嵌入式的我们为什么要学ROS
作者:良知犹存
转载授权以及围观:欢迎添加微信公众号:羽林君
前言
本来是要写一篇STM32移植ROS的一个小lib库,ROS一般都是需要跑在Linux上的,STM32使用就是当成一个ROS通讯的小节点,但是写文章时间不够,所以就简单做一篇ROS的介绍文章,分享给嵌入式的小伙伴们。ROS现在在机器人领域会有比较多的应用,学习的人群也逐渐增多,甚至会有专门的ROS岗位进行招聘,并且普遍工资要比一般的嵌入式开发高一些。今天给大家分享一下,希望大家可以一起学习进步哈。
ROS是什么
ROS(机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套电脑操作系统架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。
ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括:
1.基于服务的同步RPC(远程过程调用)通讯;
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】阶段性文章总结分析
本公众号全部原创干货已整理成一个目录,回复[ 资源 ]即可获得。
更多分享,扫码关注我
嵌入式的我们为什么要学ROS的更多相关文章
- 本科小白学ROS 和 SLAM(一):杂谈
本人最近才迷恋上ROS(Robot Operating System),准确的说应该是6月中旬,具体的记不清了(可能是年纪大了,容易健忘).对于一个电子DIY的狂热爱好者来说,我在校的梦想就是做一个属 ...
- 加快你ROS安装的一篇文章
前言: 首先ROS大家应该比较熟悉了哈,如果需要补充一下请看我之前的这篇文章 <嵌入式的我们为什么要学ROS>,对于嵌入式来说ROS是一个很好的进阶方向,所以如何快速的安装一个ROS到我们 ...
- 什么?还不懂c++vector的用法,你凭什么勇气来的!
- ros机器人开发概述
1. ROS项目开发流程? 参照古月大神写的ROS探索总结系列:http://blog.exbot.net/archives/619 具体项目设计可看看<程序员>杂志的最新一篇 ...
- 机器人程序设计——之如何正确入门ROS | 硬创公开课(附视频/PPT)【转】
转自:http://blog.exbot.net/archives/2966 导语:本期公开课面向想入手ROS却又不知从何下手的小伙伴,为大家梳理好学习思路. ROS和Android一样是开源的,功能 ...
- STM32通过rosserial接入ROS通讯开发
作者:良知犹存 转载授权以及围观:欢迎添加微信公众号:羽林君 前言 主题:串口是一种设备间常用的通讯接口,rosserial将串口字符数据转发到标准ROS网络,并输出到rosout和其日志文件.本文将 ...
- ROS 不能再详细的安装教程
版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5779206.html 关于ROS(Robot OS 机器人操作系统),估计看这个博文 ...
- 嵌入式linux的学习之路[转]
我认为的一条学习嵌入式Linux的路: 1)学习 Linux系统安装. 常用命令.应用程序安装. 2) 学习 Linux 下的 C 编程.这本书必学<UNIX 环境高级编程>.<UN ...
- ROS机器人程序设计(原书第2版)补充资料 (壹) 第一章 ROS系统入门
ROS机器人程序设计(原书第2版)补充资料 (壹) 第一章 ROS系统入门 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 第一章主要包括R ...
随机推荐
- Linux运维入门到高级全套系列PDF
Linux运维入门到高级全套系列PDF(转) [日期:2016-08-01] 来源:Linux社区 作者:Linux [字体:大 中 小] Linux 学习技巧 初学者可以自己安装虚拟机,然 ...
- 在Docker下进行MyCAT管理双主双从MySQL集群
前言 在Docker下双主双从MySQL集群模拟 https://www.cnblogs.com/yumq/p/14259964.html 本文实验配置文件 Docker拉取MyCAT镜像 如果没启动 ...
- 冷饭新炒:理解Redisson中分布式锁的实现
前提 在很早很早之前,写过一篇文章介绍过Redis中的red lock的实现,但是在生产环境中,笔者所负责的项目使用的分布式锁组件一直是Redisson.Redisson是具备多种内存数据网格特性的基 ...
- 多媒体开发(5)&音频特征:声音可以调大一点吗?
基本上,现在常用的声音采样办法是pcm,而对于压缩音频的解码,得到的也pcm数据.这个pcm数据,只是一堆数值,有正有负,看这个值看不出什么花样. 声音采集,采的是什么呢? 采的是声音的强度变化,也是 ...
- 解锁Renderbus客户端使用新技巧----快速渲染效果图篇
度娘说,效果图最基本的要求就是:应该符合事物的本身尺寸,不能为了美观而使用效果把相关模型的尺寸变动,那样的效果图不但不能起到表现设计的作用,反而成为影响设计的一个因素.可见高效渲染效果图是都是当下我们 ...
- 【剑指 Offer】06.从尾到头打印链表
题目描述 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10 ...
- 容器编排系统K8s之APIService资源
前文我们聊到了k8s上crd资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14267400.html:今天我们来了解下k8s的第二种扩展 ...
- 【JS学习】var let const声明变量的异同点
[JS学习]var let const声明变量的异同点 前言: 本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 总述 ...
- 【数据结构与算法】Java制作一个简单数组类
bobo老师的玩转算法系列–玩转数据结构 简单记录 文章目录 不要小瞧数组 - 制作一个数组类 1 .使用Java中的数组 数组基础 简单使用 2.二次封装属于我们自己的数组 数组基础 制作属于我们自 ...
- kubernets之pod的标签的使用
一 对于kubernets里面的资源标记完成之后的使用 1 node节点标签的应用(将资源调度到特定的节点上) #kubia-gpu.ymlapiVersion: v1 kind: Pod metad ...