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 tfimport 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.0quat = 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_conversionsbr = 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轴朝下)
用于表示三维空间内的旋转需要的三个角度值,分别叫做章动角θ、旋进角(即进动角)ψ和自转角φ
注意:
quaternion_from_euler(roll(X),pitch(Y),yaw(Z))
- 旋转是基于最初的系进行旋转,即旋转方向是按照最初的系
旋转矩阵
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:
- introduction to this package, such as package name, author.
- 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博客
注意:
- 话题名字前面不要加\,这个在python里是转义符号。直接写英文名,ros会自动给它加上\的。如果加了,会收不到
- 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()
都是用于让程序暂停一段时间的函数,但它们在功能和适用性上有一些区别。
- 环境:
-
rospy.sleep()
是ROS (Robot Operating System) Python库中的一个函数,它专门用于ROS环境。time.sleep()
是Python标准库中的一个函数,可以在任何Python环境中使用。
- 时间参考:
-
rospy.sleep()
使用ROS的时间作为参考,这意味着它会考虑到ROS的时间缩放因子。当你在仿真中使用ROS并想要加速或减慢时间时,rospy.sleep()
会相应地调整暂停的时间。time.sleep()
使用真实时间作为参考,并不受ROS时间缩放的影响。
- 行为:
-
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环境中暂停程序的方法,但它们的工作方式略有不同。
- rospy.Rate 和 r.sleep():
-
r = rospy.Rate(100)
设置一个频率,100表示每秒100次,也就是10毫秒一次。r.sleep()
会根据上一次调用时间来睡眠一定的时间以保持设置的频率。如果处理在一个循环中,它会自动计算需要的睡眠时间以保持整个循环以100Hz运行。如果循环的其他部分耗时较长,r.sleep()
可能会睡眠更少的时间,甚至不睡眠,以尽量维持100Hz的频率。
- rospy.sleep(0.01):
-
rospy.sleep(0.01)
直接让程序暂停0.01秒(10毫秒)。它不考虑循环中的其他处理时间,只是简单地暂停10毫秒。
在很多情况下,使用 rospy.Rate
和 r.sleep()
更适合循环中,因为它可以自动调整睡眠时间以保持稳定的频率。这对于机器人控制任务通常是非常重要的,因为你通常希望以稳定的频率发布或读取数据。
而 rospy.sleep(0.01)
更简单直接,适合只需要简单暂停一段时间的场景。
为什么订阅消息滞后于发布消息的数值?
你的问题可能与ROS的消息传输、处理和调度机制有关。首先,我们要了解ROS中消息的发送和接收并不是实时的。即使发布者发布了消息,订阅者也可能因为各种原因(比如网络延迟,处理速度等)并没有立即接收到。此外,你的程序中的每一次循环可能需要不同的时间来执行,这也可能会导致消息处理的延迟。
以下是一些可能引起此问题的原因:
- CPU 资源有限:当系统资源有限(如 CPU 使用率很高)时,消息处理的延迟可能会增加。你可以通过监控系统资源使用情况来判断这是否是问题所在。
- 网络延迟:如果你的ROS节点分布在不同的机器上,网络延迟可能也会影响消息的接收。你可以尝试优化你的网络设置,或者将所有的节点都运行在同一台机器上以减少网络延迟。
- 消息队列大小:在创建
Subscriber
对象时,你可以指定一个队列大小(在你的代码中,队列大小是默认的1)。如果发布者发布消息的速度超过了订阅者处理消息的速度,并且队列已经满了,那么新的消息就会被丢弃。你可以尝试增加队列的大小,以允许更多的消息被缓存。 - 回调函数的处理速度:在回调函数中,你可能会执行一些需要花费一些时间的操作,这会导致回调函数处理的延迟。你可以通过优化你的代码来提高处理速度,例如减少计算量,或者使用更快的算法。
如果你确定以上的原因都不是问题所在,那么你可能需要使用更高级的工具来分析你的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的功能和用法
- 在Linux系统中查看CPU使用率的终端命令通常有
top
或htop
(如果已安装)。它们提供了系统资源使用的详细信息,包括CPU使用率,内存使用情况等。仅查看CPU使用率,你也可以使用命令mpstat
,它是sysstat
包的一部分。 - 设置过长的消息队列可能会导致内存的过度使用,因为所有待处理的消息都需要在内存中缓存。此外,如果发布者发布消息的速度远大于订阅者处理消息的速度,那么即使有大的消息队列,也只会导致更多的消息延迟,而不是减少消息丢失。队列的大小应根据你的具体需求来确定,常见的设置通常在10-100之间。在创建
Subscriber
时,可以通过第三个参数来设置队列大小,例如rospy.Subscriber("my_topic", MyMessageType, my_callback, queue_size=10)
。 - 下面是
rosnode info
,rostopic bw
和rostopic delay
的功能和用法:
-
rosnode info [node_name]
:此命令提供了有关指定节点的信息,包括其订阅的话题,发布的话题,服务等。这可以帮助你了解节点的行为以及其与其他节点的关系。rostopic bw [topic]
:此命令可以测量特定话题的带宽使用情况。这可以帮助你理解消息的大小以及发布的频率如何影响网络的使用。rostopic delay [topic]
:此命令可以计算特定话题消息的延迟,也就是消息发布的时间和当前时间的差值的统计量(包括平均值,最大值和最小值)。这可以帮助你理解消息的传输是否存在延迟。
针对你的回答,我又提出了几个新问题: 1. 队列的长度大小显然和发布速度有关,那么在发布速度已知的情况下,队列大小有没有什么选取的经验可循? 2. 详细解释一下rostopic delay的使用
- 在设置队列大小时,你需要考虑几个因素:
-
- 发布者的发布频率:如果发布频率高,可能需要更大的队列来应对。
- 订阅者的处理速度:如果订阅者处理消息的速度较慢,可能需要更大的队列来存储在订阅者处理过程中发布的消息。
- 系统资源:队列越长,消耗的内存越多。如果系统资源有限,那么需要考虑这个因素来设置一个合理的队列大小。
一个常见的策略是,如果你知道订阅者的处理速度和发布者的发布频率,可以设置队列大小为两者的乘积。例如,如果订阅者处理一条消息需要0.1秒,而发布者的发布频率是100Hz,那么队列大小可以设置为10。然而,这只是一个经验法则,并不一定适用于所有情况。你需要根据你的特定需求来选择最合适的队列大小。
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函数相比,有以下几点优势:
- 不同级别的日志:如上所述,ROS的日志系统提供了不同级别的日志,这使得你可以根据信息的重要性来选择合适的级别。例如,对于重要的错误信息,你应该使用rospy.logerr,而对于一般的调试信息,你可以使用rospy.logdebug。
- 控制日志的输出:ROS的日志系统允许你在运行时通过设置ROS控制台日志级别来控制哪些级别的日志应该被打印到终端。例如,你可以设置只打印错误和致命错误的日志,而忽略信息,警告和调试日志。
- 日志记录:除了打印到终端,ROS的日志系统还会自动将日志记录到文件中,方便你在程序运行结束后进行查看和分析。
- 分布式系统:在ROS的分布式系统中,你可能会运行多个节点,这些节点可能在不同的机器上。使用ROS的日志系统,你可以方便地集中查看和管理所有节点的日志。
因此,尽管print函数在某些简单的情况下可能更直接,但在开发和调试ROS程序时,建议使用ROS的日志系统。
ROS_INFO和rospy.loginfo的区别是什么
ROS_INFO
和rospy.loginfo
都是ROS (Robot Operating System) 中用于记录信息的方法,二者都用于输出日志信息,让开发者知道程序的运行状态。区别在于它们用于不同的编程语言。
ROS_INFO
是C的ROS logging系统的一部分,通常在用C编写的ROS节点中使用。rospy.loginfo
则是Python版的ROS日志系统,主要在Python编写的ROS节点中使用。
两者之间的功能大致相同,都是用于记录程序运行过程中的信息,以帮助开发者调试程序或者追踪程序的运行状态。在具体用法上,由于语言差异,两者会有些许不同。例如,ROS_INFO
需要在消息字符串前加上<<
运算符,而rospy.loginfo
则不需要。