在这个视频中,我们将讨论如何使用传感器融合来估计物体的方向。现在,你可以用其他名字来称呼方向,比如态度,或者如果你只是在谈论2D窗格中的方向,也可以用方向。这就是为什么融合算法也可以称为姿态和航向参考系统的原因。但这都是一样的;我们想知道一个物体相对于某个参照物的朝向。
我们可以使用许多不同的传感器来实现这一点。例如,卫星可以使用恒星跟踪器来估计相对于惯性恒星场的姿态,而飞机可以使用迎角传感器来测量机翼相对于进入的自由气流的方向。
现在,在这段视频中,我们将重点介绍使用一组非常流行的传感器,这些传感器可以在每个现代手机和各种各样的自动系统中找到:磁强计、加速计和陀螺仪。
本视频的目标不是开发一个完整的惯性测量系统。要真正完成一项彻底的工作,要涵盖的内容太多了。相反,我想从概念上构建系统,并解释每个传感器带来了什么,以及在此过程中需要注意的一些事项。我还将调出一些其他非常好的来源,我在下面链接了这些来源,您可以深入了解更多细节。让我们开始吧。我是布莱恩,欢迎参加MATLAB技术讲座。
当我们谈论方向时,我们实际上是在描述一个物体从某个已知的参照系旋转了多远。例如,飞机的俯仰是指纵轴偏离局部地平线的旋转距离。因此,为了定义方向,我们需要选择描述方向的参考帧,然后使用某种表示方法指定该帧的旋转。我们有几种不同的方法来表示旋转。也许最容易想象和理解的是滚动、俯仰和偏航的概念。这种表示在某些情况下效果很好;然而,它也有一些众所周知的缺点。所以,我们有其他方法来定义不同情况下的旋转,比如方向余弦矩阵和四元数。
本次讨论的重点不在于四元数是什么或DCM是如何形成的,而在于理解这些数字组都表示两个不同坐标系之间的固定三维旋转:对象自身的坐标系固定在物体上并与物体一起旋转,以及一些外部坐标系。正是这个旋转,或这些数字集,我们试图通过传感器测量一些数量来估计。
那么让我们来看看我们的具体问题。比方说,我们想知道坐在桌子上的手机的方位。因此,手机的机身坐标系相对于本地的北坐标系、东坐标系和下坐标系。当仅使用磁强计和加速度计就可以找到绝对方向时,稍后我们将添加一个陀螺仪,以提高精度并纠正系统移动时出现的问题,但目前我们将坚持使用这两个传感器。简单地说,我们可以测量手机的加速度,这只是由于重力造成的,因为手机静止在桌子上,我们知道方向是向上的,方向与重力方向相反。然后我们可以测量身体框架中的磁场来确定北方。
但有一点需要考虑:磁场指向北方,但它也会根据你所在的半球向上或向下指向。这不仅仅是一点点。在北美,磁力线的角度大约是向下60至80度,这意味着磁力线主要是在重力方向。罗盘指向北方而不是向下的原因是指针被限制在二维平面内旋转。然而,我们的磁传感器没有这样的约束,所以它会返回一个向量,这个向量也是在重力方向上的。因此,为了到达北方,我们需要做一些交叉乘积。我们可以从人体框架中测得的磁场和加速度矢量开始。向下与加速度矢量的方向相反。东方是羽绒与磁场的叉积,然后北方是东方与羽绒的叉积。所以物体的方向就是物体框架和NED框架之间的旋转,我可以直接从刚才计算的N、E和D向量建立方向余弦矩阵。
让我们来看一下这个融合算法的实现。我有一个物理IMU;这是MPU-9250,它有一个加速计、磁强计和陀螺仪。虽然现在我们不打算使用陀螺。我已经通过I2C将它连接到Arduino,然后通过USB将其连接到MATLAB。我刚刚从MathWorks网站上学习了这个例子,该网站提供了我正在使用的一些功能,如果你想做同样的事情,我在下面链接了。
但让我给你看一下我的简单脚本。我连接到Arduino和IMU,使用MATLAB查看器可视化方位,每次读取传感器时都会更新查看器。这是一个内置功能,带有传感器融合和跟踪工具箱。这里的少量数学运算基本上是读取传感器、执行交叉乘积和构建DCM。
这几乎就是全部。所以如果我运行这个,我们可以看到算法的运行情况。注意,当它坐在桌子上时,它能很好地找到它;它在正X轴上,如果我把它旋转到另一个方向,你可以看到它跟得上我的身体运动。总的来说,非常简单明了,对吧?
这个简单的实现有一些问题,我想强调其中的两个。首先,加速度计不仅仅是测量重力;他们测量所有的线性加速度。因此,如果系统经常移动,那么它会偏离对向下位置的估计。你可以看到,我并没有将传感器旋转太多,但观众会跳得到处都是。如果你的系统基本上没有加速,这可能不是什么大问题,比如飞机在高空巡航,或者手机放在桌子上。但线性加速度并不是唯一的问题。即使是旋转也会影响估计,因为当系统旋转时,不位于旋转中心的加速计会感应到加速度。因此,我们必须找出一种方法来处理这些腐败。
第二个问题是磁力计受到磁场扰动的影响。显然,你可以看到,如果我在IMU附近有一块磁铁,估计值就会被破坏。那么我们能对这两个问题做些什么呢?好吧,让我们从磁强计开始。如果磁扰动是系统的一部分,并随磁强计旋转,则可以对其进行校准。
这些就是所谓的硬铁和软铁来源。硬铁源是一种能产生自身磁场的物质。这可能是一个真正的磁铁,就像电动机中的磁铁一样,也可能是一条线圈,它有电流从电子元件本身流过。如果你试图测量外部磁场,磁强计附近的硬铁源将有助于测量。如果我们绕单轴旋转系统并测量磁场,结果将是一个偏离原点的圆。所以你的磁强计会在某些方向上读取较大的强度,而在相反的方向上读取较小的强度。
软铁源是一种不会产生自身磁场的物质,但可以称之为磁性物质;你知道,就像钉子被磁铁或系统的金属结构吸引一样。这种金属在通过磁场及其周围时会弯曲磁场,并且随着金属旋转,弯曲量也会发生变化。因此,一个随磁强计旋转的软铁源会使测量结果失真,产生一个椭圆形而不是圆形。
因此,即使你有一个完美的无噪音磁强计,它仍然会返回一个不正确的测量值,这仅仅是因为附近有硬铁和软铁源。你的手机和几乎所有的系统都有这两种。
那么让我们来谈谈校准。如果这个系统没有硬或软的铁源,你把磁强计绕着四个π-射线方向旋转,那么磁场矢量就会描绘出一个完美的球体,其半径就是磁场的大小。现在,一个硬铁源会偏移球体,而一个软铁源会将其扭曲成椭球体。如果我们可以提前测量,我们可以通过找到偏移和变换矩阵来校准磁强计,从而将其转换回以原点为中心的完美球体。然后将此转换矩阵和偏差应用于每次测量,基本上去除硬铁和软铁源。
这正是你的手机在使用指南针之前要求你向各个方向旋转时所做的。在这里,我通过使用MATLAB函数magcal校准IMU来演示这一点。我收集了一系列不同方向的测量值,然后找到适合理想球体的校准系数。
现在我有了一个A矩阵,可以校正软铁源,还有一个b矩阵,可以消除硬铁偏置,我可以在之前向您展示的融合算法中添加一个校准步骤,这将产生比以前更准确的结果。
好了,现在让我们回到解决另一个问题,破坏线性加速度。解决这一问题的一种方法是预测线性加速度,并在使用前将其从测量中删除。这听起来可能很难做到,但如果加速度是系统促动器的结果,而不是不可预测的外部干扰,则有可能实现。我们可以接收发送给执行器的命令,并通过系统模型进行播放,以估计预期的线性加速度,然后从测量值中减去该值。例如,如果你的系统是无人机,并且你通过指挥四个螺旋桨四处飞行,那么这是可能的。
如果我们无法预测线性加速度或外部干扰过高,另一种选择是忽略加速度计读数,这些读数超出1g测量值的阈值。如果读数的大小不接近重力的大小,那么很明显,传感器正在检测其他运动,这是不可信的。
这会阻止损坏的测量数据进入我们的融合算法,但这并不是一个很好的解决方案,因为我们在这段时间内停止了方向估计,并且我们失去了对系统状态的跟踪。同样,如果我们试图估计静态物体的方向,这并不是一个真正的问题;这个算法会很好地工作。然而,我们经常想知道旋转和加速物体的方向。所以我们需要其他东西来帮助我们。
我们可以做的是在混音中加入一个陀螺来测量系统的角速率。事实上,磁强计、加速计和陀螺仪的组合非常流行,它们经常被打包成惯性测量单元,就像我的MPU-9250一样。那么陀螺仪有什么帮助呢?
好吧,首先,我认为思考一下我们如何用陀螺仪来估计旋转物体的方向是很有用的,没有加速度,也没有磁强计。为此,我们可以将角速率测量值乘以采样时间,得到该时间内角度的变化。然后,如果我们知道上一次采样时手机的方向,我们可以将此三角角添加到其中,并更新当前方向的估计值。如果物体没有旋转,那么三角角将为零,方向也不会改变,所以一切都解决了。通过对下一个样本和之后的样本重复此过程,我们将了解手机随时间的变化方向。这个过程被称为航位推算,本质上它只是对陀螺测量值进行积分。
推算航位也有缺点。第一,在开始之前,你还必须知道初始方向,所以我们必须弄清楚,第二,传感器并不完美。他们有偏见和其他高频噪音,这将破坏我们的估计。现在,积分就像一个低通滤波器,所以高频噪声被稍微平滑了一点,这很好,但由于随机游走以及积分测量中的任何偏差,结果偏离了真实位置。因此,随着时间的推移,这个方向将逐渐偏离真相。
因此,在这一点上,我们有两种不同的方法来估计方向,一种是使用加速度计和磁强计,另一种是仅使用陀螺仪。每个人都有各自的利益和问题。这就是传感器融合再次出现的地方。我们可以用它来组合这两种估计,以强调它们各自的优势并最小化它们的弱点。现在,我们可以使用许多传感器融合算法,比如互补滤波器或卡尔曼滤波器,或者更专业但非常常见的Madgwick或Mahony滤波器,但在其核心,每一个都做着基本相同的事情。
他们通过手动设置或使用磁力和加速度计的初始结果来初始化姿态,然后随着时间的推移,他们使用磁力场和重力的方向来缓慢修正陀螺仪中的漂移。现在,我在我的视频中详细介绍了互补滤波器,MathWorks有一系列关于卡尔曼滤波器的机制,都链接在下面,但如果你不马上去看,让我来介绍一下这种混合是如何工作的。
让我们把这两个解决方案放在一个代表我们对每个解决方案的信任的量表的两端。我们可以放置一个滑块,指定我们更信任哪个解决方案。如果滑块一直向左,那么我们100%信任我们的mag/accel解决方案,我们只使用该值来确定方向。一直到右边,我们100%使用航位推算解决方案。当滑块处于两者之间时,这意味着我们在一定程度上信任这两个解决方案,因此希望取一个解决方案的一部分,并将其添加到另一解决方案的互补部分。通过将滑块几乎完全置于航位推算解决方案中,我们主要相信集成陀螺仪测量的平滑性和快速更新,这为我们在旋转和线性加速度过程中提供了良好的估计,但我们一直在轻轻地将该解决方案修正回磁加速度的绝对测量值,以便在偏差有可能变得过大之前消除偏差。因此,这两种方法是相辅相成的。
现在,对于互补滤波器,作为设计者,您可以手动计算出该滑块的位置,以及您对一个测量值的信任程度。使用卡尔曼滤波器,在您指定测量中有多少噪声以及您认为您的系统模型有多好后,将为您计算滑块的最佳增益或位置。因此,底线是,我们正在根据我们对两个解决方案的信任程度,对两个解进行某种奇妙的平均。现在,如果你想自己练习,我之前使用的MATLAB教程使用MATLAB函数ahrsfilter通过卡尔曼滤波方法。
这就是我要留下这段视频的地方。在下一个视频中,我们将更进一步,添加GPS,并展示IMU和方向估计如何帮助我们改进从GPS传感器获得的位置。
所以,如果你不想错过那个或其他未来的Tech Talk视频,别忘了订阅这个频道。此外,如果你想看看我的频道《控制系统讲座》,我也会在那里介绍更多的控制主题。下次见。