本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于 ROS 的漫游机器人—Nox

发布时间:2021-12-23
分享到:

基于 ROS 的漫游机器人—Nox

发布时间:2021-12-23
分享到:

Nox 是一款出色(且耗时)的机器人,它使用 SLAM (ROS) 和 Kinect 在其环境中导航。

Nox 是使用 ROS、Raspberry Pi 和 Arduino 构建的差分驱动机器人。我开始这个项目是作为一个带有基本导航的机器人基地,然后我可以将其用于其他东西,比如吸尘器。然而,我很快决定让它成为一个具有适当设计的独立机器人,因为它经常在 DIY 机器人中缺失。在当前状态下,机器人可以使用 SLAM(gmapping)来创建其周围环境的地图(使用 Kinect 深度感知来检测墙壁和障碍物)并在地图内定位自己。它可以规划一条通往给定目标的路径,并避开障碍物驱车前往。

Nox 由 11.1v 锂离子电池供电并由两个电机驱动。可以拆下前面板来更换电池。一个槽孔和一个螺钉将其固定,并允许放置不同长度的电池。我放了一个带屏幕的电池警报来监控水平。

马达是来自两个12V直流电机(107rpm)Banggood 。它们很好,但实际上我不需要机器人跑得那么快,我可以用一些速度换取更准确的编码器。

关于设计,主要的限制是要有与 Kinect 很好集成的东西,因为我正在围绕它构建机器人。我的灵感来自许多现代风格物品的三角形外观(我不得不承认很多来自 Deus Ex)。我真的很想拥有一个漂亮而专业的机器人,因为它是 DIY 机器人中经常缺少的东西(但不要担心接线会像它应该的那样凌乱)。在 CAD 模型上花费几周时间来调整一切是必要的。

侧面的灯是从我免费获得的除夕夜荧光棒中回收的,用于指示机器人状态。当 Arduino 没有连接到 ROS master 时(表示机器人程序还没有启动),指示灯非常快地连续闪烁 3 次。驾驶时,灯有更“呼吸”式的闪烁,闪烁速度取决于机器人的速度。

结构
如上所述,机器人是差动驱动的,因此电机放置在同一轴上。底座由木头制成,带有两个用于支撑的脚轮。我最初计划使用一个脚轮来避免超静现象,但找不到合适的脚轮。其余的结构主要由木头和金属支架制成,在任何 DIY 零售店都可以轻松找到。在机器人板的后部可以堆叠以放置电子板。

Carter是由黑色塑料板制成,手工切割和粘合(也可以使用3D打印)。

硬件
主控制器内部是一个运行 Ubuntu 和 ROS 的 Raspberry Pi 3B。Raspberry 可以从外部计算机通过 WiFi 和 ssh 访问以向机器人发出命令。ROS 程序使用 Kinect 执行里程计计算、导航规划和映射。Raspberry Pi 将速度命令发送到 Arduino,后者通过 Adafruit 电机屏蔽用 PID 控制两个电机。它读取编码器的值,计算每个电机的速度并将该值发送回 Raspberry 进行里程计计算。Arduino 和 Raspberry Pi 通过 USB 连接,Arduino 程序充当 ROS 节点(查找 rosserial 了解更多信息)。

在安顿下来之前,我使用了不同类型的 Arduino。起初我使用基本的 Arduino Uno,但我没有足够的中断引脚来读取编码器值(使用 Arduino 读取编码器值的最佳方法)。速度和准确性受到限制,因为我不得不求助于其他编程技巧来使其工作。我尝试使用 Arduino Leonardo,但限制因素是内存,我不得不最终切换到 Arduino Mega 2560。因我有足够的内存和引脚来添加新功能,所以我因祸得福。

Kinect 360 从一开始就是该项目的一部分,因为我想做 SLAM(同步定位和映射),但又不想在激光雷达上花费大量资金。kinect 基本上是一个 25 欧元的 3D 相机(当然不要期望与 Hokuyo 的精度相同),除了 SLAM 所需的深度扫描外,还可用于计算机视觉,具有加速度计和麦克风大批。所有这些对于项目的以下步骤都很方便。

两个直流转换器用于转换电压。电机直接使用电池电压(或多或少 11.1v)运行。命令部分(包括 Raspberry Pi、Arduino 和编码器)在由电池转换的 5V 电压下运行。Kinect 需要一个 12v 的稳定电压,并且转换器也从电池提供它。

软件
在软件部分,我使用了 ROS Kinetic。我真正编写的唯一节点是“nox_controller”,正如他的名字并没有真正暗示的那样,它用于根据 Arduino 数据(电机速度)计算里程计。

在 Arduino 中,电机控制是通过 PWM 完成的。PID 应该管理每个电机速度,但由于 PWM/电机速度比非常线性,我通过直接命令速度获得了很好的结果,现在停用了 PID。尽管正确的 PID 实施和校准正在进行中,但请不要担心。

映射和路径规划
用于 SLAM 的算法是 gmapping。ROS 上已经存在一个很好的实现,我使用了它。我计划在不久的将来尝试 RGB-D SLAM。

关于路径规划,我尝试了 ROS 上可用的不同本地规划器并使用 DWA 本地规划器解决,因为它为差分驱动机器人提供了最佳结果。我仍然有很多调整要做,因为 Nox 有时会在靠近门或一些障碍物时卡住。此外,经过一段时间的导航,特别是如果机器人正在更衣室,地图开始变得凌乱,机器人迷路了。我主要归咎于 kinect 的质量(以及它的抖动)和里程计。将来自编码器的里程计与 IMU 融合可能是解决此问题的下一步。

为了尽可能获得最佳里程计,我进行了一些校准。我基本上是在一条直线上驾驶机器人,手动测量到起点的距离并将其与里程计距离进行比较。根据两者之间的差异,我计算了一个比例来纠正里程计测量。我通过自己旋转机器人并将里程计与现实进行比较,对旋转做了同样的事情。

项目的后续步骤:

  • 具有随机目标生成或探索行为的完全独立的车载导航(目前仍然依赖外部计算机的某些部分)。
  • 将里程计与 IMU 融合(ROS 提出了很好的卡尔曼滤波器实现)以提高准确性
  • 使用 OpenCV 添加一些计算机视觉功能
  • 实现语音识别(我正在考虑使用 HARK-ROS,但如果有人提出建议,我愿意接受)

本方案所用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

原文链接丨以上内容来源网络,如涉及侵权可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论