创建自定义ros2 message包

在使用我们自定义ros2 message的时候,需要构建一个我们自定义的包,下面是一个以ubuntu 20.04, ros2 foxy为例子的简单构建步骤。

创建message包

source /opt/ros/foxy/setup.bash  #设置ros2环境变量
ros2 pkg create xx               #创建名为xx的自定义message包

需要注意的是xx的名字不是随便起的,需要和idl最顶层的命名空间一致,否则会有“can not get message class for type …”的错误

命令执行完毕后,会创建出一个xx的目录

tree -L 1
.
├── CMakeLists.txt
├── include
├── package.xml
└── src

编写自定义message

编写自定义message存放在src目录下(或者其他你喜欢的目录)。

message是一种.msg为后缀名,记录消息成员及类型的文本文件,和idl差不多,一般可以通过idl转换过来。以我的heartbeat message为例:

$ cd src
$ ls
HeartBeatInfo.msg
$ cat HeartBeatInfo.msg 

uint8	core
uint32	alive_counter
uint32	current_state

修改CMakeLists.txt和package.xml

回到xx目录,需要修改修改CMakeLists.txt和package.xml支持msg文件编译

CMakeLists.txt :

  1. 添加find_package查找rosidl_default_generators组件
  2. 添加file语句把所有src/*.msg(如果你的目录跟我的不一样,请自行替换)添加到MSG_FILES变量
  3. 通过rosidl_generate_interfaces把MSG_FILES编译
.......
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)

file(
  GLOB
  MSG_FILES
  RELATIVE
  ${CMAKE_CURRENT_SOURCE_DIR}
  "src/*.msg"
)

rosidl_generate_interfaces(${PROJECT_NAME}
  ${MSG_FILES}
)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
........

package.xml :

  1. 把rosidl_default_generators添加到build_depend
  2. 把rosidl_interface_packages添加到member_of_group
  .....
  <buildtool_depend>ament_cmake</buildtool_depend>
  <build_depend>rosidl_default_generators</build_depend>
  <member_of_group>rosidl_interface_packages</member_of_group>
  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>
  ......

创建编译脚本

创建一个编译脚本放在xx根目录方便编译

#!/bin/bash
rm -rf build install log
source /opt/ros/foxy/setup.bash  #请自行替换为自己的ros安装环境
colcon build

测试

新启动一个终端,进入xx目录导入环境变量,启动rqt可以观测到你自定义的消息

$ cd xx
$ source install/setup.bash
$ rqt