移动乌龟 (TurtleSim)
摘要
Move Turtle 是一个简单的 ROS Python 脚本,用于将 ROS 的 TurtleSim 中的乌龟移动到指定坐标(点)。该项目最初是科罗拉多矿业学院(CSOM)CSCI473 课程的项目,随后演变为我用来学习闭环系统的项目,这些知识后来帮助我在 CSOM 的人机中心机器人实验室(HCR)工作。
背景
作为背景,ROS 代表机器人操作系统。ROS 是一个开源的机器人中间件,通常与Ubuntu操作系统配合使用,用于更好地管理机器人系统的软件组件/集群。你可以通过 ROS 官方维基了解更多关于如何使用 ROS 的信息。你在 ROS 中编写的代码可以是 C++ 或 Python。
TurtleSim 是一个简单的 2D 机器人模拟器,用于向 ROS 新用户介绍 ROS 和 ROS 包。TurtleSim 只会打开一个带有乌龟的简单 2D 显示。那只乌龟充当“机器人”,你可以向该“机器人”发送消息以移动和/或转向。实际上,TurtleSim 会生成一些随机误差,以一种简单的方式模拟真实世界的物理。
了解了 ROS 和 TurtleSim 是什么,我为什么要使用它们?在 2020 年春季,我在科罗拉多矿业学院的本科计算机科学课程中选修了“人机中心机器人”课程,授课老师是张浩博士。该课程包括三个项目,第一个项目是设置 ROS、学习如何使用 ROS,并实现一个开环或闭环算法,使 TurtleSim 中的乌龟绘制一个 M。原始项目描述可在这里查看。
当时,我通过实现开环算法完成了该项目。该方案可行,但效果很差,只画出了一个“足够好”的 A,远未达到“优秀”。在 2020 年 2 月中旬提交项目后,我一直忘记,直到 2021 年 2 月左右才重新想起。
挑战
2021 年 2 月,我被聘为科罗拉多矿业学院人机中心机器人实验室(HCR)实验室的研究助理,导师是张浩博士。实验室的目标是研究“终身协作自治”,旨在使机器人能够在长时间内运行和适应。截止 2022 年 9 月 1 日(2022 年 9 月 1 日),实验室已从科罗拉多矿业学院迁至马萨诸塞大学阿姆斯特朗分校。但当我在那里工作时,实验室仍在科罗拉多。
在 HCR 实验室,我负责 Triton 项目。Triton 项目包括多个、数十个名为 Triton 的机器人。Triton 是三角形的全向轮地面机器人,外观如下:
与 Triton 一起的还有八个来自OptiTrack的红外摄像头,以“八边形”排列,距离地面几英尺。使用这些摄像头、OptiTrack 的Motive软件、运行 Windows 10 的 PC 和 ROS,创建了一个 2 米 × 2 米 × 2 米(x、y、z)的空间,可以确定带有运动捕捉标记的对象的精确真实世界位置。
我在 Triton 项目中的第一个任务是编写脚本,使 Triton 机器人移动到特定的真实世界位置。当时,我不确定如何实现,但我记得 CSCI473 的第一个项目向我介绍了闭环系统的概念,于是我开始深入研究闭环系统以及反馈系统。
研究
在研究过程中,我发现了 AerospaceControlsLab 的一段精彩视频:
在该视频中,向我展示并解释了 PID 系统的概念。PID 系统是一个闭环、控制环系统,根据来自真实世界的数据产生特定输出。简而言之,它是一种反馈系统,根据期望值与测量值之间的差异来调整输出。PID 控制器的公式如下:
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$ 为控制信号。
- $K_p$、$K_i$、$K_d$ 分别为比例、积分和微分增益。
- $e(t)$ 为误差信号(期望值与实际输出之间的差异)。
- $\int e(t) dt$ 为误差随时间的积分。
- $\frac{de(t)}{dt}$ 为误差的导数。
想了解更多,请查看AerospaceControlsLab 的视频或这篇精彩的维基百科文章。
在进行研究并得到聪明的朋友和教授的帮助后,我认为使用比例控制器(P 控制器)最适合帮助 Triton 达到特定坐标。
由于 Triton 是地面机器人,我只需要关注 X 和 Y 坐标。基于此,我需要确定在 P 控制器中测量和处理的期望值和测量值。在我的研究中,我在 ROS 维基上找到了一个名为Go to Goal的精彩帖子,其中关注以下误差:
- 距离误差:期望位置(X, Y)与当前位置(X, Y)之间的距离差。
- 角度误差:期望方向与当前方向之间的差异。
方案
基于上述所有信息,解决方案是使用比例控制器来处理 Triton 的距离误差和角度误差,以实现对目标坐标和 Triton 当前坐标的闭环控制。但在将其实现到物理系统之前,我想先在仿真中测试该想法,当时我认为使用 TurtleSim 作为仿真是最佳选择。
在仿真中测试
在理论方案确定后,我首先通过仿真而非真实场景来验证它。真实世界往往充满噪声,可能会干扰解决方案的有效性并导致处理无关问题。为此,我重新审视了 CSCI473 的项目,并将其改编为此理论方案的测试平台。
在将旧代码从 ROS Melodic 更新为 ROS Noetic 并进行迭代优化后,我在 TurtleSim 中实现了该方案。其功能演示以及一些酷炫的目标坐标路径可在本文末尾找到。所有代码可在这里查看。
结论
总之,通过此项目,TurtleSim 中的乌龟使用闭环系统有效地导航到设定坐标,显著优于我 2020 年的开环系统。经过成功测试,我将该方案实现到 Triton 机器人上。但真实世界的噪声导致出现意外问题,需要数周的调试和实际测试。经过这些周,我最终使用在 TurtleSim 中测试的方案,使 Triton 达到特定的真实世界坐标。以下是使用在 TurtleSim 中测试的方法让 Triton 移动到特定真实世界坐标的演示:
回顾过去,我希望使用更能模拟真实世界物理的仿真。TurtleSim 对学习很有帮助,但不适合测试真实世界的机器人想法。当时,我认为它足以满足我的简单需求,但后来证明并非如此。
本文的主要目标是概述创建闭环系统,使 TurtleSim 中的乌龟以及随后在 Triton 机器人能够精确导航到指定的目标位置(X, Y)。我认为已实现此目标,并可能在 HCR 实验室的工作中引起了一些兴趣。基于此,我计划在 HCR 实验室的工作经验上撰写更多博客文章…
移动乌龟 (TurtleSim) 演示
本视频包含以下演示:
- Cayley Nodal: 一个简单的Cayley Nodal设计
- Circles: 类似蜘蛛网的设计
- Inner Circles: “圆中有圆”的设计
- M: 一个非常简单的 M 设计