ROS2—自定义话题及服务消息类型

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 接口

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值