使用 Linux 自制机器人

作者:Michael Surran

机器人自孩提时代起就是我的热情所在,所以可想而知,当我获得机会在高中计算机课程中增加机器人课程时,我有多么兴奋!我们最近庆祝了在大胡尔顿基督教学院 (GHCA) 开设机器人课程的第二个年头,我在这所学校任教。在这段时间里,我们制作了三款不同的机器人,每款都基于运行 Linux 的 PC。我们的预算很紧张,因此我们必须在设计、材料和工具的使用方面发挥创造力。这造就了任何 DIY 爱好者都可以制作的机器人。

第一款在 GHCA 大厅漫游的机器人是 K9,这是一款基于英国科幻节目《神秘博士》的机器狗。我亲自创建了 K9,以此来启动我们的机器人项目。K9 的主要目的是让学生们“哇”和“啊”,希望能激发他们对机器人领域的兴趣。我使用了常见的角铁和 1/4 螺母和螺栓来组装 K9 的“骨架”,很像早年的埃里克特玩具套装。事实上,K9 的头部是用 1971 年的埃里克特玩具套装建造的!钣金为我们班级的吉祥物提供了最终的外观。

Do-It-Yourself Robots with Linux

图 1. K9 是在 GHCA 建造的第一款机器人。

第二款机器人是由学生 Aaron Bither 和 Brian Thompson 在我们开设机器人课程的第一年设计的。在每个学年开始时,我们首先定义一个我们想要克服的“问题”,然后我们开始集思广益,讨论机器如何解决这个问题,它需要哪些功能等等。Aaron 和 Brian 决定建造一款可以从一个教室向另一个教室传递信息的机器人。他们很快了解到,对人类来说简单的事情,对机器人来说通常非常复杂。到学年末,他们有了一款可以被编程在走廊中导航的机器人,但还有很多工作没有完成。这对我们所有人来说都是一次学习经历。

我们的第三款机器人,也是本文重点介绍的机器人,是由学生 Jordan McGuire、Jeromy Nevers 和 Barrett Jewell 设计的。我也是团队的一员,贡献想法并指导学生,通过设计和建造的实践过程来教导他们。这组学生想要解决的问题是安全,因此他们决定制作一款可以巡逻走廊并扫描入侵者的“哨兵机器人”。同样,说起来容易做起来难。

一个功能齐全的自主机器人有三个主要组成部分:机械系统、电子系统和软件。设计通常从机器人的机械结构开始,特别令人感兴趣的是运动方式。有很多方法可以让机器人移动,但我们班坚持 KISS 原则——保持简单,傻瓜化!例如,当轮子工作得很好时,我们不会建造复杂的腿。事实上,所有三款机器人都在使用带有各种驱动系统的普通割草机轮子。

Do-It-Yourself Robots with Linux

图 2. 哨兵机器人

我们的哨兵机器人使用非常简单的三轮车设计。为了驱动机器人的轮子,我们使用挡风玻璃雨刷电机。这些电机可以在网上以不到 20 美元的价格购买,也可以从旧车上免费拆下来。它们使用 12VDC 电压运行,并以良好的转速提供非常高的扭矩。我们的哨兵机器人使用了两个这样的电机:一个驱动前轮,另一个转动转向支柱。

一旦选择了运动方式,就该设计框架了。框架需要坚固但又不能太重,并且必须容纳驱动系统、任何额外的机械系统(如手臂和传感器)、电源(我们使用 12V 园林拖拉机电池)和电子设备。我们为哨兵机器人选择了胶合板,因为它相对便宜且易于加工。我们使用简单的曲线锯切割框架。减轻重量的一个技巧是切掉胶合板框架内部的部分——只是不要切掉太多,否则框架会变得脆弱。

我们的电子系统包括主计算机和接口板,接口板将计算机连接到驱动系统和传感器。虽然我很想为每个机器人配备低功耗嵌入式计算机,但我们的预算根本不允许这样做。不过,我们确实可以使用一些旧的奔腾台式电脑。考虑到火星探测器的处理能力,200MHz 的奔腾处理器对于我们简陋的机器人来说绰绰有余。

在机器人技术中使用旧台式电脑的一个巨大挑战是功耗。这些主板消耗大量电流。另一个问题是主板需要的电压。为了节省时间和金钱,我们使用带有原始 AT 电源的逆变器。这很容易做到,但效率不高。未来的机器人将使用我们捐赠的旧笔记本电脑的组件,这些组件消耗更少的电力,并且可以直接从电池供电。

接口板是在课堂上设计和制造的。该组件的主要目的是获取 PC 并行端口的低电流输出,并允许这些输出为电机供电。我们使用晶体管和继电器来构建我们的控制电路,以及一个逻辑电路来防止电机在启动期间“抽搐”。我们的逻辑电路还确保电机不会超过任何限制,例如将转向支柱向左或向右转动得太远。来自传感器的输入在进入并行端口之前会通过缓冲器。简单,但有效!

Do-It-Yourself Robots with Linux

图 3. Barrett Jewell 正在接口板上工作。

当然,您真正想了解的是运行我们机器人的软件和操作系统。是的,所有三款机器人都在运行 Linux!最初,我们尝试使用 DOS 和 QBasic。然而,我们使用 DOS 能做的事情非常有限,所以我开始使用机器狗 K9 试验 Linux。

当建造 K9 时,我们在学校使用了 Mandrake Linux 发行版。Mandrake 提供了最小安装选项,这对于我们机器人的简单需求来说已经足够了。然而,从那时起,我们的学校已经切换到 Gentoo Linux,因此我们的哨兵机器人实际上运行在 Gentoo 上。也许你们中的一些人认为 Gentoo 对于简单的机器人来说是过度的。也许是,也许不是。

我个人认为安装 Gentoo 比安装大多数其他发行版更快,也许是因为我已经安装了很多次。Gentoo 的裸系统(stage 3)安装相对较小,至少与机器人硬盘上的可用存储空间相比是这样。然而,Gentoo 最大的优势是能够快速轻松地添加和更新我们机器人需要的软件,所有这些软件都经过编译,以使我们的旧硬件尽可能快地运行。

如果您想知道在旧奔腾系统上编译软件有多有用,请了解我们的哨兵机器人可以访问我们的计算机实验室。使用 distcc,一个分布式编译器,我们的机器人拥有 20 个 Athlon 1500+ 处理器和超过 7GB RAM 的处理能力,可用于编译新软件。相信我,哨兵机器人可以非常快速地编译源代码。

Gentoo Linux 还有另一个优点——它非常以 Python 为中心(由于 Portage 系统)。我们学校为所有 8 年级学生开设了一门课程,他们在课程中使用 Python 学习编程的基本概念。这为以后想参加我们机器人课程的学生提供了一个自然的跳板。Python 既简单又强大,虽然它是一种解释型语言,但对于我们机器人的简单需求来说,它的运行速度足够快。我们使用一些 C 语言来将 Python 连接到并行端口,以及处理时间关键型操作,例如漂移校正。但是,我们的大部分代码都是用 Python 编写的。这使得学生可以快速进行更改,并在机器人的行为中看到立竿见影的效果。由于我们的计算机实验室是基于 Linux 的,因此学生可以轻松地从他们的工作站使用 SSH 和 KDE 的 fish 访问机器人。

使用 Linux 和 Python 控制电机并不困难。真正的挑战在于实现感知,包括对环境和机器人内部状况的感知。例如,一个简单的程序加上一些电子元件可以打开主驱动电机十秒钟,推动机器人前进。但是,是什么阻止机器人向左或向右漂移,或者撞到墙壁或人?虽然机器人可以很容易地根据时间(向前行驶十秒钟)跟踪其进度,但电机的速度会随着电池电量和摩擦力而变化。要告诉机器人精确地向前移动 50 厘米,需要更复杂的东西;它需要一个反馈回路。

大多数机器人使用带有某种编码器的电机来充当数字“里程表”。这些编码器可以使用简单的红外发射器/接收器对和一个带孔的圆盘来构建。事实上,旧式电脑鼠标就是使用这个原理工作的。这让我思考——与其构建一个花哨的编码器电路和连接到计算机的接口,然后再编写读取编码器所需的软件,为什么不使用一个简单的设备,以非常计算机友好的格式提供相同的信息呢?因此就“发明”了光电鼠标编码器。

Do-It-Yourself Robots with Linux

图 4. 我们的光电鼠标编码器特写

就像我们机器人的其他一切一样,我们的光电鼠标编码器简单而有效。我们取了一块鼠标垫,剪出一个圆圈,然后将其粘在主驱动轮上。然后我们将一个光电鼠标安装到转向支柱上,以便鼠标位于圆形鼠标垫上方。当车轮转动时,鼠标垫在鼠标下方旋转,这会将非常精确的定位数据发送到计算机。可以通过打开和读取 /dev/psaux 或等效设备文件轻松读取此运动。光电鼠标提供高分辨率和高精度,因此通过适当的转换,我们可以将机器人的运动跟踪到厘米的分数。知道它走了多远,机器人就可以知道它在预编程地图上的位置,前提是它没有被拿起并移动,并且没有漂移或车轮打滑。

当然,漂移和车轮打滑确实会发生,而且地图无法预测移动的家具、人或书包。机器人需要一种检测其环境的方法,为此我们正在使用声纳和碰撞传感器。通常,声纳既不便宜也不简单,但碰巧的是,我最近在圣诞派对 Yankee swap 上“赢”了一个汽车泊车辅助器。该设备使用声纳,并带有三个指示灯,用于告诉驾驶员在将汽车驶入车库时需要倒车多远。好吧,没有什么比免费更划算的了,虽然该设备不以传统意义上的方式测量距离,但它是一个可以工作的声纳,可以检测到靠近(黄灯)和非常靠近(红灯)的物体。通过将黄色和红色 LED 连接到我们并行端口的输入线,我们的机器人可以在接近物体时检测到它们并采取行动,例如停止或转弯。声纳发射器安装在前轮支柱上,因此声纳始终“看向”机器人前进的方向。

即使我们试图保持简单,我们仍然有很多工作要做。我们的学生期待着即将到来的学年,届时他们可以继续使用他们构建的物理平台。随着大部分硬件到位,我们的重点将转向软件。我们已经遇到的一个挑战是确保机器人笔直前进,而不是向左或向右漂移。虽然可能可以设计硬件来锁定前轮完全向前,但仍然存在由于每个车轮的摩擦差异而导致的漂移问题。为了解决这个问题,我们正在转向软件。

根据我们目前的设计,我们没有测量单个前轮的转速,而是最近尝试通过连接两个光电鼠标来测量两个后轮。Linux 为每个鼠标提供单独的设备文件,允许我们独立跟踪两个后轮并进行比较。通过测量转速的差异,我们可以使用软件来调整转向电机,直到机器人笔直前进。这也将使我们能够精确计算机器人在转弯或受到漂移和车轮打滑影响时的航向。将此与外部传感器结合使用,我们将拥有一个可以准确知道自己在我们建筑物中位置的机器人。

Do-It-Yourself Robots with Linux

图 5. 转向机构和接口板一览

高中生 Jordan McGuire 编写了软件,该软件允许机器人根据已知边界(例如墙壁)的声纳读数来校正其内部位置。类似的技术可用于检测“不属于那里”的物体,然后使用其他传感器(例如热传感器和运动传感器)在建筑物应该空无一人的时候检测可能的入侵者。使用 Linux,可以轻松添加一个网络摄像头,该摄像头可以捕获入侵者的图像并通过无线网络发送。哨兵机器人最好的武器是它的摄像头。

以 Linux 作为我们的操作系统,我们可以将机器人的功能扩展到远远超出最初赋予它的“任务”。我们甚至讨论过添加 GPS 接收器并对机器人进行编程,让它从当地的冰淇淋店为我们取奶昔。好吧,也许这有点牵强,但敢于梦想是好事!

说到梦想和未来设计,随着机器人课程的成熟以及学生在更年轻的时候接触到机器人技术,我计划引入更先进的概念。我们仍然会努力保持简单,但肯定有更好的方法来做我们目前正在做的一些事情。例如,台式电脑的功耗对于电池供电的机器人来说是不现实的。笔记本电脑组件将是一个很大的改进,但如果钱不是问题,嵌入式计算机将是最佳选择。最近的捐赠为 K9 购买了一块 TS-7260 ARM 计算机板,该板的运行功率不到一瓦。与 PC 的并行端口相比,这款基于 Linux 的板卡具有许多 I/O 端口,更适合连接到机器人的各种电机、伺服系统和传感器。我们的简单方法引入的另一个低效之处是中央 PC 管理微小但对时间非常敏感的任务的负担,例如主驱动电机的速度控制。我目前正在重新设计 K9 的控制器板,以使用简单的微控制器来卸载 CPU 的低级任务。虽然我们的班级可能还没有准备好立即处理微控制器,但他们肯定会被介绍这个概念并看到结果。

我意识到本文没有提供有关如何构建 DIY 机器人的分步说明。关于这个主题有很多好书和信息丰富的网站。我的目标是分享如何使用廉价、易于获得的零件和我们最喜欢的操作系统来完成工作。Linux 受到修补匠和爱好者的喜爱,而对这种修补的令人兴奋和具有挑战性的扩展是添加电机和传感器以及自主性。就像花生酱和果冻一样,Linux 和机器人技术是完美的结合!

Michael Surran 在过去的七年中一直担任大胡尔顿基督教学院的网络管理员和计算机科学教师。他发表了两篇文章,倡导在 K-12 学校中使用开源软件。在计算机生活之外,他喜欢缅因州美丽的户外风光。评论可以发送至 michael@ghca.com

加载 Disqus 评论