呀!
上篇运动规划的科普文阅读量居然上千了。
自从推送上篇文章后,后台就收到不少回复,询问如何在自己的机器人上做运动规划。每个回复太麻烦,而且在实际机器人上做运动规划还是有不少坑要填的,所以我就打算推送一篇“运动规划入门篇”的。
但由于我是在ROS MoveIt上进行的开发,并且也推荐没运动规划基础的人直接使用MoveIt来入门。因此就必须先介绍一下ROS。此外,昨天也在知乎问答“选用什么样的系统或平台开发机器人/机器臂? ”(点击文末阅读原文,查看知乎问答)中添加了ROS的相关内容,正好可以整理一起放在公众号中。
前言
先放一个ROS Industrial一周年剪辑视频。
ROS已经发布八周年了,在国外科研机构中非常受欢迎。目前,以美国西南研究院为首的几位大佬开始尝试将ROS应用在工业机器人中,上面这个视频就是ROS-I项目一周年的进展情况。
为了说明讲清楚ROS,我就从ROS是什么,为什么使用ROS,如何使用ROS三个方面展开。
△出自今年《机器人视觉与应用》课程本人制作的课件
是什么
ROS是Robot Operating System的缩写,原本是斯坦福大学的一个机器人项目,后来由Willow Garage公司发展,目前由OSRF(Open Source Robotics Foundation, Inc)公司维护的开源项目。
1、首先是一个操作系统
根据wikipedia定义,OS is system software that manages computer hardware and software resources and provides common services for computer programs。也就是说操作系统是用来管理计算机硬件与软件资源,并提供一些公用的服务的系统软件。而ROS也自称是一个OS。
△计算机OS与机器人OS对比示意图
如上图所示,计算机的操作系统将计算机硬件封装起来,而应用软件运行在操作系统之上,不用管计算机具体应用的是什么类型的硬件产品。这能大大提高软件开发效率(否则大家只能都写汇编了)。
同理,ROS则是对机器人的硬件进行了封装,不同的机器人、不同的传感器,在ROS里可以用相同的方式表示(topic等),供上层应用程序(运动规划等)调用。
2、是一种跨平台模块化软件通讯机制
ROS用节点(Node)的概念表示一个应用程序,不同node之间通过事先定义好格式的消息(Topic),服务(Service),动作(Action)来实现连接。
三种通讯方式的优缺点可看上表,由于很多模块化编程工具都有类似功能,这里就不具体展开了。
基于这种模块化的通讯机制,开发者可以很方便地替换、更新系统内的某些模块;也可以用自己编写的节点替换ROS的个别模块,十分适合算法开发。
此外,ROS可以跨平台,在不同计算机、不同操作系统、不用编程语言、不同机器人上使用。
3、是一系列开源工具
△几种ROS工具示意图:左上rqt_plot,右上rqt_graph,左下Rviz,右下TF
如上图所示,ROS为开发者提供了一系列非常有用的工具,可以大大提高我们开发的效率。
rqt_plot:可以实时绘制当前任意Topic的数值曲线;
rqt_graph:可以绘制出各节点之间的连接状态,和正在使用的Topic等;
TF:TF是Transform的简写,利用它,我们可以实时知道各连杆坐标系的位姿,也可以求出两个坐标系的相对位置。
Rviz:超强大的3D可视化工具,可以显示机器人模型、3D电影、各种文字图标、也可以很方便二次开发;
△在Rviz里显示机器人模型、3D点云、物体模型等
△在Rviz里也可以实现方便交互功能
除此之外,ROS还有很多其他有用的开源工具等待大家探索。
4、是一系列最先进的算法
除了ROS之外,世界上已经有很多非常优秀的机器人开源项目,但是ROS正逐渐将它们一一囊括在自己的范畴里。例如:
PS:我跟ROS的其他几个开发者也正在努力将LinuxCNC整合进ROS
OROCOS:这个开源项目主要侧重于机器人底层控制器的设计,包括用于计算串联机械臂运动学数值解的KDL、贝叶斯滤波、实时控制等功能。
OpenRave:这是在ROS之前最多人用来做运动规划的平台,ROS已经将其中的ikfast(计算串联机械臂运动学解析解)等功能吸收。
Player:一款优秀的二维仿真平台,可以用于平面移动机器人的仿真,现在在ROS里可以直接使用。
OpenCV:大名鼎鼎的机器视觉开源项目,ROS提供了cv_bridge,可以将OpenCV的图片与ROS的图片格式相互转换。
OMPL:现在最著名的运动规划开源项目,已经成了MoveIt的一部分。
Visp:一个开源视觉伺服项目,已经跟ROS完美整合。
Gazebo:一款优秀的开源仿真平台,可以实现动力学仿真、传感器仿真等,也已被ROS吸收。
△左下角gazebo,右下角Rviz
当然,除了吸收别的优秀开源项目,ROS自己也发展出许多非常优秀的项目和库。
ORK:一个物体识别与位姿估计开源库,包含LineMod等算法,但实际使用效果还不是太理想。
PCL:一个开源点云处理库,原本是从ROS中发展起来的,后来由于太受欢迎,为了让非ROS用户也能用,就单独立了一个PCL的项目。
Gmapping:这其实是在OpenSlam项目继承过来的(后来发展和改动较大),利用gmapping可以实现laser-based SLAM,快速建立室内二维地图。
△gmapping建立二维地图
Localization:基于扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)的机器人定位算法,可以融合各种传感器的定位信息,获得较为准确的定位效果。
△robot_localization示意图
Navigation:基于Dijkstra、A*算法(全局规划器)和动态窗口法DWA(局部规划器)的移动机器人路径规划模块,可以在二维地图上实现机器人导航。
△navigation示意图
MoveIt:这个是专注于移动机械臂运动规划的模块,下次讲运动规划入门的时候再详细介绍它。
△MoveIt对UR5进行运动规划
当然,除了这些最先进算法外,ROS还有各种机器人、传感器驱动等内容。
5、是一个最活跃的机器人开发交流平台
个人认为,这应该是最重要的一点。除了ROS外,现在有需要其他的项目可以代替或者部分代替ROS的功能:OpenRave运动规划,V-rep仿真。但是这些项目的社区远没有ROS活跃。
ROS版本定期更新、主要模块有专人维护、问答区活跃、各mail lists也非常活跃、开发者非常热衷交流分享。如果深入到ROS社区,可以学到很多东西。
为什么
首先,用过工业机器人的人肯定知道,不同工业机器人的开发系统基本都不一样,示教、编程方法也不同,一个熟练使用Motoman的工程师很可能并不会使用Kuka机械臂。就算是同种机器人,由于固件版本的更新换代,也可能造成程序的不兼容(我在UR上就遇到过这个问题)。这就大大影响了机器人的推广普及。
△左:不同机器人的示教器;右:UR固件版本不兼容
对此,ROS可以用统一的方式来封装机器人(URDF模型+机器人驱动),用户只需要在ROS中编写应用程序,并不用关心机器人的控制方式。如果所有机器人都采用了这种方式,那么机器人必将得到更广泛地应用(对系统集成商的要求会降低)。
其次,现在越来越多机器人厂商开始尝试使用ROS,包括占据最多工业市场份额的机器人四大家族和各种流行的研究型机器人;甚至有如Rethink的Baxter,只能使用ROS控制。研究机器人的如果不去学习ROS的话,以后可能就会面临不会使用机器人的问题。
再者,机器人是一个复杂且涉及面极广的学科,从下往上包括机械设计、电机控制、传感器、轨迹规划、运动学与动力学、运动规划、机器视觉、定位导航、机器学习、高级智能等等。一个研究生基本不可能在几年时间内掌握所有领域。
对于一个做上层规划的研究生,如果不用ROS的话,往往需要花费非常长时间用于搭建实验系统,从而大大挤压了真正用在发明新知识的时间。例如,我做运动规划,就必须先把机械臂运动学正逆解、物体识别算法、碰撞检测算法等完成才有可能开始做运动规划。造轮子的事就交给专业造轮子的人做吧。
所以,对于科研人员来说,ROS可以帮助你快速搭建机器人软件系统,同时其模块化的设计可以让你方便地用自己的算法替换其中某一模块,让你专注于自己的研究点。
最后,就是对于创业或者参加比赛的人来说,ROS可以帮助你快速搭建原型样机。原型样机出来了,自然比只有设计说明书的人有优势。
为防止做广告嫌疑,创业的例子就不说了,就拿我们去年参加的一个创业大赛来讲。我们组四个人用了不到两个月时间完成了下面这个超市购物机器人的软硬件设计与制作,功能包括避障、防跌、人员跟随、蓝牙校正(跟踪对的人)、手势识别、商品自动计价、自动支付等。
嗯,我的公众号Nao(qRobotics)的头像就是在这个项目时设计的。
如何
这方面已经可以找到很多答案了,但是学习这种东西只能靠自己多练习了,我只简单从我个人角度给出几个建议吧。
首先,就是要先了解ROS的基本架构和开发方式。我个人是强烈推荐直接看ROS官网上的教程ROS/Tutorials的Beginner Level(多看几遍),同时充分使用ROS的问答社区ROS Answers与各模块的Mail Lists,很多基础问题可能前人都遇到过。
其次,在了解ROS的基本架构与开发方式后,就可以有针对性地看自己所关心的部分了。如做移动机器人的同学就去看Navigation教程;做物体识别的就去看ORK教程;做运动规划的就去看MoveIt教程。这一步最好能跟有实际机器人练手(如果没有的话,就用gazebo仿真)。由于一些模块的教程不够清楚(如MoveIt),一定要多练习,甚至是去看部分源码,先保证自己会用ROS实现一些功能。
对于ROS与实际机器人的连接,建议仔细看看action(编写机器人驱动package)、URDF(机器人描述文件)的教程(或者ros_control)。如下图,我为SDA5F机器人编写了URDF文件,并修改了motoman_driver中的action,使得在ROS环境中用MoveIt规划控制双臂机器人运动。
最后,就是进阶阶段了。我要强调一句“ROS只是一个工具”,你会用ROS做SLAM并不能说明你会做SLAM。对于自己研究的内容,必须沉下心去看教材和论文,去理解每种算法背后的原理,知道如何调整算法参数、如何改进算法,最终能够自己编写某部分代码,并替换ROS的相应模块(如自己写运动学正逆解替代KDL等)。
做研究,交流非常重要。如果你改进ROS某一算法后,最好能与package的原作者交流,将自己的修改merge到原项目中,在交流中提高自己与package的水平。当然,如果对算法有疑问,也可以直接咨询作者,ROS里的贡献者大都非常愿意分享和交流。
当然,在问别人之前,请一定要保证自己充分熟悉了官方Tutorials,而不是朝别人发一堆编译错误截图,然后问这是怎么回事。提问的艺术真的非常重要,有时候不是对方不愿意跟你交流,而是对方不愿意手把手带你过Tutorials。
结尾
很多人在争论是否应该使用ROS、是否应该在产品上使用ROS、是否应该在工业中使用ROS。但是从我个人的角度上看,ROS对于服务机器人上层算法开发和研究而言是一个很棒的工具,作为学术研究使用的话,可以大大加快实验平台搭建过程。
有问题和意见欢迎大家直接在下面留言。