ROS2官网教程学习笔记理解ROS2 actions动作
学习目标: 了解ROS2 actions动作
背景
actions动作是ROS2用于耗时比较长的一种通讯方式。主要由三部分组成: 目标(goal)、结果(result)、反馈(feedback)
actions动作基于话题和服务,它的功能和服务类似,除了它是可以被抢占的(可以在执行时取消它)。而且还提供稳定过程的反馈,而不是向服务一样只进行单一响应反馈。
actions动作使用客户端-服务器模型,类似于发布-订阅模型。客户端节点(action client)向服务器节点(action server)发送一个目标,服务端节点确认目标并返回一个反馈流和一个结果。
准备条件
需要按照turtlesim篇的软件,了解节点话题和服务的概念
学习内容
1. 启动节点
和之前一样先启动两个节点
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
2. 使用 actions动作
当我们启动/teleop_turtle
节点的时候我们可以看到下面这样的信息
Use arrow keys to move the turtle.
Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.
第二行所说的功能就指的是actions动作。
到了这里我得吐槽一下turtle_teleop_key这个节点,不知道是电脑问题还是上面其他原因这个节点在我电脑上CPU占用非常高,而且记得在使用actions动作相关功能的时候键盘要用小写键盘不要用大写,否则没效果。
这里面简单进行一下说明G|B|V|C|D|E|R|T这几个键在F键周围一圈,代表乌龟的8个绝对方向,依次变换45°
当我们在键盘控制的终端(/teleop_turtle
)按下一个键的时候就往actions动作服务器乌龟(/turtlesim)发送一个目标,当乌龟转到设定的角度的时候就会乌龟的终端就会显示下面的消息
[INFO] [turtlesim]: Rotation goal completed successfully
我们通过F键可以看到actions动作可以被打断的特性,随便按下一个键让乌龟转起来,在没有到达目标角度之前按下F,我们会在乌龟的终端看到下面的消息
[INFO] [turtlesim]: Rotation goal canceled
此外actions动作还有一个特性就是只执行最新的目标,当我们连续按下目标角度的时候,新的目标值会覆盖之前的目标,例如按下D马上又按下G,我们在乌龟的终端会看到下面的输出。
[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
3. ros2 node info
我们查看/turtlesim
节点的详细信息
ros2 node info /turtlesim
我们得到有关/turtlesim
节点相关信息
/turtlesim
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
Services:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
/reset: std_srvs/srv/Empty
/spawn: turtlesim/srv/Spawn
/turtle1/set_pen: turtlesim/srv/SetPen
/turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
/turtle1/teleport_relative: turtlesim/srv/TeleportRelative
/turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
/turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
/turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
/turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
/turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
其中的Action Servers: 展示了/turtlesim
节点有关Action动作的信息
通过这些信息我们可以得到/turtlesim
节点相应并进行/turtle1/rotate_absolute
的Action,这是一个服务器端
我接下来再观察/teleop_turtle
ros2 node info /teleop_turtle
返回结果如下
/teleop_turtle
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Services:
/teleop_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
/teleop_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/teleop_turtle/get_parameters: rcl_interfaces/srv/GetParameters
/teleop_turtle/list_parameters: rcl_interfaces/srv/ListParameters
/teleop_turtle/set_parameters: rcl_interfaces/srv/SetParameters
/teleop_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Action Servers:
Action Clients:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
同样我们也看到了名为/turtle1/rotate_absolute
的Action,但是这是作为客户端
4. ros2 action list
通过下面命令我们可以获得当前ros中的所有action
ros2 action list
我们执行过后输出如下
/turtle1/rotate_absolute
4.1 ros2 action list -t
和之前结束话题和服务的命令类似加上-t
选项还可以显示动作的类型
ros2 action list -t
命令输出如下
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
5. ros2 action info
我们还可以针对一个action动作,获得它的信息,例如
ros2 action info /turtle1/rotate_absolute
终端显示如下
Action: /turtle1/rotate_absolute
Action clients: 1
/teleop_turtle
Action servers: 1
/turtlesim
结合之前的操作我们知道/turtle1/rotate_absolute
这个Action目前/turtlesim
为服务器端 /teleop_turtle
为客户端
6. ros2 interface show
我们之前通过ros2 action list -t
知道了Action的消息类型,我们可以用下面命令进而获得消息类型的结构
ros2 interface show turtlesim/action/RotateAbsolute.action
返回结果如下
# 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
通过---
分为三部分,最上面是目标,中间是结果,最后的是反馈的结果
7. ros2 action send_goal
我们可以通过命令行的方式向一个action发送目标
ros2 action send_goal <action_name> <action_type> <values>
我们通过下面的命令向乌龟发送一个目标值
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {'theta: 1.57'}
我们可以看到乌龟在转圈同时终端输出下面的内容
Waiting for an action server to become available...
Sending goal:
theta: 1.57
Goal accepted with ID: f8db8f44410849eaa93d3feb747dd444
Result:
delta: -1.568000316619873
Goal finished with status: SUCCEEDED
所有的Goal都会有一个唯一的ID值,同样终端显示了这个ID。终端同时返回了结果delta
,表示乌龟转动的位移。
前面我们说过action动作有过程反馈,我们可以加上--feedback
参数显示反馈状态。
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {'theta: -1.57'} --feedback
终端会一直输出反馈的结果,直到到达目标角度
Sending goal:
theta: -1.57
Goal accepted with ID: e6092c831f994afda92f0086f220da27
Feedback:
remaining: -3.1268222332000732
Feedback:
remaining: -3.1108222007751465
…
Result:
delta: 3.1200008392333984
Goal finished with status: SUCCEEDED
总结
Actions通常用于执行时间比较长的过程,例如可以用于机器人导航上,发送一个导航点,然后我们实时监控导航运动过程,在这个过程当中随时可以取消目标点和发送新的目标点