9.ROS的通信方式 & topic通信
》》点赞,收藏+关注,理财&技术不迷路《《
总共有四种通信方式。Topic是最常用的通信方式。
Topic 通信方式:
ROS中最常用的通信方式:Topic(topic是以/开头的)
Topic类似于一个频道,A在里面发消息,B订阅这个频道,然后从topic中获取A发送的信息。(采用的是发布和订阅这种消息传递形式,是单向的!!!!!!)
什么是异步?
比如我的node1,是一个摄像头程序,它可以发送一些topic,比如它可以发送RGB图像信息,有些有深度传感器的可以发送深度图。
异步:我这个程序我反正只管发送,我只用publish这些topic就行了,我按我自己方法不断地发送topic就行了,至于谁会获取不管。(在发送的时候调用publish()这个函数,调用完后它就立即返回,不用等待发送完后处理结果)
然后有一个node2,作用是图像处理,它订阅了RGB图像处理,反正只要RGB有消息到了,它就获取,他不管谁发送的。
对于发送者publisher来说,当他发布了这个消息,他不用去等待这个消息的返回状态。对于接收者reciever来说,有消息来了,我就去处理,没有的话我就去干别的事。
一个topic可以对应多个node:
比如这里有一个node3,用户用来监控画面,用来在计算机上显示图像的node。
对应demo演示中:node1发送图片信息的这个程序其实是封装在gezibo这个模拟器中。模拟器中摄像头不断在项RGB和depth两个topic发送数据,这个node3就是之前的image_view,他订阅了RGB这个topic,所以它可以不断获得图像
总结:
异步:publish()方法
一个topic可对应多个subcribers,也可以多对一,多对多。
Message(严格格式要求):
RGB这个topic是传输RGB图像,那么它必须遵循ROS中定义的RGB图像信息的格式,这种数据格式叫做——Message。
Publish的每一条message是一个对象。这个类,类型,定义在package中的*.msg文件中。
基本msg:
具体message组织方法:
Node1 发送一个topic(“/camera-RGB“)给node2
这个topic必须遵循sensor_msgs/Image这个message。这个是ROS自己定义好了的数据类型。Message的定义很像C语言中的结构体或者是是一个类,有高度,宽度,每次发布的内容是一个对象。
Message相关命令:
和之前的rosnode很像。
举例:练习topic/message:
Roslaunch 模拟环境并查看roslist topic
xiangliu@xiangliu-virtual-machine:~$ roslaunch robot_sim_demo robot_spawn.launch
Rostopic可以看出camera发送很多个topic,topic都已是/开头的。
Rostopic info topic
RGB颜色信息是:/camera/rgb/image_raw
这里我们来查看一下这个topic的信息:
可以看到它的Type是sensor_msgs/Image
它的publisher是gazebo
他的Subsribes是None(说明还没有接收摄像头信息)
添加接收者rosrun image_view image_view image:=topic
上面讲到 image_view 是用来接收图像信息的
这里我们运行image_view
发现rosrun image_view这个node的时候出错了
按他的格式修改: 还要指定image topic,如下。
一旦成功运行image_view就会出来图像
这个图像的格式不是什么jpg之类的,而是我们之前查看过的topic info中讲到的*msg类型。
Ros info /camera/depth/image_raw
是一个深度图,它和RGB图像融合后可以形成点云,pointcloud。这些运用在建图,运动上面很有用。
查看一个topic
运行这个topic的接收者
查看message
Rosnode list查看所有node:
Rosnode info node(查看node属性)
/cmd_velocity 这个topic其实就是command velocity 控制速度的一个topic
/cmd_velocity(topic)
这个的publisher是 teleop_twist_keyboard 就是我们的键盘控制
它的subscribers 是gazebo 就是模拟器里面的模拟运动
我想详细查看这个topic(速度控制)具体是什么内容:
可以看出控制速度的message是:geometry_msgs/Twist
Rostopic info / 后会出来下面框,我按前后左右他就会动。Linear和angular,所以这个command_velocity就是接收的linear和angular这两个格式。
rosmsg show type
我要查看它的具体定义:就是:rosmsg show type
所以我们这里是: $ rosmsg show geometry_msgs/Twist
可以看出,线速度可以分为x,y,z三轴的线速度
角速度可以分为x,y,z三轴的角速度。
Rosmsg list(查看系统当前所有message):
这个会把系统当前装上的所有message显示出来。
任务/作业(自学rostopic pub):
使用rostopic pub /cmd_vel 使用这个指令向cmd_vel这个topic发送我们自己定义的东西。
本文地址:https://blog.csdn.net/weixin_48619768/article/details/108178730