概要:这篇主要认识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通信类型的一种,目地是长时间运行任务.它们由三部分组成:目标,反馈和结果.
动作由话题和服务构成.它们的功能和服务类似,但动作可被抢占(当动作在执行过程中,你可以把它取消).动作(不仅有响应)也会有一个稳定的反馈,对比服务只是返回单纯响应.
动作使用了客户端-服务器模型,类似发布器-订阅器模型(在话题课程有描述).一个客户端动作节点发送一个目标给动作服务器节点,服务器节点会获取目标并返回一个反馈流(持续的)和一个结果.
(这是一个很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键是取消执行中的目标,证明了动作的抢占式功能.
先按一下c
键,在小乌龟完成转动前键入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> #发送动作指令
这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.
#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈