使用 TurtleSim 的 PID 控制

项目的 GitLab 仓库

摘要

移动海龟是一个简单的 ROS python 脚本,它将海龟在 ROS 的 TurtleSim 中移动到指定的坐标(点)。该项目最初是科罗拉多矿业学院(CSOM)CSCI473 课程的一个班级项目,后来演变成一个帮助我学习如何创建闭环系统的项目,这些知识帮助我在 CSOM 的人机中心机器人(HCR)实验室的工作。

背景

为了提供一些背景,ROS 代表 机器人操作系统。ROS 是一个开源机器人中间件,通常与 Ubuntu 操作系统配对,用于更好地管理机器人系统的软件组件/集群。您可以通过 ROS 的官方 wiki 了解更多关于如何使用 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 日,该实验室已从科罗拉多矿业学院迁至马萨诸塞大学阿默斯特分校。但是,当我在那里工作时,他们仍然位于科罗拉多州。

在 HCR 实验室,我的任务是参与 Triton 项目。Triton 项目由多个、数十个名为 Tritons 的机器人组成。Tritons 是三角形的 全向轮 地面机器人,外观如下:

除了 Tritons,还有八个来自 OptiTrack红外相机,以“八边形顺序”排列,离地面几英尺。利用这些相机、Optitrack 的 Motive 软件、一台运行 Windows 10 的 PC 和 ROS,创建了一个 2 米 x 2 米 x 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 wiki 上一篇精彩的帖子,名为 Go to Goal,他们关注以下误差:

  • 距离误差:期望位置(X, Y)与当前位置(X, Y)之间的距离差。
  • 角度误差:期望方向与当前方向之间的差异。

提议的解决方案

了解了这一切后,使 Triton 移动到特定现实世界坐标的解决方案是使用比例控制器来处理 Triton 的距离误差和角度误差,以便与目标坐标和 Triton 的当前位置相对应。但在将其实施到物理系统之前,我想在模拟中测试这个想法,当时我认为使用 TurtleSim 作为模拟是最佳选择。

在模拟中测试

在理论解决方案概述后,我选择最初通过模拟来验证它,而不是现实世界场景。现实世界通常充满噪音,这可能会混淆解决方案的有效性,并导致处理无关问题。意识到这一点,我重新审视了我在 CSCI473 的项目,并将其改编为这个理论解决方案的测试场。

在将旧代码从使用 ROS Melodic 更新为使用 ROS Noetic 并进行了一些迭代改进后,我确实在 TurtleSim 中使提议的解决方案得以实现。其功能的演示以及一些酷炫的目标坐标路径可以在这篇博客的末尾找到。所有这些代码可以在 这里 查看。

结论

总之,通过这个项目,TurtleSim 中的海龟有效地使用闭环系统导航到设定的坐标,显著优于我在 2020 年的初始开放式系统。经过成功测试,我将这个解决方案应用于 Triton 机器人。但现实世界的噪音引入了意想不到的问题,需要数周的调试和现实世界测试。在那些周之后,我最终使 Triton 达到特定的现实世界坐标,最终使用我在 TurtleSim 中测试的解决方案。以下是 Triton 使用在 TurtleSim 中测试的方法移动到特定现实世界坐标的演示:

回想起来,我希望我使用一个更好地模拟现实世界物理的模拟器。TurtleSim 非常适合学习,但不适合测试现实世界的机器人想法。当时,我认为它对于我的简单用例足够好,但后来证明并非如此。

这篇博客的主要目标是概述创建一个闭环系统,使 TurtleSim 中的海龟,以及随后 Triton 机器人,能够精确导航到指定的目标位置(X, Y)。我相信这个目标已经实现,但它可能引起了人们对我在 HCR 实验室工作的兴趣。知道这一点,我确实计划撰写更多关于我在 HCR 实验室工作经验的博客…

移动海龟(TurtleSim)演示

该视频包含以下演示:

  • 凯莱节点: 一个简单的 凯莱节点 设计
  • 圆圈: 一个像蜘蛛网一样的设计
  • 内圈: 一个“圈内有圈”的设计
  • M: 一个非常简单的 M 设计