引言
机器人发展的三个重要时期

- 电气时代:主要应用于工业生产,俗称工业机器人,没有太多智能而言,完全按照人类的命令执行动作
- 数字时代:计算机和视觉技术逐渐应用,出现了AGV、视觉检测等应用,机器人传感器更加丰富,但是依然缺少自主思考的过程,智能化
有限,只能感知局部环境 - 智能机器人时代:机器人成为了AI技术的最佳载体
教程链接
系统架构
ROS是什么?
对于越来越复杂的智能机器人系统,已经不是一个人或者一个团队可以独立完成的,如何高效开发机器人,是技术层面上非常重要的一个问题,一群斯坦福大学的有志青年尝试给出一个答案,那就是机器人操作系统。
ROS的发展

经历前几年野蛮而快速的增长,ROS逐渐迭代稳定,2014年起,ROS跟随Ubuntu系统,每两年推出一个长期支持版,每个版本支持五年时间,这标志着ROS的成熟,也让ROS加快了普及的步伐。ROS被越来越多机器人使用,受限于当初设计的局限性,ROS的问题也逐渐暴露。为了能够真正设计一款适用于所有机器人的操作系统,ROS2在2017年底正式发布。
ROS的特点
- 提高机器人软件复用率
- 不要重新造轮子
ROS已经广泛用于各种机器人的开发,无论是机械臂、移动机器人、水下机器人,还是人形机器人、复合机器人,统统都可以看到ROS的身影,ROS已经成为机器人领域的普遍标准。
如一家做汽车的公司,从零制造汽车并不是一个明智的做法,他们通常会采购A家的轮子、B家的引擎、C家的多媒体系统,最后把这些整合到一起做成汽车。同理,我们也可以将ROS社区中已有的各种软件集合到一起,在此之上去实现自己的创意,同时还可以将自己的成果分享给别人,这样大家都可以站在巨人的肩膀上,向前走的更远,一步一步,智能机器人才会有更多沉淀和更长远的进步。
ROS 全球社区
- answers.ros.org,这是一个ROS问答网站,大家可以在上边提出任何关于ROS的问题,全球很多开发者都很乐意回答我们的问题;
- wiki.ros.org,这是ROS的维基百科,记录了ROS教程和各种功能包的使用;
- discourse.ros.org,这是ROS论坛,关于ROS开发的新鲜事都可以在这里发表和查看,比如ROS的活动、新功能包的发布等等。
- index.ros.org,是ROS各种资源的一个索引网站;
- packages.ros.org,是ROS功能包存储的数据库。
ROS2对比ROS1
ROS1局限性

ROS最早的设计目标就是开发这样一款PR2家庭服务机器人,这款机器人绝大部分时间都是独立工作,为了让他具备充足的能力:
- 搭载了工作站级别的计算平台和各种先进的通信设备,不用担忧算力不够,有足够的实力支持各种复杂的实时运算和处理;
- 由于是单兵作战,通信绝大部分都自己内部完成,那就可以用有线连接,保证了良好的网络连接,没有丢数据或者黑客入侵的风险;
- 这台机器人最终虽然小批量生产,但是由于高昂的成本和售价,也只能用于学术研究。
随着ROS的普及,应用ROS的机器人类型已经和PR2机器人有了天翻地覆的问题,也并不具备PR2这样的条件,那原本针对PR2设计的软件框架,就会出现一些问题,比如:
- 要在资源有限的嵌入式系统中运行;
- 要在有干扰的地方保证通信的可靠性;
- 要做成产品走向市场,甚至用在自动驾驶汽车和航天机器人上。
全新的ROS2
- 多机器人系统:未来机器人一定不会是独立的个体,机器人和机器人之间也需要通信和协作,ROS2为多机器人系统的应用提供了标准方法和通信机制。
- 跨平台:为了让所有机器人都可以运行ROS2,ROS2可以跨平台运行于Linux、Windows、MacOS、RTOS,甚至是没有任何系统的微控制器(MCU)上
- 实时性
- 网络连接:无论在怎样的网络环境下,ROS2都可以尽量保障机器人大量数据的完整性和安全性,比如在wifi信号不好的时候数据也要尽力发送过去,在有黑客入侵风险的场景下要对数据进行加密解密。
- 产品化
- 项目管理:机器人开发是一个复杂的系统工程,设计、开发、调试、测试、部署等全流程的项目管理工具和机制,也会在ROS2中体现,更方便我们去开发一款机器人

- 系统架构进行了颠覆性的变化,ROS1中所有节点都需要在节点管理器ROS Master的管理下进行工作,一旦Master出现问题,系统就面临宕机的风险,ROS2实现了真正的分布式,不再有Master这个角色,借助一种全新的通信框架DDS,为所有节点的通信提供可靠保障。
- 软件API进行了重新设计,ROS1原有的接口已经无法满足需求,ROS2结合C++最新标准和Python3语言特性,设计了更具通用性的API,虽然导致原有ROS1的代码无法直接在ROS2中运行,但是尽量保留了类似的使用方法,同时提供了大量移植的说明。
- 编译系统进行了升级,ROS1中使用的rosbuild和catkin问题诸多,尤其是针对代码较多的大项目以及Python编写的项目,编译、链接经常会出错,ROS2对这些问题也进行了优化,重新优化后的编译系统叫做ament和colcon,大家在后续的课程中就会体验到新版编译器的使用方法。
ROS2 VS ROS1

- 在ROS1中,应用层里Master这个节点管理器的角色至关重要,所有节点都得听它指挥,类似是一个公司的CEO,有且只有一个,如果这个CEO突然消失,公司肯定会成一团乱麻。ROS2把这个最不稳定的角色请走了,节点可以通过另外一套discovery——自发现机制,找到彼此,从而建立稳定的通信连接。
- 中间层是ROS封装好的标准通信接口,我们写程序的时候,会频繁和这些通信接口打交道,比如发布一个图像的数据,接收一个雷达的信息,客户端库会再调用底层复杂的驱动和通信协议,让我们的开发变得更加简单明了。
- 在ROS1中,ROS通信依赖底层的TCP和UDP协议,而在ROS2中,通信协议更换成了更加复杂但也更加完善的DDS系统。
- 如果是在进程内需要进行大量数据的通信,ROS1和ROS2都提供了基于共享内存的通信方法,只不过名字不太一样而已。
- 最下边是系统层,也就是可以将ROS安装在哪些操作系统上,ROS1主要安装在Linux上,ROS2的可选项就很多了,Linux、windows、MacOS、RTOS都可以。
DDS通信

ROS2相比ROS1最大的变化,除了省略了Master之外,应该就是通信系统的变化了。
DDS其实是物联网中广泛应用的一种通信协议,类似于我们常听说的5G通信一样,DDS是一个国际标准,能够实现该标准的软件系统并不是唯一的,不过这就带来一个问题,每个DDS厂家的软件接口肯定是不一样的,如果我们按照某一家的接口写完了程序,想要切换其他厂家的DDS,不是要重新写代码么?为了解决这个问题,ROS2设计了一个ROS Middleware,简称RMW,也就是指定一个标准的接口,比如如何发数据,如何收数据,数据的各种属性如何配置,都定义好了,如果厂家想要接入ROS社区,就得按照这个标准写一个适配的接口,把自家的DDS给移植过来,这样就把问题交给了最熟悉自家DDS的厂商。
举一个例子,比如我们在产品开发时,可以先用开源版本的DDS满足基本需求,部署交付的产品时,再更换为商业版本更稳定的DDS,这样可以减少开发成本。
核心概念

命令行

ROS1中的命令行相对分散,每一个功能都是一个独立的命令,比如rosrun启动某一个节点,rostopic控制话题相关的功能。
ROS2对命令行做了大幅度的集成,所有命令都集成在一个ros2的主命令中,比如ros2 run,表示启动某一个节点,ros2 topic表示话题相关的功能。
总结:ROS2 VS ROS1
- 节点干掉了Master
- 通信换成了DDS
- 核心概念没变化
- 编程难度有上升
3600




被折叠的 条评论
为什么被折叠?



