ROS 基础知识汇总

news2024/9/29 7:28:32


How to learn ROS ROS for Beginners: How to Learn ROS - The Construct

ROSwiki 界面介绍 ROS/Tutorials/NavigatingTheWiki - ROS Wiki

ROS要学会哪些?如何学习Ros? - 知乎

setup.bash 的作用 ROS中的setup.bash_泠山的博客-CSDN博客

包的层级架构 ROS功能包_ros包是什么_duganlx的博客-CSDN博客

发现:Python脚本是可以放到scripts文件夹下的,因为只要赋予python脚本可执行权限,则python文件就可以被视为可执行文件

ROS常用指令 https://www.cnblogs.com/kay2018/p/10314741.html#:~:text=%E4%BD%BF%E7%94%A8rosnode,info%E5%91%BD%E4%BB%A4%E5%8F%AF%E4%BB%A5%E6%9F%A5%E7%9C%8B%E6%8C%87%E5%AE%9A%E8%8A%82%E7%82%B9%E7%9A%84%E4%BF%A1%E6%81%AF%E3%80%82

一个工作空间内部的层级架构

YAML command ROS/YAMLCommandLine - ROS Wiki

ROS tutorial ROS/Tutorials - ROS Wiki

Creating a catkin workspace catkin/Tutorials/create_a_workspace - ROS Wiki

Creating ROS Package ROS/Tutorials/CreatingPackage - ROS Wiki

Publisher and Subscriber in Python ROS/Tutorials/WritingPublisherSubscriber(python) - ROS Wiki

Structure of Package Packages - ROS Wiki

Understanding Nodes ROS/Tutorials/UnderstandingNodes - ROS Wiki

发现1:rosrun 的是可执行文件,可执行文件运行后开启节点。节点名和可执行文件名不一样。

发现2:ping的作用就是判断某个节点是否在连接上正常

Very helpful for checking ROS info. ROS/Tutorials/UnderstandingTopics - ROS Wiki

两个python文件之间如何发送msgs,srv?

HTML注释要注意的。<!-- -->HTML comments

发现:<! 和 --中间不要有空格。

ROS的依赖配置

package.xml catkin/package.xml - ROS Wiki

问问题论坛

Questions - ROS Answers: Open Source Q&A Forum

ROS参数服务器详细使用

ROS参数服务器(参数使用详细介绍)_参数服务器的作用的访问指令是什么_pd很不专业的博客-CSDN博客

获取参数列表:rosparam list

tf

tf/Tutorials/Introduction to tf - ROS Wiki

tf view_frames 报错

tf view_frames is broken · Issue #201 · ros/geometry · GitHub

tf2

Outline

tf2 - ROS Wiki

tf2/Tutorials - ROS Wiki

Demo

tf2/Tutorials/Introduction to tf2 - ROS Wiki

tf2简介(博客)

https://www.cnblogs.com/sxy370921/p/11726691.html

展示坐标系

在rviz里add tf就行

坐标变换之静态坐标系变换

tf2/Tutorials/Writing a tf2 static broadcaster (Python) - ROS Wiki

静态坐标系就是不变的坐标系,一般来说都是与世界坐标系保持静止的惯性系。静态坐标系一般都是作为初始坐标系使用的。

静态坐标系在发布时会伴随一个话题发送

rostopic echo /tf_static可以查看静态坐标系的切换

示例:

#!/usr/bin/env python
import rospy

# to get commandline arguments
import sys

# because of transformations
import tf

import tf2_ros
import geometry_msgs.msg
#static initial frame transform: world(ENU)->NED
broadcaster = tf2_ros.StaticTransformBroadcaster()
static_transformStamped = geometry_msgs.msg.TransformStamped()

static_transformStamped.header.stamp = rospy.Time.now()
static_transformStamped.header.frame_id = "world"
static_transformStamped.child_frame_id = "NED"

static_transformStamped.transform.translation.x = 0.0
static_transformStamped.transform.translation.y = 0.0
static_transformStamped.transform.translation.z = 0.0

quat = tf.transformations.quaternion_from_euler(np.pi, 0, np.pi/2)
static_transformStamped.transform.rotation.x = quat[0]
static_transformStamped.transform.rotation.y = quat[1]
static_transformStamped.transform.rotation.z = quat[2]
static_transformStamped.transform.rotation.w = quat[3]

broadcaster.sendTransform(static_transformStamped)

初始坐标系?

rviz里不存在初始坐标系一说。但映射在rviz里总是有一个绝对参考系的x-y-z坐标系,这个系需要我们命名。

动坐标系变换

import tf2_conversions

br = tf2_ros.TransformBroadcaster()
trans_msg = geometry_msgs.msg.TransformStamped()

trans_msg.header.stamp = rospy.Time.now()
trans_msg.header.frame_id = "NED"
trans_msg.child_frame_id = "base_link"
trans_msg.transform.translation.x = n
trans_msg.transform.translation.y = e
trans_msg.transform.translation.z = 0.0
quat = tf_conversions.transformations.quaternion_from_euler(np.pi, 0, psi*np.pi/180)
trans_msg.transform.rotation.x = quat[0]
trans_msg.transform.rotation.y = quat[1]
trans_msg.transform.rotation.z = quat[2]
trans_msg.transform.rotation.w = quat[3]

br.sendTransform(trans_msg)

如何生成新坐标系

生成新坐标系时就涉及与旧坐标系的关联,无论这个新坐标系是动坐标系还是静态坐标系

查看现在的tf树

生成pdf:rosrun tf2_tools view_frames.py

查看:evince frames.pdf

tf_echo

rosrun tf tf_echo [源参考系] [目标参考系]

含义:查看由[参考系]转移到[目标参考系]需要的平移和旋转变换

右手系坐标图

注意:不管怎么进行坐标轴旋转,坐标轴的x-y-z都要满足右手系

frame_id解释

针对frame_id和child_frame_id的理解_学无止境的小龟的博客-CSDN博客

ROS中的坐标系map、odom、base_link、base_footprint、base_laser

ROS中的坐标系map、odom、base_link、base_footprint、base_laser_abcwoabcwo的博客-CSDN博客

欧拉角

欧拉角有不同的描述方法,最常用的表述方法是:roll(绕x),pitch(绕y),yaw(绕z,注意z轴朝下

用于表示三维空间内的旋转需要的三个角度值,分别叫做章动角θ、旋进角(即进动角)ψ和自转角φ

注意:

  1. quaternion_from_euler(roll(X),pitch(Y),yaw(Z))
  2. 旋转是基于最初的系进行旋转,即旋转方向是按照最初的系

旋转矩阵

Derivative of a rotation matrix | Robot Academy

Expert Maths Tutoring in the UK - Boost Your Scores with Cuemath

旋转,既可以看做是在同一个坐标系下向量进行旋转,也可以认为是向量不动,对坐标系旋转。两个旋转的角度大小相等,方向相反。

旋转矩阵怎么背呢?不好背,自己会推。

四元数

https://www.cnblogs.com/gaoxiang12/p/5120175.html

四元数仅是3D姿态的一种表达方式,我们用一个单位四元数表达原本用旋转矩阵表示的三维旋转。这样做一个直接的好处是省空间。一个旋转阵有9个分量,但只有三个自由度。那么,能不能用三个数来描述呢?可以是可以的,但不可避免会出现奇异的情况,欧拉角就是一个例子。而四元数,比三维向量多了一个分量,从而可以无奇异地表示各种姿态.

为什么用三个数表示三个自由度会出现奇异的情况?以欧拉角为例

暂时未知,。可以参考:

欧拉角奇异性产生的原因_lipi37的博客-CSDN博客

四元数转为欧拉的函数

rad

Quaternion transformations in Python - ROS Answers: Open Source Q&A Forum

例子:

from tf_conversions import transformations
quaternion = (pose.orientation.x, 
              pose.orientation.y, 
              pose.orientation.z, 
              pose.orientation.w) 
euler = tf_conversions.transformations.euler_from_quaternion(quaternion)
psi = euler[2]

坐标变换和坐标系变换的区别

前者是同一个位置在不同坐标系下的分解,从A frame到B frame。坐标变换用source->target表示

后者是指如何将坐标系通过平移或旋转变换到另一个新坐标系。坐标系变换用parent->child表示。

ROS中TF(坐标系转换)原理与使用 - 古月居

`rospack find turtle_tf2`/rviz/turtle_rviz.rviz?

Robot_state_publisher

robot_state_publisher/Tutorials/Using the robot state publisher on your own robot - ROS Wiki

robot_state_publisher - ROS Wiki

URDF

urdf/Tutorials - ROS Wiki

urdf - ROS Wiki

Glosary

catkin/Glossary - ROS Wiki

package.xml

catkin/package.xml - ROS Wiki

Contents include:

  1. introduction to this package, such as package name, author.
  2. declare dependencies on other catkin packages

Note that package.xml must be at any packages at the root folder.

There are six types of dependencies, including build, export, execution, build tool, test, doc

Except <depend>, corresponding tag are <build_depend>, <build_export_depend>, <exec_depend>, <buildtool_depend>, <doc_depend>, <test_depend>

<depend> means, I guess, dependency that not only plays a role as a build tool but also an export tool as well as an execution tool.

build...against. Build libraries against this package: means build libraries where this package plays a role of a part or a library.

CMakeLists.txt

catkin/CMakeLists.txt - ROS Wiki

the format, or say to be more detail, the order is neccessary.

Writing Publisher&Subscriber with Python

ROS/Tutorials/WritingPublisherSubscriber(python) - ROS Wiki

std_msgs

std_msgs - ROS Wiki

自定义消息

tutorials

msg - ROS Wiki

ROS error: Did you forget to specify generate_messages(DEPENDENCIES ...)?

很有可能是.msg文件中某个格式出现错误

ROS error: Did you forget to specify generate_messages(DEPENDENCIES ...)?_拉格朗日橙汁的博客-CSDN博客

ros 无法rosmsg show自定义消息类型

ROS自定义msg类型及其使用 - 知乎

ROS中package.xml中message_runtime的一点说明_莫能长老的博客-CSDN博客

编译好以后,重开一个终端

rostopic pub通过命令行发布话题

rostopic pub通过命令行发布话题_abcwoabcwo的博客-CSDN博客

注意:

  1. 话题名字前面不要加\,这个在python里是转义符号。直接写英文名,ros会自动给它加上\的。如果加了,会收不到
  2. msg_name都是有field的,比如Odometry的field是nav_msgs,在command line里需要加上它的field,即nav_msgs/Odometry.

rostopic 发布自定义消息

ROS/Tutorials/CreatingMsgAndSrv - ROS Wiki

话题名字不需要加字符串符号

实例:

(自定义消息所在工作空间下)rostopic pub -r 10 task detect_track/sentiment tabtab

ros 常用命令

ROS基本命令 - 知乎

查看某个topic的具体属性:

实例:

rostopic echo odom/pose/pose/position

rosbag 录包常用命令

ROS 机器人技术 - rosbag 详细使用教程! - 知乎

ROS rospy.loginfo

Python rospy.loginfo方法代码示例 - 纯净天空

ROS 编译python文件

ROS编译 Python 文件(详细说明) - 古月居

ROS——创建工作空间和功能包并成功运行一个基本python文件_catkin create pkg python_Irving.Gao的博客-CSDN博客

ROS运行Python节点

ROS/Tutorials/ExaminingPublisherSubscriber - ROS Wiki

ROS使用消息查看的命令

发现:在新Terminal使用相关命令,需要在工作空间先source 一下。

roslaunch

type: executable name.

name: node name

How launch a python script with roslaunch - ROS Answers: Open Source Q&A Forum

roslaunch - ROS Wiki

roslaunch解析:ROS 初级 - 解析 roslaunch 文件 - 知乎

使用roslaunch导致节点输出不全【ROS】使用roslaunch导致节点输出不全,用output="screen"_ros2的launch启动后节点无输出_ethan_guo的博客-CSDN博客

发现:roslaunch可以自动开启master

更改工作空间位置(或改名工作空间)

ros工作空间文件位置改变解决办法_ros怎么删除工作空间_hansrobothans的博客-CSDN博客

需要删除src里面的cmakelists,然后重新定向。其实就是重新初始化。初始化之后如下图:

192.168.2.122

8880

8881 pc

mkdir -p的参数含义?

https://www.cnblogs.com/miaooo/p/4479332.html

允许创建多层参数,而不是一层参数

解决rospy.spin()一直循环,无法执行剩余程序

解决rospy.spin()一直循环,无法执行剩余程序_ros python 不被rospin阻塞_DLUT_小叮当的博客-CSDN博客

使用rospy.wait_for_message(topic, topic_type, timeout)

不需要rospy.spin() ,可以直接获取话题的数据 , 注意要先定义节点

import rospy
from sensor_msgs.msg import LaserScan
def listener():
    rospy.init_node('get_laser')
    rospy.sleep(2)
    data = rospy.wait_for_message("/scan", LaserScan, timeout=None)
    print(data.ranges)

if __name__ == '__main__':
    listener()

ROS工作空间中是否有必要为python做一个虚拟环境?

How to install and launch Python node inside a virtualenv? - ROS Answers: Open Source Q&A Forum

没有必要

import: 未找到命令

需要在开头加入:

#! /usr/bin/env python3

rqt_plot无法显示话题

需要在工作空间下rosrun

rqt_plot 的使用

rqt plot - Easily Debug ROS topics - The Robotics Back-End

ros.spin()的作用

ros::spin()、ros::spinOnce():使用细节、区别_默_存的博客-CSDN博客

rospy.spin() 和while not rospy.is_shutdown()的区别?

What is difference between rospy.spin() and while not rospy.is_shutdown()? - ROS Basics In 5 Days (Python) - The Construct ROS Community

如何从其他包导入python模块

[ROS] How To Import a Python Module From Another Package - The Robotics Back-End

Ros的时间模块

rospy/Overview/Time - ROS Wiki

有非常多的获取当前时间模块,区别暂时没有完全弄明白,只知道如果要获得float类型,可以参与算数运算的,

调用rospy.get_time()

ros difference between rospy.loginfo and print

Why rospy.loginfo instead of print - ROS Basics In 5 Days (Python) - The Construct ROS Community

ros python导入内置消息

用Python编写ROS中的订阅和发布,导入消息类型问题_wakaka Yuan+的博客-CSDN博客

from geometry_msgs.msg import PoseStamped

ros Pose

Python Examples of geometry_msgs.msg.Pose

python 实例化msg无法有效append进Path类型的消息

被加进去的点改为局部变量,而path对应的变量改为全局变量。原因未知

Error:/usr/bin/env:“python“:没有那个文件或目录

Error:/usr/bin/env:“python“:没有那个文件或目录_error: /bin/sh: /home/yzc/.tuya/venv/bin/python: 没_Believe yourself!!!的博客-CSDN博客

第二种最简单

catkin_package() include dir ‘include‘ does not exist relative to xxx的解决办法

这是因为在ros工作空间的包中没有include文件夹造成的,所以在该路径下创建include的文件夹,问题就解决了!

【rviz::RenderSystem: error creating render window: std::exception】

显卡出现问题,重启试试。亲测有效。

【rviz::RenderSystem: error creating render window: std::exception】_Mr_D0325的博客-CSDN博客

工作空间功能包代码移植

用git的时候,我会只上传某一个工作空间的src,但是在上传的时候,include是没法上传的。所以如果要在另一台机子上克隆src,必须要给每一个功能包新建一个空的include文件夹。

rospy.Publisher中的queue_size的作用

在`rospy`中,`Publisher`对象用于发布消息到一个特定的话题(topic)上。`queue_size`参数是可选的,用于设置`Publisher`的内部队列的大小。

具体来说,当你通过`Publisher`发布消息时,这些消息首先进入一个内部队列。然后,这些消息会从队列中取出并发送到相应的话题上。`queue_size`参数限制了这个队列可以容纳的消息的最大数量。

当你以很快的速率发布消息,而接收方或网络不够快时,这个队列会开始填满。一旦队列满了,根据你的配置和`rospy`的版本,它可能会开始丢弃旧的消息或拒绝添加新的消息。

设置`queue_size`的目的是为了处理发布和订阅之间速率的不匹配,并为处理瞬时的消息发布峰值提供一些缓冲。

选择合适的`queue_size`值是重要的:

- 如果你设置的`queue_size`太小,并且发布消息的速率非常快,你可能会丢失一些消息。

- 如果你设置的`queue_size`太大,那么在网络或订阅者慢的情况下,消息可能会在队列中积累,并且订阅者可能会收到过时的消息。

通常,你需要根据你的应用需求和网络条件来选择一个合适的`queue_size`值。

rospy.sleep,time.sleep()和r = rospy.Rate()后循环中r.sleep()的区别?

下面是我和chatgpt的对话内容

我:rospy.sleep和time.sleep的区别?哪个更适合用于ROS系统中

chatgpt:rospy.sleep()time.sleep()都是用于让程序暂停一段时间的函数,但它们在功能和适用性上有一些区别。

  1. 环境:
    • rospy.sleep()是ROS (Robot Operating System) Python库中的一个函数,它专门用于ROS环境。
    • time.sleep()是Python标准库中的一个函数,可以在任何Python环境中使用。
  1. 时间参考:
    • rospy.sleep()使用ROS的时间作为参考,这意味着它会考虑到ROS的时间缩放因子。当你在仿真中使用ROS并想要加速或减慢时间时,rospy.sleep()会相应地调整暂停的时间。
    • time.sleep()使用真实时间作为参考,并不受ROS时间缩放的影响。
  1. 行为:
    • rospy.sleep()在ROS节点关闭时会抛出异常。这可以让你更好地控制ROS节点的关闭行为。
    • time.sleep()不关心ROS节点的状态,在指定的时间段后正常返回。

在ROS系统中,通常推荐使用rospy.sleep(),因为它更适合处理ROS特定的时间管理和节点生命周期。当你需要你的代码与ROS的时间同步,或者当你在仿真环境中工作并且可能会改变时间的流逝速度时,rospy.sleep()尤其有用。

我:r= rospy.rate(100)然后 r.sleep()和rospy.sleep(0.01)有什么区别?

r = rospy.Rate(100)r.sleep() 以及 rospy.sleep(0.01) 都是在ROS环境中暂停程序的方法,但它们的工作方式略有不同。

  1. rospy.Rate 和 r.sleep():
    • r = rospy.Rate(100) 设置一个频率,100表示每秒100次,也就是10毫秒一次。
    • r.sleep() 会根据上一次调用时间来睡眠一定的时间以保持设置的频率。如果处理在一个循环中,它会自动计算需要的睡眠时间以保持整个循环以100Hz运行。如果循环的其他部分耗时较长,r.sleep()可能会睡眠更少的时间,甚至不睡眠,以尽量维持100Hz的频率。
  1. rospy.sleep(0.01):
    • rospy.sleep(0.01) 直接让程序暂停0.01秒(10毫秒)。它不考虑循环中的其他处理时间,只是简单地暂停10毫秒。

在很多情况下,使用 rospy.Rater.sleep() 更适合循环中,因为它可以自动调整睡眠时间以保持稳定的频率。这对于机器人控制任务通常是非常重要的,因为你通常希望以稳定的频率发布或读取数据。

rospy.sleep(0.01) 更简单直接,适合只需要简单暂停一段时间的场景。

为什么订阅消息滞后于发布消息的数值?

你的问题可能与ROS的消息传输、处理和调度机制有关。首先,我们要了解ROS中消息的发送和接收并不是实时的。即使发布者发布了消息,订阅者也可能因为各种原因(比如网络延迟,处理速度等)并没有立即接收到。此外,你的程序中的每一次循环可能需要不同的时间来执行,这也可能会导致消息处理的延迟。

以下是一些可能引起此问题的原因:

  1. CPU 资源有限:当系统资源有限(如 CPU 使用率很高)时,消息处理的延迟可能会增加。你可以通过监控系统资源使用情况来判断这是否是问题所在。
  2. 网络延迟:如果你的ROS节点分布在不同的机器上,网络延迟可能也会影响消息的接收。你可以尝试优化你的网络设置,或者将所有的节点都运行在同一台机器上以减少网络延迟。
  3. 消息队列大小:在创建Subscriber对象时,你可以指定一个队列大小(在你的代码中,队列大小是默认的1)。如果发布者发布消息的速度超过了订阅者处理消息的速度,并且队列已经满了,那么新的消息就会被丢弃。你可以尝试增加队列的大小,以允许更多的消息被缓存。
  4. 回调函数的处理速度:在回调函数中,你可能会执行一些需要花费一些时间的操作,这会导致回调函数处理的延迟。你可以通过优化你的代码来提高处理速度,例如减少计算量,或者使用更快的算法。

如果你确定以上的原因都不是问题所在,那么你可能需要使用更高级的工具来分析你的ROS系统的行为。例如,你可以使用rostopic hz来检查消息的发布频率,使用rosnode info来查看节点的详细信息,或者使用rqt_graph来查看节点和话题的连接图。此外,ROS还提供了一些专门的工具来分析和调试消息传输的性能,如rosbag, rostopic bw, rostopic delay等。

针对你的回答,我提出了几个新的问题: 1. 在linux系统中查看CPU使用率的终端命令是什么? 2. Subscriber对象创建时队列过长会有什么弊端?你建议设置多长的队列?如何设置队列长度? 3. 介绍一下rosnode info、rostopic bw和rostopic delay的功能和用法

  1. 在Linux系统中查看CPU使用率的终端命令通常有tophtop(如果已安装)。它们提供了系统资源使用的详细信息,包括CPU使用率,内存使用情况等。仅查看CPU使用率,你也可以使用命令mpstat,它是sysstat包的一部分。
  2. 设置过长的消息队列可能会导致内存的过度使用,因为所有待处理的消息都需要在内存中缓存。此外,如果发布者发布消息的速度远大于订阅者处理消息的速度,那么即使有大的消息队列,也只会导致更多的消息延迟,而不是减少消息丢失。队列的大小应根据你的具体需求来确定,常见的设置通常在10-100之间。在创建Subscriber时,可以通过第三个参数来设置队列大小,例如rospy.Subscriber("my_topic", MyMessageType, my_callback, queue_size=10)
  3. 下面是rosnode info, rostopic bwrostopic delay 的功能和用法:
    • rosnode info [node_name]:此命令提供了有关指定节点的信息,包括其订阅的话题,发布的话题,服务等。这可以帮助你了解节点的行为以及其与其他节点的关系。
    • rostopic bw [topic]:此命令可以测量特定话题的带宽使用情况。这可以帮助你理解消息的大小以及发布的频率如何影响网络的使用。
    • rostopic delay [topic]:此命令可以计算特定话题消息的延迟,也就是消息发布的时间和当前时间的差值的统计量(包括平均值,最大值和最小值)。这可以帮助你理解消息的传输是否存在延迟。

针对你的回答,我又提出了几个新问题: 1. 队列的长度大小显然和发布速度有关,那么在发布速度已知的情况下,队列大小有没有什么选取的经验可循? 2. 详细解释一下rostopic delay的使用

  1. 在设置队列大小时,你需要考虑几个因素:
    • 发布者的发布频率:如果发布频率高,可能需要更大的队列来应对。
    • 订阅者的处理速度:如果订阅者处理消息的速度较慢,可能需要更大的队列来存储在订阅者处理过程中发布的消息。
    • 系统资源:队列越长,消耗的内存越多。如果系统资源有限,那么需要考虑这个因素来设置一个合理的队列大小。

一个常见的策略是,如果你知道订阅者的处理速度和发布者的发布频率,可以设置队列大小为两者的乘积。例如,如果订阅者处理一条消息需要0.1秒,而发布者的发布频率是100Hz,那么队列大小可以设置为10。然而,这只是一个经验法则,并不一定适用于所有情况。你需要根据你的特定需求来选择最合适的队列大小。

  1. rostopic delay命令的使用:
    rostopic delay [topic]可以用于度量指定话题的消息延迟。具体来说,这个命令计算的是每条消息发布时间戳和接收时间的差值,并提供了这些差值的统计量。
    命令的输出可能类似如下形式:
subscribed to [/topic]
average delay: 0.053
min: 0.026s max: 0.068s std dev: 0.00948s window: 1270


其中,“average delay”是平均延迟,“min”和“max”分别是观测到的最小和最大延迟,“std dev”是延迟的标准差,“window”是用于计算这些统计量的消息数量。
请注意,如果消息没有时间戳,那么rostopic delay将无法计算延迟。
你可以通过如下命令来使用rostopic delay
其中,“/my_topic”应替换为你感兴趣的话题名。

ROS中打印信息到终端(类似于print)的方式是什么?和print有什么区别?

在ROS中,打印信息到终端常用的方式是使用ROS的日志记录系统,包括以下几种级别的日志函数:

  • rospy.loginfo(msg):用于打印一般的信息,相当于Python中的print函数。
  • rospy.logwarn(msg):用于打印警告信息。
  • rospy.logerr(msg):用于打印错误信息。
  • rospy.logfatal(msg):用于打印致命错误信息。
  • rospy.logdebug(msg):用于打印调试信息。

其中,msg是你要打印的信息,可以是字符串,数字,甚至是复杂的数据结构。

使用ROS的日志系统与直接使用print函数相比,有以下几点优势:

  1. 不同级别的日志:如上所述,ROS的日志系统提供了不同级别的日志,这使得你可以根据信息的重要性来选择合适的级别。例如,对于重要的错误信息,你应该使用rospy.logerr,而对于一般的调试信息,你可以使用rospy.logdebug。
  2. 控制日志的输出:ROS的日志系统允许你在运行时通过设置ROS控制台日志级别来控制哪些级别的日志应该被打印到终端。例如,你可以设置只打印错误和致命错误的日志,而忽略信息,警告和调试日志。
  3. 日志记录:除了打印到终端,ROS的日志系统还会自动将日志记录到文件中,方便你在程序运行结束后进行查看和分析。
  4. 分布式系统:在ROS的分布式系统中,你可能会运行多个节点,这些节点可能在不同的机器上。使用ROS的日志系统,你可以方便地集中查看和管理所有节点的日志。

因此,尽管print函数在某些简单的情况下可能更直接,但在开发和调试ROS程序时,建议使用ROS的日志系统。

ROS_INFO和rospy.loginfo的区别是什么

ROS_INFOrospy.loginfo都是ROS (Robot Operating System) 中用于记录信息的方法,二者都用于输出日志信息,让开发者知道程序的运行状态。区别在于它们用于不同的编程语言。

  1. ROS_INFO是C的ROS logging系统的一部分,通常在用C编写的ROS节点中使用。
  2. rospy.loginfo则是Python版的ROS日志系统,主要在Python编写的ROS节点中使用。

两者之间的功能大致相同,都是用于记录程序运行过程中的信息,以帮助开发者调试程序或者追踪程序的运行状态。在具体用法上,由于语言差异,两者会有些许不同。例如,ROS_INFO需要在消息字符串前加上<<运算符,而rospy.loginfo则不需要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/808368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT长文本对话输入方法

ChatGPT PROMPTs Splitter 是一个开源工具&#xff0c;旨在帮助你将大量上下文数据分成更小的块发送到 ChatGPT 的提示&#xff0c;并根据如何处理所有块接收到 ChatGPT&#xff08;或其他具有字符限制的语言模型&#xff09;的方法。 推荐&#xff1a;用 NSDT设计器 快速搭建可…

如何搭建并部署抖音SEO源代码?

搭建并部署抖音SEO源代码&#xff0c;需要以下步骤&#xff1a; 购买服务器&#xff1a;在云服务商或者VPS提供商购买一台服务器&#xff0c;选择Linux系统。 安装LAMP/LEMP环境&#xff1a;LAMP是指Linux Apache MySQL PHP&#xff0c;LEMP是指Linux Nginx MySQL PHP。…

卷积的意义及其应用

卷积的意义及其应用 卷积的定义 我们将形如 ∫ − ∞ ∞ f ( τ ) g ( x − τ ) d τ \int^\infty_{-\infty} f(τ)g(x-τ)dτ ∫−∞∞​f(τ)g(x−τ)dτ 的式子称之为f&#xff08;x&#xff09;与g&#xff08;x&#xff09;的卷积记为 h ( x ) ( f ∗ g ) ( x ) h(x…

js开发技巧

1. 初始化数组 如果想要初始化一个指定长度的一维数组&#xff0c;并指定默认值&#xff0c;可以这样&#xff1a; const array Array(6).fill(); // [, , , , , ] 如果想要初始化一个指定长度的二维数组&#xff0c;并指定默认值&#xff0c;可以这样&#xff1a; const…

【尚硅谷】第01章:随堂复习与企业真题(Java语言概述)

来源&#xff1a;尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备) 基本都是宋老师发的资料里面的内容&#xff0c;只不过补充几个资料里没直接给出答案的问题的答案。 不想安装markdown笔记的app所以干脆在这里发一遍。 第01章&#xff1a;随堂复习…

电路原理分析1

d2的作用是提供一个1.25v的电平 r3、r4的作用都是限流 c1是滤波 运放的4、8脚是常规的外围 这个运放是一个运算放大电路 具体计算是这样的&#xff1a; 按照虚短原则&#xff0c;输入的信号Uinu1,输出的信号Uoutu3 按照虚断原则&#xff0c;i1i2i5i5 u1/r2i1i5&#xff…

windows使用多账户Git,多远程仓库版本管理

1 清除全局配置 git config --global --list // 看一下是否配置过user.name 和 user.email git config --global --unset user.name // 清除全局用户名 git config --global --unset user.email // 清除全局邮箱 2 本地仓库&#xff0c;每个远程对应的本地仓库目录下执行 $…

Redis缓存击穿问题以及解决方案

Redis缓存击穿问题以及解决方案 前言一、什么是Redis缓存击穿二、解决方案1.使用锁来解决使用锁的流程&#xff1a;核心思路&#xff1a;思路流程图&#xff1a;操作的锁的代码&#xff1a;业务的实现&#xff1a; 2.逻辑过期来解决思路分析&#xff1a;解决流程&#xff1a;业…

YOLOv5改进系列(17)——更换IoU之MPDIoU(ELSEVIER 2023|超越WIoU、EIoU等|实测涨点)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

【数据结构】_5.栈

目录 1. 概念 2. 栈的使用 2.1 方法 2.2 示例 3. 栈的模拟实现 4. 栈的应用场景 4.1 题目1&#xff1a;不可能的出栈序列 4.2 题目2&#xff1a;逆序打印单链表 4.3 题目3&#xff1a;逆波兰表达式求值 4.4 题目4&#xff1a;括号匹配 4.5 题目5&#xff1a;栈的压入…

如何构建高效的接口自动化测试框架

在选择接口测试自动化框架时&#xff0c;需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说&#xff0c;使用Python相关的测试框架更为便捷。无论选择哪种框架&#xff0c;重要的是确保 框架功能完备&#xff0c;易于维护和扩展&#xff0c;提高测试效率和准确性。今…

最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理

黑马程序员最新Java项目实战《苍穹外卖》&#xff0c;最适合新手的SpringBootSSM的企业级Java项目实战。 新增员工 设计 DTO 类 我们需要根据新增员工接口设计对应的 DTO 类去接收前端传递的参数&#xff0c;前端传递参数列表如下&#xff1a; 注意&#xff1a; 当前端提交的…

C++ 成员初始化列表和new运算符的应用

输出一个学生的学号&#xff0c;姓名&#xff0c;性别和出生年月日 class Date { public:Date(int y, int m, int d) :m_year(y), m_month(m), m_day(d) {}void Print(){cout << m_year << "/" << m_month << "/" << m_day…

第四章 No.1树状数组的原理与使用

文章目录 应用问题原理树状数组练习题241. 楼兰图腾242. 一个简单的整数问题243. 一个简单的整数问题2244. 谜一样的牛 线段树的反面&#xff1a;树状数组原理复杂&#xff0c;实现简单 应用问题 支持两个操作&#xff1a;快速求前缀和任意地修改某个数&#xff0c;时间复杂度…

520 · 一致性哈希 II

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a; class Solution{private:int n;const int mVirtualNodeCount;map<int, int> mVirtualNodeToMachineIdMap;set<int> mVirtualNodeSet;public:Solution(int n…

SpringBoot的三层架构以及IOCDI

目录 一、IOC&DI入门 二、三层架构 数据库访问层 业务逻辑层 控制层 一、IOC&DI入门 在软件开发中&#xff0c;IOC&#xff08;Inversion of Control&#xff09;和DI&#xff08;Dependency Injection&#xff09;是密切相关的概念。 IOC&#xff08;控制反转&a…

CAN学习笔记2:CAN简介

CAN 1 概述 CAN(Controller Area Network),是 ISO 国际标准化的串行通信协议,目的是适应汽车“减少线束的数量”、“通过多个网络进行大量数据的高速传输”的需求。 低速 CAN(ISO11519)通信速率 10~125Kbps&#xff0c;总线长度可达 1000米. 高速 CAN(ISO11898)通信速率 125~…

cnn卷积神经网络(基础)

convolutional neural networks 特征提取&#xff08;卷积、下采样&#xff09;->分类器 &#xff08;全连接&#xff09; 卷积过程 依次进行数乘 &#xff08;每个相同位置上的数字相乘再加和&#xff09; 左右数乘矩阵channel数量要一样&#xff0c;输出得到一个通道 卷…

吴师傅教你几招极速清理C盘,高能操作绝不让你失望!

电脑使用久了&#xff0c;C盘堆积的垃圾过多&#xff1b;每天上网会给电脑带来很多临时文件&#xff0c;这些垃圾文件不清理掉时间久了就会影响到电脑的运行速度&#xff1b;也会导致C盘变红&#xff0c;空间不足。那么&#xff0c;电脑C盘满了如何清理呢&#xff1f;教你几招极…

SpringBoot 如何进行 统一异常处理

在Spring Boot中&#xff0c;可以通过自定义异常处理器来实现统一异常处理。异常处理器能够捕获应用程序中抛出的各种异常&#xff0c;并提供相应的错误处理和响应。 Spring Boot提供了ControllerAdvice注解&#xff0c;它可以将一个类标记为全局异常处理器。全局异常处理器能…