当前位置:   article > 正文

ROS学习:ROS消息传递——std_msgs_ros发布一个整数

ros发布一个整数

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

可以看到

  1. rosmsg is a command-line tool for displaying information about ROS Message types.
  2. Commands:
  3. rosmsg show Show message description
  4. rosmsg list List all messages
  5. rosmsg md5 Display message md5sum
  6. rosmsg package List messages in a package
  7. rosmsg packages List packages that contain messages
  8. Type rosmsg <command> -h for more detailed usage

使用

rosmsg list

ros会输出工作空间中已经存在的所有类型消息,我们在其中可以找到std_msg包含的所有消息类型

  1. std_msgs/Bool
  2. std_msgs/Byte
  3. std_msgs/ByteMultiArray
  4. std_msgs/Char
  5. std_msgs/ColorRGBA
  6. std_msgs/Duration
  7. std_msgs/Empty
  8. std_msgs/Float32
  9. std_msgs/Float32MultiArray
  10. std_msgs/Float64
  11. std_msgs/Float64MultiArray
  12. std_msgs/Header
  13. std_msgs/Int16
  14. std_msgs/Int16MultiArray
  15. std_msgs/Int32
  16. std_msgs/Int32MultiArray
  17. std_msgs/Int64
  18. std_msgs/Int64MultiArray
  19. std_msgs/Int8
  20. std_msgs/Int8MultiArray
  21. std_msgs/MultiArrayDimension
  22. std_msgs/MultiArrayLayout
  23. std_msgs/String
  24. std_msgs/Time
  25. std_msgs/UInt16
  26. std_msgs/UInt16MultiArray
  27. std_msgs/UInt32
  28. std_msgs/UInt32MultiArray
  29. std_msgs/UInt64
  30. std_msgs/UInt64MultiArray
  31. std_msgs/UInt8
  32. std_msgs/UInt8MultiArray

再用

rosmsg show std_msgs/Int8

可已看到

int8 data
  •  

也就是说,std_msgs/Int8实际上是由一个int8 类型的对象data组成,知道这些信息,我们就能够正确的构造消息发布器和订阅了
要发布一个消息,正确的做法应该是
1.包含相应的头文件
2.定义节点句柄和发布器,要指明发布的数据类型,话题和缓存队列大小
3.定义一个相应数据类型的对象并给其成员赋值
4.发布消息
参考下面代码片段

  1. #include "std_msgs/String.h"
  2. ...
  3. ros::NodeHandle nh;
  4. ros::Publisher pub_int8 = nh.advertise<std_msgs::Int8>("int8", 10);
  5. std_msgs::Int8 msg;
  6. msg.data = 1;
  7. pub_int8.publish(msg);

接收程序类似,也有几点需要注意
1.包含相应的头文件
2.定义节点句柄和订阅器,要指明订阅器订阅的话题,缓存队列大小和回调函数名
3.编写回调函数,回调函数的形参数据类型一定要对应正确的数据类型
4.进入循环

  1. #include "ros/ros.h"
  2. #include "std_msgs/Int8.h"
  3. void int8Callback(const std_msgs::Int8::ConstPtr& msg)
  4. {
  5. ...
  6. }
  7. //这里也可以不用指针接收,则对发布的消息进行拷贝,如
  8. //void int8Callback(const std_msgs::Int8 msg)
  9. int main(int argc, char **argv)
  10. {
  11. ros::init(argc, argv, "int8_sub");
  12. ros::NodeHandle nh;
  13. ros::Subscriber sub_int8 = nh.subscribe("int8", 10, int8Callback);
  14. ros::spin();
  15. return 0;
  16. }

另外,std_msg下还包含了基本数据类型的向量,我们也可以很方便地传递向量,不过除了上面包含的步骤外,向量的赋值要格外注意,应该使用pushback()函数来填充数据。例如一个double类型向量,应该这样发布

  1. std_msgs::Float64MultiArray val;
  2. val.data.push_back(1.0);
  3. val.data.push_back(2.0);
  4. val.data.push_back(3.0);
  5. val.data.push_back(4.0);
  6. val.data.push_back(5.0);
  7. val.data.push_back(6.0);
  8. pub_double.publish(val);

转载地址:https://blog.csdn.net/wengge987/article/details/50614957

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/49900
推荐阅读
相关标签
  

闽ICP备14008679号