ROS2自定义msg和srv数据类型

ROS2开发机器人应用时,通信采用话题还是服务,标准的数据类型非常受限,因此需要自定义数据类型,这样在节点间就可以传递更加丰富的数据。本人在摸索过程中踩了无数次坑,贴出来与大家方便。

更权威的指南见ROS官方:Creating custom msg and srv files — ROS 2 Documentation: Foxy documentation

  1. 准备

由于编译过程中必须使用visual studio提供的CMAKE工具,我们必须提前安装好visual studio(很耗磁盘空间,不知道这是不是一种绑架呢?),否则后面编译会报 VisualStudioVersion is not set, please run within a Visual Studio Command Prompt. 错误。不建议安装最新的visual studio,比如我这里就选择了visual studio 2019,否则会报版本错误。当然为了节省空间,我们在安装过程中只需要勾选必需的模块:

  1. 创建新功能包

在工作空间下,使用如下命令创建新功能包:

call C:\opt\ros\foxy\x64\local_setup.bat
ros2 pkg create interface_pkg --build-type ament_cmake --dependencies rclpy std_msgs rosidl_default_generators

第2句里面的interface_pkg是包的名字,可以随便起。记下来,后面编译要用。

  1. 编写自定义数据类型文件

在包目录中,新建两个文件夹 msg 和 srv,分别放话题msg数据类型文件,以.msg为扩展名,和服务数据类型文件,以.srv为扩展名。当然可以放多个.msg和.srv,根据你的需要来。文件名的规定也比较奇葩,只能是字母和数字的组合,下划线是非法的,否则编译时必然报错。当然自定义数据类型也是由基础类型组成的,比如我的RobotPos.msg内容为:

string robot_name
float64[] pos
int64 time_stamp

比如我的RobotLog.srv内容为:

geometry_msgs/Point center
string name

注意数组的定义方法,是int16[] int64[] float64[],诸如此类。

  1. 修改CMakeLists.txt和package.xml

打开包目录下的CMakeLists.txt,找到#find dependencies位置,按如下修改,其中的关键是find_package(rosidl_default_generators REQUIRED)和rosidl_generate_interfaces函数的增加。

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclpy REQUIRED)
find_package(std_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
  # ---msg---
  "msg/RobotPos.msg"
  # ---srv---
  "srv/RobotLog.srv"
  DEPENDENCIES std_msgs # Add packages that above messages depend on.
)

打开包目录下的package.xml,找到<depend>语句,在它的下面添加3句关于rosidl的依赖。

  <depend>rclpy</depend>
  <depend>std_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>
  1. 编译

万事俱备,开始编译。编译一定要使用visual studio的Developer Command Prompt,在系统的开始菜单中可以找到。(不知道为什么只用这一编译工具,却要安装visual studio,没办法)

在打开的黑框中,cd到你的工作空间,输入如下指令开始编译:

call C:\opt\ros\foxy\x64\local_setup.bat
colcon build --packages-select interface_pkg

不出意外就会出现完成的标志:

  1. 测试

新开一个cmd终端,输入指令:

call C:\opt\ros\foxy\x64\local_setup.bat
call install\local_setup.bat
ros2 interface show interface_pkg/msg/RobotPos

如果返回你定义的数据类型,那就表示编译成功了。

  1. 在python节点中调用

新建一个python节点(这是另外一个课题了,可以参考本人的另外一篇博文),导入自定义数据类型:

from interface_pkg.msg import RobotPos

建立一个发布或订阅话题,使用上面的数据类型:

你的发布者 = 你的节点.create_publisher(msg_type=RobotPos, topic=你的话题名称, qos_profile=10)
你的订阅者 = 你的节点.create_subscription(msg_type=RobotPos, topic=你的话题名称, callback=你的回调函数,qos_profile=10)

现在可以在节点间自由传递自定义数据类型了。

结论

  1. 要编译ROS2自定义数据类型,只能选择CMAKE工具。

  1. 必须使用visual studio的Developer Command Prompt进行编译。

  1. 自定义数据类型,应该做成一个单独的功能包,这样无论是python写的节点还是C++写的节点,都可以使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzq02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值