引用自定义消息
开发过程中,有的时候会碰到传递的数据结构复杂,会有嵌套消息的存在,例如现在需要创建一个Team.msg
,基本结构如下:
名称 | 类型 | 描述 |
---|---|---|
name | string |
团队名称 |
leader | 团队领导 |
在这个设计过程中,我们希望leader
这个属性是一个复杂类型,对应着我们之前自定义的Student.msg
。那么当前的Team.msg
该如何编写。
首先,我们在msg
目录下新建Team.msg
,Team.msg
的内容如下:
string name
Student leader
:::tip
Team.msg
要去引用Student.msg
,Student
就是具体类型,通过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/String
,std_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