在使用我们自定义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