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,否则会报版本错误。当然为了节省空间,我们在安装过程中只需要勾选必需的模块:

ROS2自定义msg和srv数据类型_第1张图片
ROS2自定义msg和srv数据类型_第2张图片
ROS2自定义msg和srv数据类型_第3张图片
  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,找到语句,在它的下面添加3句关于rosidl的依赖。

  rclpy
  std_msgs

  rosidl_default_generators
  rosidl_default_runtime
  rosidl_interface_packages
  1. 编译

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

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

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

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

ROS2自定义msg和srv数据类型_第4张图片
  1. 测试

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

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

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

ROS2自定义msg和srv数据类型_第5张图片
  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++写的节点,都可以使用。

你可能感兴趣的:(控制仿真,python,机器人)