ros中引用自定义消息

引用自定义消息

开发过程中,有的时候会碰到传递的数据结构复杂,会有嵌套消息的存在,例如现在需要创建一个Team.msg,基本结构如下:

名称 类型 描述
name string 团队名称
leader 团队领导

在这个设计过程中,我们希望leader这个属性是一个复杂类型,对应着我们之前自定义的Student.msg。那么当前的Team.msg该如何编写。

首先,我们在msg目录下新建Team.msgTeam.msg的内容如下:

string name
Student leader

:::tip

Team.msg要去引用Student.msgStudent就是具体类型,通过Student leader来去声明。

:::

接着,我们要到CMakeLists.txt文件中,修改add_message_files,修改如下:

add_message_files(
        FILES
        Student.msg
        Team.msg
)

:::tip

其实我们就是添加了Team.msg

值得注意的是,Team.msg不能放到Student.msg前面,原因是,Team.msg引用了Student.msg,如果调换位置,编译器会先去编译Team.msg,这个时候编译器是找不到Student.msg,因此会出现错误。

被引用对象要放到引用者的前面。

:::

引用标准消息库

rosmsg是ros的标准消息库,开发中,有的时候我们需要将标准消息封装到自己的消息中去的。例如Team.msg中需要加入一个数据进行描述Team情况:

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

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

string name
Student leader
std_msgs/String intro

:::tip

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

:::

引用其他三方消息

作为自定义的消息,有可能还需要使用三方的消息库,我们在此以geometry_msgs这个三方库作为案例进行说明。

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

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

string name
Student leader
std_msgs/String intro
geometry_msgs/Twist location

引入三方库过程中,我们需要对package.xml文件进行配置添加:

geometry_msgs
geometry_msgs
geometry_msgs

我们还需要对CMakeLists.txt进行修改,在find_package中添加如下:

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rosmsg
  rospy
  message_generation
  geometry_msgs
)

:::tip

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

:::

generate_messages中添加geometry_msgs如下:

generate_messages(
        DEPENDENCIES
        std_msgs
        geometry_msgs
)

:::tip

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

:::

消息类型为数组

作为自定义的消息,有的时候我们需要去定义数组集合来去帮我们存储数据,例如我们要加入members来描述成员:

名称 类型 描述
name string 团队名称
leader Student 团队领导
intro std_msgs/String 团队介绍
location geometry_msgs/Twist 位置
members 团队成员

在此处,我们希望members的类型是Student的数组集合类型,我们对Team.msg实际编码为:

string name
Student leader
std_msgs/String intro
geometry_msgs/Twist location
Student[] members

我们采用[]表示数组,对应中C++中的Vector类型,对应Python中的列表list

你可能感兴趣的:(ros中引用自定义消息)