android ros 节点编写_嵌入式的我们为什么要学ROS

9d509757c41d7020f0539e3078d2f044.png
c6b3e29faf1e3a841556322ef80a8d99.gif

前言

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

作者:良知犹存

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

02b1a73f4adf570dd033d47035718823.png

c6b3e29faf1e3a841556322ef80a8d99.gif
9d509757c41d7020f0539e3078d2f044.png
c6b3e29faf1e3a841556322ef80a8d99.gif

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通用接口,从而避免为了集成它们而 重新开发新的接口程序

9d509757c41d7020f0539e3078d2f044.png
c6b3e29faf1e3a841556322ef80a8d99.gif

ROS可以做什么

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

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

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

bfed9988e32992ba03553bbbb790f249.png

c6b3e29faf1e3a841556322ef80a8d99.gif

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

eec6e8711c0cf787f55dcca41e7c27cd.png

c6b3e29faf1e3a841556322ef80a8d99.gif

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

9927e80d216897832811b492cd6a3ac6.png

c6b3e29faf1e3a841556322ef80a8d99.gif

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

ed4d850dc0d45b3fcfb8c65c315b7da6.png
c6b3e29faf1e3a841556322ef80a8d99.gif

除了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识别效果

82be297f9e9236438631cc1ac66d9cce.png

c6b3e29faf1e3a841556322ef80a8d99.gif

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

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

3b2fd4c288a857e741729b44df8f6576.gif

c6b3e29faf1e3a841556322ef80a8d99.gif

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

robot_localization示意图

5d92fe332b23904ba3f93c89d4b95307.png
c6b3e29faf1e3a841556322ef80a8d99.gif

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

e8cad76e1afc01f26574e78b1aaff4d3.gif

c6b3e29faf1e3a841556322ef80a8d99.gif

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

d7d11e3b74bb8e3507c9f0e1918dfe1a.gif

c6b3e29faf1e3a841556322ef80a8d99.gif

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

9d509757c41d7020f0539e3078d2f044.png
c6b3e29faf1e3a841556322ef80a8d99.gif

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

04a483075fcc3fa0b12091858764f143.png

c6b3e29faf1e3a841556322ef80a8d99.gif

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】阶段性文章总结分析

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL源码剖析 __type_traits

traits编程 弥补了C本身的不足STL只对迭代器进行规范制定出了iterator_traits,SGI在此基础上进一步扩展,产生了__type_traits双下划线的含义是这个是SGI内部使用的东西,不属于STL标准iterator_traits 负责萃取迭代器的特性__type_traits负责萃…

java 学生成绩

题目 对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格” 代码 使用/除法简化代码 package l1_switch_case;import java.util.Scanner;public class SwitchDemo2 {public static void main(String[] args) {Scanner scanner new Scanne…

STL源码剖析 序列式容器|Vector

容器的概观和分类 array 数组 、list 链表、tree树 、stack堆栈、queue队列、hash table散列表、set集合、map映射表根据数据在容器中的排列顺序,将上述数据结构分为序列式和关联式两种类型SGI STL使用内缩方式来表达基层和衍生层之间的关系衍生不是派生&#xff0…

ansible 修改文件变量_Ansible Playbook中的变量与引用

Ansible是一个系列文章,我会尽量以通俗易懂、诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些。Ansible自动化运维前言前面有说到使用playbook来搞一些复杂的功能,我们使用YAML来写playbook,就像我们用其它语言…

java 判断日期为第几天

题目1 编写程序:从键盘上输入2019年的“month”和“day”,要求通过程序 输出输入的日期为2019年的第几天。 代码1 从12月往下加日期数 package l1_switch_case; import java.util.Scanner; public class SwitchDemo4 {public static void main(Strin…

STL源码剖析 list概述

目录 list的节点(node) list迭代器 list 的构造和内存管理 list 的元素操作 list相较于vector连续的线性空间就显得很复杂,他的存储空间是不连续的,好处是每次插入和删除一个元素的时候,只需要配置或者释放一个元素的空间 插入和删除十分的…

vsftp不允许切换到其它目录_IntelliJ IDEA如何对project的目录进行筛选显示?

如果你的项目很庞大,同一个功能用到的各种文件散落在多个文件夹,开发时切换不便,可以利用scope功能,只显示该功能用到的文件,让project列表十分清爽,提高开发效率。本文使用的IDEA版本为2020.1。1、打开sco…

java 年份对应的中国生肖

题目 编写一个程序,为一个给定的年份找出其对应的中国生肖。 中国的生肖基于12年一个周期, 每年用一个动物代表: rat、ox、tiger、rabbit、dragon、snake、horse、sheep、monkey、 rooster、dog、pig。 提示:2019年:猪…

密码学专题 对称加密算法

一般来说,使用OpenSSL对称加密算法有两种方式,一种是使用API函数的方式,一种是使用OpenSSL提供的对称加密算法指令方式。本书将介绍对称加密算法的指令方式OpenSSL的对称加密算法指令主要用来对数据进行加密和解密处理,输入输出的…

网络防火墙单向和双向_单向晶闸管与双向晶闸管之间的不同之处

晶闸管是回一个可以控导点开关,能以弱电去控制强电的各种电路。晶闸管常用于整流,调压,交直流变化,开关,调光等控制电路中。具有提交小,重量轻,耐压高,容量大,效率高&…

java 遍历100以内的偶数,偶数的和,偶数的个数

题目 遍历100以内的偶数,偶数的和,偶数的个数 代码 package l2_for; /*遍历100以内的偶数,偶数的和,偶数的个数*/ public class ForDemo1 {public static void main(String[] args) {//方法1:int sum1 0,count10;f…

python版本切换_怎么切换python版本

展开全部 (1)分别安2113装 python-2.7.12.amd64.msi python-3.5.2-amd64.exe (python官网下载的) 顺序无所谓(为5261了看着4102方便,我把安装路径修改统一了1653) (2)配置…

java 打印

题目 编写程序从1循环到150,并在每行打印一个值,另外在每个3的倍数行 上打印出“foo”,在每个5的倍数行上打印“biz”,在每个7的倍数行上打印 输出“baz”。 代码 package l2_for;/** 编写程序从1循环到150,并在每行打印一个值&#xff0c…

react.lazy 路由懒加载_Vue面试题: 如何实现路由懒加载?

非懒加载import List from /components/list.vue const router new VueRouter({routes: [{ path: /list, component: List }] })方案一(常用)const List () > import(/components/list.vue) const router new VueRouter({routes: [{ path: /list, component: List }] })方…

STL源码剖析 deque双端队列 概述

vector是单向开口的连续线性空间,deque是一种双向开口的连续线性空间。deque可以在头尾两端分别进行元素的插入和删除操作vector和deque的差异 1,deque允许常数时间内对于头端元素进行插入和删除操作2,deque没有所谓容量(capacity)的概念&…

java 最大公约数和最小公倍数

题目 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 比如:12和20的最大公约数是4,最小公倍数是60。 说明:break关键字的使用 代码一 package l2_for; //题目:输入两个正整数m和n,求…

python的自带数据集_Python的Sklearn库中的数据集

一、Sklearn介绍 scikit-learn是Python语言开发的机器学习库,一般简称为sklearn,目前算是通用机器学习算法库中实现得比较完善的库了。其完善之处不仅在于实现的算法多,还包括大量详尽的文档和示例。其文档写得通俗易懂,完全可以当…

STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器

Stack是一种先进后出的数据结构,他只有一个出口stack允许 新增元素、移除元素、取得最顶端的元素,但是无法获得stack的内部数据,因此satck没有遍历行为Stack定义的完整列表 (双端队列作为Stack的底层容器) 将deque作为Stack的底部结构&#…

java 三位数的水仙花数

代码 package l2_for;public class ForDemo6 {public static void main(String[] args) {for (int i 100; i <999 ; i) {int i1i/1%10;int i2i/10%10;int i3i/100%10;if (i(int)(Math.pow(i1,3)Math.pow(i2,3)Math.pow(i3,3))){System.out.print(i"\t");}}} }

python怎么实现图像去噪_基于深度卷积神经网络和跳跃连接的图像去噪和超分辨...

Image Restoration Using Very Deep Convolutional Encoder-Decoder Networks with Symmetric Skip Connections作者&#xff1a;Xiao-Jiao Mao、Chunhua Shen等本文提出了一个深度的全卷积编码-解码框架来解决去噪和超分辨之类的图像修复问题。网络由多层的卷积和反卷积组成&a…