ROS入门
- ROS介绍
- 分布式、模块化的设计
- 充满活力的社区
- 宽松的许可
- 核心许可BSD
- 其他许可
- 协作环境
- 核心组件
- 通信基础设施
- 消息传递
- 记录和回放信息
- 远程过程调用
- 分布式参数系统
- 机器人特定能力
- 机器人标准消息
- 机器人几何库
- 机器人描述语言
- 可抢占的远程过程调用
- 诊断工具
- 姿态估计、定位和导航
- 工具
- 命令行工具
- rviz
- rqt
- rqt_graph插件
- rqt_plot插件
- rqt_publisher插件
- rqt_bag插件
- 参考
打算花一些时间整理一些ROS的入门资料,聊以作为自己的读书笔记。
ROS介绍
Robot Operation System,名为OS,实际上可以认为是一个中间件。
在采用之前,我们一起来看看为什么我们需要在机器人系统中引入ROS框架。
分布式、模块化的设计
ROS被设计为尽可能地分布式和模块化,以确保ROS在部署时的灵活性。
ROS的模块化允许开发人员挑选和选择哪些部分对您有用,哪些部分预计自己实现。
ROS的分布式特性还催生了一个由用户贡献的包组成的大型社区,这些包在核心ROS系统之上增加了很多能力。
据最新统计,在ROS生态系统中有超过3000个包(向公众公布的)。这些软件包涵盖了从新算法的概念验证实现到工业质量的驱动程序和功能的所有内容。
ROS用户社区构建在公共基础设施之上,提供对硬件驱动程序、通用机器人功能、开发工具、有用的外部库等的访问。
充满活力的社区
在过去的几年中,ROS已经发展到包括一个全球范围内的大型用户社区。
较早的ROS用户运用于实验机器人,但我们看到越来越多的团队在商业机器人上采用ROS,特别是在工业和服务领域。
ROS社群非常活跃。ROS社区在ROS -users邮件组中有超过1500名参与者,在wiki协作文档上有超过3300名用户,在ROS回答社区的网站上有大约5700名用户。
ROS维基有超过22000个页面,每天有超过30个维基页面得到更新。到目前为止,该问答网站共有13000个问题,回答率为70%。
宽松的许可
核心许可BSD
ROS的核心遵循标准的BSD(3-Clause)许可证。
允许在商业和封闭源代码产品中重用。
BSD允许使用者以其他协议的形式修改和重新发布代码,允许闭源商业发布和销售。
BSD鼓励代码共享的同时,要求尊重代码作者的著作权。
使用BSD协议,需要遵守以下规则:
- 如再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议;
- 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档的版权声明中包含原来代码中的BSD协议;
- 不可以用开源代码的“作者/机构的名字”或“原来产品的名字”做市场推广。
相关BSD-3的条款在如下网页有相关详情:
http://opensource.org/licenses/BSD-3-Clausehttp://en.wikipedia.org/wiki/BSD_licenseshttps://baike.baidu.com/item/BSD%E8%AE%B8%E5%8F%AF%E5%8D%8F%E8%AE%AE
其他许可
ROS社区发行的包中,包含由其他许可,如Apache 2.0许可、GPL许可、MIT许可,甚至专有许可。ROS生态系统中的每个包都需要指定一个许可,这样您就可以很容易地快速识别一个包是否满足您的许可需求。
协作环境
ROS的核心理念之一是公共组件的共享开发。
ROS本身就为大量的机器人项目提供了价值,它也提供了一个与世界一流的机器人专家(ROS社区的一部分)建立联系和合作的机会。
核心组件
由于ROS的生态由社区自行维护,所以很难提供一个详尽的清单。但我们可以识别的一些核心部分并谈论他们的功能、技术规格和质量,以说明ROS能有助于您的项目。
包含通信基础设施、机器人特定能力、工具三部分。
通信基础设施
ROS提供了一个消息中间件,在低层级上提供了一个消息传递接口,该接口提供进程间通信。
ROS中间件提供了以下能力:
- 匿名的发布/订阅式的消息传递
- 信息的记录和回放
- 请求/响应远程过程调用(RPC)
- 分布式参数系统
消息传递
在实现新的应用程序时,通信系统通常是首要需求之一。ROS内置了经过良好测试的消息传递系统,在此系统中可通过匿名的发布/订阅机制管理分布式节点之间的通信细节,从而节省了您的时间。使用消息传递系统的另一个好处是,它迫使您在系统中的节点之间实现清晰的接口,从而改进封装并促进代码重用。这些消息接口的结构被定义与在消息IDL(接口描述语言)中。
记录和回放信息
由于发布/订阅系统是匿名且异步的,因此可以在无需对代码进行任何修改的情况下,轻松地捕获和回放数据。
例如,任务A负责读取一个传感器来的数据,你可以开发任务B处理任务A产生的数据。ROS可以很轻松地将任务A发布的数据捕获输入一个文件,然后稍后重新从文件中发布数据。消息传递抽象允许任务B不受数据源的影响而专注于数据本身(数据源可以是任务A或日志文件)。
这是一种强大的设计模式,可以显著减少开发工作,并提高系统的灵活性和模块化程度。
远程过程调用
异步的发布/订阅消息传递的机制可满足机器人技术中的大部分通信需求,但有时您需要进程间的同步请求/响应交互。ROS中间件通过服务service提供了这种能力。
与主题Topic类似,服务调用中进程之间发送的数据使用相同的简单消息IDL定义。
分布式参数系统
通过全局键值存储,ROS中间件还为任务提供了一种共享配置信息的方法。这个机制允许您轻松地修改您的任务设置,甚至允许任务更改其他任务的配置。
机器人特定能力
除了核心的通信中间件外,ROS还提供了常用的机器人专用库和工具,可以快速让机器人启动和并运行。以下是ROS提供的专用能力:
- 机器人的标准消息定义
- 机器人几何库
- 机器人描述语言
- 抢占式RPC远程过程调用
- 诊断
- 姿态估计
- 定位
- 建图
- 导航
机器人标准消息
经过多年的社区讨论和开发演进,机器人领域已经形成了一套标准消息格式,涵盖了机器人技术中涉及到的大多数常见用例。
包括有:
- 几何概念消息,如姿势、变换和矢量;
- 传感器消息,如摄像头、IMU和激光等;
- 导航数据消息,如里程、路径和地图等;
- 其他。
通过在应用程序中使用这些标准消息,您的代码将能够与ROS生态系统的其余部分无缝地进行互操作,包括开发工具以及功能库。
机器人几何库
在机器人项目中,一个常见的挑战是追踪机器人不同部分相对于其他部分的位置。
例如,如果你想要将来自相机的数据与来自激光的数据结合起来,则需要知道每个传感器在一个共同参考系中的位置。
这个问题对于有许多运动部件的类人机器人尤为重要。我们在ROS中使用TF (transform)库来解决这个问题,该库将跟踪机器人系统中所有东西的位置。
TF库在设计时充分对效率进行了考量。该库被用于管理机器人的坐标转换数据,具有超过100个自由度和数百赫兹的更新率。TF库允许定义静态转换(如固定在移动底座上的摄像机)和动态转换(如机器人手臂的关节)。您可以在系统中的任意一对坐标系之间转换传感器数据。
TF库处理消息的生产者和消费者可能跨网络分布的情况,以及信息将以不同的速度更新的情况。
机器人描述语言
ROS为您解决的另一个机器人领域的常见问题是如何以机器可读的方式描述您的机器人。ROS提供了一组用于描述和建模机器人的工具,以便ROS系统的各部分(包括tf、robot_state_publisher和rviz)能够理解它。ROS用以描述机器人的格式是URDF(统一机器人描述格式),作为一个XML文档,它描述了机器人的物理性质,包括四肢的长度、轮子的大小、传感器位置和机器人的每个部分的视觉外观。
一旦使用了这种定义方式,我们就可以将TF库运用于机器人上,以良好的三维方式进行可视化呈现,并可使用模拟器和运动规划器作用于机器人上。
可抢占的远程过程调用
尽管主题(匿名发布/订阅)和服务(远程过程调用)涵盖了机器人技术中的大多数通信用例,但有时您需要启动一个带有明确反馈的行为,在此行为中监视其进展、能够在过程中被抢占并在完成时接收通知。ROS为此目的提供了action。action与service类似,只是它们可以在返回最终响应之前报告进度,并且可以被调用者抢占。
例如,你可以指示你的机器人导航到某个位置,在它试图到达那里时监控它的进度,停下来或重定向,并告知它何时成功(或失败)。
在整个ROS生态系统中,Action是一个强有力的概念。
诊断工具
ROS提供了一种标准的方法来生成、收集和聚合关于机器人的诊断,这样您就可以快速地看到机器人的状态,并在出现问题时确定如何解决问题。
姿态估计、定位和导航
ROS还提供了一些开箱即用的功能,可以帮助您开始您的机器人项目。
有一些ROS包可以解决基本的机器人问题,如姿态估计、地图定位、地图构建、以及移动导航。
无论你是一名想要做一些快速研发的工程师,或是一个想要及时完成研究的研究者,还是一个想要学习更多机器人知识的业余爱好者,这些开箱即用的功能都将帮助你以更高的效率完成更多的事情。
工具
ROS最强大的特性之一是丰富的开发工具集。这些工具支持对系统进行监控、绘制,并将正在开发的系统状态进行可视化。
底层的发布/订阅机制将允许您自发地对流经系统的数据进行监控,这使得在出现问题时我们能够更易于理解系统并进行调试。
ROS工具通过图形和命令行工具的集合来利用这种内部监控功能,这些工具大大简化了开发和调试。
命令行工具
你把所有的时间都花在远程登录机器人上了吗?
ROS完全可以在没有GUI的环境下使用。所有的核心功能和监控工具都可以通过ROS的45个命令行工具之一访问,包括有:
- 启动节点组的命令
- 检查主题Topic、服务Service和操作Action的工具
- 数据记录和回放工具
如果您更喜欢使用图形化工具,rviz和rqt也提供了类似的(和扩展的)功能。
rviz
rviz可能是ROS中最著名的工具,它提供了泛用目的的三维可视化描述,包含了各种传感器数据类型和任何以URDF描述的机器人。
rviz可以可视化ROS中提供的许多常见消息类型,如激光扫描、三维点云和相机图像。
它还会在您选择的公共坐标系中,使用来自tf库的信息,显示所有传感器数据以及机器人的三维渲染模型。
在一个应用程序中可视化所有数据不仅让人印象深刻,而且还能让您快速查看机器人所见的内容,并识别传感器错位或机器人模型不精准等问题。
rqt
ROS提供了rqt,一个基于qt的框架,用于为机器人开发图形界面。通过配置组合内置的rqt插件,可以使用选项卡、分屏和其他布局样式,定制您的交互界面。您还可以通过编写自己的rqt插件来引入新的接口组件。
rqt_graph插件
rqt_graph插件提供了对运行中ROS系统的监控,并通过可视化方式展示出来,显示节点和它们之间的连接,并允许您轻松调试和理解运行中的系统及其结构。
rqt_plot插件
使用rqt_plot插件,您可以监视编码器、电压或随时间变化的任何可以以数字表示的东西。
你可以根据需要选用相应的绘图后端(如matplotlib, Qwt, pyqtgraph),以绘制你的rqt_plot插件。
rqt_publisher插件
rqt_topic和rqt_publisher插件可以帮助您对系统Topic进行监视和使用。
前者允许您监视和监控系统中发布的任意Topic。
后者允许您将自己的消息发布到任何主题,方便使用您的系统进行特定的测试。
rqt_bag插件
ROS使用bag格式进行数据记录和回放。通过rqt_bag插件,可以创建并以图形方式访问Bag文件。这个插件可以将数据记录到包中,从包中回放选定的主题,并可视化包中的内容,包括显示图像和绘制随时间推移的数据。
参考
1: https://www.ros.org/is-ros-for-me/ 2: https://www.ros.org/core-components/