ROS 基础知识汇总


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轴朝下

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

注意:

  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.mzph.cn/news/13129.shtml

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

相关文章

详细介绍 React 中如何使用 redux

在使用之前要先了解它的配套插件&#xff1a; 在React中使用redux&#xff0c;官方要求安装其他插件 Redux Toolkit 和 react-redux Redux Toolkit&#xff1a;它是一个官方推荐的工具集&#xff0c;旨在简化 Redux 的使用和管理。Redux Toolkit 提供了一些提高开发效率的工具…

MybatisPlus拓展篇

文章目录 逻辑删除通用枚举字段类型处理器自动填充功能防全表更新与删除插件MybatisX快速开发插件插件安装逆向工程常见需求代码生成 乐观锁问题引入乐观锁的使用效果测试 代码生成器执行SQL分析打印多数据源 逻辑删除 逻辑删除的操作就是增加一个字段表示这个数据的状态&…

用JavaScript和HTML实现一个精美的计算器

文章目录 一、前言二、技术栈三、功能实现3.1 引入样式3.2 编写显示页面3.2 美化计算器页面3.3 实现计算器逻辑 四、总结 一、前言 计算器是我们日常生活中经常使用的工具之一&#xff0c;可以帮助我们进行简单的数学运算。在本博文中&#xff0c;我将使用JavaScript编写一个漂…

剑指 Offer 26. 树的子结构

思路&#xff1a; 先统计B数的非空节点数countB。然后前序遍历A&#xff0c;当遇到A的值和B的第一个值相等时&#xff0c;则进行统计左右结构和值都相等的节点数和sum&#xff0c;如果sum countB&#xff0c;则true。 /*** Definition for a binary tree node.* public class…

android framework车载桌面CarLauncher的TaskView详细源码分析

1、构建相关的TaskView&#xff0c;装载到对应的ViewGroup b站免费视频教程讲解&#xff1a; https://www.bilibili.com/video/BV1wj411o7A9/ //packages/apps/Car/Launcher/src/com/android/car/carlauncher/CarLauncher.java void onCreate() { //ignoresetContentView(R.…

macos下安装john the ripper并配置zip2john+破解加密zip文件

为了破解加密的zip文件&#xff0c;需要用到john进行爆破密码。 1、首先使用homebrew安装john&#xff0c;可以安装它的增强版john-jumbo: brew install john-jumbo 2、安装后可以使用 john 命令验证&#xff1a; john 3、配置zip2john的环境——.zshrc下&#xff0c;&#x…

城市气象数据可视化:洞察气候变化,构建智慧城市

随着城市化进程的加速&#xff0c;城市气象数据的采集和分析变得越来越重要。气象数据不仅影响着人们的生活和出行&#xff0c;还与城市的发展和规划息息相关。在数字化时代&#xff0c;如何将城市中各个气象数据进行可视化&#xff0c;让复杂的数据变得简单易懂&#xff0c;成…

【JavaEE初阶】HTTP请求的构造及HTTPS

文章目录 1.HTTP请求的构造1.1 from表单请求构造1.2 ajax构造HTTP请求1.3 Postman的使用 2. HTTPS2.1 什么是HTTPS?2.2 HTTPS中的加密机制(SSL/TLS)2.2.1 HTTP的安全问题2.2.2 对称加密2.2.3 非对称加密2.2.3 中间人问题2.2.5 证书 1.HTTP请求的构造 常见的构造HTTP 请求的方…

简单工厂模式——集中式工厂的实现

1、简介 1.1、概述 简单工厂模式并不属于GoF 23个经典设计模式&#xff0c;但通常将它作为学习其他工厂模式的基础&#xff0c;它的设计思想很简单&#xff0c;其基本流程如下&#xff1a; 首先将需要创建的各种不同对象的相关代码封装到不同的类中&#xff0c;这些类称为具体…

【IDEA】idea不自动生成target

文章目录 1. 不生成target2. 仅部分文件不生成target2.1. 一般原因就是资源没有设置2.2. 配置编译src/main/java文件夹下的资源文件2.3. 清理缓存&#xff08;王炸&#xff09; 3. 参考资料 本文描述idea不生成target的几种情况以及处理方法 1. 不生成target 像下图这样根本就…

一篇文章搞定Java泛型

目录 介绍 优点 泛型类 语法定义 代码示例 泛型类注意事项 抽奖示例 泛型类派生子类 定义 代码示例 子类是泛型 子类不是泛型 泛型接口 定义 泛型方法 定义 代码示例 泛型方法与可变参数 泛型方法总结 ​编辑类型通配符 定义 代码示例 通配符的上限 定义 …

致敬图灵!HashData拥抱数据智能新时代!

图1&#xff1a;2023ACM中国图灵大会现场 生于1912年的艾伦图灵被称为“计算机科学之父”、“人工智能之父”。1966年&#xff0c;国际计算机协会&#xff08;ACM&#xff09;为了纪念这位卓越的科学家&#xff0c;设立了以其名字命名的ACM图灵奖&#xff0c;以表彰在计算机领…

入门redis你一定需要知道的命令

1、各种数据类型的特点 字符串(string)&#xff1a;普通字符串&#xff0c;Redis中最简单的数据类型 哈希(hash)&#xff1a;也叫散列&#xff0c;类似于Java中的HashMap结构 列表(list)&#xff1a;按照插入顺序排序&#xff0c;可以有重复元素&#xff0c;类似于Java中的Li…

【【51单片机11.0592晶振红外遥控】】

51单片机11.0592晶振红外遥控 红外遥控&#xff0c;51单片机完结 这是初步实现的架构 怎么实现内部的详细逻辑 我们用状态机的方法 0状态时一个空闲状态 当它接收到下降沿开始计时然后转为1状态 1状态下 寻找start 或者repeat的信号 再来下降沿读出定时器的值 如果是start 那…

M 芯片的 macos 系统安装虚拟机 centos7 网络配置

centos 安装之前把网络配置配好或者是把网线插好 第一步找到这个 第二步打开网络适配器 选择图中所指位置 设置好之后 开机启动 centos 第三步 开机以后 编写网卡文件保存 重启网卡就可以了&#xff0c;如果重启网卡不管用&#xff0c;则重启虚拟机即可 “ ifcfg-ens160 ” 这…

黑苹果如何在macOS Sonoma中驱动博通网卡

准备资源&#xff08;百度&#xff1a;黑果魏叔 下载&#xff09; 资源包中包含&#xff1a;AirportBrcmFixup.kext/IOSkywalkFamily.kext/IO80211FamilyLegacy.kext/OpenCore-Patcher 使用方法&#xff1a; 1.将 csr-active-config 设置为 03080000 全选代码 复制 2.在 …

c++数据锁链

题目描述&#xff1a; 创建一个结构体为Node&#xff0c;具有value , next 两个属性&#xff1b; value为整型&#xff0c;用来储存结构体数值&#xff1b; next为Node类型指针&#xff0c;用来指向下一组数据地址&#xff1b; 第1组数据value 5&#xff1b; 第2组数据value …

【C++】STL——list的介绍和使用、list增删查改函数的介绍和使用、push_back、pop_back

文章目录 1.list的使用2.list的增删查改函数&#xff08;1&#xff09;push_front 在list首元素前插入值为val的元素&#xff08;2&#xff09;pop_front 删除list中第一个元素&#xff08;3&#xff09;push_back 在list尾部插入值为val的元素&#xff08;4&#xff09;pop_ba…

TCP三次握手/四次挥手

三次握手 三次握手过程 TCP服务器进程先创建传输控制块TCB&#xff0c;时刻准备接受客户进程的连接请求&#xff0c;此时服务器就进入了LISTEN&#xff08;监听&#xff09;状态&#xff1b;TCP客户进程也是先创建传输控制块TCB&#xff0c;然后向服务器发出连接请求报文&…

【QT 网络云盘客户端】——登录界面功能的实现

目录 1.注册账号 2.服务器ip地址和端口号设置 3. 登录功能 4.读取配置文件 5.显示主界面 1.注册账号 1.点击注册页面&#xff0c;将数据 输入 到 用户名&#xff0c;昵称&#xff0c;密码&#xff0c;确认密码&#xff0c;手机&#xff0c;邮箱 的输入框中&#xff0c; 点…