1、action是什么样子的?
上图中右侧有4个大方框,每个方框包含了好几个消息,这些消息有一个共有的特点:结尾都是/goal 、 /cancel、 /result、/feedback、 /status,这个方框里的全部就构成了一个action,这与下图的表述也是一致的。
2、moveit用了哪些action?
可以肯定的是,moveit!使用了不止一个action,每个action的名称就是将/goal 、 /cancel、 /result、/feedback、 /status,这些后缀去掉后,前面共有的部分。比如上图中move_group、execute_trajectory、place、pickup,每个action各自掌管着一些行为,这些action我也只能从名字上会意一下,从下图的moveit!结构图中也可以看到,这些action是外部节点与move_group(moveit!的核心)交互的重要桥梁。
3、moveit使用哪个action控制真实机器人?
我们的目的是使用moveit控制真实的机械臂,而我们真正需要的action是FollowJointTrajectoryAction(上图蓝色箭头所指),这个action是moveit留出来专门控制真实机器人的,官网对此的描述如下:
上图英文中也涉及到一点重要概念:关于这个action接口,moveit扮演的角色是客户端,服务端才是我们需要编写的部分,不要搞反了。
然而,从文章最上部的图1可以看出,启动刚开始生成的moveit!配置文件中的demo.launch文件后,节点图中并没有出现FollowJointTrajectoryAction这个action,这是因为刚生成的moveit!配置文件默认是用来控制虚拟机器人的,并不是针对真实机器人的,启动文件里有个参数可以选择是否控制真实机械臂,并且还得自己写/修改几个配置文件,修改后再次启动demo.launch文件,就能看见FollowJointTrajectoryAction,具体方法会写在下一篇博文。这里先提前放个图,预览一下FollowJointTrajectoryAction的样子(红框内话题的前缀是机械臂的名字)。