一、创建功能包
ros2 pkg create <功能包名称> --build-type ament_cmake --dependencies rosidl_default_generators geometry_msgs
例:
ros2 pkg create ze_msg_interfaces --build-type ament_cmake --dependencies rosidl_default_generators
注意功能包类型必须为:ament_cmake
依赖rosidl_default_generators
必须添加
二、创建文件
cd ze_msg_interfaces/src/
mkdir msg && cd msg
touch RobotPose.msg
其中ros的基础类型有(同时后面加上[]可形成数组)
bool
byte
char
float32
float64
int8
uint8
int16
uint16
int32
uint32
int64
uint64
string
包装类型
即在已有的接口类型上进行包含,比如
uint32 id
string image_name
sensor_msgs/Image
编辑RobotPose.msg文件,我需要如下类型
int32 pose_x
int32 pose_y
float64 pose_pitch
float64 pose_roll
float64 pose_yaw
接着修改CMakeLists.txt
find_package(rosidl_default_generators REQUIRED)
# 添加下面的内容
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/RobotPose.msg"
)
接着修改package.xml
<buildtool_depend>ament_cmake</buildtool_depend>
<member_of_group>rosidl_interface_packages</member_of_group> #添加这一行
<depend>rosidl_default_generators</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
编译
colcon build
自定义接口就完成啦!
三、调用自定义消息接口
例:我在自己创建的另一个功能包中的talk.cpp文件中调用自定义接口
首先修改CMakeLists.txt
find_package(ze_msg_interfaces REQUIRED) #添加这一行
add_executable(talk src/talk.cpp) #talk.cpp是我的节点文件
ament_target_dependencies(talk rclcpp serial ze_msg_interfaces) #添加功能包依赖
修改package.xml文件
添加这一行
<buildtool_depend>ze_msg_interfaces</buildtool_depend>
然后在talk.cpp 里直接添加头文件就可以调用接口了
#include "ze_msg_interfaces/msg/robot_pose.hpp"
接口调用: ze_msg_interfaces::msg::RobotPose