一、首先是创建工作空间,使用之前创建的也可以。
二、然后创建功能包,创建功能包时可以指定好依赖的库,否则后面需要自己手动配置(在CMakeList.txt和package.xml文件中加入依赖的库)。
e.g.:ros2 pkg create ros2_interfaces --build-type ament_cmake --dependencies std_msgs
创建了一个名为ros2_interfaces的功能包,依赖的库是std_msgs
msg的创建可以参考:ROS2 编写自定义消息_持之以恒2016的博客-CSDN博客_ros2 自定义消息
过程很详细,按照步骤走不会出错且能编译通过(srv部分可以不用走,只参考msg即可)。我这里就不赘述了,只记录自己的心得 。
===================================================================
1.colcon build编译通过后记得source一遍环境变量,否则无法查找到自定义的msg。
. install/setup.bash
2.CMakeList.txt文件中如果没有使用到其他特殊的库(比如传感器的库geometry_msgs、sensor_msgs等),在自定义消息时,加入这三个库即可,其他的都可以不用:
find_package(std_msgs REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rosidl_default_generators REQUIRED)
并加入消息的名称
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/yourmsgname.msg"
DEPENDENCIES std_msgs
)
3.package.xml文件中加入以下依赖即可
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
如果定义功能包时没有指定依赖库,则还需要加入
<depend>rclcpp</depend>
<depend>std_msgs</depend>
4.ROS2中msg的定义与ROS的有些许不同,
(1)ROS2中的Header定义需要加入依赖的库,否则会报错,例如:
std_msgs/Header header
(2)msg文件名需以大写字母开头,且要注意定义的名称不可太长,最好不要超过2个大写字母的命名,否则编译会报没有那个文件或目录
(3)消息内容的定义需用小写字母,定义消息内容赋值时用大写字母,如FALSE,TRUE等,消息格式不满足要求也会报错
5.ROS2中没有interface命令,无法使用ros2 interface list,虽然msg、srv、action通称为interface,但是需要查看时,应执行:
列举所有的interfaces名称:如
ros2 msg list
ros2 srv list
ros2 action list
查看某个msg的内容,如:
ros2 msg show 功能包/msg/yourmsgname
6.可以在上面博主的例程中修改为自己想要的msg