大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从ROS1切换到ROS2,在上一篇中,我们一起了解ROS 2中Parameters, 这一篇,我们主要会围绕ROS中另外一个重要的概念“Actions ”来展开。
目录
1 、启动模拟节点
2、 Use actions
3、 ros2 node info
4、 ros2 action list(列表)
4.1 ros2 action list -t
5、 ros2 action info(详细信息)
6、 ros2 interface show(接口结构)
7 、ros2 action send_goal
8、总结
操作(Actions)是ROS 2中用于长时间运行任务的通信类型之一。它们由三部分组成:目标、结果和反馈。Actions基于主题和服务。它们的功能类似于服务,只是动作是可抢占的(您可以在执行时取消它们)。它们还提供稳定的反馈,而不是返回单一响应的服务。
Actions使用客户端-服务器模型,类似于发布者-订户模型(在主题教程中描述)。“Action客户端”节点向“Action服务器”节点发送目标,该节点确认目标并返回反馈流和结果。
到现在,你应该可以轻松地启动turtlesim。打开一个终端,执行如下命令:
ros2 run turtlesim turtlesim_node
打开一个新的终端,启动遥控节点:
ros2 run turtlesim turtle_teleop_key
当您启动/teolep_turtle节点时,您将在终端中看到以下消息:
Reading from keyboard
---------------------------
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.
'Q' to quit.
让我们关注第4行,它对应于一个动作。(第一条指令对应于“cmd_vel”主题,前面在主题教程中讨论过。)
请注意,字母键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
服务器端中止了第一个目标动作,因为它被中断了。
要查看/turtlesim节点的操作,请打开一个新终端并运行命令:
ros2 node info /turtlesim
它将返回/turtlesim的订户、发布者、服务、动作服务器和动作客户端的列表:
nvidia@ubuntu:~$ ros2 node info /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
Service Servers:
/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
Service Clients:
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
请注意,/turtlesim的/turtle1/rotate_absolute操作位于“操作服务器”下。这意味着/turtlesim响应/turtle1/rotate_absolute动作并为其提供反馈。/teolep_turtle节点在Action Clients下的名称为/turtle1/rotate_absolute,这意味着它发送该动作名称的目标。
ros2 node info /teleop_turtle
nvidia@ubuntu:~$ 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
Service Servers:
/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
Service Clients:
Action Servers:
Action Clients:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
要识别ROS图中的所有action,请运行以下命令:
ros2 action list
nvidia@ubuntu:~$ ros2 action list
/turtle1/rotate_absolute
这是ROS图中目前唯一的操作。它控制着海龟的旋转,正如你前面看到的。通过使用ros2 node info<node_name>命令,您还可以知道该操作有一个操作客户端(/teolep_turtle的一部分)和一个操作服务器(/turtlesim的一部分)。
操作具有与主题和服务类似的类型。要查找/tuttle1/rotate_absolute的类型,请运行以下命令:
ros2 action list -t
nvidia@ubuntu:~$ ros2 action list
/turtle1/rotate_absolute
nvidia@ubuntu:~$ ros2 action list -t
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
在每个动作名称右侧的括号中(在本例中仅限/turtle1/rotate_absolute)是动作类型,即turtlesim/action/RotateAbsolute。当您想要从命令行或代码中执行操作时,您将需要此选项。
您可以使用以下命令进一步了解和查看/tuttle1/rotate_absolute操作:
ros2 action info /turtle1/rotate_absolute
会得到如下回复:
nvidia@ubuntu:~$ ros2 action info /turtle1/rotate_absolute
Action: /turtle1/rotate_absolute
Action clients: 1
/teleop_turtle
Action servers: 1
/turtlesim
这告诉了我们之前在每个节点上运行ros2节点信息所学到的内容:/teolep_turtle节点有一个动作客户端,/turtlesim节点有一台动作服务器,用于/turtle1/rotate_absolute动作。
在自己发送或执行行动目标之前,还需要一条信息,那就是行动类型的结构。回想一下,在运行命令ros2 action list-t时,您标识了/tuttle1/rotate_absolute的类型。在终端中输入具有操作类型的以下命令:
ros2 interface show turtlesim/action/RotateAbsolute.action
会得到如下回复:
nvidia@ubuntu:~$ 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
此消息的第一部分位于---之上,是目标请求的结构(数据类型和名称)。下面是结果的结构。最后一部分是反馈的结构。
现在,让我们使用以下语法从命令行发送一个操作目标:
ros2 action send_goal
<values>需要采用YAML格式。
关注turtlesim窗口,并在终端中输入以下命令:
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
会得到如下回复:
nvidia@ubuntu:~$ 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: 5cd8eb561348477abbb532fc816ce792
Result:
delta: 1.5680029392242432
Goal finished with status: SUCCEEDED
所有目标都有一个唯一的ID,显示在返回消息中。您还可以看到结果,一个名为delta的字段,它是到起始位置的位移。要查看此目标的反馈,请在上次运行的命令中添加--feedback。首先,确保改变θ的值。运行上一个命令后,乌龟将已经处于1.57弧度的方向,因此除非您传递新的θ,否则它不会移动。
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback
会看到连续的打印输出:
nvidia@ubuntu:~$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback
Waiting for an action server to become available...
Sending goal:
theta: -1.57
Feedback:
remaining: -1.046811819076538
Goal accepted with ID: 9d189d65de984057ad9c92f6b7580e39
Feedback:
remaining: -1.0308117866516113
Feedback:
remaining: -1.0148117542266846
。。。。。。。。
Feedback:
remaining: -0.006811380386352539
Result:
delta: 1.0400004386901855
Goal finished with status: SUCCEEDED
你将继续收到反馈,剩余的弧度,直到目标完成。
动作就像服务,允许您执行长期运行的任务,提供定期反馈,并且可以取消。
机器人系统可能会使用动作进行导航。动作目标可以告诉机器人移动到某个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),然后在到达目的地后发送最终结果消息。
Turtlesim有一个动作服务器,动作客户端可以向其发送旋转乌龟的目标。在本教程中,您对动作/turtle1/rotate_absolute进行了详细了解,以更好地了解动作是什么、以及它们是如何工作的。
以上就是我今天要分享的内容。纠错,疑问,交流: [email protected]