我的平台是Ubuntu22.04+humble,使用Python语言。下一内容主要是对官方教程的翻译实现。ros2自定义消息等主要包括创建一个包用于集中管理这些信息类型,定义msg、srv的信息结构,修改CMakeLists.txt和package.xml文件,编译。下面是具体内容。
1. 进入工作空间src目录,创建功能包
在创建包的时候,选择 ament_cmake方式创建,编译完成后c++和Python都能使用。
ros2 pkg create --build-type ament_cmake tutorial_interfaces
在改包目录下新建msg和srv两个文件夹,用于存放自己定义的消息和服务类型文件。
mkdir msg
mkdir srv
2. 在msg和srv文件中定义信息结构
这里定义了两种消息,一种只用了简单的数据结构,另一种使用了ros2自带的较复杂的消息。这两种消息在修改cmakelist文件时有区别。
消息1:传递一个int64整数。新建Num.msg文件,内容为:
int64 num
消息2:传递球的球心和半径。新建Sphere.msg文件,内容为:
geometry_msgs/Point center
float64 radius
进入srv文件,新建AddThreeInts.srv文件,用于描述请求三个数a、b、c相加,返回总和sum的服务,请求和返回之间用三个-隔开。
int64 a
int64 b
int64 c
---
int64 sum
3. 修改CMakeList.txt和package.xml文件
在原CMakeList.txt文件中添加以下内容:
find_package(geometry_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/Num.msg"
"msg/Sphere.msg" # 这里各项之间不能用标点符号隔开
"srv/AddThreeInts.srv"
DEPENDENCIES geometry_msgs # 添加以上自定义依赖的ros包, 这里的Sphere.msg使用了geometry_msgs
)
在原package.xml文件中添加以下内容
<depend>geometry_msgs</depend>
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
4. 编译并验证
colcon build --packages-select tutorial_interfaces
编译后在工作空间目录执行下面命令source一下:
. install/setup.bash
查看Sphere消息:
ros2 interface show tutorial_interfaces/msg/Sphere
返回:
geometry_msgs/Point center
float64 x
float64 y
float64 z
float64 radius
5. 编译错误
我的系统还安装了anaconda,如果是在base环境编译的话会出下面的问题(build_type是ament_python时则没有问题):
ImportError: cannot import name 'generate_py' from 'rosidl_generator_py'
解决办法:
不使用anaconda的base环境,deactivate出来,再编译。还不行的话把build、install和log文件夹删除,重新编译。