ROS2 基础概念 动作
- 1. Actions
- 2. 动作
- 3. 中止目标
- 4. 动作类型
- 5. 动作请求
1. Actions
Actions 动作是ROS 2中的通信类型之一,适用于长时间运行的任务
它们由三部分组成:目标、反馈 和 结果,操作基于话题和服务
它们的功能类似于服务,只是可以取消操作;还提供稳定的反馈(话题),而不是返回单一响应的服务
操作使用客户端-服务器模型,类似于发布-订阅模型(和话题类似)
“行动客户端”节点向“行动服务器”节点发送目标,该节点确认目标并返回 反馈流 和 结果
指令 | 功能 |
---|---|
ros2 action info | 按照类型查找服务 |
ros2 action list | 列出当前活动的服务 |
ros2 action send_goal /action type values | 显示服务的消息类型 |
2. 动作
还是启动海龟及其遥控节点为例:
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
当启动 turtle_teleop_key
时,将在终端中看到以下消息:
使用箭头键移动乌龟,使用G|B|V|C|D|E|R|T键旋转到绝对方向,F’取消旋转。
这里旋转到绝对方向实际用小写的,例如按 “e” 就会转到右上角,在旋转的过程中按 “f” 就会立即停下来。
每次按下其中一个键时,都会向/turtlesim
节点中的动作服务器发送一个目标,目标是旋转乌龟以面向特定方向
海龟完成旋转后,注意/turtlesim
节点正在运行的终端显示了一条动作结果的消息:
[INFO] [turtlesim]: Rotation goal completed successfully
3. 中止目标
试着按 c
键,然后在过程中按 f
键,将看到消息:
[INFO] [turtlesim]: Rotation goal canceled
不仅客户端(在远程操作中的输入)可以停止目标
服务器端(/turtlesim
节点)自身也可以中止目标
再尝试按 d
键,然后按 g
键,将看到消息:
[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
此操作服务器选择中止第一个目标,因为它获得了一个新目标
4. 动作类型
查看动作信息:
ros2 action list
# /turtle1/rotate_absolute
就一个动作,旋转绝对值 rotate_absolute
,控制着海龟的旋转角度绝对值
查看两个节点信息关于动作的信息:
1.节点 /turtlesim
的 动作 /turtle1/rotate_absolute
位于 动作服务器 Action Servers
下,响应动作并为其提供反馈
ros2 node info /turtlesim
# Action Servers:
# /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
# Action Clients:
2.节点 /teleop_turtle
的 动作 /turtle1/rotate_absolute
位于 动作客户端 Action Clients
下,发送该动作名称的目标
ros2 node info /teleop_turtle
# Action Servers:
#
# Action Clients:
# /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
从上还可以看出 动作类型,即 turtlesim/action/RotateAbsolute
ros2 action info /turtle1/rotate_absolute
# Action: /turtle1/rotate_absolute
# Action clients: 1
# /teleop_turtle
# Action servers: 1
# /turtlesim
也可以查到动作服务器和客户端对应的节点和数量
再具体看看动作类型
ros2 interface show turtlesim/action/RotateAbsolute
# The desired heading in radians
# float32 theta
# ---
# The angular displacement in radians to the starting position
# float32 delta
# ---
# The remaining rotation in radians
# float32 remaining
最上面的是目标请求的结构(数据类型和名称),接下来是结果,最后是反馈
5. 动作请求
发布一个动作目标可以通过:
ros2 action send_goal <动作名称> <动作类型> <目标数据>
目标数据需要采用YAML格式
例如:
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 0.01}" --feedback
可以看到目标有一个唯一的ID,显示在返回消息中
还可以看到当前角度反馈,和最终结果(起始角度delta
)
将持续收到反馈,剩余的弧度,直到目标完成
动作就像服务,允许执行长期运行的任务,提供定期反馈,并且可以取消
机器人系统可能会使用动作进行导航
动作目标可以告诉机器人移动到某个位置
当机器人导航到该位置时,它可以沿途发送更新(即反馈)
然后在到达目的地后发送最终结果消息
谢谢