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通常用于执行时间比较长的过程,例如可以用于机器人导航上,发送一个导航点,然后我们实时监控导航运动过程,在这个过程当中随时可以取消目标点和发送新的目标点

发布了63 篇原创文章 · 获赞 50 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38649880/article/details/104399746