ROS2学习笔记(六)从turtlesim学习ROS2动作

前言

学习ROS2的路,并不能通过学习ROS1代替,因为ROS2的“内核”不同于ROS1,必须认认真真从头开始重新学习。

Ubuntu版本:20.04

ROS版本:Foxy

学习笔记回顾

1.ros2 action

action是ROS2和ROS1中的一种通信类型,可以解决较复杂的应用层问题。如果需要我们控制机械臂,我们不仅要发出指令,还要机械臂的实时反馈,如果直接使用话题和服务也可以实现,不过需要一下发送好几个话题或者服务,非常麻烦。针对类似的实时性较高,比较复杂的场景,ROS推出了一个应用级的通信机制-action(动作),主要解决需要长时间运行的机器人任务。action由一个话题和两个服务组成:一个任务目标(Goal,服务),一个执行结果(Result,服务),周期数据反馈(Feedback,话题)。

action的功能类似于服务,可以随时停止动作,如果执行过程中发送一个新的action动作,则会直接终端上一个动作开始执行最新的动作。
在这里插入图片描述

2.启动小海龟模拟器

$ ros2 run turtlesim turtlesim_node
$ ros2 run turtlesim turtle_teleop_key

3.使用action

在启动键盘控制节点的终端中,可以看到返回信息:

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.

我们把‘F’作为小海龟,按键G|B|V|C|D|E|R|T都围绕着‘F’,按下键的方向就是在键盘上相对于’F’的方向。每当按下一个按键,会从客户端发送一个action,服务器接收到后就会开始执行响应的动作,此时按下‘F’键可以停止动作,执行完返回的消息如下所示:

[INFO] [turtlesim]: Rotation goal completed successfully

如果先按下‘D’,在还没有完成旋转的情况下,再按下‘G’,这时会中断前一个action的执行,因为action是抢占式的,终端中的提示如下所示:

[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal

4.ros2 action list

列出当前运行的action列表,输入如下命令:

$ ros2 action list
----
/turtle1/rotate_absolute

如果想要更详细的查看action的数据类型,可以使用如下命令查看:

$ ros2 action list -t
----
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

这边的turtlesim/action/RotateAbsolute就是动作类型。

5.ros2 action info

该命令可以查看ROS2动作的信息,输入如下命令:

$ ros2 action info /turtle1/rotate_absolute
----
Action: /turtle1/rotate_absolute
Action clients: 1
    /teleop_turtle
Action servers: 1
    /turtlesim

从中可以看到提供给该action的服务器数量和客户端数量。

6.ros2 interface show查看action数据结构

想要发送一条action的前提下,需要知道action的数据结构。我们上面已经获取到了/turtle1/rotate_absolute的数据类型,使用如下命令查看数据结构:

$ 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

返回的数据中,由---分割为三段,第一段是目标请求的变量,第二段是返回结果的变量,最后一段是周期反馈的变量。

7.ros2 action send_goal

该命令可以发送一个动作目标,命令格式如下所示:

$ ros2 action send_goal <action_name> <action_type> <values>

是yaml格式的,可以尝试着发送一个试试:

$ 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

输完命令后,可以看到小海龟在原地旋转,并且回复了结果数据,当我们加上–feedback参数后,可以看到action的周期反馈,命令如下所示:

$ 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

在旋转过程中会不断显示周期反馈信息。

总结

这就是ROS2中的动作,用于长时间执行一项任务,提供过程中的周期反馈,而且是可以取消或者抢占的。

Reference:

https://docs.ros.org/en/foxy/Tutorials/Understanding-ROS2-Actions.html

结语

本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~

为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接

おすすめ

転載: blog.csdn.net/xiaokai1999/article/details/118946072