最近没啥可写博客了的,而且自己的毕业设计刚好是ROS的SLAM+MoveIt相关的,怕写的太多论文查重没法通过。

最近有小伙伴联系到我,问了我八个ROS问题,我觉得很有意义,所以在这里给大家整理一下供大家一起学习。

大家在学习有困惑可以发送问题给我(1692697820@qq.com),我会找时间整理并回复大家。也欢迎大家在“泡泡”里面进行提问~

这里我们来讲解第二个问题,如何学习ROS的系统知识(如何学习ROS?)


这个问题的话,你首先要清楚ROS是什么。

ROS---(Robot Operating System)是一个机器人软件平台,它能为异质计算机集群提供类似操作系统的功能。ROS的前身是斯坦福人工智能实验室为了支持斯坦福智能机器人STAIR而建立的交换庭(switchyard)项目。到2008年,主要由威楼加拉吉继续该项目的研发。ROS提供一些标准操作系统服务,例如硬件抽象,底层设备控制,常用功能实现,进程间消息以及数据包管理。ROS是基于一种图状架构,从而不同节点的进程能接受,发布,聚合各种信息(例如传感,控制,状态,规划等等)。目前ROS主要支持Ubuntu。

​ ROS = 分布式通讯 + 强大的功能包 + 好用的工具 + 资源众多的社区

​ 我们首先学习ROS学的就是如何去发布/订阅一个话题、如何去请求/应答一个服务、如何是定义调用参数、如何是要话题+服务的Action动作,这些是为整个ROS系统学习打下基础。当然,Linux系统、C++、Python这三个你可以不精通但是一定要会。

​ ROS系统下的数据都是Node(节点)的形式进行交互, 节点之间可以发布/订阅一个Topic,可以请求/响应一个Server,Param参数服务器这个,我基本是是把当成系统全局宏参数来理解的,至于动作Action通讯机制,完全就是Topic+Server构成的。(为什么这么说,请耐心看下去)

​ ROS-I系统是通过XML/RPC机制来实现,所有的节点要在Master下进行注册,通过Master才能知道其他节点并与之通讯,但是当Master宕机之后,所有的节点都会是瘫痪状态,而且必须有Master处于运行状态,节点们才可以正常工作。ROS-II系统是基于DDS数据分发来实现的,没有Master,每个Node都是独立的存在,寻找其他Node的时候通过IP来实现,这相对于ROS-I确实是一个很大的改进。ROS-II也能跑在除Linux系统之外,这也是一个很强大的优势。

​ 现在你再看这张图,是不是有了新的理解和认知呢~

​ 那么问题来了,XML/RPC和DDS是什么?这个问题我不做除解答,需要你们自己去理解。

​ ROS的分布式通讯可以很轻而易举的实现多台具备ROS系统的机器人之间的相互通讯,但这仅是其一,分布式的优势在功能包上才是体现的淋漓尽致。

​ 这里我们以雷达SLAM车为例,它的组成有激光雷达、驱动底盘、运算主机三部分组成,这是最基础的组成。假如我们现在要进行“键盘遥控实现Gmapping建图”的功能,这个时候的Node有哪些呢?

​ 我们需要雷达设备,那么雷达是以Node节点加入在系统里面的,它以话题通讯方式发布了一个叫做scan的话题。

​ 我们需要驱动底盘,那么驱动底盘也是以Node节点加入在系统里面的,它会订阅一个叫做cmd_vel的话题来对电机的控制从而驱动底盘,通过这个Node也会发布一个叫做Odom的话题,这个是通过轮子编码器计算得到的里程计数据。

​ 在运算主机上面,我们有两个节点。其一就是我们的Gmapping建图节点,负责订阅雷达的scan话题和底盘的Odom话题从而实现地图的建立;其二就是键盘控制节点,这个节点会发布一个cmd_vel速度控制话题,驱动底盘节点通过订阅这个节点来实现运动。

​ 这个就是rqt_graph!

​ 分布式通讯可以很容易的实现多台设备之间的数据交互,而在ROS系统下,所有的数据都是以Node节点发出,而Node实现,就是功能包。

​ ROS的开发是在一个工作空间下,编译成功的工作空间分为devel、build和src三部分组成,其中的src存放的就是我们的功能包。

​ 那么功能包的组成是什么样的呢?我们来分析一下。

​ CMakeList.txt和package.xml这两个是必不可少的,怎么配置的话大家可以去系统性学习一下。另外的几个文件夹,如果不是玩ROS有一定年限的话,也很难理解。但这确实是一个功能包的构成,我们自己去开发功能包或者使用他人功能包时候,也可以根据这样的构成来进行分析。

​ ROS系统下为我们提供了大量的功能包,二维建图的gmapping、hector、cartographer等等,三维建图的rtabmap、orb-slam等等,导航的navigation,多传感融合的robot_posetion_ekf、robot_localtion等等,甚至雷达的厂家、深度相机的厂家、底盘驱动的厂家,都会为你提供相应的功能包。

​ 很多人吐槽,说玩ROS啊就是掉包,算法什么的也不会,就是调调参数、跑通结构的工作,事实确是如此。ROS只是一个工具,你的代码、你的思想才是真正有价值的存在。

​ ROS的第三部分是开发工具。三维数据可视化平台RVIZ、物理仿真系统Gazebo、rqt工具包、以及自带的指令。没有任何一个工具可以和ROS比拟,而且还是免费。你可以没有雷达,可以没有深度相机,可以没有底盘和底盘驱动,但是你有Gazebo+RVIZ,这就够了!你可以很好的来验证你的算法设计。

​ ROS的第四部分是生态系统。生态系统对于一个软件来说十分重要,我们在学习ROS的时候可以在社区、交流群等进行技术咨询、交流和探讨,至少我们在碰到解决不了Bug的情况下可以有个方向。

​ 如何学习ROS?这个问题不止一个人问过我。

​ ROS很综合,它对学习者的知识面、计算机基础、编程能力等有着很高的要求。如果你很熟练Linux系统操作那么上手ROS会很快,如果你熟悉C++和Python那么很轻松就可以跑出来ROS的案例程序,如果你熟悉Socket、C/S和B/S、MQTT等等内容,那么你很轻松就可以掌握ROS的分布式通讯。

​ 很多机器人项目,我们完全可以不用ROS进行开发,比如视觉抓取目标的机械臂。淘宝上很多具备该功能的机械臂,最初的开发都没有使用ROS系统,而是随着ROS系统的推广,他们不得不将自己的产品开发ROS相关的支持。就好像我之前设计的人脸识别追踪的云台,最初的设计也仅仅只是Python OpenCV + PID控制 + 单片机驱动的方式来实现,我为了学习ROS才做了ROS的开发。

​ 那么我们为什么要学习ROS?

​ 这个问题,我们评论区见!大家可以聊聊自己的想法。