ROS2:自定义接口文件(无废话)

发布于:2025-05-07 ⋅ 阅读:(10) ⋅ 点赞:(0)

一、ROS2接口文件定义

 ROS2中接口文件的格式根据通信的类型可以分为三种:

  • 话题通信:.msg文件
    常用格式为:[消息类型] 消息名称
	#话题通信接口格式
	#[消息类型] 消息名称
	int64 num
	int64 sum
	.
	.
	.
  • 服务通信:.srv文件
    常用格式为:
    [请求消息类型] 请求消息名称
    (三个短横杠隔开)
    [响应消息类型] 响应消息名称
	#服务通信接口格式
	#请求
	int64 num
	.
	.
	---
	#响应
	int64 sum
	.
	.
  • 动作通信:.action文件
    常用格式为:
    [请求消息类型] 请求消息名称
    (三个短横杠隔开)
    [响应消息类型] 响应消息名称
    (三个短横杠隔开)
    [反馈消息类型] 反馈消息名称
	#动作通信接口格式 
	#请求
	int64 num
	.
	.
	---
	#响应
	int64 sum
	.
	.
	---
	#反馈
	float feedback
	.
	.

消息变量的类型

  1. 数字型:intXX,floatXX等
  2. 时间类型:time,duration
  3. 字符串类型:string
  4. 变长数组与定长数组
    定长数组例如:int64[100]、float[100]等,变长数组例如 int[]、float[<=100]等
  5. 其它的msg文件(嵌套)
    特别谈一下嵌套,嵌套类型的定义语法为 完整包名/消息类型名的格式(package_name/TypeName)例如:geometry_msgs/Pose current_pose,并且需要在package.xml中包含所依赖的包

字段名必须小写字母开头,并且禁止双下划线与下划线结尾

二、创建接口文件步骤

  1. 工作空间/src下创建功能包(包名全小写):
ros2 pkg create [package_name] --build-type ament_cmake --dependencies [nested_package_name]
  1. 在功能包目录下创建文件夹:(msg\srv\action),并编写相应的接口文件(.msg\.srv\.action接口文件首字母必须大写且不包含下划线
  2. 在package.xml中添加 3 依赖:
<buildtool_depend>rosidl_default_generators</buildtool_depend> <!-- 构建依赖 --> 
<exec_depend>rosidl_default_runtime</exec_depend>              <!-- 运行时依赖 --> 
<member_of_group>rosidl_interface_packages</member_of_group>   <!-- 功能包依赖 --> 
  1. 在CmakeList中添加2编译规则:
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "[msg/srv/action]/xxx.msg/.srv/.action" #自定义
)
  1. 返回工作空间目录下,并执行编译:
colcon build --packages-select [package_name]

三、验证是否创建成功,以及自定义接口文件的使用

  1. 使用命令行工具查看接口:
. install/setup.bash 
ros2 interface show [package_name]/[msg/srv/action]/[interface_name]

如果能成功输出,则说明自定义接口文件成功!

  1. 如何在cpp程序中调用?
  • 首先,需要在package.xml中添加依赖: <depend>[interface_pkgname]</depend>
  • 其次,在CmakeList中加入find_package([interface_pkgname] REQUIRED),并在ament_target_dependencies()中加入interface_pkgname
    以上两步确保编译时能加入接口文件,并且在构建pkg时可以通过参数自动实现依赖添加(–dependencies interface_pkgname)
  • 在程序中引用时,需要包含头文件interface_pkgname/[msg/srv/action]/xxx.hpp
  • 使用时通过命名空间:using interface_pkgname::[msg/srv/action]::xxx引入接口类型。

网站公告

今日签到

点亮在社区的每一天
去签到