如何用MoveIt快速搭建机器人运动规划平台?

MoveIt = RobotGo,翻译成中文就是“机器人,走你!”所以,MoveIt的主要就是一款致力于让机器人能够自主运动及其相关技术的软件,它的所有模块都是围绕着运动规划的实现而设计的。

两个月前给自己挖了个坑,说要写写MoveIt,但一直没动手。主要有两个原因:

1)这两个月主要在写小论文,毕竟博士生要毕业还得看论文,不能靠公众号阅读量分享率;

2)直接讲MoveIt似乎需要挖更多坑,一直没想好怎么写比较好。

主要是因为机器人运动规划涉及太多基础内容,如果跳过不讲就会变成新坑;一时半会又没法讲完。

所以,这次就从初学者如何利用MoveIt快速搭建机器人运动规划平台来讲吧,先展示Big Picture,其他细节内容以后有空再慢慢填。但可能会坑的地方我会用(坑)标注出来。

什么是MoveIt

先看个视频介绍吧:

看完视频,大家应该对MoveIt有一个大概的印象了。用MoveIt官网(moveit.ros.org)的说法:

它是目前最先进的移动(坑)操作机器人软件,整合了最先进的运动规划、操作、3D感知、运动学、控制与导航算法。为这方面的开发人员提供了一个十分便利的开发平台。

这个说法不太直观,换个说法就是MoveIt = RobotGo,翻译成中文就是“机器人,走你!”

所以,MoveIt的主要就是一款致力于让机器人能够自主运动及其相关技术的软件,它的所有模块都是围绕着运动规划的实现而设计的。

下面大概介绍下它的一些功能模块。

  • 运动规划(Motion Planning):运动规划的介绍内容之前公众号已经发过了,要让一个机器人实现运动规划,需要先将机器人抽象到构形空间(C-Space)。 MoveIt就可以帮大家把这些工作给做了,只需提供机器人URDF模型,就可以调用几大运动规划库(坑)的规划算法(如 OMPL,SBPL,CHMOP),自动生成机器人运动轨迹。
  • 操作(Manipulation):这个目前还比较弱,就是根据识别的物体生成一系列动作抓取物体(pick-and-place),不涉及任何反馈、动力学、re-grasp等操作问题,所以我一般都不用这个模块。
  • 3D感知(Perception):这个并不是说MoveIt整合了物体识别、环境建模等模块,而是它可以利用传感器(坑)采集的信息(点云或深度 图像)生成用于碰撞检测的OctoMap。OctoMap这个东西挺好的,做SLAM的同学应该了解,它就是以八叉树形式表示点云,可以大大降低存储空 间,它看起来就跟你们玩的minecraft差不多。同时,这些3D OctoMap也可以依据贝叶斯准则不断实时更新。这样,机器人就可以避开真实世界的障碍物了。

  • 运动学(Kinematics):运动学机器人工作空间与构形空间(C-Space)的映射关系,所以MoveIt就它也包括在自己系统内。目前它 可以支持多种运动学求解器,如OpenRave的ikfast(封闭解)、Orocos的KDL(数值解)、Trac_ik(考虑关节极限的数值解)、基 于service的求解器(用户自己定义)。(坑)
  • 碰撞检测(Collision Checking):碰撞检测是运动规划的一大难题,如果采用基于采用的规划算法,那么我们需要对每个采样点做有效性判断,这时候就需要进行碰撞检测。所 以,运动规划需要提供一个高效的碰撞检测算法。幸好,香港城市大学的潘佳大神写了个FCL(Flexible Collision Library),可以非常快速地实现各种几何体(3D面片、OctoMap、基本几何体)的碰撞检测。(这个不是坑,直接用很好用,但以后有机会可以好 好说说,反正潘大神不会看朋友圈,不至于班门弄斧)。
  • 轨迹插值(Trajectory Processing):由于大多数规划器只能返回一系列路径点,MoveIt可以根据机器人的控制参数(速度、加速度限制等)重新处理路径,生成一条带有时间戳、位置、速度、加速度信息的完整轨迹。
  • 控制(Controll):这个其实不能算控制,只是一个机器人控制接口问题。由于不同机器人的控制接口都不一样,开发者只需简单修改配置文件,就可以让MoveIt发布出机器人相应的控制指令(只是修改action名字而已)。
  • 导航(Navigation):这是个大坑,MoveIt虽然原理上可以进行移动机器人的导航,但是它没提供针对移动机器人的规划器。也就是说目前它的Navigation功能是不能直接使用的(自己写规划器和碰撞检测已经超出初学者的要求了)。

  • 交互(Interaction):MoveIt给开发者提供了三种方式交互方式,Rviz图形界面(直观)、Python(快速编程)、C++(丰富的高级功能)。

目前而言,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,上海交通大学机器人所博士生,本科毕业于清华大学机械工程系,主要研究方向机器视觉与运动规划

时间: 2024-09-30 00:40:35

如何用MoveIt快速搭建机器人运动规划平台?的相关文章

快速搭建sonar代码质量管理平台

安装 下载,直接解压http://www.sonarqube.org/downloads/ 添加mysql驱动至\extensions\jdbc-driver\mysql\ 创建mysql数据库和用户:10.22.10.139 db:sonar 用户名/密码:sonar/sonar 修改sonar.properties,注释掉默认的数据库配置,添加以下配置: [plain] view plain copy #----- MySQL 5.x # Comment the embedded datab

运动规划 (Motion Planning): MoveIt! 与 OMPL

原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 最近有不少人询问有关MoveIt!与OMPL相关的话题,但是大部分问题都集中于XXX功能怎么实现,XXX错误怎么解决.表面上看,解决这些问题的方法就是提供正确的代码,正确的编译方法,正确的运行步骤. 然而,这种解决方法只能解决这个特定的问题,而且解决之后我们也无法学到一些实际的东西.要想彻底明白,需要从源头入手,也就是说,不要问"MoveIt! 怎么把机械手从空间一个点移到另一个点?",而是要

MoveIt运动规划-1

按照帮助文档Setup Assistant Tutorial中的描述,用moveit_setup_assistant图形界面一步步配置机器人,最后生成机器人的配置文件保存到指定的文件夹中. 以UR5机器人为例,将生成的配置文件保存在ur5_moveit_config文件夹中.生成的config文件夹中包含了一些机器人和求解器相关的配置文件,运行launch文件夹中的demo.launch文件可以在rivz中使用moveit进行机械臂的运动规划. 在该路径下运行demo.launch文件: ~/D

用Gitbook快速搭建Wiki

本文展示如何用Gitbook快速搭建一套wiki 必备环境 1.gitbook(如何安装gitbook自行百度) 2.nginx(或其他的能当作静态http服务器的) 3.gitlab(或者svn,需要能触发CI/CD的.我这里只展示用gitlab的.gitlab-ci.yml配置CI/CD,svn可以用post-trigger) 一.创建git库 二.初始化gitbook目录(可以用gitbook init,这里我采用手动) 根目录分别创建3个文件book.json,README.md,SUM

新巴巴运动网上商城 项目 快速搭建 教程 The new babar sports online mall project quickly builds a tutorial

新巴巴运动网上商城 项目 快速搭建 教程 The new babar sports online mall project quickly builds a tutorial 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:[email protected] E-mail: 313134555 @qq.com 搭建后台网站.启动 console 服务器 ,它的http 端口 是 8150 Build a background site.Start the console s

机械臂的运动规划

如果你想要让机器人能帮你拿瓶子.做饭.收拾屋子等,就必须赋予机器人快速生成无碰撞.最优运动轨迹的能力,这就需要靠运动规划了.有人觉得运动规划已经很成熟了,无需再研究,但实际上,机械臂运动规划非常难-- 如 果你想要让机器人能帮你拿瓶子.做饭.收拾屋子等,就必须赋予机器人快速生成无碰撞.最优运动轨迹的能力,这就需要靠运动规划了.有人觉得运动规划已经很 成熟了,无需再研究,但实际上,机械臂运动规划非常难,之所以这么难,主要是因为规划问题的维度太高(具体后面分析),目前暂无兼顾实时性与最优性的规划 算

Spring-Boot快速搭建web项目详细总结

最近在学习Spring Boot 相关的技术,刚接触就有种相见恨晚的感觉,因为用spring boot进行项目的搭建是在太方便了,我们往往只需要很简单的几步,便可完成一个spring MVC项目的搭建,感觉就是下图: 好,下面就本人搭建项目的过程简单说说如何快速搭建一个spring MVC项目,相信我,spring-boot这趟车,你上了根本就停不下来了! 下面是这篇博客的主要内容: 1.spring boot 介绍 2.spring boot 项目快速搭建 3.spring-boot中单元测试

快速搭建Web环境 Angularjs + Express3 + Bootstrap3

快速搭建Web环境 Angularjs + Express3 + Bootstrap3 AngularJS体验式编程系列文章, 将介绍如何用angularjs构建一个强大的web前端系统.angularjs是由Google团队开发的一款非常优秀web前端框架.在当前如此多 的web框架下,angularjs能脱颖而出,从架构设计上就高人一等,双向数据绑定,依赖注入,指令,MVC,模板.Angular.js创新地把后 台技术融入前端开发,扫去jQuery一度的光芒.用angularjs就像写后台代

Python快速搭建自动回复微信公众号

Python快速搭建自动回复微信公众号 在之前的一篇文章 Python利用 AIML 和 Tornado 搭建聊天机器人微信订阅号 中用 aiml 实现了一个简单的英文聊天机器人订阅号.但是只能处理英文消息,现在用 图灵机器人 来实现一个中文的聊天机器人订阅号. 这里主要介绍如何利用 Python 的 Tornado Web框架以及wechat-python-sdk 微信公众平台 Python 开发包来快速搭建微信公众号. 完整的公众号代码 GitHub 地址:green ,由于目前此公众号有一