当前位置:网站首页>ROS2系列知识(6):Action服务概念
ROS2系列知识(6):Action服务概念
2022-08-01 16:43:00 【无水先生】
一、背景
Action是 ROS 2 中的一种通信类型,适用于长时间运行的任务。它们由三个部分组成:目标、反馈和结果。
操作建立在主题和服务之上。它们的功能类似于服务,除了可以取消操作。它们还提供稳定的反馈,而不是返回单一响应的服务。
操作使用客户端-服务器模型,类似于发布者-订阅者模型(在主题教程中描述)。 “动作客户端”节点将目标发送到“动作服务器”节点,该节点确认目标并返回反馈流和结果。
二、开启演示方式
启动海龟案例的两个 turtlesim 节点,/turtlesim 和 /teleop_turtle。
打开一个新终端并运行:
ros2 run turtlesim turtlesim_node
打开另一个终端并运行:
ros2 run turtlesim turtle_teleop_key
三、使用动作action
当您启动 /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.
让我们关注第二行,它对应一个动作。 其中:
(G|B|V|C|D|E|R|T对应一条指令,而该指令对应于“cmd_vel”主题。F对应另一个指令,另一个动作)
请注意,字母键 G|B|V|C|D|E|R|T 在美国 QWERTY 键盘上的 F 键周围形成一个“框”(如果您不使用 QWERTY 键盘,请参阅此链接以跟随)。每个键在 F 周围的位置对应于 turtlesim 中的方向。例如,E 会将海龟的方向旋转到左上角。
注意运行 /turtlesim 节点的终端。每次按下其中一个键时,都会向作为 /turtlesim 节点一部分的操作服务器发送一个目标。目标是旋转乌龟以面向特定方向。一旦海龟完成其旋转,应显示一条中继目标结果的消息:
[INFO] [turtlesim]: Rotation goal completed successfully
([INFO] [turtlesim]:轮换目标成功完成)
F 键将在执行过程中取消目标。
尝试按 C 键,然后在海龟完成旋转之前按 F 键。在 /turtlesim 节点正在运行的终端中,您将看到以下消息:
[INFO] [turtlesim]: Rotation goal canceled
[INFO] [turtlesim]:轮换目标取消
不仅客户端(您在 Teleop 中的输入)可以停止目标,服务器端(/turtlesim 节点)也可以。当服务器端选择停止处理一个目标时,它被称为“中止”该目标。
尝试按 D 键,然后在完成第一次旋转之前按 G 键。在 /turtlesim 节点正在运行的终端中,您将看到以下消息:
[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
[WARN] [turtlesim]:在上一个目标完成之前收到轮换目标。中止先前的目标
此操作服务器选择中止第一个目标,因为它有一个新目标。它本可以选择其他方式,比如拒绝新目标或在第一个目标完成后执行第二个目标。不要假设每个动作服务器在获得新目标时都会选择中止当前目标。
四、ros2 节点信息
4.1 查看 /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
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 操作并提供反馈。
4.2 查看 /teleop_turtle节点的操作
/teleop_turtle 节点在 Action Clients 下的名称为 /turtle1/rotate_absolute,这意味着它为该动作名称发送目标。
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
4.3 查看节点对比后结论
/turtlesim和 /teleop_turtle是一对action的服务器、客户端。通过以上信息对比,不难获得下列结论:
1)在ROS2的节点基类中,存在六个基本模块:
- Subscribers:
- Publishers:
- Service Servers:
- Service Clients
- Action Servers:
- Action Clients:
2)六个模块,表示六种身分。每个节点可以是六模块中的任意一个或多个角色。
五、针对于Action的特殊操作
5.1 ros2 action列表
要识别 ROS 图中的所有操作,请运行以下命令:
ros2 action list
返回信息
/turtle1/rotate_absolute
这是目前 ROS 图中唯一的动作服务。
如您之前所见,它控制海龟的旋转。您还已经知道,通过使用 ros2 node info <node_name> 命令,该操作有一个操作客户端(/teleop_turtle 的一部分)和一个操作服务器(/turtlesim 的一部分)。
5.2 ros2 action list -t 动作有类型
类似于主题和服务。要查找 /turtle1/rotate_absolute 的类型,请运行以下命令:
ros2 action list -t
哪个会返回:
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
在每个动作名称右侧的括号中(在这种情况下只有 /turtle1/rotate_absolute)是动作类型,turtlesim/action/RotateAbsolute。当您想从命令行或代码执行操作时,您将需要它。
5.3 ros2 动作信息
您可以使用以下命令进一步检查 /turtle1/rotate_absolute 操作:
ros2 action info /turtle1/rotate_absolute
返回信息:
Action: /turtle1/rotate_absolute
Action clients: 1
/teleop_turtle
Action servers: 1
/turtlesim
这告诉我们之前在每个节点上运行 ros2 节点信息所学到的知识:/teleop_turtle 节点有一个动作客户端,/turtlesim 节点有一个用于 /turtle1/rotate_absolute 动作的动作服务器。
5.4 ros2界面显示
在您自己发送或执行操作目标之前,您需要的另一条信息是操作类型的结构。
Recall that you identified /turtle1/rotate_absolute
’s type when running the command ros2 action list -t
. Enter the following command with the action type in your terminal:
回想一下,您在运行命令 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
此消息的第一部分,在 --- 上方,是目标请求的结构(数据类型和名称)。下一部分是结果的结构。最后一部分是反馈的结构。
5.5 ros2 动作 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 添加到 ros2 action send_goal 命令:
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
您将继续收到反馈,剩余的弧度,直到目标完成。
六、总结
action类似于允许您执行长时间运行的任务、提供定期反馈并且可以取消的服务。
机器人系统可能会使用action进行导航。action目标可以告诉机器人前往某个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),然后在到达目的地后发送最终结果消息。
Turtlesim 有一个动作服务器(Action),动作客户端可以将目标发送到旋转海龟。在本教程中,您明白动作 /turtle1/rotate_absolute,以及是什么,它们如何工作。
Understanding actions — ROS 2 Documentation: Humble documentation
边栏推荐
猜你喜欢
月薪12K,蝶变向新勇往直前,我通过转行软件测试实现月薪翻倍...
酷逼了 Pathetic Dog 第 304 场周赛
5年测试,只会功能要求17K,功能测试都敢要求这么高薪资了?
下载 | 谷歌科学家Kevin P. Murphy发布新书《概率机器学习:高级主题》
暑气渐敛,8月让我们开源一夏!
ECCV 2022 | Poseur:你以为我是姿态估计,其实是目标检测哒
Rancher 部署 DataKit 最佳实践
Vulnhub target drone: HARRYPOTTER_ NAGINI
金仓数据库KingbaseES安全指南--6.3. Kerberos身份验证
清华教授发文劝退读博:我见过太多博士生精神崩溃、心态失衡、身体垮掉、一事无成!...
随机推荐
C#中关于DevExpress的常用操作和帮助类项目工程内容说明
Bugku-Misc-贝斯手
MySQL最大建议行数2000w, 靠谱吗?
C#的DateTime帮助类
阿里官方 Redis 开发规范
【建议收藏】技术面必考题:多线程、多进程
请问nacos 连接mysql失败后会重新连接吗?
如何有效地开发 Jmix 扩展组件
C#的FTP帮助类
08 spark 集群搭建
[Dark Horse Morning Post] Hu Jun's endorsement of Wukong's financial management is suspected of fraud, which is suspected to involve 39 billion yuan; Fuling mustard responded that mustard ate toenails
短剧正在抢长剧的生意
金仓数据库KingbaseES安全指南--6.5. LDAP身份验证
UI helper class for Winform - some components will use DevExpress components
My new book has sold 10,000 copies!
C # Excel helper classes
02 es cluster construction
Path helper class for C#
重庆银河证券股票开户安全吗,是正规的证券公司吗
使用Canvas 实现手机端签名