案例四

需求介绍

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

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

名称 类型 描述
name string 团队名称
leader Student 团队领导
intro std_msgs/String 团队介绍
location TODO 位置

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

现在需要添加location位置信息,类型为三方库geometry_msgs/Twist。 此处使用这种类型不一定复合实际业务,但是我们可以使用这种类型进行**教学演示**,来**体会这种使用策略**。

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

业务分析

在此处,我们希望location的类型是geometry_msgs/Twist,我们对Team.msg实际编码为:

1
2
3
4
string name
Student leader
std_msgs/String intro
geometry_msgs/Twist location

实现步骤

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

消息定义流程

1. 修改Team.msg

1
2
3
4
string name
Student leader
std_msgs/String intro
geometry_msgs/Twist location

3. 修改package.xml文件

添加依赖配置:

1
2
3
<build_depend>geometry_msgs</build_depend>
<build_export_depend>geometry_msgs</build_export_depend>
<exec_depend>geometry_msgs</exec_depend>

2. 修改过CMakeLists.txt

find_package配置

find_package中添加如下:

1
2
3
4
5
6
7
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rosmsg
  rospy
  message_generation
  geometry_msgs
)

Tip

添加geometry_msgs是方便编译器在查找包时,能找到这个库。

generate_messages配置

generate_messages中添加geometry_msgs如下:

1
2
3
4
5
generate_messages(
        DEPENDENCIES
        std_msgs
        geometry_msgs
)

Tip

此处是为了生成定义好的头文件而去做配置

检验自定义消息

1. 编译项目

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

1
catkin_make

2. 查看生成的消息文件

c++的头文件

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

python的py文件

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

3. 通过rosmsg工具校验

1
rosmsg show demo_msgs/Student

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