5.4ROS2_Action介绍 你好,我是小鱼。通过前面章节的学习,你已经掌握了ROS2中四大通信利器中话题、服务、参数这三个,还差最后一个就能将ROS2的通信机制全部打包带回家了,这节课小鱼就带你一起认识一下Action,并带你动手体验一下Action通信。 1.Action背景 前面章节学习了话题、服务、参数。话题适用于节点间单向的频繁的数据传输,服务则适用于节点间双向的数据传递,而参数则用于动态调整节点的设置,动作Action和他们三个有什么不同之处呢? 小鱼举个例子,在前面的章节中王二通过话题获取李四写的小说。张三通过服务向李四购买小说。 流程是张三将钱通过服务给王二,然后王二凑够对应章节数量的小说返回给张三,这个过程看似没有问题,假设你是张三,你就会发现下面这些问题: - 你把100块钱给了王二,你并不知道王二有没有收到自己的钱(不能确认服务端接收并处理目标) - 假设王二收到了,但库存没有100章的小说,王二开始攒小说,此时你也无法得知王二攒小说的进度(没有反馈) - 假设王二攒小说攒一半,你不想要了,也没办法通知王二退款 如果这些问题体现在机器人上,可能是这样子的。我们通过服务服务发送一个目标点给机器人,让机器人移动到该点: - 你不知道机器人有没有处理移动到目标点的请求(不能确认服务端接收并处理目标) - 假设机器人收到了请求,你不知道机器人此时的位置和距离目标点的距离(没有反馈) - 假设机器人移动一半,你想让机器人停下来,也没有办法通知机器人 上面的场景在机器人控制当中经常出现,比如控制导航程序,控制机械臂运动,控制小乌龟旋转等,很显然单个话题和服务不能满足我们的使用,因此ROS2针对控制这一场景,基于原有的话题和服务,设计了动作(Action)这一通信方式来解决这一问题。 2.Action的组成部分 知道了Action的出现原因,接着说说Action的三大组成部分目标、反馈和结果。 - 目标:即Action客户端告诉服务端要做什么,服务端针对该目标要有响应。解决了不能确认服务端接收并处理目标问题 - 反馈:即Action服务端告诉客户端此时做的进度如何(类似与工作汇报)。解决执行过程中没有反馈问题 - 结果:即Action服务端最终告诉客户端其执行结果,结果最后返回,用于表示任务最终执行情况。 > 参数是由服务构建出来了,而Action是由话题和服务共同构建出来的(一个Action = 三个服务+两个话题) ![../_images/行动-单一行动.gif](5.4ROS2_Action介绍/imgs/Action-SingleActionClient.gif) 3.感受Action 带着前面对Action的了解,接着我们一起来了直观的通过小乌龟的案例来感受一下Action的魅力。 3.1 启动乌龟模拟器和键盘控制节点 乌龟模拟器 ``` ros2 run turtlesim turtlesim_node ``` 键盘控制节点 ``` ros2 run turtlesim turtle_teleop_key ``` 打开键盘控制节点后,你应该窗口中可以看到下面的提示 ``` 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. ``` 有请翻译官小鱼(其实用Deppl翻译的) ``` 使用方向键移动乌龟。 用G、B、V、C、D、E、R、T键旋转到绝对方向。'F'可以取消旋转。 ``` 这段提示什么意思呢?其实就是字面的意思, 小乌龟键盘控制节点,提供两种可选的控制方式。 - 方向键,通过话题(Topic)控制小乌龟的(直接发送移动话题) - 绝对旋转,则是采用动作(Action)来控制的小乌龟