作者:良知犹存

来源:羽林君

前言

本来是要写一篇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

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

更多分享,扫码关注我

嵌入式的我们需要学习一下ROS吗?相关推荐

  1. 嵌入式Linux系统编程学习之二常用命令

    嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...

  2. 嵌入式Linux系统编程学习之一目录结构

    嵌入式Linux系统编程学习之一目录结构 文章目录 嵌入式Linux系统编程学习之一目录结构 前言 一.Linux目录结构 前言 Linux目录结构 一.Linux目录结构 /bin:存放Linux的 ...

  3. 2014025631嵌入式程序设计第一周学习总结

    2014025631嵌入式程序设计第一周学习总结 学习任务 本周我们对gcc和vim的基本操作进行了学习,因为头一次在linux环境下些内容,本周学习略微有些难度. 学习内容 在实验楼中学习了一些基本 ...

  4. 嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析)

    嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析) 首先声明该博客是针对朱有鹏老师的嵌入式课程进行笔记的总结. 一.通过GPIO控制点亮LED( ...

  5. 学习嵌入式的书籍推荐,嵌入式编程入门教程学习大纲

    嵌入式系统是当前热门.具发展前景的IT应用领域之一,很多数字包括手机.电子字典.可视电话.数字相机.数字摄像机.机顶盒.智能玩具医疗仪器和航空航天设备等都是典型的嵌入式系统.越来越多的人想要了解学习嵌 ...

  6. 嵌入式算法移植优化学习笔记5——CPU,GPU,TPU,NPU都是什么

    嵌入式算法移植优化学习笔记5--CPU,GPU,TPU,NPU都是什么 一.什么是CPU? 二.什么是GPU? 三.什么是NPU? 四.什么是TPU? 附: 随着AI的广泛应用,深度学习已成为当前AI ...

  7. I.MX6U嵌入式Linux应用编程学习

    I.MX6U嵌入式Linux应用编程学习 目录 I.MX6U嵌入式Linux应用编程学习 〇.备忘 0.0 本文大写字母缩写说明 0.1 C编译 0.2 NFS与文件夹挂载 一.应用编程概念 1.1 ...

  8. 嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210)

    嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210) 一.SD卡介绍 1. SD卡背景知识和特点 SD卡.MMC卡.MicroSD.TF卡:这些卡其实内部就是Flash存储颗粒,比 ...

  9. 嵌入式有什么值得学习的软硬件技术?

    在2020年虽说不怎么顺利,但是对于嵌入式工程师来说算是好日子,随着物联网的发展,嵌入式也随之崛起了,那么嵌入式技术人才要怎么去选择呢?下面一起来了解下嵌入式有什么值得学习的软硬件技术吧. 先搞清楚什 ...

最新文章

  1. 不安全网络中的数据安全传输利器——GnuPG(下)
  2. 【12c新特性】安装12c Standalone Grid Infrastructure
  3. scala语言的底层是java实现的_Scala学习笔记一(与Java、Jvm的关系以及程序执行流程分析)...
  4. JSON.NET 简单的使用
  5. OpenCV与图像处理学习十五——LBP纹理特征(含代码)
  6. finereport与finebi差别_Finereport和Finebi的区别
  7. 我,30岁,部队服役5年,零基础转大数据
  8. AE zoom to selected 地图刷新
  9. 汽车电子控制系统的构成
  10. [Unity2D入门教程]简单制作仿植物大战僵尸游戏之③完善Defender植物和Attacker的相关细节(脚本,碰撞体)
  11. 只有VOB 文件,怎样使用IfoEdit生成烧制DVD所需的IFO、BUP文件!
  12. 优秀码农选择对象详细指南,看完记得要实战噢
  13. 从程序员到CTO的Java技术路线图(转)
  14. msc.marc的Python开发,MscMarc,python,2
  15. SN74HC165驱动
  16. 目前住院病人主要由护士护理,这样做不仅需要大量护士,而且由于不能随时观察危重病人的病情变化,还会延误抢救时机。某医院打算开发一个以计算机为中心的患者监护系统,请用数据流图描述下面系统的业务流程。
  17. 奋斗吧,程序员——第四十六章 此情可待成追忆,只是当时已惘然
  18. 2022-2028年全球与中国蜗牛美容产品行业竞争格局与投资战略研究
  19. HTTP Status 404 的解决思路
  20. 价格时序预测-LSTM

热门文章

  1. 信息系统项目管理师 - 信息系统项目管理基础
  2. 缓存微信accesstoken实现
  3. Java - 拷贝亿赛通项目
  4. 同济大学mba提前面试-同济大学MBA提前面试需要准备哪些材料?
  5. CSS截字符串,表格英文强制换行
  6. php照片墙,照片墙(CSS3动态效果)
  7. iPhone 手机怎么设置App Store的显示语言,中英文切换
  8. C++friend用法简单总结
  9. Dubboamp;hsfamp;Spring-cloud的区别
  10. Skype 不能开启