ROS2教程(⼊门级):理解ROS2的动作(action)
⽬标: 介绍ROS 2中的动作。
背景知识
动作是ROS 2 中⽤来沟通的类型之⼀。 他是为长时间运⾏的任务准备的。 它包括三个部分:⽬标,反馈以及结果。
动作是在话题和服务的基础上构建的。 它的功能类似于服务,但是动作是可以抢占的,意思是, 你可以在节点运⾏时,取消动作。 他同时能够提供稳定的反馈,不像服务,每次都只返回⼀个回复。
动作同样使⽤的是客户端+服务器的模式,类似于发布器与订阅器的模式。 ⼀个动作的客户端节点发送⼀个⽬标到⼀个动作的服务器节点,服务器节点会确认收到这个⽬标并且返回⼀个反馈流和⼀个结果。
前提条件
这个教程建⽴在⼀些概念上,⽐如说,、以及。这个教程会使⽤到,并且不要忘记在启动的每个新的终端上。如何你对上⾯的内容还没看过的,可以戳⼀下,过去了解⼀下。
任务
inspire
1. 设置
启动两个turtlesim的节点, /turtlesim 和 /teleop_turtle。
打开⼀个新的终端,并且运⾏下⾯的指令:
ros2 run turtlesim turtlesim_node
打开另⼀个终端,并且运⾏下⾯的指令:
ros2 run turtlesim turtle_teleop_key
2. 使⽤动作
当你启动这个节点,你会看到你的终端上会打印出下⾯的信息:
U arrow keys to move the turtle.
U G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.
让我们关注第⼆⾏,第⼆⾏是跟⼀个动作有关系的,(第⼀⾏是跟“cmd_vel”这个话题相关的,我们在之前的教程⾥⾯提到过)。
Let’s focus on the cond line, which corresponds to an action. (The first instruction corresponds to the “cmd_vel”topic, discusd previously in the .)
我们可以看到: G|B|V|C|D|E|R|T 这⼏个字母围绕着F ,在键盘上形成了⼀个“盒⼦”。每⼀个按钮相对按键F的位置跟⼩海龟在turtlesim中运动的⽅向有关系。⽐如,按下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. 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_nsor: turtlesim/msg/Color
/turtle1/po: turtlesim/msg/Po
Services:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
/
ret: std_srvs/srv/Empty
/spawn: turtlesim/srv/Spawn
/turtle1/t_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
your love is my drug/turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
/turtlesim/t_parameters: rcl_interfaces/srv/SetParameters
/turtlesim/t_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:天堂英语
注意到 /turtlesim 的 /turtle1/rotate_absolute 这个动作是在动作服务器下⾯的。这就意味着, /turtlesim 会响应并持续回复
/turtle1/rotate_absolute 这个动作。
⽽在/teleop_turtle这个节点,在Action Clients的下⾯有⼀个 /turtle1/rotate_absolute ,这意味着,它会往这个名字的动作发送⽬标。
port什么意思具体可以执⾏下⾯的命令:
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/t_parameters: rcl_interfaces/srv/SetParameters
/teleop_turtle/t_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
广州美容网
Action Servers:
Action Clients:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
4. ros2 action list
为了找到ROS图中所有的action,可以运⾏下⾯的命令:
ros2 action list
会看到下⾯的输出:
/turtle1/rotate_absolute
这个也是当前的ROS图中的唯⼀⼀个动作。就像你在前⾯看到的⼀样,它控制这⼩海龟的旋转。通过
ros2 node info <node_name> 这个命令,你已经知道了这⾥有关于这个动作的⼀个动作客户端以及⼀个动作服务器端。
This is the only action in the ROS graph right now. It controls the turtle’s rotation, as you saw earlier. You also already know that there is one action client (part of /teleop_turtle) and one action rver (part of /turtlesim) for this action from using the ros2 node info <node_name> command.
4.1 ros2 action list -t
动作都有类型,类似于话题和服务。为了找到 /turtle1/rotate_absolute的类型,可以运⾏下⾯的命令:
ros2 action list -t
它会返回下⾯的内容:
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
动作名称右边的中括号⾥⾯的就是动作的类型。当你需要从命令⾏或者代码中执⾏动作的的时候,你就需要知道这个类型。
5. ros2 action info
你可以通过下⾯的命令进⼀步了解/turtle1/rotate_absolute这个动作:
ros2 action info /turtle1/rotate_absolute
它会返回:
Action: /turtle1/rotate_absolute
Action clients: 1
bothering/teleop_turtle
Action rvers: 1
/turtlesim
这也可以了解到之前我们通过 ros2 node info 了解到的信息: /teleop_turtle 这个节点有⼀个动作客户端, /turtlesim 这个节点有⼀个动作的服务器。
6. ros2 interface show
在你准备发送或者执⾏⼀个动作的⽬标之前,还有⼀个信息你需要知道,那就是动作类型的数据结构。
回想起,前⾯已经通过命令: ros2 action list -t确认了 /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 nd goal
现在,让我们使⽤下⾯的语法通过命令⾏发送⼀个动作的⽬标:
人力资源的六大模块
ros2 action nd_goal <action_name><action_type><values>
<values> 需要使⽤YAML格式。
注意看turtlesim的窗⼝,然后输⼊下⾯的命令:
ros2 action nd_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
你应该会看到⼩海龟在旋转,同时你的终端上会出现下⾯的消息:
pm是什么意思Waiting for an action rver to
Sending goal:
theta: 1.57
Goal accepted with ID: f8db8f44410849eaa93d3feb747dd444
freestyle swimmingResult:
delta: -1.568000316619873
Goal finished with status: SUCCEEDED
所有的⽬标都有⼀个独特的ID,显⽰在返回的消息中。你还可以看到结果中有⼀个叫delta的部分,显⽰的是起始位置。
为了看到这个⽬标的持续反馈,在你最后运⾏的⼀个命令加上--feedback的参数。⾸先,确保你已经改变了theta的值。在运⾏了之前的⼀条命令之后,⼩海龟已经处于1.57这个弧度的⽅向上了,所以在你给它传递⼀个新的theta值之前,它是不会运动的。
ros2 action nd_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
在⽬标完成之前,你将会持续收到反馈:还有多少弧度需要转。
总结
动作很像服务,但是他允许你执⾏长时间运⾏的任务,提供规律的反馈,以及他们是可以被取消的。
⼀个机器⼈系统可以使⽤动作来进⾏导航。动作的⽬标可以是告诉机器⼈到某⼀个位置,当机器⼈导航到。这个位置, 它可以⼀路上发送更新,也就是反馈。 最后当他到达⽬标点的时候会返回⼀个结果,这就是他的⽬的地。
下⼀步
现在你已经了解了核⼼的概念了。剩下的⼏个教程会给你介绍⼀些⼯具以及技术使得ROS 2的使⽤更容易。
你可以在接下来的教程⾥⾯,学习到更多关于ROS图的连接相关的内容。可以关注我或者订阅我的专栏:。