ROS2入门教程—理解动作(Action)


  之前介绍到的话题和服务是ROS中最重要的两种底层通信机制,但也并不是说能解决所有应用层的问题,举一个例子,如果要让机械臂抓取一个物体,我们不仅要发出指令,还需要获取机械臂的实时反馈,如果直接用话题和服务也可以实现,不过一下得上好几个,有点麻烦。所以针对类似的场景,ROS推出了一个应用级的通信机制——动作( action),主要应用于需要运行一段时间的机器人任务。action也并不是一个全新的机制,而是由底层的三个话题和服务组成:一个任务目标( Goal,服务),一个执行结果( Result,服务),周期数据反馈( Feedback,话题)。action是可抢占式的,由于需要执行一段时间,比如执行过程中你不想跑了,那可以随时发送取消指令,动作终止,如果执行过程中发送一个新的action目标,则会直接中断上一个目标开始执行最新的任务目标。总体上来讲,action是一个客户端/服务器的通信模型,客户端发送一个任务目标,服务器端根据收到的目标执行并周期反馈状态,执行完成后反馈一个执行结果。

在这里插入图片描述

1 启动小海龟仿真器

  打开新终端并运行:

ros2 run turtlesim turtlesim_node

  打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

2 使用action

  在启动键盘控制节点的终端中,可以看到如下日志提示:

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.

  第一条信息提示的指令是使用键盘的上下左右按键发布话题指令来控制小海龟移动的。第二行信息提示的指令,则是通过action来控制海龟转动到指定方向的。按键G|B|V|C|D|E|R|T都是围绕“F”的,以“F”为中心,对应方向的按键就表示控制小海龟的转动到的方向,比如按下“E”,小海龟就会转动到朝向左上方。仔细观察小海龟仿真器,每当按下以上一个按键,相当于从客户端发送了一个action的任务目标,海龟仿真器后台运行的服务器端接收到之后就会开始执行,执行完成后反馈给客户端类似下边的结果:

[INFO] [turtlesim]: Rotation goal completed successfully

   “F”按键就是用来发送action终止指令的。假设你先按下了“C”,小海龟开始执行action,在没有完成该action之前,按下“F”,此时在/turtlesim节点运行的终端可以看到如下输出信息:

[INFO] [turtlesim]: Rotation goal canceled

  再来试试先按下“D”,在完成action前按下“G”,这时终端中会提示:

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

  可以看出,action是抢占式的,后一个action的执行直接中断了前一个action的执行。

3 ros2 node info

  为了查看/turtlesim节点中的动作,开启新的终端并执行以下命令:

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:

  可以看到,Action Servers中有一个动作服务器/turtle1/rotate_absolute,这意味着/turtlesim节点对动作/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

  在Action Clients中有同名的动作客户端/turtle1/rotate_absolute。可见,键盘控制节点发送action目标,海龟仿真器执行action并反馈,action名为/turtle1/rotate_absolute

4 ros2 action list

  action也可以类似话题服务一样查看:

ros2 action list

  在海龟仿真器系统中,可以看到:

/turtle1/rotate_absolute

  如果想要看到更详细的action数据类型,需要加入-t参数:

ros2 action list -t

  此时,在终端中将会输出如下信息:

/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

  这里的turtlesim/action/RotateAbsolute就是action的数据类型,当我们通过终端发送action指令时,知道这个数据类型就可以知道如何发送具体的数据了。

5 ros2 action info

  从list列表中看到的action可以用如下命令查看详情:

ros2 action info /turtle1/rotate_absolute

  看到的结果如下:

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

  这里可以看到提供该action的服务器和客户端的数量。

6 ros2 interface show

  如果我们想发送一个action的目标goal,就需要知道action的具体数据类型和数据结构,刚才我们已经看到/turtle1/rotate_absolute的数据类型是turtlesim/action/RotateAbsolute,那这个数据类型的具体数据结构是什么样的呢?可以使用如下命令查看:

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

  有点像service的数据结构,只不过有两个“---”将数据分成了三段,第一段描述客户端发送的请求目标,第二段描述的是action执行完成后的反馈结果,第三段描述的是action执行过程中的周期反馈。

7 ros2 action send_goal

  可以使用如下命令发布action目标:

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

   <values>同样是YAML格式描述的数据,如下所示:

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

  从以上信息我们可以看到,每一个action目标都有一个唯一的ID。如果先要看到action中的周期反馈,以上命令还需要加一个--feedback参数:

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执行完成前,终端中会不断周期刷新类似反馈信息。好啦,这就是ROS2中的action概念,用于长时间运行某一任务,提供过程中的周期反馈,而且是可以取消或者抢占的。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: "ROS2入门21讲"是一套图文教程,以简单易懂的方式介绍ROS2的基本概念和操作。通过这套教程,读者可以了解Ros2的工作原理,学习如何使用ROS2搭建机器人系统。教程分为21个部分,每个部分讲解一个话题,包括ROS2的体系结构,节点,Topic,服务等。对于初学者来说,这套教程是学习ROS2的良好入门材料。在学习过程中,读者可以循序渐进地学习相关知识,通过实际操作,了解ROS2的核心技术。教程还提供了大量的示例代码和操作指南,帮助读者更好地理解ROS2的操作过程。此外,教程也提供了一些高级内容的介绍,如如何自动部署ROS2应用,如何实现ROS2的多机通信等。总体而言,ROS2入门21讲图文教程是一套非常实用的教程,适合初学ROS2的读者使用。学习这套教程可以让读者了解ROS2在机器人系统中的应用,从而更好地掌握相关技能。 ### 回答2: 如今,ROS成为了机器人领域调试、开发和测试的标准,ROS 2是其最新版本,它主要带来了更快的性能、更好的可靠性和更好的可扩展性等特性。 为了帮助大家更快、更好地学习ROS 2,本着开放、分享、合作的精神,一位名为vxy10的作者为我们制作了《ROS 2入门21讲图文教程》。 该教程分为多个章节,涵盖了ROS 2的基础知识、常用工具的使用以及一些实例案例的讲解等内容。 首先,作者详细阐述了ROS 2的基础概念,例如节点、话题、服务、参数、行为等,为读者提供了一个清晰的整体认识。然后,课程讲解了ROS 2常用的工具和函数,包括Rviz、rostopic、rosnode、rqt等,为新手提供了一个快速入门的方式。接着,课程分别讲解了一些实例案例,例如如何使用 ROS 2进行控制机器人、如何使用ROS 2进行机器人的对话等,为读者提供了一个更加深入的了解。 本教程不仅提供了详尽的代码示例,还有丰富精美的图例,能够帮助读者更好地理解各种概念和示例。此外,每个章节都配有习题和答案,帮助读者巩固所学知识,提高学习效率。 总之,《ROS 2入门21讲图文教程》具有系统性、实用性和互动性等特点,对于想要学习ROS 2的读者来说,是一份非常宝贵的资源。 ### 回答3: ROS2入门21讲图文教程是一篇非常详细的教程,旨在帮助初学者了解ROS2的基本知识和使用方法。这个教程分为21个章节,每个章节都覆盖了ROS2的不同方面和主题。 在第一章中,教程简要介绍了ROS2的概念和优点,让读者了解ROS2的用途和处理能力。第二章讲解了ROS2的安装和设置,包括环境变量的配置和ROS2节点的启动方式。第三章介绍了ROS2的工具,包括rqt图形界面,rviz可视化环境等,这些工具是ROS2开发的关键组成部分。第四章到第十二章讲解了ROS2的核心概念,包括消息传递机制、文件结构、包和节点等,这些都是ROS2开发的重要知识点。第十三章到第十五章讲解了ROS2服务,包括服务器和客户端的创建和使用。第十六章到第十九章讲解了ROS2参数服务器和节点名称,涉及到ROS2开发中的重要概念和工具。最后两章讲解了ROS2的调试方式和使用ROS2与OpenCV进行通信的方法。 整个教程详细、生动、易于理解,其中配图和代码示范也让读者更好地理解和操作ROS2。对于初学者来说,这个教程是入门ROS2的一份非常好的材料,不仅涵盖了大部分基础知识和技能,而且通过大量实例的演示,让读者能够更好地掌握ROS2的使用方法。所以,这个教程是初学ROS2的开发者们不可多得的宝贵资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Roar冷颜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值