技术分享 | 初学ROS这个重要概念,你必须要了解

Posted 阿木实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术分享 | 初学ROS这个重要概念,你必须要了解相关的知识,希望对你有一定的参考价值。

前言

相信很多初学ROS的小伙伴,对于ROS消息这个概念,理解不是很透彻,它是怎么定义的,然后又是怎么使用的。本文将会深度讲解ROS消息这个概念,并且告诉大家如何使用ROS自定义消息

一、 ROS消息概念 1.ROS消息概念 ROS消息,作为ROS通信的基础之一。其本质就是数据类型,就和C++中的int,double是一样的。只不过,在ROS中,把ROS消息用面向对象编程的思想来表现,在使用的过程中,被当作对象,定义为一个类。(或者说结构体)。同时其文件后缀为xxx.msg

2.ROS消息例子 如果我们使用 rosmsg show std_msgs/String 这个命令去查看ROS消息,它会返回string data 。由此我们知道了ROS消息的格式为:数据类型 变量名称 这个和 int x没有什么区别。这是一个很简单的消息。如果我们输入这个命令 rosmsg show nav_msgs/Odometry 它的返回如下: 这个消息,看起来很复杂,其实它是嵌套了多个消息。如果我们去看它的源文件,只有

短短的四行,这里只是把它全部展开了。源文件内容如下。

std_msgs/Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist

从源文件中,我们可以知道 pose的类型为geometry_msgs/PoseWithCovariance ,那么这个 geometry_msgs/PoseWithCovariance 是什么类型呢?我们可以通过 rosmsg show xxx这个命令去抽丝剥茧,这里由于篇幅原因,就不演示了。当我们看到最后的时候,就会发现这个pose,就是三个 float64 类型的数据。这也就是为什么在编写代码或者在读源码的时候,会有下面类似的语句。

nav_msgs::Odometry car_odom; car_odom.pose.pose.position.x = 1.0; //只是举例说明

二、 ROS自定义消息使用

前面说了,消息(无论是系统自带还是自定义),其本质是数据类型,格式为 数据类型 变量名称。这里,新建一个文件 Person.msg,其内容为

string name #姓名 uint16 age #年龄 float64 height #身高 uint16 tall=188 #身高的另一种表示

有了这样一个自定义消息文件,我们应该如何去使用呢?在ROS编程中,对于消息,一般有两种用法。

第一种的格式为 功能包名称::消息文件名称::变量名称,

第二种的格式为 功能包名称::消息文件名称 对象(常用)

对于第一种用法,可以直接使用消息文件中的变量。由于在文件中给tall赋予了默认值188,可以直接使用my_tall = ros_beginner::Person::tall。这个语句表示把自定义消息中的tall的默认值赋值给变量my_tall。

同时,第一种用法还可以用于判断和初始化(这里不贴具体代码)。可以这样定义MODE.msg文件

uint8 Mode uint8 Stop=0 uint8 Start=1 uint8 Turn_left=2 uint8 Turn_right=3 uint8 Back=4

在代码中就可以这样去使用

ros_beginner::MODE Current_Cmd; //创建消息对象 /你的代码/ //初始化为stop,stop=0 Current_Cmd.Mode = ros_beginner::MODE::Stop /你的代码/ switch (Current_Cmd.Mode) case ros_beginner::MODE::Start //case 1 /.../ case ros_beginner::MODE::Back //case 4 /.../

对于第二种用法,是ROS开发中比较常用的用法。通过创建自定义消息对象,就可以使用msg文件中的所有变量,使用方法同类。例如

ros_beginner::Person person; //创建对象 person.height = 150; person.name = Tom; person.age = 15;

三、 具体使用的例子

https://gitee.com/loren98/ros_ws.git 将代码从码云上下载到你的工作空间,或者home目录。然后编译运行即可。代码中均有非常详细的代码注解

*总结 * ROS消息本质就是数据类型,在使用的时候被当作对象。最后附上ROS消息数据类型和C++以及python数据类型的对比(图片来自:《ROS机器人编程--从基本概念到机器人应用程序编程实战(表允哲)》)

  • End - 技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把机器人行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在机器人行业,就请关注我们的公众号,我们将持续发布机器人行业最有价值的信息和技术。 阿木实验室致力于前沿IT科技的教育和智能装备,让机器人研发更高效!

以上是关于技术分享 | 初学ROS这个重要概念,你必须要了解的主要内容,如果未能解决你的问题,请参考以下文章

一步步学习设计模式系列之你必须要了解的概念和UML工具

10 个你必须要知道的重要JavaScript 数组方法

10 个你必须要知道的重要JavaScript 数组方法

你必须要知道的雪崩穿透预热更新降级

你必须要知道的软件测试3个主流方式

你必须要知道的软件测试3个主流方式