工作 sum 现在 其他 一行代码 如何学习 -s 有时
MoveIt = RobotGo,翻译成中文就是 "机器人,走你!" 所以,MoveIt 的主要就是一款致力于让机器人能够自主运动及其相关技术的软件,它的所有模块都是围绕着运动规划的实现而设计的。
两个月前给自己挖了个坑,说要写写 MoveIt,但一直没动手。主要有两个原因:
1)这两个月主要在写小论文,毕竟博士生要毕业还得看论文,不能靠公众号阅读量分享率;
2)直接讲 MoveIt 似乎需要挖更多坑,一直没想好怎么写比较好。
主要是因为机器人运动规划涉及太多基础内容,如果跳过不讲就会变成新坑;一时半会又没法讲完。
所以,这次就从初学者如何利用 MoveIt 快速搭建机器人运动规划平台来讲吧,先展示 Big Picture,其他细节内容以后有空再慢慢填。但可能会坑的地方我会用(坑)标注出来。
什么是 MoveIt
先看个视频介绍吧:
看完视频,大家应该对 MoveIt 有一个大概的印象了。用 MoveIt 官网(moveit.ros.org)的说法:
- 它是目前最先进的移动(坑)操作机器人软件,整合了最先进的运动规划、操作、3D感知、运动学、控制与导航算法。为这方面的开发人员提供了一个十分便利的开发平台。
这个说法不太直观,换个说法就是 MoveIt = RobotGo,翻译成中文就是 "机器人,走你!"
所以,MoveIt 的主要就是一款致力于让机器人能够自主运动及其相关技术的软件,它的所有模块都是围绕着运动规划的实现而设计的。
下面大概介绍下它的一些功能模块。
目前而言,MoveIt 还只是一个针对机械臂运动规划问题的软件平台,暂时还不是适合用在 Navigation、manipulation、control、perception 等领域。
为什么选择 MoveIt
其实,要做运动规划可以用很多方法:自己写、OMPL、OpenRave 等。我个人认为选择 MoveIt 大概有三个原因:
__- 对初学者很友好 __
前面我们已经知道,要想自己从头建立一个运动规划的软件平台需要花费非常多力气:运动学正逆解、碰撞检测算法、环境识别、规划算法,任何一点都是需要一段不短的时间积累才可能亲手实现的。初学者可能一开始就被这些次要问题打退了。
- 自己写:对初学者简直是灾难,尤其是没人带的情况;
- OMPL:完全没有机器人的概念,需要用户自己集成运动学、碰撞检测算法,它的官方文档也不涉及如何利用OMPL做机器人的运动规划问题;
- OpenRave:虽然OpenRave已经有自己的一套机器人描述方法,但是它的文档不太友好。
用 MoveIt 的话,初学者只需准备机器人的模型,跟着教程走,便可以在半小时内实现仿真环境中的机器人运动规划演示。
__- 方便研究 __
这个应该是更重要的因素。运动规划由很多子问题构成,每个子问题都可以成为一个研究点。MoveIt 几乎所有组件都是以 Plugin 的形式工作的,也就是说我们可以随时更换它的任一模块。目前它支持以下组件的修改:
- 运动学求解器
- 规划算法 同时OMPL自身也支持用户自己编写规划器
- 规划器初始化方法
- 控制器接口
- 传感器接口
- 规划器的采样算法
- 碰撞检测算法
- OctoMap更新算法
如果是做这些课题研究的人,完全可以先用 MoveIt 建立一个环境,之后修改相应 Plugin,换成自己的算法。这样可以让我们将侧重点放在主要矛盾上。
- 活跃的社群
这点其实就是 ROS 相对于其他机器人开发平台的优点。MoveIt 依托于 ROS,也拥有很高的人气(去年的调研结果看,MoveIt 是 ROS 中使用度排名第三的 package)。
活跃的社群对于学习是大有裨益的:
- ①遇到问题很容易问到能解决的人,刚开始MoveIt还没出文档,我就是靠着MoveIt的mail lists入门的;
- ②网站、教程、代码维护更新很好,MoveIt刚推出时,总是有一大堆Bug,现在才过几年,已经非常好用了,官方教程也已经非常人性化了。
怎么样使用 MoveIt
要用 MoveIt 控制机器人大概分为以下几步:
- 建立机器人URDF模型(必须)
- 建立机器人ROS驱动
- 生成MoveIt配置文件(必须)
- 标定相机
- 修改MoveIt配置文件与launch文件
- 机器人,走你!(必须)
其中,上面未标明 "(必须)" 字样的只有在使用实际机器人时才需要。初学者如果只想在仿真里看看的话,可以先跳过。
__- 建立机器人 URDF 模型(必须) __
URDF(Unified Robot Description Format)是 ROS 中使用的一种机器人描述文件,它以 html 的形式定义一个机器人。包含的内容有:连杆、关节名称,运动学参数、动力学参数、可视化模型、碰撞检测模型等。
后续碰撞检测、运动学求解、规划等都依赖于 URDF 文件。
那么,要如何建立 URDF 文件呢?如果你用的是单臂、串联机器人,并且你本人没有强迫症的话,可以使用 ROS 官方发布的 sw_urdf_exporter,它可以帮你从 SolidWorks 中导出 URDF 文件。
但如果不幸你使用的是双臂(双臂机器人用这个插件经常出问题)或者非并联机器人(需要自己用 mimic-joint 改成串联形式),又或者你有强迫症(想要尽量简洁、漂亮的模型)的话,可以考虑自己手写 URDF 或者 xacro 文件(坑)。
这点我就不具体说了,简单写几个要点:
- 多臂用xacro来减少工作量;
- 坐标系设置尽量满足所有关节为0°时候,所有坐标系同姿态(这样可以避免引入pi);
- 如果想要有颜色的模型,可以自己生成每个零件的dae模型,而不使用stl模型;
- 可视化模型采用漂亮、精细的模型,碰撞模型可以使用简化的模型。
__- 建立机器人 ROS 驱动 __
如果你不用真实机器人,这步可以先跳过。
机器人的 ROS 驱动并没有什么标准的格式或者规定。对于 MoveIt 而言,只要求你有个 ROS node,它有两个功能:
__1)发布关节角度 / joint_states __
如果连接实际机器人,MoveIt 需要从机器人当前状态开始规划,因此这个 ROS 驱动需要能够实时获取机器人的各关节信息(如角度),并用过 / joint_states 消息发布;
__2)接收规划结果,并下发给机器人 __
由于 MoveIt 规划的结果会以一个 action 的形式发布,所以我们的 ROS 驱动就应该提供一个 action server,这个功能就是接收规划结果,下发给机器人,并反馈执行情况。action 的类型是 control_msgs/FollowJointTrajectory。 具体 action 的写法可以参照 ROS 官网(坑)。
简单而言,一个 action 有五个部分:
- action_name/goal:这个就是规划的路径,我们需要接收这个路径,并将所有路径点解析成机器人控制器可以识别的形式,之后下发给机器人,必须要有;
- action_name/cancel:这个指令可以随时中断正在执行的动作,但并不是必须的功能;
- action_name/feedback:这个是实时反馈执行状态,最简单的就是将机器人当前关节角度等信息反馈回去,非必须;
- action_name/status:这个用于显示机器人状态,如正在执行动作、等待、执行结束等待,非必须;
- action_name/result:这个就是在动作执行完之后给MoveIt反馈一个执行结果,这个是必须要有的,当然,为了简单,可以已接收到goal就反馈执行成功。
这部分在 MoveIt 部分是看不到文档的,所以也是阻碍初学者使用 MoveIt 控制自己机器人的最大问题之一。但是了解了它的机理之后,就比较简单了。 如果你是第一次使用 MoveIt,极力推荐你先试试 UR、Baxter 等已经写好这部分驱动的机器人。
- 生成 MoveIt 配置文件(必须)
这个利用 MoveIt 的 setup assistant 界面,按照教程很容易就能配置好。
这步做完,就可以直接在仿真里面看运动规划效果了。这是我觉得 MoveIt 对初学者最友善的地方,不用写一行代码就可以看到运动规划。
__- 标定相机 __
这个主要涉及相机模型与 AX=XB 求解问题,不多赘述。 这步就是为了让机器人知道摄像头放在机器人的哪个位置。大家可以看看我实验室师弟写的自动标定演示:
一个 launch 文件就能完成标定,不知比我当年写的手动标定方法高多少。这个标定程序我们之后可能会开源出来。如果有机会我也会顺便讲讲它的原理(坑)。
__- 修改 MoveIt 配置文件与 launch 文件 __
因为前面生成的文件都是针对虚拟机器人的,如果需要连接实际机器人,需要修改一些配置文件,我可能记不太清具体要修改几个文件了,请以官方教程为主:
- controllers.yaml:这个就是要根据你的ROS驱动中的action来修改,MoveIt可以根据这个配置文件发布出与机器人驱动相匹配的action。简单地说,就是action的名字、类型、关节名字几个信息。
- robot_moveit_controller_manager.launch:这个额外新增,就是在不适用fake controller的时候能找到上述controller.yaml文件,发布出正确的action类型。
- sensors.yaml:这个需要额外增加,它主要定义了点云的消息名称、OctoMap属性等。
- moveit_sensor_manager.launch:同样的,增加传感器配置文件后,我们也需要在launch文件中增加对配置文件的读取。
- 其他(可选):industrial_robot_simulator、warehouse、joystick、规划器、规划算法库……
- 机器人,走你!(必须)
上述内容完成后,就可以 Enjoy Yourself 了,无论是 Rviz, Python 还是 C++,都可以用来进行运动规划,如果连接了真实机器人,那么也可以在实际机器人上完成运动规划。
其他
虽然写了这么多,但感觉还是没写清楚,最后随便列点之前大家在后台问过的比较多的问题:
__- 什么机器人能用 MoveIt __
MoveIt 其实跟机器人关系不大,只要你有 URDF 文件,能接受控制指令,那么就能用 MoveIt,移动机器人的话也可以,只是 MoveIt 现在没有针对 Navigation 做规划器。
__- 怎么用 MoveIt 做移动机器人 3D Navigation __
相对于传统 Navigation 包,MoveIt 中可以做 3D 的碰撞检测,但是它尚未加入适合移动平台的规划算法。大概做法如下:
- 修改FCL,开放出碰撞检测函数(最新版本好像已经可以直接调用了);
- 写一个规划器:最简单的就是自己写一个A*或Dijkstra,也可以想办法将SBPL用起来(我没在移动机器人上试过),这样就可以进行全局规划了;
- 写一个action server,接受规划结果,同时将其转换成Navigation包的gloal_planner相同格式,利用Navigation的local_planner完成路径跟踪;当然,这一步也可以自己写local_planner。
__- 怎么用 MoveIt 做飞行器或潜艇的路径规划 __
这个与上个问题类似,MoveIt 没有针对刚体的规划算法,如果可以接受 RRT 的规划结果,那么理论上讲是可以直接使用的。
__- 如何在 MoveIt 上使用自己的规划算法 __
我只尝试过先在 OMPL 中写自己的规划器,之后通过修改 moveit_planner 中的 ompl_interface,将自己的规划器用到 MoveIt 中; 如果是非 Sampling-based 方法,那就要去看看 MoveIt 的 Plugin 怎么改了,这部分我没经验。
__- 如何学习 MoveIt __
- 学ROS基本概念:三种消息机制等;
- 学教程:按照官网教程走一遍;
- 遇到问题,先在ROS问答区或MoveIt的mail lists搜索是否有同类问题,如没有,则自己在上述平台提问; (至此, 你已经会用MoveIt了,但用得效果肯定不好)
- 看MoveIt各部分API,阐释其高级功能;
- 根据自己需要,修改部分源码(例如开放出FCL的各种功能),之后再MoveIt官方github上提出修改源码请求(PR); (至此,你已经掌握了MoveIt这个工具,可以充分发挥MoveIt的功能)
- 根据自己的研究内容,写自己的Plugin,充分发掘MoveIt的潜力;
- 如果效果好,那么在IROS/ICRA发paper,会议中找MoveIt的作者们聊天,回家后到github上将自己的代码开源,并PR到MoveIt上。
机器人,走你!
本文作者 qqfly,上海交通大学机器人所博士生,本科毕业于清华大学机械工程系,主要研究方向机器视觉与运动规划
如何用 MoveIt 快速搭建机器人运动规划平台?
来源: http://www.bubuko.com/infodetail-2014752.html