消息和消息类型

节点能相互传递消息,节点之间通信也是基于消息。消息类型也就是数据类型数据类型,理解消息的类型很重要,因为它决定了消息的内容。也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪些信息,以及这些信息是如何组织的。正如开篇提到的geometry_msg/Twist ,Twist就是消息类型。

利用rosmsg show geometry_msg/Twist 查看消息类型的详情如下:

geometry_msgs/Vector3 linear

float64 x

float64 y

float64 z

geometry_msgs/Vector3 angular

float64 x

float64 y

float64 z

该例中,linear 和 angular 都是复合域,其数据类型是 geometry_msgs/Vector3。缩进格式表示命名为x,y和z的域,是对应的上级两个域之一的成员。也就是说,geometry_msgs/Twist 消息包含六个成员,并且以两个向量的形式组织,分别为 linear 和 angular。其中每个数值都是基本数据类型 float64,即每个数值都
是 64位浮点型 数据。一般来说,一个复合域是由简单的一个或者多个子域组合而成,其中的每一个子域可能是另一个复合域或者独立的域,而且它们一般也都由基本数据类型组成。同样的思想也出现在 C++以及其他面向对象的编程语言中,即对象的数据成员可能是其他对象。
此外,上述复合域本身也可以作为消息类型。例如,一个具有消息类型 geometry_msgs/Vecotr3 的话题是完全符合语法的假如利用命令 rosmsg show geometry_msgs/Vecotr3 则类型的详情是:

float64 x

float64 y

float64 z

每行一个元素,每个域由基本数据类型(float64)以及域名称(x、y和z)定义。该类型的消息包含三个顶层域,即x、y和z。这种嵌套组织方法有助于提高代码的复用率,尤其是在该系统中很多消息类型共享相同的数据类型。一个常见的例子是 std_msgs/Header 消息类型,其包含一些基本的序列号,时间戳以及坐标系等信息。这种类型将作为一个复合域(一般称作 header)出现在在上百个其他的消息类型中。幸运地是, rosmsg show 命令在显示消息类型时自动向下展开复合域直到基本类型为止,同时使用缩进的形式来展示这种嵌套结构,因此一般没有必要直接查看这些内层结构的消息类型。

消息类型同样可以包含固定或可变长度的数组(用中括号[]表示)和常量(一般用来解析其他非常量域)。比如在 3Dslam 中会用到点云,表示点云的消息 sensor_msgs/PointCloud  则类型的详情是:

Header header

geometry_msgs/Point32[]  points

ChannelFloat32[]       channels

这个消息包含3 d点的集合,加上可选的额外的每一点信息,在给定的帧头每个Point32应解释为一个3 d点。也许表示激光雷达数据的类型rosmsg show sensor_msgs/LaserScan会更好理解,但是这里不再熬述。

理解消息类型的命名:

和ROS里其他的程序一样,每条消息类型都属于一个特定的包。消息类型名总会包含一个斜杠"/",斜杠前面的名字是包含它的包,例如 geometry_msgs/Twist

功能包名:geometry_msgs  类型名称:Twist  消息类型:geometry_msgs/Twist

这种命名方式的好处是把包的名字包含在消息类型名里能避免命名冲突。

举个例子比如:geometry_msgs/Pose 和 turtlesim/Pose 是有区别的消息类型,它们包含了不同的(但概念上是类似的)数据。这也有助于猜测它的含义。例如,消息类型 ModelState 单独出现可能会让人产生迷惑,但是以 gazebo/ModelState 的形式出现后,就会指明这个消息类型是 Gazebo 仿真器中的一部分,而且很有可能包含了这个仿真器中某个模型的状态信息。

今后笔者会结合简单的开发程序继续讲解。

由浅到深理解ROS(4)相关推荐

  1. 由浅到深理解ROS(1)

    ROS机器人操作系统 ( Robot Operating System 或简称 ROS),可以帮助提高机器人软件的开发效率.ROS能够提供类似传统操作系统的诸多功能,如硬件抽象.底层设备控制.常用功能 ...

  2. 由浅到深理解ROS(8)-线程管理

    转自 单线程Spinning ros::spin()是最简单的单线程自旋, 它会一直调用直到结束 用法:  ros::spin(); 另一个单线程spinning是ros::spinOnce(),它定 ...

  3. 由浅到深理解ROS(7)-URDF

    转自 相信许多爱好者止步于昂贵的机器人价格.虽然有了Arduino,但一个载重能力很弱的机器人小车成本也得一两百块钱.搭建自己的机器人更是费时费力. 所以如果你只是普通机器人爱好者,或者还没想好要拿机 ...

  4. 由浅到深理解ROS(3)-命名空间

    全局命名空间: /rosout前面的反斜杠"/"表明该节点名称属于全局命名空间.之所以叫做全局名称因为它们在任何地方(包括代码.命令行工具.图形界面工具等的任何地方)都可以使用.无 ...

  5. 由浅到深理解ROS(5.1)- roslaunch 学习

    oslaunch 用处:将多个rosnode 结合起来,一起运行.这样就不需要一个个的运行. roslaunch格式 (add_two.launch) <launch>         & ...

  6. 由浅到深理解ROS URDF教程

    创建自己的URDF文件 1.1创建树形结构文件 在这部分教程中要创建的将是下面的图形所描述的机器人的urdf文件 图片中这个机器人是一个树形结构的.让我们开始非常简单的创建这个树型结构的描述文件,不用 ...

  7. 由浅到深理解ROS(9)- 几个基本概念的理解 坐标系 包

    1.坐标系 最常用的就是map,odom,base_link,base_laser坐标系,这也是开始接触gmapping的一些坐标系. map:地图坐标系,顾名思义,一般设该坐标系为固定坐标系(fix ...

  8. 由浅到深理解ROS(6)-坐标转换

    转自 ROS 中对于多坐标系的处理是使用树型表示,在机器人自主导航中,ROS会构建这几个很重要的坐标系: base_link: 一般位于tf tree的最根部,物理语义原点一般为表示机器人中心,为相对 ...

  9. 由浅到深理解ROS(2)

    ROS文件系统 用户可以直接参看官网: http://wiki.ros.org/ROS/Tutorials/NavigatingTheFilesystem ROS文件系统中的两个最基本的概念:Pack ...

最新文章

  1. Dubbo基础专题——第一章(带你认识Dubbo)
  2. 电脑族必备的6款神器,第1个都让人惊艳了!
  3. 从不用 try-catch 实现的 async/await 语法说错误处理
  4. DeepMind丢掉了归一化,让图像识别训练速度提升了8.7倍 | 已开源
  5. 网站在收录后还需要做什么?
  6. java 转换上传文档_自己编写JAVA环境下的文件上传组件 (转)
  7. Boost:基于Boost的stream流服务器
  8. android 首页广告显示不出来的,android – Admob插页式广告(全屏)不会显示
  9. JS Number对象常用函数(数字类型常用函数)
  10. jquery jeditable 多选插件 (checkbox or select)
  11. OffsetIndex和TimeIndex分析
  12. Django的设计模式
  13. 数据库设计_SQL数据库设计(数据建模)
  14. install texlive-full on ubuntu
  15. 要么放权,要么输得起 | 卫哲谈战略
  16. 小米蓝牙音响驱动_小米手机绝佳配件,20W无线闪充,支持唤醒小爱,只卖149
  17. 流程图绘图工具 Gliffy 使用简介
  18. AutoJs学习-自动添加微信群好友
  19. 全国各省市区域mysql_中国省市区数据表(MySQL版)
  20. 最新 2022高露洁AI面试真题题库

热门文章

  1. dba_segments和dba_tables的不同
  2. codeforces B. The Fibonacci Segment 解题报告
  3. arry-718 Maximum Length of Repeated Subarray
  4. [Leedcode][JAVA][第914题][最大公约数]
  5. Palindrome subsequence HDU - 4632 区间dp|记忆化搜索
  6. 文件共享服务器地址格式,文件共享服务器配置
  7. 2019昆明计算机会议,计算机 | ACSAC 2019等国际会议信息6条
  8. python实验九答案_Python实验九
  9. python实战项目前后端分离flask_Flask Vue 构建前后端分离的应用
  10. Java NIO学习