写点什么

嵌入式的我们为什么要学 ROS

用户头像
良知犹存
关注
发布于: 2020 年 11 月 04 日


作者:良知犹存

转载授权以及围观:欢迎添加微信公众号:羽林君


前言

    本来是要写一篇 STM32 移植 ROS 的一个小 lib 库,ROS 一般都是需要跑在 Linux 上的,STM32 使用就是当成一个 ROS 通讯的小节点,但是写文章时间不够,所以就简单做一篇 ROS 的介绍文章,分享给嵌入式的小伙伴们。ROS 现在在机器人领域会有比较多的应用,学习的人群也逐渐增多,甚至会有专门的 ROS 岗位进行招聘,并且普遍工资要比一般的嵌入式开发高一些。今天给大家分享一下,希望大家可以一起学习进步哈。



ROS 是什么

     ROS(机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套电脑操作系统架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。

ROS 的运行架构是一种使用 ROS 通信模块实现模块间 P2P 的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括:

  1. 1.基于服务的同步 RPC(远程过程调用)通讯;

  2. 2.基于 Topic 的异步数据流通讯,还有参数服务器上的数据存储。

发展目标

    ROS 的首要设计目标是在机器人研发领域提高代码复用率。ROS 是一种分布式处理框架(又名 Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS 还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。上述所有功能都能由 ROS 的基础工具实现。

为了实现“共享与协作”这一首要目标,人们制订了 ROS 架构中的其他支援性目标:

  • “轻便”:ROS 是设计得尽可能方便简易。您不必替换主框架与系统,因为 ROS 编写的代码可以用于其他机器人软件框架中。毫无疑问的,ROS 更易于集成与其他机器人软件框架。事实上 ROS 已完成与 OpenRAVE、Orocos 和 Player 的整合。

  • ROS-agnostic 库:【agnostic:不可知论】建议的开发模型是使用 clear 的函数接口书写 ROS-agnostic 库。

  • 语言独立性:ROS 框架很容易在任何编程语言中执行。我们已经能在 Python 和 C++中顺利运行,同时添加有 Lisp、Octave 和 Java 语言库。

  • 测试简单:ROS 有一个内建的单元/组合集测试框架,称为“rostest”。这使得集成调试和分解调试很容易。

  • 扩展性:ROS 适合于大型实时系统与大型的系统开发项目

     在 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 客户端库都支持重命名,这等同于,每一个编译成功的程序能够以另一种形似【名字】运行。

    ROS 通信接口正在成为机器人软件互操作的事实标准,也就是 说绝大部分最新的硬件驱动和最前沿的算法实现都可以在 ROS 中找到。例如,在 ROS 的官方网页 上有着大量的开源软 件库,这些软件使用 ROS 通用接口,从而避免为了集成它们而 重新开发新的接口程序


ROS 可以做什么

    当我们希望稍微提高一下机器人复杂度的时候,就会发现另一个需要考虑的问题,进程间通信。在我们用 Windows + RTX 的时候,进程间通信使用 RTX 提供的 shared memory,不过都是比较慢的图像处理进程向 shared memory 中写数据,决策和运动控制进程读数据。shared memory 显然并不是很好的通信方式,这里不再多加讨论。ROS 则使用了一个很好的通信架构,并且是 ROS 整个框架的一个基础(不论是对于 ROS 中的 topic,service,plugin,actionlib 等基础概念还是 rviz,navigation package 等功能包。

   

    ROS 为开发者提供了一系列非常有用的工具,可以大大提高我们开发的效率。

rqt_plot:可以实时绘制当前任意 Topic 的数值曲线;



rqt_graph:可以绘制出各节点之间的连接状态,和正在使用的 Topic 等;



TF:TF 是 Transform 的简写,利用它,我们可以实时知道各连杆坐标系的位姿,也可以求出两个坐标系的相对位置。



Rviz:超强大的 3D 可视化工具,可以显示机器人模型、3D 电影、各种文字图标、也可以很方便二次开发;


   除了 ROS 本身之外,世界上已经有很多非常优秀的机器人开源项目,但是 ROS 正逐渐将它们一一囊括在自己的范畴里,所以你可以在 ROS 里面很容易的使用这些开源项目:(这部分项目介绍文字摘自公众号:【Nao】 一位交大的算法博士的公众号

OROCOS:这个开源项目主要侧重于机器人底层控制器的设计,包括用于计算串联机械臂运动学数值解的 KDL、贝叶斯滤波、实时控制等功能。

OpenRave:这是在 ROS 之前最多人用来做运动规划的平台,ROS 已经将其中的 ikfast(计算串联机械臂运动学解析解)等功能吸收。

Player:一款优秀的二维仿真平台,可以用于平面移动机器人的仿真,现在在 ROS 里可以直接使用。

OpenCV:大名鼎鼎的机器视觉开源项目,ROS 提供了 cv_bridge,可以将 OpenCV 的图片与 ROS 的图片格式相互转换。

OMPL:现在最著名的运动规划开源项目,已经成了 MoveIt 的一部分。

Visp:一个开源视觉伺服项目,已经跟 ROS 完美整合。

Gazebo:一款优秀的开源仿真平台,可以实现动力学仿真、传感器仿真等,也已被 ROS 吸收。

当然,除了吸收别的优秀开源项目,ROS 自己也发展出许多非常优秀的项目和库。

ORK:一个物体识别与位姿估计开源库,包含 LineMod 等算法,但实际使用效果还不是太理想。下图是 LineMod 识别效果



PCL:一个开源点云处理库,原本是从 ROS 中发展起来的,后来由于太受欢迎,为了让非 ROS 用户也能用,就单独立了一个 PCL 的项目。

Gmapping:这其实是在 OpenSlam 项目继承过来的(后来发展和改动较大),利用 gmapping 可以实现 laser-based SLAM,快速建立室内二维地图,下图就是 gmapping 建立二维地图



Localization:基于扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)的机器人定位算法,可以融合各种传感器的定位信息,获得较为准确的定位效果。

robot_localization 示意图



Navigation:基于 Dijkstra、A*算法(全局规划器)和动态窗口法 DWA(局部规划器)的移动机器人路径规划模块,可以在二维地图上实现机器人导航。



MoveIt:这个是专注于移动机械臂运动规划的模块,运动规划.



当然,除了这些最先进算法外,ROS 还有各种机器人、传感器驱动等内容。


ROS 怎么学

   Nao 作者

    首先,ROS 版本定期更新、主要模块有专人维护、问答区活跃、各 mail lists 也非常活跃、开发者非常热衷交流分享。如果深入到 ROS 社区,可以学到很多东西。

    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 里的贡献者大都非常愿意分享和交流。

   

   此外除了一个好的学习平台,我们还需要一个趁手的使用工具:推荐 TurtleBot



    TurtleBot 可以说是 ROS 中最为重要的机器人之一,它伴随 ROS 一同成长,一直都作为 ROS 开发前沿的机器人,几乎每个版本的 ROS 测试都会以 TurtleBot 为主,包括 ROS2 也率先在 TurtleBot 上进行了大量测试。

    所以 TurtleBot 是 ROS 支持度最好的机器人之一,可以在 ROS 社区中获得大量关于 TurtleBot 的相关资源,很多功能包都能直接复用到我们自己的移动机器人平台上,绝对是使用 ROS 开发移动机器人的重要资源。并且 TurtleBot 相关的国内支持平台:创客制造网站也提供了许多详细资料。

这就是我分享的 ROS,最近也有在用 ROS 以及更加深入的学习 ROS,有些资料大家可以添加我微信,我可以分享给大家。此外如果大家有什么更好的思路,也欢迎分享交流哈。

END

推荐阅读

【1】c++nullptr(空指针常量)、constexpr(常量表达式)

【2】嵌入式底层开发的软件框架简述 必读

【3】CPU中的程序是怎么运行起来的

【4】C++的匿名函数(lambda表达式)

【5】阶段性文章总结分析

本公众号全部原创干货已整理成一个目录,回复[ 资源 ]即可获得。



更多分享,扫码关注我


发布于: 2020 年 11 月 04 日阅读数: 103
用户头像

良知犹存

关注

还未添加个人签名 2020.05.29 加入

还未添加个人简介

评论

发布
暂无评论
嵌入式的我们为什么要学ROS