ROS2学习笔记7--认识ros2动作actions

Posted 鸿_H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS2学习笔记7--认识ros2动作actions相关的知识,希望对你有一定的参考价值。

概要:这篇主要认识ros2动作actions

环境:ubuntu20.04,ros2-foxy,vscode

2.1.7认识ros2动作actions(原文:https://docs.ros.org/en/foxy/Tutorials/Understanding-ROS2-Actions.html

>>教程>>认识ros2动作actions

你正阅读的是ros2较老版本(Foxy),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html

认识ros2动作actions

目的:探索ros2的动作

课程等级:初级

时长:15min

目录

1.背景
2.预备知识
3.步骤
3.1设置
3.2使用动作
3.3 ros2 node info
3.4 ros2 action list
3.5 ros2 action info
3.6 ros2 interface show
3.7 ros2 action send_goal
4.总结
5.下一步
6.相关内容

1.背景

动作是ros2通信类型的一种,目地是长时间运行任务.它们由三部分组成:目标,反馈和结果.

动作由话题和服务构成.它们的功能和服务类似,但动作可被抢占(当动作在执行过程中,你可以把它取消).动作(不仅有响应)也会有一个稳定的反馈,对比服务只是返回单纯响应.

动作使用了客户端-服务器模型,类似发布器-订阅器模型(在话题课程有描述).一个客户端动作节点发送一个目标给动作服务器节点,服务器节点会获取目标并返回一个反馈流(持续的)和一个结果.
图片.png
(这是一个很nice动态图,建议原文链接查看)

2.预备知识

这节课使用的概念,如节点和话题,都在前面课程有介绍.

这节课使用的是小乌龟仿真turtlesim

老规矩,别忘记在新打开终端source一下配置文件(环境变量)(个人,如果ros2的环境变量写到启动脚本.bashrc里面,没必要再source一次了).

3.步骤

3.1设置

打开两个终端,分别运行turtlesim的两个节点/turtlesim/teleop_turtle

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

3.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.

让我们专注于第二行,其对应一个动作.(第一个指令相当于前面话题课程所讨论的“cmd_vel” 话题)

可以发现G|B|V|C|D|E|R|T字母键围着键盘字母F围成一个盒子.每个键围绕F的位置相当于小乌龟的取向.例如,E让小乌龟往左上角旋转.

注意运行/turtlesim节点的终端(输出)是在变换的.你每次按一次键盘,你就是发送一个目标到动作服务器,该服务器也是节点/turtlesim的一部分.目标是旋转小乌龟朝向指定方向.一旦小乌龟完成旋转,一条表示目标(执行)结果的消息显示出来:

[INFO] [turtlesim]: Rotation goal completed successfully

F键是取消执行中的目标,证明了动作的抢占式功能.

先按一下键,在小乌龟完成转动前键入.运行节点/turtlesim的终端,你会看到这么一条消息:

[INFO] [turtlesim]: Rotation goal canceled

不仅客户端(从键盘输入)可以抢占目标,服务器端(运行节点/turtlesim)也是可以的.当服务器端抢占了动作,会导致目标的中断执行.

尝试按着D键,然后在旋转运动完成前按着G键.运行节点/turtlesim的终端,你会看见信息:

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

由于受到打断,服务器端中断目标(的继续执行).

3.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:

注意到/turtlesim的动作/turtle1/rotate_absolute是在动作服务器Action Servers的.这就表示/turtlesim会对动作/turtle1/rotate_absolute作出响应和反馈.

/teleop_turtle节点有/turtle1/rotate_absolute处于动作客户端Action Clients下面,意味着该节点可以发送目标.

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

3.4 ros2 action list

为了认识ros网络所有的动作action,输入指令:

ros2 action list

返回:

/turtle1/rotate_absolute

现在ros网络里面仅有一个动作.它控制着小乌龟的旋转,正如之前所见那样.通过ros2 node info <node_name>指令,你也已经知道有一个动作客户端(/teleop_turtle的一部分)和一个动作服务器(/turtlesim的一部分)组成该动作的.

3.4.1 ros2 action list -t

动作类似话题和服务,同样有类型属性.运行下面指令,找出/turtle1/rotate_absolute的类型:

ros2 action list -t

会返回:

/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

每个动作名称(本案例只有一个动作/turtle1/rotate_absolute)的右侧括号表示的是动作类型,turtlesim/action/RotateAbsolute.当需要从命令行输入代码执行一个动作时,你会需要它的.

3.5 ros2 action info

你可以使用指令进一步了解动作/turtle1/rotate_absolute

ros2 action info /turtle1/rotate_absolute

将会返回:

Action: /turtle1/rotate_absolute
Action clients: 1
    /teleop_turtle
Action servers: 1
    /turtlesim

之前运行指令ros2 node info获取所有节点,这可以告诉我们:对于动作/turtle1/rotate_absolute,节点/teleop_turtle有一个动作客户端,节点/turtlesim有一个服务器客户端.

3.6 ros2 interface show

在发送或执行动作目标之前,你需要很多动作类型结构信息.

回想你获取动作/turtle1/rotate_absolute的类型时,使用到指令ros2 action list -t.在你的终端输入如下指令,并包含动作的类型:

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

第一部分信息,在---上方,是目标请求的结构(数据类型和名字).第二部分信息是结果的结构.最后一部分是反馈的结构.

3.7 ros2 action send_goal

现在,遵循下面语法,从命令行发送一个动作目标:

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

<values>要符合yaml格式

看着turtlesim窗口,输入如下指令:

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

正如反馈信息所示,每个目标都有一个独特的id.你也可以看到这个结果,带有delta的一段字段,其是起始位置的位移.

看看目标的反馈,添加--feedback到你最后运行的指令.首先,你肯定修改了theta量值.运行之前的指令,这个小乌龟已经在1.57弧度取向上,只有当你输入新的theta,小乌龟才会移动.

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

你继续接受反馈,(发送)剩下弧度,直到目标完成.

4.总结

动作就像服务允许你执行长时间运行的任务,定期提供反馈,并可(随意)取消。

一个机器人系统可能使用动作来导航.一个动作目标可以告诉机器人运动到一个位置.当机器人运动到该位置过程中,它会一路持续更新(如反馈),然后,一旦到达目标点会有一个最后结果信息.

Turtlesim有一个动作服务器,动作客户端可以发送目标去转动小乌龟.在本课程,你了解动作/turtle1/rotate_absolute,对动作是什么以及工作原理有了更好的认识.

5.下一步

现在,你已经学习了ros2所有核心的概念.过去几个“用户”组教程给你介绍一些工具和技术,这将使你使用ROS2更容易.开始使用rqt工作台.

6.相关内容

你可以阅读这里(https://design.ros2.org/articles/actions.html)了解更多关于ROS2动作背后知识.

其他

动作actions也是节点node通信方式之一,其跟话题(发布-订阅),服务(请求-响应)区别在于,其模式为,目标-反馈-结果.

个人认为重点:

ros2 action list #所有动作罗列

ros2 action list -t #动作罗列并附加动作类型

ros2 action info /turtle1/rotate_absolute #动作类型信息概述

ros2 interface show turtlesim/action/RotateAbsolute #动作类型信息详细展开

ros2 action send_goal <action_name> <action_type> <values> #发送动作指令

这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.

#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈

以上是关于ROS2学习笔记7--认识ros2动作actions的主要内容,如果未能解决你的问题,请参考以下文章

ROS2学习笔记21--编写action服务器和客户端(C++)

ROS2学习笔记3--认识ros2节点node

ROS2学习笔记6--认识ros2参数parameters

ROS2学习笔记5--认识ros2服务services

ROS2学习笔记4--认识ros2话题topic

ROS2学习笔记15--创建自定义ros2接口文件msg和srv