嵌入式的我们为什么要学ROS 前言 % m: X5 z- f2 D" _2 d% d 本来是要写一篇STM32移植ROS的一个小lib库,ROS一般都是需要跑在Linux上的,STM32使用就是当成一个ROS通讯的小节点,但是写文章时间不够,所以就简单做一篇ROS的介绍文章,分享给嵌入式的小伙伴们。ROS现在在机器人领域会有比较多的应用,学习的人群也逐渐增多,甚至会有专门的ROS岗位进行招聘,并且普遍工资要比一般的嵌入式开发高一些。今天给大家分享一下,希望大家可以一起学习进步哈。9 O, `( A& _0 o+ @0 O8 u. W& m 0 W2 K2 |7 `3 y7 U% u. \# L* @ ROS是什么 ROS(机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套电脑操作系统架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。0 J [; v7 b8 _7 { ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括:: j: y' x, T! L; ~+ ~2 I& i1 W [2 s) D4 }, ^; v. A) P; | ( j. s! l& Y$ k 1.基于服务的同步RPC(远程过程调用)通讯; % E& A- N# _1 r* {' I9 a 2 } C: R& g+ I1 |3 D 2.基于Topic的异步数据流通讯,还有参数服务器上的数据存储。; x8 f8 d5 z; W; ^ 发展目标" q% ]* m; D! b9 F6 \ ROS的首要设计目标是在机器人研发领域提高代码复用率。ROS是一种分布式处理框架(又名Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。上述所有功能都能由ROS的基础工具实现。# q/ ], j& j& |* @ # a. x. M. O; C) ~ 2 @- z1 k" `0 `, Z2 R: d% a 为了实现“共享与协作”这一首要目标,人们制订了ROS架构中的其他支援性目标: “轻便”:ROS是设计得尽可能方便简易。您不必替换主框架与系统,因为ROS编写的代码可以用于其他机器人软件框架中。毫无疑问的,ROS更易于集成与其他机器人软件框架。事实上ROS已完成与OpenRAVE、Orocos和Player的整合。 ROS-agnostic库:【agnostic:不可知论】建议的开发模型是使用clear的函数接口书写ROS-agnostic库。 1 }2 |: `. p6 }- \. U, E- @ ' g7 U9 v5 M) ?# t 语言独立性:ROS框架很容易在任何编程语言中执行。我们已经能在Python和C++中顺利运行,同时添加有Lisp、Octave和Java语言库。 4 C8 f+ Y: A- s1 r- P$ @' r% \ 1 h; h/ }+ ], O 测试简单:ROS有一个内建的单元/组合集测试框架,称为“rostest”。这使得集成调试和分解调试很容易。 0 \+ r& `1 y- \6 \& f 扩展性:ROS适合于大型实时系统与大型的系统开发项目2 G2 h. Q5 X. V4 @/ X ; A1 G1 G( T* s1 o 2 H; U7 S, ` f* F; [ 在ROS的计算图中,ROS的Master以一个name service的方式工作。它给ROS的节点存储了topics和service的注册信息。Nodes 与Master通信从而报告它们的注册信息。当这些节点与master通信的时候,它们可以接收关于其他以注册节点的信息并且建立与其它以注册节点之间的联系。当这些注册信息改变时Master也会回馈这些节点,同时允许节点动态创建与新节点之间的连接。 节点之间的连接是直接的;Master仅仅提供了查询信息,就像一个DNS服务器。节点订阅一个topic将会要求建立一个与发布该topics的节点的连接,并且将会在同意连接协议的基础上建立该连接。ROS里面使用最广的连接协议是TCPROS,这个协议使用标准的TCP/IP 接口。 这样的架构允许解耦操作(decoupled operation),通过这种方式大型或是更为复杂的系统得以建立,其中names方式是一种行之有效的手段。names方式在ROS系统中扮演极为重要的角色:topics, services, and parameters 都有各自的names。每一个ROS客户端库都支持重命名,这等同于,每一个编译成功的程序能够以另一种形似【名字】运行。 " G j% z0 B8 y- M/ w ROS通信接口正在成为机器人软件互操作的事实标准,也就是 说绝大部分最新的硬件驱动和最前沿的算法实现都可以在 ROS中找到。例如,在ROS的官方网页 上有着大量的开源软 件库,这些软件使用ROS通用接口,从而避免为了集成它们而 重新开发新的接口程序$ }0 w& b Q# g- w( S$ w ROS可以做什么 : x6 ?9 |; m$ @! ]% ] 当我们希望稍微提高一下机器人复杂度的时候,就会发现另一个需要考虑的问题,进程间通信。在我们用Windows + RTX的时候,进程间通信使用RTX提供的shared memory,不过都是比较慢的图像处理进程向shared memory中写数据,决策和运动控制进程读数据。shared memory显然并不是很好的通信方式,这里不再多加讨论。ROS则使用了一个很好的通信架构,并且是ROS整个框架的一个基础(不论是对于ROS中的topic,service,plugin,actionlib等基础概念还是rviz,navigation package等功能包。 - [% M% \8 L; r5 I; _' Q% O ROS为开发者提供了一系列非常有用的工具,可以大大提高我们开发的效率。* f$ E* [+ a' m: s9 o# O5 ~1 F" W rqt_plot:可以实时绘制当前任意Topic的数值曲线;/ H% K+ f' i- l& `% v3 c, c / @; d0 \- T3 N! [" t, d! @ 除了ROS本身之外,世界上已经有很多非常优秀的机器人开源项目,但是ROS正逐渐将它们一一囊括在自己的范畴里,所以你可以在ROS里面很容易的使用这些开源项目:(这部分项目介绍文字摘自公众号:【Nao】 一位交大的算法博士的公众号). E$ S3 a% ?" b, q: V! ?: A , L" \% w, T: e4 S; N3 y+ q # f0 _, I' j4 H. D. A OROCOS:这个开源项目主要侧重于机器人底层控制器的设计,包括用于计算串联机械臂运动学数值解的KDL、贝叶斯滤波、实时控制等功能。 . j; `6 O! q4 p OpenRave:这是在ROS之前最多人用来做运动规划的平台,ROS已经将其中的ikfast(计算串联机械臂运动学解析解)等功能吸收。 Player:一款优秀的二维仿真平台,可以用于平面移动机器人的仿真,现在在ROS里可以直接使用。5 S b3 w& `' n% { h$ N 3 m& J. o$ D; K5 S 0 D. a; D6 R/ t9 J U OpenCV:大名鼎鼎的机器视觉开源项目,ROS提供了cv_bridge,可以将OpenCV的图片与ROS的图片格式相互转换。 + u4 r; k! X4 a# k) d 9 ?! C8 c9 \0 [# i OMPL:现在最著名的运动规划开源项目,已经成了MoveIt的一部分。 . a0 p$ \7 o* k8 T9 V Visp:一个开源视觉伺服项目,已经跟ROS完美整合。 + E `% U" {" i& C Gazebo:一款优秀的开源仿真平台,可以实现动力学仿真、传感器仿真等,也已被ROS吸收。 7 |& c; O0 i5 Q# i2 ~8 o- j& C 当然,除了吸收别的优秀开源项目,ROS自己也发展出许多非常优秀的项目和库。# Q) H. P& x6 R/ T ! U( z7 P9 V9 G ORK:一个物体识别与位姿估计开源库,包含LineMod等算法,但实际使用效果还不是太理想。下图是LineMod识别效果 5 e- N- S7 W @* c Gmapping:这其实是在OpenSlam项目继承过来的(后来发展和改动较大),利用gmapping可以实现laser-based SLAM,快速建立室内二维地图,下图就是gmapping建立二维地图 ' z2 _7 k- q1 ]) D H+ h/ B4 A Navigation:基于Dijkstra、A*算法(全局规划器)和动态窗口法DWA(局部规划器)的移动机器人路径规划模块,可以在二维地图上实现机器人导航。 ROS怎么学3 z9 s; e: S1 D4 ^ f 8 o. o" M( d) _# s' j Nao作者8 R( f+ @0 X n1 e6 e4 R3 T ' z* V: D- Q! j0 Y 首先,ROS版本定期更新、主要模块有专人维护、问答区活跃、各mail lists也非常活跃、开发者非常热衷交流分享。如果深入到ROS社区,可以学到很多东西。 ; N$ A+ @" L1 d; N1 f& j9 K h7 w6 P0 i6 K ROS的基本架构和开发方式。我个人是强烈推荐直接看ROS官网上的教程ROS/Tutorials的Beginner Level(多看几遍),同时充分使用ROS的问答社区ROS Answers与各模块的Mail Lists,很多基础问题可能前人都遇到过。 $ C" V& {' Q. ~; T) e 7 F- S% _/ Q, I3 \3 K 其次,在了解ROS的基本架构与开发方式后,就可以有针对性地看自己所关心的部分了。如做移动机器人的同学就去看Navigation教程;做物体识别的就去看ORK教程;做运动规划的就去看MoveIt教程。这一步最好能跟有实际机器人练手(如果没有的话,就用gazebo仿真)。由于一些模块的教程不够清楚(如MoveIt),一定要多练习,甚至是去看部分源码,先保证自己会用ROS实现一些功能。 3 n2 ^: V, @3 s4 ^ 对于ROS与实际机器人的连接,建议仔细看看action(编写机器人驱动package)、URDF(机器人描述文件)的教程(或者ros_control)。我为SDA5F机器人编写了URDF文件,并修改了motoman_driver中的action,使得在ROS环境中用MoveIt规划控制双臂机器人运动。* }/ J5 l7 p1 t8 e c1 x 3 x8 y$ b/ X- q4 C0 r$ ~4 H 9 U$ g D2 H3 x% l 最后,就是进阶阶段了。我要强调一句“ROS只是一个工具",你会用ROS做SLAM并不能说明你会做SLAM。对于自己研究的内容,必须沉下心去看教材和论文,去理解每种算法背后的原理,知道如何调整算法参数、如何改进算法,最终能够自己编写某部分代码,并替换ROS的相应模块(如自己写运动学正逆解替代KDL等)。做研究,交流非常重要。如果你改进ROS某一算法后,最好能与package的原作者交流,将自己的修改merge到原项目中,在交流中提高自己与package的水平。当然,如果对算法有疑问,也可以直接咨询作者,ROS里的贡献者大都非常愿意分享和交流。# q* K8 v; y) w7 N* y5 f ! E# a- k% M) F! D' { 此外除了一个好的学习平台,我们还需要一个趁手的使用工具:推荐TurtleBot 所以TurtleBot是ROS支持度最好的机器人之一,可以在ROS社区中获得大量关于TurtleBot的相关资源,很多功能包都能直接复用到我们自己的移动机器人平台上,绝对是使用ROS开发移动机器人的重要资源。并且TurtleBot相关的国内支持平台:创客制造网站也提供了许多详细资料。, r9 o- A5 o$ @5 X3 Q2 U" Q |
ROS 要在ubutun下运行,难度有点大; u6 i8 A j, v" ~/ r3 n
本人接触不久,发现ROS的joint_states的输出频率(10Hz),提不上去。, Z- C4 S, _ B: | k
6轴的机械手点到点的仿真可以,但实时操控有问题,规划一个圆的运动,实际机械手有锯齿。