在使用我们自定义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 :
- 添加find_package查找rosidl_default_generators组件
- 添加file语句把所有src/*.msg(如果你的目录跟我的不一样,请自行替换)添加到MSG_FILES变量
- 通过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 :
- 把rosidl_default_generators添加到build_depend
- 把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