消息和消息类型

节点能相互传递消息,节点之间通信也是基于消息。消息类型也就是数据类型数据类型,理解消息的类型很重要,因为它决定了消息的内容。也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪些信息,以及这些信息是如何组织的。正如开篇提到的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(5)- launch启动文件的理解与编写

    ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...

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

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

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

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

  5. 由浅到深理解java反射

    1.基础概念 class类: 1.1java是面向对象的,但是在java中存在两种东西不是面向对象的 一种是普通的数据类型,这也是封装数据类存在的原因. 二种是静态静态成员. 1.2所以我们首先要理解 ...

  6. JavaScript基础知识从浅入深理解(一)

    JavaScript的简介 javascript是一门动态弱类型的解释型编程语言,增强页面动态效果,实现页面与用户之间的实时动态的交互. javascript是由三部分组成:ECMAScript.DO ...

  7. Stage3d 由浅到深理解AGAL的管线vertex shader和fragment shader || 简易教程 学习心得 AGAL 非常非常好的入门文章

    Everyday Stage3D (一) Everyday Stage3D (二) Triangle Everyday Stage3D (三) AGAL的基本概念 Everyday Stage3D ( ...

  8. 从浅入深——理解JSONP的实现原理

    由于浏览器的安全性限制,不允许AJAX访问 协议不同.域名不同.端口号不同的 数据接口,浏览器认为这种访问不安全: 可以通过动态创建script标签的形式,把script标签的src属性,指向数据接口 ...

  9. 浅入深出之Java集合框架(下)

    Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...

随机推荐

  1. canvas实现"雷达扫描"效果

    今天来讲解“雷达扫描”效果demo,来源于QQ群里边有群友说想要个雷达效果,就尝试写了一下. 效果图: demo链接: https://win7killer.github.io/can_demo/de ...

  2. android 管理wifi

    activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  3. 【Linux】CentOS7上设置快捷键 随时补充

    ---------------------------------------------------------------------------------------------------- ...

  4. windows和linux之间上传下载文件的两种方法

    一    用rz和sz http://blog.csdn.net/register_man/article/details/53860774 http://www.jb51.net/article/7 ...

  5. 2016.6.30 java.util.concurrent.ExecutionException java.lang.OutOfMemoryError

    选中ccs项目后,选择debug on server,但是运行到一半,跳出错误: java.util.concurrent.ExecutionException: java.lang.OutOfMem ...

  6. sql取随机结果集

    应用场景: 某日,接产品姐姐需求,网站搜索页在搜索特定的内容时候,会现实搜索不到结果!如衣服网站,搜索鞋子等.为了不直接呈现一个赤裸裸的无此商品页面,so,需要在搜索商品件数小于3时,在下面随机推荐本 ...

  7. Tomcat、Weblogic、JBoss、GlassFish、Resin、Websphere弱口令及拿webshell方法总结 [复制链接]

    1.java应用服务器    Java应用服务器主要为应用程序提供运行环境,为组件提供服务.Java 的应用服务器很多,从功能上分为两类:JSP 服务器和 Java EE 服务器.1.1  常见的Se ...

  8. ionic中actionsheet在安卓中显示样式问题

    可以看到在浏览器上是正常的,在安卓上的样式没了 建议不要直接去动ionic的css文件,容易影响全局 方法:注释掉_action-sheet.sass中文件123行,针对安卓样式去写的样sass 保存 ...

  9. vueAdmin使用动态路由时踩坑

    在路由守护方法router.beforeEach中如果有使用动态路由,注意此时的路由对当前的router无效,下次路由时才起效. 导致的问题是---- 当页面刷新或重新打开页面时,无法找到当前路由(跳 ...

  10. javascript判断是否为数组 面试题

    1.方法 instanceof:多框架下有问题(看示例代码). Object.prototype.toString.call():兼容性很好 Array.isArray: IE9+以上 constru ...