ROS是最流行的机器人操作系统,但官方 Introduction 写的很一般,这篇把系统各要点和如何组合起来的介绍得通俗易懂。
每个机器人制造者的生活中都会有这样一个时刻,他们开始考虑建造一些... 史诗般的东西(钢铁侠?)。也许你已经构建了几个简单的 Arduino (一种开源开发板)机器人,它们可以绕着房间跑,避开障碍物,或者跟着地板上的轨迹走。它们非常有趣,你也学到了很多,但是你想做一些更复杂的事情,用一些图像处理,或者网络控制,或者一些你见过的便宜的激光雷达传感器。你必须从头开始写这些东西吗?你从哪里开始呢?
我建议你花点时间学习一下 ROS 的基本知识。
如果你像我一样,只是从 ROS 教程开始,没有上下文背景,你可能得花一段时间去理解它可以做什么,为什么它有用,以及你如何将它集成到你的机器人中。本文旨在提供背景信息,向你展示它们是如何组合在一起的,以及你可以如何使用它们。
ROS 是你的机器人的操作系统。它运行在各种不同类型的计算机上的标准 Linux 系统之上,如树莓派或其他单片计算机、笔记本电脑或台式机。这是它可以做的:
最简单的架构 —— 一个远程控制(teleop)节点向电机控制器节点发送速度指令
一旦你搞清楚了,ROS 的设计是相当优雅的。
一个称为 roscore 的中心枢纽首先启动,所有其他组件都连接到它。它可以看作是一种目录,允许机器人的所有功能定位和相互通信。
机器人的其他功能由称为节点(node)的软件来处理。例如,一个节点负责接收运动指令,并指挥电动机的运动。另一个节点可能负责从碰撞传感器或光传感器读取传感器值,并将其提供给其他节点。最后,控制节点可以从传感器节点获取输入,做出必要的决策,并向运动节点发送适当的命令。
向其他节点提供信息的节点是发布者(publisher)。接收该信息的节点是订阅者(subscriber)。一个节点既可以是不同主题的订阅者,也可以是发布者。正在发布的信息被分到称为主题(topic)的通道,这些主题在机器人上有唯一的名称。
在上面的示例图中,远程控制节点(teleop_turtle)从用户那里获得键盘输入并发布速度命令。机器人的电机控制器和传感器节点(turtlesim)订阅了运动速度主题(cmd _ vel) ,并将这些命令转化为运动。这是Turtlesim, 一个非常简单的机器人的模拟,你可以在 ROS 教程中学习如何控制它。
TurtleSim 在 Python 程序的控制下驾驶
稍微复杂一点的节点集看起来是什么样的?嗯,我在机器人控制方面的第一个练习题是让 Turtlesim 在 Python 程序的控制下在一个正方形中驾驶。要做到这一点,控制器节点订阅 Turtlesim 的里程主题(/turtle1/pose) ,该主题会不断显示机器人对自己位置的最佳估计。然后控制节点进行计算,找出电动机需要做什么才能导航到下一个目标,并发布电动机命令到主题 cmd_vel。
控制程序订阅位置主题并发布行进到目标的电机指令
如何把它和真正的机器人组合起来
一旦你理解了主题(topics)的总体流程,你可能会想: “太好了。我如何在一个真正的机器人上使用它?那会是什么样子呢? ”
让我们假设你想在 Raspberry Pi 上运行 ROS 来处理通信和高级控制,并且你也想要一个 Arduino 来控制电机和测量你的电池电压。此外,你有一个声纳模块,你想连接起来,以获得距离测量来避障。我们将分解每一个部分。
想添加一个 RP-Lidar 激光雷达单元?没有问题 —— 通过 USB 将它插入 Pi,然后启动一个接收数据并发布数据的节点。GPS 呢?同样的过程 —— 插入它并启动一个已经存在的节点。
如果你从头开始制造一个机器人,你可以购买有现成软件节点的电机控制器,或者你可以为你的控制器编写一个。你的传感器也是如此。
你可能只需要为你的特定硬件编写代码,就可以以预期的消息格式发布主题,这样你突然就可以访问大量编写良好的软件了。一旦完成,你的硬件就被有效地抽象了,你就可以开始使用 ROS 的更高层的功能了。
运行导航栈的Husky
例如,现有的一些用于室内导航的节点栈,实现了SLAM。
Husky 机器人在 Gazebo 通过激光雷达扫描环境
Gazebo 模拟器
对 Gazebo 模拟器的完整描述超出了本文的范围,但是这里有一个教程(https://www.clearpathrobotics.com/assets/guides/kinetic/ros/Drive%20a%20Husky.html)可以帮助你入门。我鼓励你们快速浏览一下。能够以一种安全的方式使用控制算法,或者在购买实际的硬件之前在机器人上测试,都是非常有用的。这是一个很好的工具。我和一个朋友在搞一个割草机器人,我们在 Gazebo 模拟了一个典型的郊区庭院,用 GPS 和磁强计测试导航代码。
割草机器人测试地面
在我看来,ROS 最酷的特性之一就是,这些节点可以在不同的计算机上运行,而不是在 roscore hub 上运行!你只需告诉运行计算机的节点运行 roscore 的计算机的名称/ip,它就可以透明地连接和运行。你可以用它在机器人本身上建立一个计算机网络,或者将控制和计算扩展到网络上的其他计算机,而不需要编写任何额外的代码。
我希望这能帮助你理解 ROS 各个部分是如何组合在一起的 —— 你现在可以开始学习那些教程了,希望你对如何在真正的机器人上使用它有了更好的理解。玩得开心!
来源:https://medium.com/swlh/a-gentle-introduction-to-using-ros-on-your-robots-329aa5e261d1