案例三

需求介绍

已知有两个节点,其中一个节点是Publisher,另外一个节点是Subscriber

Publisher发布的消息是团队数据,包含了以下内容:

名称 类型 描述
name string 团队名称
leader Student 团队领导
intro TODO 团队介绍

现在需要添加intro团队介绍,类型为标准库std_msgs/String类型。

要求实现这个两个节点,并且模拟数据发布和订阅!

业务分析

rosmsg是ros的标准消息库,开发中,有的时候我们需要将标准消息封装到自己的消息中去的。

在此处,我们希望intro的类型是std_msgs/String,我们对Team.msg实际编码为:

1
2
3
string name
Student leader
std_msgs/String intro

Note

Team.msg要去使用std_msgs/Stringstd_msgs/String就是具体类型,通过std_msgs/String intro来去声明。

实现步骤

  1. 首先复杂类型的自定义消息
  2. 实现publisher
  3. 实现subscriber
  4. 模拟数据发布

消息定义流程

1. 修改Team.msg

1
2
3
string name
Student leader
std_msgs/String intro

2. 修改过CMakeLists.txt

修改catkin_package,结果如下:

1
2
3
4
5
6
7
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo_msg
#  CATKIN_DEPENDS roscpp rosmsg rospy
#  DEPENDS system_lib
        CATKIN_DEPENDS message_runtime
)

Tip

为catkin编译提供了依赖message_runtime

检验自定义消息

1. 编译项目

来到工作空间目录下,运行编译

1
catkin_make

2. 查看生成的消息文件

c++的头文件

来到develinclude目录下,如果生成了头文件说明,自定义消息创建成功。

python的py文件

来到devellib/python2.7/dist-package目录下,查看是否生成和package名称相同的目录,以及目录内是否生成对应的py文件。

3. 通过rosmsg工具校验

1
rosmsg show demo_msgs/Student

查看运行结果,运行结果和自己定义的相一致,说明成功。