目录
Rostopic命令系列
Rostopic list系列指令
Rostopic list
Rostopic list -v
Rostopic list /namespace
Rostopic list -b bagFile.bag
Rostopic list -p/-s
Rostopic bw topic_name
Rostopic delay topic_name
Rostopic hz topic_name
Rostopic info topic_name
Rostopic list
Rostopic type topic_name
Rostopic echo系列指令
Rostopic echo --offset topic_name(--offset中是两个-)
Rostopic echo -c topic_name
Rostopic echo --filter “m.data==’str’” topic_name
Rostopic echo -b bagFile.bag topic_name
Rostopic echo -p topic_name
Rostopic echo -p --noarr --nostr topic_name
Rostopic echo -n msg_number topic_name
Rostopic echo topic_name/arg
输出topic_name中指定参数的数据:
Rostopic pub系列之令
Rostopic pub topic_name topic_type arg1 arg2 ……
Rostopic pub topic_name topic_type “arg1,args2…”
Rostopic pub -l Hz_value topic_name topic_type “arg1,args2…”
Rostopic pub -1 topic_name topic_type “arg1,args2…”
Rostopic pub -f yamlFilePath topic_name topic_type “arg1,args2…”
Rostopic find topic_type
和之前的rosnode list一样,这个命令用于列出所有现在正在通信的通信话题名称,无需参数。调用如下:
该命令可以显示出发布者/订阅者与指定话题的关系,即以详尽模式显示topic信息:
列出指定命名空间下的话题:
显示录制文件中包含的topic:
列出功能包中自定义发布方/订阅方所发布/订阅的topic:
“bw”就是bandwidth的简写,该命令行是用来显示两个节点通过我们指定的topic_name话题进行通信的带宽。带宽说白了就是“通信双方的通信速率(比特/秒)”。操作如下:
数据显示的就是每秒进行的通信数据量,用bit/s来表示,window那个数据就代表从开始通信到现在一共进行了多少次通信。
当你的.msg文件中包含Header类对象时,此时你的自定义数据类类型中就已经包含了Header类对象并且将其绑定在你的数据信息中一起发布到订阅端,当你运行完文件publisher和subscriber所在的文件,你就会发现我们可以在订阅端订阅到Header消息:
① publisher端代码运行:
注意:一定在运行前,先执行“source ./devel/setup.bash”命令,启动下一启动项。
② subscriber端代码运行:
注意:一定在运行前,先执行“source ./devel/setup.bash”命令,启动下一启动项。
再运行“rostopic delay /topic_name”就会出现该话题消息所对应的header信息了:
一定要注意,一定要在Header_ros项目文件下运行(我这里的功能包名称为Header_ros)。
这里使用”rostopic delay /topic_name”获取的信息,是通过在通信中捕获header头消息得出的,如果没有header头消息,那么调用该命令无效。
这个命令用于查看话题通信中信息发布的速度:
这个命令用于查看通过指定topic话题相互通信的双方的信息:
这个命令是列出当下项目文件中所有通信的主题:
这个命令用于列出topic_name主题的数据类型,我们这里使用的自定义的话题通信消息文件是person.msg文件:
该命令的作用是用于显示当下实时显示的消息相对于开始通信之时的延迟时间,即该条数据发送的时刻相对于通信开始的时刻来说已经过去多久了:
这个命令和“rostopic echo topic_name”作用一样,如下所示:
如果你看这一条条的数据太不顺眼,可以使用这个命令,该命令可以使得发送完一条信息后自动清屏发送并自动发送下条数据:
我们订阅一个话题,可以看到打印到命令窗口的消息内容:
输出的消息都是yaml格式的,我们使用yaml文件的编写格式来解读以下输出的消息:
1. transforms是个数组(因为以-开头);
2. 数组中每个元素又是个结构体,结构体中的变量结构如下所示:
Header |
seq |
|
stamp |
sec |
|
nsec |
||
Frame_id |
||
Child_frame_id |
||
transform |
translation |
x |
y |
||
z |
||
rotation |
x |
|
y |
||
z |
订阅到的数据全都被放在了名为m的数组中,我们可以使用m来调用所有使用echo订阅到的消息,并结合匹配表达式匹配特定的消息:
使用示例:
我们可以使用python中支持的所有用于逻辑运算的运算符:
符号 |
逻辑运算对象 |
== |
一般用于字符,也可用于数字 |
<= |
一般用于数字 |
>= |
一般用于数字 |
> |
一般用于数字 |
< |
一般用于数字 |
除此之外,还支持表达式结果的匹配:
使用注意事项:
1. 由于transforms本身就是个数组,那为何使用m.transforms[0]呢?不使用m.transforms[n]呢?首先我们使用rostopic echo订阅到许多的数据,那你可以数的清吗?除此之外,当你输入m.transforms[n]且当n不为0时,系统会报错。如果我们输出的消息是transforms一样的数组,那么我们匹配特定消息时,都要使用array[0]形式!
2. 只可以对数字和字符串加以限定,也就是说“逻辑运算对象只可以是数字或者字符串”。
打印出bag录制文件中指定topic_name的消息:
我们在读取bag文件中的消息时,一般使用ros_readbagfile指令,为何呢?
因为rostopic echo -b bagFile.bag topic_name只可以查看指定的话题的消息,也就是对一个话题录制的消息,这太局限了,就拿小车为例“难道我们查看时只查看小车的速度信息吗,按道理来讲,速度信息和小车状态信息应该一同纳入我们的监视范围才可以”。这个命令需要安装,原生版本的ROS并不自带:
ros_readbagfile no module named ‘cryptodome‘_u014154183的博客-CSDN博客_ros_readbagfilehttps://blog.csdn.net/u014154183/article/details/116242626
ROS/Tutorials/reading msgs from a bag file - ROS Wikihttp://wiki.ros.org/ROS/Tutorials/reading%20msgs%20from%20a%20bag%20file#rosbag.2FTutorials.2Freading_msgs_from_a_bag_file.Example_1:
使用ros_readbagfile脚本高效提取bag中的topic数据_易-CSDN博客_ros_readbagfilehttps://blog.csdn.net/weixin_42269667/article/details/116267496由于我们还未将python脚本文件编译成.exe可执行文件,因此对于脚本文件,我们可以进行如下参数传递(先对.py脚本文件使用chmod +x file.py授予可执行权限):
以MATLAB数据格式打印topic_name发布的消息:
注意:
1. 不可以和-c指令一起使用!
2. 以%开头的注释显示以空格分隔开来的数据对应的变量名名称。
在以MATLAB数据格式打印消息时,排除数组(--noarr)、排除字符串(--nostr):
订阅指定topic话题所发出的msg_number条消息之后就自动停止订阅监听:
Rostopic pub发布带有Header类型的简单消息中最难的一步在于发布header类型中的stamp时间戳数据,这个数据是map类型的,因此必须通过如下方式进行发布:
在订阅端使用rosrun命令运行完对应的订阅端对应的源文件之后,会显示如下结果:
一定要切记:
① map类型数据如何输入到命令行中?
rostopic pub /chatter hello_ros/person "header:
seq: 10
stamp: {secs: 10, nsecs: 10}
frame_id: 'earth'
age: 0
height: 0.0
name: 'd'"
map这种键值对类型的数据必须使用{}大括号括起来;
② 细节问题:
假如我们在“stamp:”后面输入数据,切记“一定要在:冒号后面添加空格”,因为我们在命令行输入的信息全都是以字符类型的形式传入”int main(int argc,char* argv[])”main函数入口的,因此在:冒号后面加空格,可以将我们的数据和提示信息分别开来不会混淆。
我们也可以按照一定速率给订阅方发送消息:
① 发送一条消息后就自动结束(once mode):
② 按照一定频率发送消息(rate mode):
订阅端响应如下所示:
③ 只发送一次消息就结束发送,但是此时发布消息的一端并没有结束运行而是挂起等待我们按下”crtl+c”来结束发布端的挂起状态(latch mode):
订阅端响应如下所示:
因为我们在命令行向功能包发布消息,因此首先查找自定义功能包的订阅者:
我们获知“topic_name=/turtle1/cmd_vel,topic_type=geometry_msgs/Twist”,因此我们使用rostopic pub来向订阅/turtle1/cmd_vel的自定义订阅者发布信息:
当输入至“rostopic pub /turtle1/cmd_vel geometry_msgs/Twist”可以使用tab键自动补齐参数,命令行会根据你的topic_type自动补齐你的参数。乌龟节点运动如下所示:
Rostopic pub有四种模式:
输入命令的形式 |
含义 |
Rostopic pub -l |
Latch模式(默认模式),publisher之发送一条消息,然后等待结束publisher的指令 |
Rostopic pub -r |
Rate模式,publisher按照指定的频率进行消息的发布 |
Rostopic pub -1 |
Once模式,publisher发布一次消息之后自动退出运行 |
Rostopic pub -f |
Filter模式,publisher从yaml文件中读取消息然后进行发布,yaml文件中有多少条消息就发布多少条消息 |
输入如下指令之后,乌龟节点以10Hz的频率按照publisher发布的运动信息运动:
Once模式下publisher持续发布3s消息之后自动结束运行。
Yaml文件书写格式注意事项:
1. 按照topic_type格式来书写;
2. 被公布的消息之间要用”---”三个连字符分隔开来,并且”---”单独成一行;
其实,filter模式就相当于若干个once模式的组合,每个消息持续发送3s然后结束发送并且开启下一条消息的发送:
命令行输入负数时的注意事项:
在命令行中,输入true/false/yes/no这类的字符串,常被解析为Boolean类型的变量,为了将其强制类型转换为string类型的字符串,我们可以使用yaml文件的命令行工具:
上面我们讲了“使用topic_name话题名称查找话题对应的消息类型”,这里我们使用topic_type消息类型来查找topic_name话题名称:
一定要注意:每打开一次命令行就要执行以下几句命令,才可以使用rostopic相关命令:
如果我们没有运行”source ./devel/setup.bash”这条命令,就会出现“当我们使用rostopic list来显示出我们所有的topic_name时,会发现我们自定义的话题通信根本没有”,这种情况就是“你没有启动“setup.bash”启动文件所致”。