ROS2学习——(ACTION)

action 是 ROS 2 中的一种通信类型,适用于长时间运行的任务。 它们由三个部分组成:目标(goal)、反馈(feedback)和结果(result)。

action 建立在主题(topic)和服务(service)之上。 它们的功能类似于服务(service),除了操作是可抢占的(您可以在执行时取消它们)。 它们还提供稳定的反馈,而不是返回单一响应的服务。

action 使用客户端(Client)-服务器(Server)模型,类似于发布者(publisher)-订阅者(subscriber)模型(在主题(topic)教程中描述)。 “actionClient客户端”节点将目标(goal)发送到“动作服务器(action server)”节点,该节点确认目标并返回反馈流(stream of feedback)和结果(result)。

1.打开小海龟和海龟控制器

2.使用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.

让我们关注第二行,它对应一个action。 (第一行指令对应于“cmd_vel”主题,之前在topic教程中讨论过。)

请注意,字母键 G|B|V|C|D|E|R|T 在键盘上的 F 键周围形成一个“框”。 每个键在 F 周围的位置对应于 turtlesim 中的方向。 例如,E 会将海龟的方向旋转到左上角。

注意运行 /turtlesim 节点的终端。 每次按下其中一个键时,都会向作为 /turtlesim 节点一部分的操作服务器发送一个目标。 目标是旋转乌龟以面向特定方向。 一旦海龟完成其旋转,应在打开小海龟的终端中显示一条中继目标结果的消息:

[INFO] [turtlesim]: Rotation goal completed successfully

F 键会在执行过程中取消一个目标,展示动作的可抢占特性。

尝试按 C 键,然后在海龟完成旋转之前按 F 键。 在 /turtlesim 节点正在运行的终端中,您将看到以下消息:

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

服务器端中止了第一个目标,因为它被中断了。

3.ros2 node info

运行ros2 node info 可以看到/turtlesim节点的动作(action)信息:

ros2 node info /turtlesim

可以获取节点的subscriber,publisher, service, action server,action client的列表,结果如下:

 

 

可以看到节点/turtlesim的动作(action)/turtle1/rotate_absolute是在Action Servers之下的,也就是说/turtlesim响应该动作(action /turtle1/rotate_absolute)并提供反馈。

而/teleop_turtle节点的动作(action)/turtle1/rotate_absolute(和上面的/turtlesim节点动作名字相同),是在Action Clients下面的,也就是说这个动作只是发送这个动作名字的结果

通过运行:ros2 node info /teleop_turtle

可以得到返回值:

 4. ros2 action list

执行命令:ros2 action list可以获得所有动作列表,执行后返回:

/turtle1/rotate_absolute

这是目前的ROS图中唯一的动作,这个动作控制海龟的旋转。也可以看到,存在一个action client(属于/teleop_turtle),一个action server(属于/turtlesim)

5.ros2 action list -t

通过ros2 action list -t可以获取动作信息,运行后返回值如下:

/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
在action名字后面的方括号里是action 类型,turtlesim/action/RotateAbsolute,当需要从命令行执行动作时,需要这些信息。

5.ros2 action info

运行命令:ros2 action info /turtle1/rorate_absolute,可以得到返回值:

 这里也可以看到之间的信息,存在一个action client(属于/teleop_turtle),一个action server(属于/turtlesim)

6.ros2 interface show 

在发送和执行动作前,还需要知道动作的数据类型的结构,运行命令:
ros2 interface show turtlesim/action/RotateAbsolute

可以得到:

 ---上方的是目标反馈的数据结构,---下方的是结果的数据类型,最后的部分是反馈的数据类型()

7.ros2 action send_goal

目前可以通过命令行发送一个action目标,命令如下:

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

<values>需要时YAML格式

根据上面得到的action_name,action_type,输入下面的指令:

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"

可以看到小海龟转向头朝正上方,同时返回值如下:

 在返回值可以看到,每个目标都有一个独特的ID,返回值中的delta是从起始点的位移值。

在上面的命令行后面加上 --feedback 可以看到反馈值,如:

总结:action和服务比较像,允许执行一个长时间运行的任务,提供反馈,可以取消。

一个机器人系统更适合action进行导航,一个action可以告诉机器人朝一个方向运行,当机器人导航时,可以发送沿途的更新数据和一个最终的结果信息(一旦抵达最终目的地)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值