1. source ROS 2 环境
source ROS 2的基础工作空间可以使用下面的命令:
source /opt/ros/foxy/setup.bash
2. 创建一个新的文件夹
执行类似下面的命令:
mkdir -p ~/dev_ws/src
cd ~/dev_ws/src
另外一个好的习惯是,将你的工作空间中所有的包都放在src
文件夹下。上面的代码在dev_ws
下创建一个src
文件夹,并且进入到该文件夹下。
3 创建功能包
进入到dev_ws/src文件夹,运行创建功能包的指令创建一个新的功能包more_interfaces,并在其中为msg文件创建一个文件夹:
cd ~/dev_ws/src
ros2 pkg create --build-type ament_cmake more_interfaces
mkdir more_interfaces/msg
4 创建msg文件
在more_interfaces/msg
中,创建一个新文件A.msg
,例如:
std_msgs/Header header # Ros header
float32 speed # 车速(km/h)
float32 steerAngle # 转角
如果Header前面没有加std_msgs,编译时会报下面的错误:
fatal error: more_interfaces/msg/detail/header__struct.h: 没有那个文件或目录
22 | #include "more_interfaces/msg/detail/header__struct.h"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/more_interfaces__rosidl_generator_c.dir/build.make:124:CMakeFiles/more_interfaces__rosidl_generator_c.dir/rosidl_generator_c/more_interfaces/msg/detail/A__functions.c.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:206:CMakeFiles/more_interfaces__rosidl_generator_c.dir/all] 错误 2
make[1]: *** 正在等待未完成的任务....
域名必须是由小写的字母或数字的字符以及下划线组成。必须以字母字符开头,不能以下划线结尾,而且不能有连续的两个下划线。因此用steerAngle会报下面错误:
Error processing 'float32 steerAngle' of
'more_interfaces/A': ''steerAngle' is an invalid
field name. It should have the pattern
'^(?!.*__)(?!.*_$)[a-z][a-z0-9_]*$''
5 编译msg文件
打开package.xml,并添加以下行:
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<exec_depend>std_msgs</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
请注意,在编译时,我们需要rosidl_default_generators,而在运行时,我们只需要rosidl_default_runtime。
打开CMakeLists.txt并添加以下行,找到从msg文件中生成消息代码的包::
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(std_msgs REQUIRED)
set(msg_files
"msg/A.msg"
)
rosidl_generate_interfaces(${PROJECT_NAME}
${msg_files}
DEPENDENCIES std_msgs
)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
find_package(std_msgs REQUIRED)
ament_lint_auto_find_test_dependencies()
endif()
返回工作空间根目录,编译功能包:
cd ~/dev_ws
colcon build --packages-up-to more_interfaces
然后开启一个新终端,运行:
. install/local_setup.bash
ros2 interface show more_interfaces/msg/A
此时会看到消息A的内部定义。
或者运行:
ros2 interface list
可以看到msg里面有我们自定义的more_interfaces/msg/A
参考链接:
ROS2教程(入门级):创建ROS2工作空间_车库109的博客-CSDN博客_ros2教程
ROS2入门教程——19. 自定义话题及服务消息类型 - 古月居
ROS2入门教程—自定义话题及服务消息类型_拓展_Roar冷颜的博客-CSDN博客
https://www.csdn.net/tags/NtjakgxsMTIwNDMtYmxvZwO0O0OO0O0O.htmlhttps://www.csdn.net/tags/NtjakgxsMTIwNDMtYmxvZwO0O0OO0O0O.html
ROS2 编译错误和警告_shadowsland的博客-CSDN博客
ROS2官方教程:关于ROS2接口_P2Tree的博客-CSDN博客_ros2 接口
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)