无人机已经拥有自己的内部 IMU,但这些 IMU 的精度不足以完成较大的飞行任务。对于短途飞行和娱乐飞行,内部 IMU 的精度足以保证无人机按预期运行。A
我们尝试将 MicroStrain IMU 的支持集成到 Ardupilot 自主飞行软件套件中。我们这样做是为了获得 CSU 的学分,是与 CSU 无人机中心合作开展的一项独立研究。这个学期的大部分时间都花在了研究和学习上,因为我们使用的大多数技术和现有库对我们来说都是全新的。经过大量的学习,我们开始在带有 MicroStrain 3DM-CX5-GNSS/INS IMU 的 Pixhawk 4 上开发和测试定制的 Ardupilot。学期结束时,我们完成了一次试飞,使用我们的定制 Ardupilot 构建,在自主模式下成功发射并飞行了一架固定翼飞机,其中只使用了 MicroStrain IMU 的加速度计、陀螺仪、气压计和磁力计数据,而完全禁用了 Pixhawk 的内置 IMU。要将我们对 Ardupilot 的修改应用于生产,还有很多工作要做,我们希望将来能继续这个项目。
我们项目的目标是创建固件,将高精度惯性测量单元(IMU)成功集成到现有的无人机设置中。无人机已经有了自己的内部 IMU,但这些 IMU 缺乏完成大型飞行任务所需的精度。对于短途飞行和娱乐飞行,内部 IMU 的精度足以保证无人机按预期运行。随着时间的推移,IMU 读数中的微小误差会逐渐增加,到长途飞行结束时,总误差可能会非常大。通过使用高精度 IMU,我们可以通过提高读数精度来延长无人机的飞行时间,从而减少微小误差。我们选择了 MicroStrain IMU,这是一款专为航天器设计的高精度 IMU。由于它是为需要几乎精确测量的设备而设计的,因此 IMU 的精度可以让我们的无人机在更长的时间内保持正确的飞行轨迹。
拥有一架可以长时间飞行的无人机对执行各种任务非常有用。估价师和林业人员都可以使用这些无人机对野生动物和火灾造成的结构性破坏进行大规模勘测。目前,全国范围内的邮政和包裹递送公司都在研究无人机递送,这就需要无人机有足够的精确度和飞行时间,以递送许多包裹。随着人们探索不同无人机和机器人的更多用途,高精度的选择甚至可以帮助考古学家和海洋生物学家完成他们的工作,到达人类无法到达的地方。提高现有无人机软件的精确度为无人机帮助人们和取得新发现提供了更多可能性,这也是我们开展这个项目的原因。
在这个项目中,我们的团队可以使用三个 MicroStrain IMU 和两个 Pixhawk 飞行控制器。三个 IMU 分别是 3DMCX5-45、3DM-CX5-AHRS 和 3DM-GX5-GNSS/INS。两个 Pixhawk 分别是 Pixhawk 4 和 Pixhawk 1。我们的目标是通过 UART 电缆将 Pixhawk 4 与 3DM-CX5-45 连接起来,使用 Pixhawk 上的 UART / I2C B 端口,该端口传统上用于连接外部 GPS 设备。我们能够在所有三个 IMU 上测试数据包配置,并使用 SITL 运行我们的自定义 Ardupilot 构建,但我们只能使用一个 Pixhawk 4 和一个 3DM-CX5-45 作为在完整硬件上测试构建的唯一方法。在整个学期中,我们多次尝试使用 Arduino Uno R3 和 Raspberry Pi Pico 设置额外的硬件配置,但这些尝试大多导致了更多的复杂问题。事实证明,使用 SITL 进行开发并在 Pixhawk 4 上进行测试是最有效的策略。
我们尝试的第一种方法是使用 MicroStrain 通信库 (MSCL)。由于创建 MSCL 是为了简化与 MicroStrain IMU 的交互,因此 MSCL 似乎是让 MicroStrain 以我们想要的方式进行通信的一个很有前途的解决方案。在研究 MSCL 的过程中,我们发现 MSCL 需要许多其他库作为依赖库,而获取这些依赖库将使构建的结果超过 Pixhawk 4 内存的总容量。由于内存是个问题,我们无法使用 MSCL;不过,我们能够了解 MSCL 中每个数据包的校验和是如何计算的,我们在创建自己的固件时使用了这些信息。
用于设置和测试 MicroStrain IMU 的图形用户界面工具对我们的研究和开发也很有帮助。它们使我们能够在学期初获得二进制 (BIN) 文件。使用 BIN 文件,我们可以开始处理数据包并解析出我们需要的数据,即使我们的所有团队成员都无法访问物理 IMU。图形用户界面还能让我们轻松检查我们解析的数据是否正确。它提供了一个易于使用的平台,使我们能够快速配置 IMU,以一定的速率传输数据,而无需通过 uart 端口发送数据包。我们还利用它进行调试,检查是否在 Ardupilot 中获得了与 IMU 相同的值。
刚开始使用 Ardupilot 时,我们发现学习代码库以便进行扩展是一项艰巨的任务。我们花了几周时间研究文档,试图了解现有的传感器库是如何为软件的其他部分提供数据的。最初,我们发现 InertialSensor 库提供了从大多数飞行控制器的内部 IMU 读取数据的代码,并认为这将是一个很好的方法。我们记录并追踪代码,以确定 Pixhawk 4 的内部 IMU 如何向其他库提供数据。我们发现,传感器库被分成两个部分,一个是每个传感器模型的特定后台类,用于直接与硬件通信;另一个是通用后台类,用于接收来自后台的数据并将其提供给软件的其他部分。我们集成 MicroStrain IMU 的首次尝试包括编写一个新的后端类,扩展 AP_InertialSensor_Backend 类。当我们朝着这个方向前进时,我们开始意识到这种方法更适合集成内部传感器,而不是通过 UART 连接的 IMU。
在进一步探索代码库时,我们发现 Ardupilot 中新增了 AP_ExternalAHRS 类。编写该类的目的是为了支持 VectorNav VN-300 IMU 的集成,该传感器的用途与我们的 MicroStrain IMU 非常相似。我们意识到,利用该类将使我们的工作变得更加轻松。
为了了解串行设备如何与计算机协同工作,我们首先用 python 编写了一个简单的脚本,向 IMU 发送 ping 并从 IMU 接收信息。脚本运行后,我们开始将脚本翻译成 C++,以便与同样使用 C++ 的 Ardupilot 库配合使用。两种语言之间的转换有些棘手。第一个 C++ 脚本是使用以 pyserial 为模型的库开发的,但它有太多的依赖关系,无法与 Ardupilot 库兼容。随后,C++ 脚本被改写成一个测试草图,使用 Ardupilot 库中的串行通信资源,一旦该脚本可以正常工作,就进一步开发该脚本以读取和解析数据包。
如前所述,在项目过程中,我们只能使用一对正常工作的 IMU 和 Pixhawk。这意味着大部分开发和测试都是在 Ardupilot SITL(环路软件)模拟器上完成的。当我们学会使用 SITL 时,我们发现它实际上提供了许多好处。使用 SITL 运行代码可以更方便地进行断点调试,而且 SITL 的代码构建速度比硬件快得多。我们在 SITL 开发过程中遇到的一个难题是连接 IMU。最终,我们找到了将其插入 USB 端口并将 USB 端口映射到 Ardupilot 串行管理器中的设备的方法,使我们能够通过 SITL 有效地测试与 IMU 的通信。
虽然 SITL 的调试相当简单,但当我们在 Pixhawk 和 IMU 上运行新代码并遇到问题时,故障排除就比较困难了。起初,许多调试都是通过在代码周围放置打印语句来确定故障所在。这种策略有明显的缺点,即效率低下,而且会造成更多混乱。为了进行硬件断点调试,我们购买了一台 Segger J-Link EDU Mini。我们将 JLink GDB 服务器与内置的 Ardupilot GDB 调试命令结合使用。这种设置使我们能够更精确地分析代码在硬件上运行时的情况。
通过测试草图实现与 IMU 的通信后,下一步就是收集和解析 IMU 的信息。
虽然我们知道 IMU 工作时的数据包大小和速率,但以指定速率读取数据包的字节数并不是一种 有效的数据包收集方法。我们需要知道数据包开始和结束的时间,处理数据包损坏的可能性,并处理数据包之间的垃圾字节。我们想出的解决方案是建立一个单独的线程,以 MicroStrain 向我们提供数据的速度,将字节读入一个足够大的环形缓冲区。该线程运行一个循环,执行三项操作:将字节读入缓冲区,将可用字节解析为数据包,当构建了一个完整的数据包后,解析该数据包中的传感器数据并将其发送出去。MIP 协议包括两个同步字节,告诉我们数据包的开始位置,以及一个弗莱彻校验和,允许我们验证字节的正确性。环形缓冲区允许我们在构建数据包时保留字节,并在同步字节后重新开始,以防校验和不匹配。
在研究了 MicroStrain IMU 使用的 MIP 协议并阅读了 IMU 手册以了解数据包结构之后,我们查看了从 IMU 收集到的数据包,并开始对其进行解析。我们将数据包头和校验和分离到各自的变量中,然后将数据包有效载荷发送到另一个可以解析数据包的函数中。通过查看 Ardupilot 的 AP_ExternalAHRS 库,我们确定了需要解析的数据。起初,使用该库非常复杂,因为它主要是为 VectorNav 传感器构建的,但我们发现 Ardupilot 的一位首席开发人员正在创建可分割前端和后端固件的代码。这种拆分使我们能够使用现有的后端为 MicroStrain 传感器进行开发。我们以现有实现为指导,从 MicroStrain 数据集中解析信息,并将数据发送到相应的处理程序。由于我们首先在测试草图中编写了数据包解析程序,因此无论有无硬件,都能轻松进行测试和调试,但在将代码移入 AP_ExternalAHRS 库时,我们必须进行修改。
当我们最初将代码从测试草图中移出时,我们的目标是以任何能让代码工作的方式将其移入库中。我们从测试草图中复制和粘贴了大量代码,并对其进行了处理,直到它可以构建和运行为止。这项工作导致了一些混乱的实现和一些艰苦的编码,以使构建能够正确运行。运行成功后,我们又回头清理了实现过程,制作了与我们正在做的事情相关的函数,整理了代码以提高可读性,并研究了我们在飞行前无人机检查中需要使用的不同标志和字段。在数据包解析方面,我们实现了一个带有开关语句的函数,该函数可以检查我们需要的数据集中的数据包,并将它们发送到不同的函数中进行更多解析。这些单独的函数确定所给数据的类型,并将数据存储在相应的变量中。这些变量随后会被传递给不同函数中的相应处理程序。通过以这种方式构建代码,我们可以在开关语句中引入更多新变量,并构建任何必要的函数来解析和处理更多数据,这使得我们可以继续进一步集成 IMU,与开始集成时相比相对容易。
经过大量的研究、测试和开发,我们成功地将定制的 Ardupilot 部署到固定翼平台上,并使用仅来自 MicroStrain IMU 的加速度计、指南针、气压计和陀螺仪数据进行飞行。为了达到这一点,我们必须解决许多棘手的问题,其中最主要的是在 Ardupilot 中与 MicroStrain IMU 通信的问题,以及将传感器数据传送到固件中正确位置以便其他 Ardupilot 库能够访问和利用这些数据的问题。此外,我们还在 ExternalAHRS_MicroStrain 类中创建了一个结构,使我们能够在未来实现 GNSS 数据。我们的首次试飞在自主模式下出现了严重的振荡。不过,飞机能够稳定下来,在航点之间飞行,甚至能够利用 MicroStrain IMU 的数据自主起飞。
我们未来工作的主要目标是将 MicroStrain IMU 支持合并到 Ardupilot 库中。这将涉及重写我们现有的代码,使其更加简洁并为生产做好准备,以更加优雅的方式实现当前硬编码的一些功能,并为我们的代码及其使用方法创建详尽的文档。除了这些后勤工作,我们还需要添加对 MicroStrain 数据的全面支持。这项工作包括将我们目前读取的原始数据转换为过滤数据,以及添加对 GPS 的支持。此外,我们还需要添加代码,以便在初始化过程中发送数据包,确保 IMU 每次都配置正确。我们还将在 Ardupilot 中添加 MicroStrain 参数,并提供详细的文档说明如何构建支持 MicroStrain IMU 的 Ardupilot。虽然还有很多工作要做,但我们已经克服了最大的障碍,因此完成我们的主要目标是可行且有希望的。
• G-Link-200-8G 无线三轴加速度传感器
• 3DM-CX5-IMU 高性能工业级惯性测量单元
• 3DM-CV7-AHRS 战术级 OEM IMU/AHRS
• 3DM-CX5-AR 高性能倾斜/垂直参考传感器
备注:本文转载自 MicroStrain 官网。