ROS消息传递——std_msgs
来源:互联网 发布:枪花和涅槃 知乎 编辑:程序博客网 时间:2024/06/16 08:54
【ROS学习】(四)ROS消息传递——std_msgs
经常看到:from std_msgs.msg import String,这 std_msgs究竟是什么东西,我们一起看看!
ROS中,节点之间通过发布话题和订阅话题来通信,在程序中是通过消息发布器和订阅器来实现,数据流通过话题的发布和订阅在节点之间传播,而数据流的数据类型则称为消息,例如ros入门教程中的节点talker和listener之间通过话题”chatter”来传递数据流,而数据流的具体数据类型则是std_msgs/String。
参见http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29
教程中只介绍了std_msgs/String消息的发布和接收,但我们经常还需要传递其他类型比如整形,字符型等数据,这些类型的如何传递呢?实际上std_msgs中已经包含了所有的基本数据类型,我们可以rosmsg指令对我们不了解的数据类型进行详细的考察。
打开一个新终端,键入:
$ rosmsg -h
可以看到:
rosmsg is a command-line tool for displaying information about ROS Message types.Commands: rosmsg show Show message description rosmsg list List all messages rosmsg md5 Display message md5sum rosmsg package List messages in a package rosmsg packages List packages that contain messagesType rosmsg <command> -h for more detailed usage
使用:
$ rosmsg list
ros会输出工作空间中已经存在的所有类型消息,我们在其中可以找到std_msg包含的所有消息类型。
std_msgs/Boolstd_msgs/Bytestd_msgs/ByteMultiArraystd_msgs/Charstd_msgs/ColorRGBAstd_msgs/Durationstd_msgs/Emptystd_msgs/Float32std_msgs/Float32MultiArraystd_msgs/Float64std_msgs/Float64MultiArraystd_msgs/Headerstd_msgs/Int16std_msgs/Int16MultiArraystd_msgs/Int32std_msgs/Int32MultiArraystd_msgs/Int64std_msgs/Int64MultiArraystd_msgs/Int8std_msgs/Int8MultiArraystd_msgs/MultiArrayDimensionstd_msgs/MultiArrayLayoutstd_msgs/Stringstd_msgs/Timestd_msgs/UInt16std_msgs/UInt16MultiArraystd_msgs/UInt32std_msgs/UInt32MultiArraystd_msgs/UInt64std_msgs/UInt64MultiArraystd_msgs/UInt8std_msgs/UInt8MultiArray
再用:
$ rosmsg show std_msgs/Int8
可以看到:
int8 data
也就是说,std_msgs/Int8实际上是由一个int8 类型的对象data组成。知道这些信息,我们就能够正确的构造消息发布器和订阅器了。要发布一个消息,正确的做法应该是
1.包含相应的头文件
2.定义节点句柄和发布器,要指明发布的数据类型,话题和缓存队列大小
3.定义一个相应数据类型的对象并给其成员赋值
4.发布消息
参考下面代码片段
#include "std_msgs/String.h"...ros::NodeHandle nh;ros::Publisher pub_int8 = nh.advertise<std_msgs::Int8>("int8", 10);std_msgs::Int8 msg;msg.data = 1;pub_int8.publish(msg);
接收程序类似,也有几点需要注意:
1.包含相应的头文件
2.定义节点句柄和订阅器,要指明订阅器订阅的话题,缓存队列大小和回调函数名
3.编写回调函数,回调函数的形参数据类型一定要对应正确的数据类型
4.进入循环
#include "ros/ros.h"#include "std_msgs/Int8.h"void int8Callback(const std_msgs::Int8::ConstPtr& msg){ ...}//这里也可以不用指针接收,则对发布的消息进行拷贝,如//void int8Callback(const std_msgs::Int8 msg)int main(int argc, char **argv){ ros::init(argc, argv, "int8_sub"); ros::NodeHandle nh; ros::Subscriber sub_int8 = nh.subscribe("int8", 10, int8Callback); ros::spin(); return 0;}
另外,std_msg下还包含了基本数据类型的向量,我们也可以很方便地传递向量,不过除了上面包含的步骤外,向量的赋值要格外注意,应该使用pushback()函数来填充数据。例如一个double类型向量,应该这样发布
std_msgs::Float64MultiArray val; val.data.push_back(1.0); val.data.push_back(2.0); val.data.push_back(3.0); val.data.push_back(4.0); val.data.push_back(5.0); val.data.push_back(6.0); pub_double.publish(val);
- ROS消息传递——std_msgs
- 【ROS学习】(四)ROS消息传递——std_msgs
- 【ROS学习】(五)ROS消息传递——自定义消息
- ROS 服务 消息传递
- ROS总结——ROS消息和ROS服务
- ROS总结——ROS消息发布和订阅
- iOS——消息传递
- 在ROS中传递图像消息(一)
- 在ROS中传递图像消息(二)
- ios的消息传递—— performSelector
- ios的消息传递—— performSelector
- 框架——消息传递机制
- 消息传递机制——block
- ios的消息传递—— performSelector
- ios的消息传递—— performSelector
- 进程间通信——消息传递(消息队列)
- Windows应用程序信息传递—消息机制
- ROS:三个节点相互传递消息,每个节点都可以同时发布和订阅主题
- 王道计算机网络--3.5介质访问层
- 慕课网达达租车系统
- 二叉搜索树的后序遍历序列:递归中不要过早return f(左)&&f(右)
- 小希的迷宫(请永远相信c语言的强大)
- ion torrent 下机数据
- ROS消息传递——std_msgs
- angular2项目教程-微型Blog系统4
- JAR包用bat格式调用
- shell bash script to start and stop named services
- JSP中out对象的方法总结
- js如何用正则获取a标签的内容
- 数据库中Date类型数据导入到报表去掉00:00
- FastJson
- DOS DDOS DRDOS原理