Moveit的前身是PR2机器人的机械臂的代码包,之后被集成为一个软件包。它不仅可以实现单个机械臂的控制。而且可以实现两个机械臂的协调控制。而且可以RGB摄像头采集外部障碍物信息,完成自主避障这样的功能。由一系列移动操作的功能包组成,运动规划,操作控制,3D感知,运动学,控制与导航算法。同时提供友好的GUI界面。系统架构如下图所示:
在这里面有一个非常核心的节点,是move_group节点,类似于rosmaster在ros当中的地位。如上图所示,move_group处于中心的这样一个位置,其他的组件跟move_group有一个数据上的交互,它本身并不具备丰富的功能,主要是其他插件的集成,通过消息或者服务的形式来接收机器人发布的一些信息。左边是一系列的插件,能够帮助我们去完成程序编程的接口,还有一些可视化的接口。ROS参数服务器里面主要有机器人的模型参数。 URDF:robot_description参数,获取机器人URDF模型的描述信息。SRDF:robot_description_semantic参数获取机器人模型的配置信息。config:机器人的其他配置信息,例如关节限位,运动学插件,运动规划插件等。另外一个很重要的部分就是机器人,通过摄像头或者其他的外部感知设备采取到外部的障碍物信息等,然后将其发布到move_group里面,能够实现自主避障这样的一个功能。机器人的状态信息也可以发布到move_group里面,通过action实现通讯,完成控制。里面含有大量的插件,我们也可以自己设计自己的插件,只要满足插件的形式就可以了。
我们看一下机器人运动规规划器的插件结构,假设我们已经知道了机器人的初始姿态,和目标姿态,和周围环境的模型参数,那我们就可以通过某种算法,找到一条路径,使得机器人能够从初始姿态到达目标姿态,且在路径中不跟周围物体或自己发生碰撞。这种方法就是机械臂的路径规划算法。我们也可以使用双目摄像头,或者单目摄像头来帮助我们实现对周围物体的感知,更好地规划算法。所以运动规划器就是来帮助我们实现运动规划的这样一个插件。
我们实现机器人的运动规划是有一系列的约束条件的,约束条件是通过配置文件来实现的,在规划请求适配器组里面有很多的插件,能够实现很多小功能。比如说一个运动规划请求输入进来,我们发现机器人的初始位姿并不是这样一个初始位姿,然后我们就可以通过适配器来修正初始位姿等这样一些信息。 如果我们需要机器人夹取桌子上的杯子的话,我们就需要把桌子的模型和杯子的模型去告诉我们的moveit。这个就是通过规划场景监听器来实现的,监听器可以监听下图的这些感知信息。
从上诉可知,moveit里面有很多插件,能够帮助我们实现相应的功能。Moveil使用步骤: 1.组装:创建机器人URDF模型 2.配置:使用Moveil!Setup Assistant工具生成配置文件 3.驱动:添加机器人控制器插件(controller) 4.控制:Moveit!控制机器人运动(算法仿真、物理仿真)。 那么我们如何来创建机器人的模型呢?可以在视频的源码包里面找到相关的源码,视频里面也有对模型做相关的解释。launch文件如下,主要是加载模型,发布节点信息,运行可视化界面/
功能包编译完成之后,我们使用以下命令来查看一下:
roslaunch marm_description view_arm.launch
我们已经创建了一个机械臂,接下来我们需要创建配置文件,这个配置文件的生成我们需要使用moveit里面的工具,Moveit Setup Assistant。可以帮助我们通过可视化的形式完成一系列的配置工作,这个工具可以通过以下命令启动。
roscore
rosrun moveit_setup_assistant moveit_setup_assistant
启动之后会弹出如下的界面:
主界面里面有两个选项,一个是创建一个新的包,一个是编译已有的包。 这里我们选择创建一个新的功能包,
接下来我们需要去找到我们的配置文件,选中我们的模型文件,然后点击右下角的加载模型按钮:
这样的话我们的第一步加载机器人模型就创建好了。 第二步我们需要去点击左边列表的第二个选项,主要是采样一系列的检测点,去检测机械臂的各各关节在运动的过程当中是否会发生碰撞,在这一步我们只需要去点击Generate Collision Matrix按钮就能够自动地去完成采样和计算,通过这样一系列的数据,我们在后面去做运动规划的时候,就可以提高运算的效率。
第三个步骤是虚拟关节,这个虚拟关节我们这里用不到,比如说我们需要将机械臂固定到一个底盘上面。这里的话我们直接跳过这里,到第四个步骤,运动规划组。 在这里我们可以去添加几个规划组,我们的控制都是通过规划组来控制的。比如说我们的机器人,我们可以将其分开成两个部分,一个是六轴机械臂的部分,另外还有一个就是夹爪的部分。那么我们可以将这两个部分分开,去配置相关的规划组。我们可以通过点击右下角的按钮来对其进行添加。第参数是规划组的名称、运动学求解器是什么、运动学求解器的基本参数。
接下来点击Add Kin. Chain来做配置,
按照上图将其配置完成,之后点击save
我们还要配置夹爪,点击右下角的Add Group,然后填写名称,由于夹爪是直线运动,并不需要运动学的求解器,我们也不用去添加串行的链条,我们点击Add Joints来添加手指。
添加之后,我们点击save。
之后双击手指下面的links,添加如下参数:
这样的话我们就完成了机械臂部分的配置了:
接下来配置Robot Poses这一步是去配置一些自定义的点位,点击右下角的Add Pose。
命名为home,之后点击save:
这样的话我们之后就可以通过调用的方式直接将这个home调用出来。
如果我们还要添加其它姿态的话也是可以的。在End Effectors里面点击add effectors。按照下图所示进行配置:
Passive表示的是不需要去做运动的关节。我们现在的joint都是要做运动的,所以没有要添加的部分, 添加作者信息:
这样的话我们的这个工具就使用完成。 接下来验证一下生成的简单的demo(运行之前先将功能包编译一下):
roslaunch marm_moveit_config demo.launch
左上角是一些显示的插件,左下角是一些控制的gui界面。点击上面的球可以让机械臂达到指定的位置:
点击左侧的planing中的plan可以让机械臂达到指定位置。
可以看到会有一个虚影,点击execute可以看到机械臂能够达到指定位置。关掉loop就没有虚影了。
Moveit编程基础: 整个的编程都是通过action和service来跟move_group来做交互的,完成了计算之后通过action来跟机器人做数据上的交互,我们也可以通过3D传感器来使得机器人检测周围的信息。它提供了两种编程接口:
可以看到,我们首先需要定义一下我们的控制组是哪个,然后我们定义目标状态,通过Pose来定义目标姿态。然后调用函数将目标姿态发送出去。然后调用函数规划,如果有路径能够规划出来的话就会返回一个路径。其他的机械臂规划与这个都差不多,更多的可以去看原版视频(在github里面)。我们也可以在Moveit官网看到更多相关的教程。 我的微信公众号名称:深度学习与先进智能决策 微信公众号ID:MultiAgent1024 公众号介绍:主要研究强化学习、计算机视觉、深度学习、机器学习等相关内容,分享学习过程中的学习笔记和心得!期待您的关注,欢迎一起学习交流进步!