【ROS2】通讯协议接口 Interface
ROS 系列学习教程(总目录)
ROS2 系列学习教程(总目录)
目录
- 一、接口定义文件
- 1.1 Message (.msg)
- 1.2 Service (.srv)
- 1.3 Action (.action)
- 二、基本数据类型和字段类型
- 三、接口常用命令行
- 3.1 查看接口定义信息
- 3.2 列出所有可用接口
- 3.3 列出特定包的所有接口
- 3.4 列出提供接口的所有包
- 3.5 查看接口的详细类型信息
ROS2 新增了 Interface 的概念,但内容还是原来那一套,可以说是新瓶装老酒。
Interface(接口) 是 ROS 2 中定义节点之间如何交换数据的规范。它严格规定了通信双方使用的数据结构、字段名称和数据类型。
ROS 2 主要支持三种通信模式,对应三种接口类型:
类型 | 通信模式 | 描述 | 适用场景 |
---|---|---|---|
Message (msg ) | 单向异步 | 发布者->订阅者,一次性的数据传递 | 传感器数据、状态信息、日志流 |
Service (srv ) | 双向同步 | 客户端发送请求->服务端处理并返回响应 | 执行命令、查询状态、计算任务 |
Action (action ) | 双向异步 | 客户端发送目标->服务端持续反馈->最终返回结果 | 长时间运行的任务(导航、抓取) |
一、接口定义文件
1.1 Message (.msg)
最简单的接口,用于话题通信。
示例1:geometry_msgs/msg/Twist.msg
# 单行注释以 # 开头# 这表示线性速度分量
geometry_msgs/Vector3 linear
# 这表示角速度分量
geometry_msgs/Vector3 angular
示例2:sensor_msgs/msg/LaserScan.msg
(更复杂)
std_msgs/Header header # 标准头信息,包含时间戳和坐标系
float32 angle_min # 开始扫描角度 [rad]
float32 angle_max # 结束扫描角度 [rad]
float32 angle_increment # 角度增量 [rad]
float32 time_increment # 测量时间增量 [s]
float32 scan_time # 扫描时间 [s]
float32 range_min # 最小有效距离 [m]
float32 range_max # 最大有效距离 [m]
float32[] ranges # 距离数据数组 [m] (可变长度数组)
float32[] intensities # 强度数据数组
1.2 Service (.srv)
用于服务通信,包含请求和响应两部分,用 ---
分隔。
示例:example_interfaces/srv/AddTwoInts.srv
int64 a # 请求部分:第一个加数
int64 b # 请求部分:第二个加数
---
int64 sum # 响应部分:计算结果
1.3 Action (.action)
最复杂,包含目标、反馈、结果三部分。
示例:action_tutorials_interfaces/action/Fibonacci.action
# 目标定义:我们想要计算的斐波那契数列序号
int32 order
---
# 结果定义:最终返回的序列
int32[] sequence
---
# 反馈定义:执行过程中的中间结果
int32[] sequence
二、基本数据类型和字段类型
ROS 2 接口支持丰富的内置数据类型:
类型 | 描述 | 示例 |
---|---|---|
bool | 布尔值 | True , False |
int8 , int16 , int32 , int64 | 有符号整数 | 10 , -5 |
uint8 , uint16 , uint32 , uint64 | 无符号整数 | 255 , 1000 |
float32 , float64 | 浮点数 | 3.14 , -0.5 |
string | 字符串 | "hello world" |
time , duration | 时间和持续时间 | |
array_type[] | 可变长度数组 | float32[] ranges |
array_type[N] | 固定长度数组 | float32[3] position |
三、接口常用命令行
命令语法:
ros2 interface [commands] [options] [params]
3.1 查看接口定义信息
命令[commands] | 选项[options] | 参数[params] | 说明 |
---|---|---|---|
show | 空 | type_name | 打印接口协议字段 |
–all-comments | type_name | 除了接口协议字段,还打印接口的注释 | |
–no-comments | type_name | 除了接口协议字段,不打印任何注释与空格 |
使用示例:
3.2 列出所有可用接口
命令[commands] | 选项[options] | 参数[params] | 说明 |
---|---|---|---|
list | -m | 空 | 列出所有消息接口(msg) |
-s | 空 | 列出所有服务接口(srv) | |
-a | 空 | 列出所有动作接口(action) | |
空 | 空 | 列出所有消息\服务\动作接口 |
使用示例:
列出所有消息接口(msg):
列出所有服务接口(srv):
列出所有动作接口(action):
3.3 列出特定包的所有接口
命令[commands] | 选项[options] | 参数[params] | 说明 |
---|---|---|---|
package | 空 | package_name | 列出所有消息接口(msg) |
使用示例:
3.4 列出提供接口的所有包
命令[commands] | 选项[options] | 参数[params] | 说明 |
---|---|---|---|
packages | -m | 空 | 列出所有提供消息接口的包(msg) |
-s | 空 | 列出所有提供服务接口的包(srv) | |
-a | 空 | 列出所有提供动作接口的包(action) | |
空 | 空 | 列出所有提供消息\服务\动作接口的包 |
使用示例:
3.5 查看接口的详细类型信息
命令[commands] | 选项[options] | 参数[params] | 说明 |
---|---|---|---|
proto | 空 | type_name | 输出接口原型 |
–no-quotes | type_name | 不打印最外层的引号 |
使用示例:
欢迎大家加QQ群,一起讨论学习:894013891