Raspberry Pi和Python校准惯性测量单元-陀螺仪-加速度计-磁力计

惯性测量单元校准

惯性测量单元(IMU)可以由单个传感器或传感器集合组成,这些传感器或传感器集合捕获旨在测量给定参考系中的惯性运动的数据。 加速度,旋转速度和磁场强度是IMU中包含的传感器的示例。 IMU可以在智能设备,医疗康复,通用机器人,制造控制,航空和导航,运动学习以及增强和虚拟现实系统等应用中找到。 惯性测量单元随着其外形尺寸的缩小和计算能力的提高而变得越来越流行。 使用IMU进行室内/室外跟踪,运动检测,力估计,方向检测等的能力已导致惯性传感器的使用和可用性在智能电话,智能手表,无人机和其他常见电子设备中变得越来越普遍。 互联网上到处都是涉及加速度计,陀螺仪和磁力计的项目,但很少能涵盖所有三个传感器的全部校准。 在本项目中,探索了九个自由度(9-DoF)IMU的手动校准。 IMU连接到Raspberry Pi-这将允许IMU的所有九个组件的高速数据采集速率。

部件

接线

I2C通讯

为了通过I2C读取和写入数据,我们必须首先在RPi上启用I2C端口。 我们执行此操作的方法是使用命令行或导航到“首选项”→“ Raspberry Pi配置”。 Adafruit有一个很好的教程,概述了此过程,但是下面将使用RPi配置窗口的屏幕快照给出一个简化的版本。

首选项→Raspberry Pi配置

接口→启用I2C

打开命令窗口,然后键入“ sudo i2cdetect -y 1”

验证0x68作为I2C可用地址

sudo nano /boot/config.txt

在I2C设置旁边添加配置

i2c_arm_baudrate=1000000

完成将波特率更改为1Mbps后,输入CTRL+X,Y,然后按ENTER。 这将保存新的I2C波特率。 完成后,重新启动RPi。 我们在这里所做的只是将波特率设置为1 Mbps-高于默认值100kbps。 这应该给我们大约400Hz-500Hz的采样率(转换为实际单位后)。 我们可以为陀螺仪获得更高的采样率,而为加速度计获得稍高的采样率,但这在本文中将不做探讨。

Python库和惯性测量单元测试(Python代码)

成功运行以上代码后,输出应类似于以下屏幕快照中所示的输出:

该重力是由于重力在IMU的z方向作用而产生的。 这就是为什么我们在z方向上看到接近1g的值,而在x和y方向上看到接近0g的原因。 加速度计在当前配置中跨度为0g-2g,但可以编程为跨度为0g-16g。

对于陀螺仪,我们希望它记录到接近零角速度的位置,对于三个方向我们大致都可以看到。 当然,只有在IMU处于稳定状态(不移动)的情况下,这才是正确的。 陀螺仪在当前配置中的跨度为0-250 dps(每秒度),因此我们可以假设上面观察到的小值是噪声,小振动或要校准的偏移量。

最后,磁力计显示地球磁场强度约为17μT和12μT。磁力计的值很难验证:

  • 首先,访问国家环境信息中心(NCEI)的磁场计算器

  • 选择标题为“磁场”的选项卡

  • 接下来,输入IMU的当前地理位置坐标

  • 查找标题为“ Horizontal Intensity”的组件-在我们的示例中为20,798 nT(20.8μT)

  • 接下来,对IMU的x和y方向输出值求平方:

    B H = B x 2 + B y 2 B_{H}=\sqrt{B_{x}^{2}+B_{y}^{2}} BH=Bx2+By2

  • 对于我们的情况,我们得到以下信息:

    B H = ( − 16.99 ) 2 + ( 12.01 ) 2 ≈ 20.8 u T B_{H}=\sqrt{(-16.99)^{2}+(12.01)^{2}} \approx 20.8 \mathrm{uT} BH=(16.99)2+(12.01)2 20.8uT

因此,由于根据NCEI的计算,我们测得的水平偏角与预期值几乎相同,因此我们可以再次验证IMU的行为是否符合地球磁场的预期。 在这一点上,用户可以验证IMU是否在固定条件下正常运行。

陀螺仪和加速度计校准

器具背景

加速度计坐标系使用了某种传统的笛卡尔坐标系。 类似地,陀螺仪使用逆时针旋转作为正旋转方向。 磁力计切换x和y方向,同时反转z方向振幅的方向。 这些约定将在校准期间发挥作用,并将针对三个传感器中的每一个进行澄清和讨论。

每个传感器的范围:

  • 加速度计-将在0g至2g的范围内进行校准
  • 陀螺仪-将在0dps-250dps的范围内进行校准
  • 磁力计-将在0μT-4800μT的范围内进行校准

稳定条件下校准陀螺仪(Python代码)

IMU的最简单校准包括计算陀螺仪每个轴的偏移量。 由于在稳定条件下会输出预期的读数,因此陀螺仪是最简单的校准方法。 当IMU不移动时,陀螺仪的三个轴中的每个轴应每秒读取0度(dps,°/ s)。 可以通过在IMU不移动时先获取一些读数,然后在将来读取陀螺仪值时将这些值用作“偏移量”来测量偏移量。 这只是用于IMU的最简单的校准方法,足以满足陀螺仪和IMU的大多数随意使用。

通过记录每个轴上的数据样本块并使用每个样本的平均值,可以找到陀螺仪偏移量。 陀螺仪校准例程(以及本教程中使用的所有其他代码)可以在此链接上找到:

上面代码的输出绘制了三轴陀螺仪的未校准值和校准值,这些值是变量“ cal_size”中指定的许多样本(在本例中选择为500个样本)。 我们的陀螺仪的示例输出如下所示:

显而易见,在稳定的IMU条件下,偏移量对于最小化预期最小值至关重要。

通过数值积分验证陀螺仪校准(Python代码)

我们可以通过在已知旋转下随时间积分角速度值数组来进一步测试陀螺仪的校准。 例如,我们可以将IMU校准模块旋转180°并随时间推移集成陀螺仪,以验证陀螺仪是否正常工作。

通过集成陀螺仪的角速度,可以得出角位移的近似值:

∫ t 1 t 2 ω i d t = θ i \int_{t 1}^{t 2} \omega_{i} d t=\theta_{i} t1t2ωidt=θi

对于离散点,需要一种数值积分技术,为此我们使用梯形数值积分:

θ i = ∫ t 1 t 2 ω i d t ≈ ∑ j = N N ( f i ( t j − 1 ) + f i ( t j ) 2 Δ t j ) \theta_{i}=\int_{t 1}^{t 2} \omega_{i} d t \approx \sum_{j=N}^{N}\left(\frac{f_{i}\left(t_{j-1}\right)+f_{i}\left(t_{j}\right)}{2} \Delta t_{j}\right) θi=t1t2ωidtj=NN(2fi(tj1)+fi(tj)Δtj)

Python中的“ scipy”程序包很好地实现了梯形数值积分,这使得通过陀螺仪积分可以很容易地估算IMU的旋转。 下图给出了陀螺仪集成的示例实现:

使用重力校准加速度计(Python代码)

加速度计的校准需要利用重力引起的加速度,我们可以将其用于IMU的正负方向。 此外,我们还可以将IMU垂直于重力放置,以获取第三个校准点。 这产生了三个唯一的值,可以将其组合起来以制定三个值与加速度计的每个轴输出的值之间的线性拟合。

加速度计的校准步骤如下(针对每个轴):

将IMU指向反重力(1g)

将IMU向下指向重力(-1g)

将IMU垂直于重力(0g)

这三个校准应针对每个3轴进行。这三个点将使一阶模型与加速度计各轴的比例因子和偏移量(斜率和截距)的最小二乘拟合。

下面给出了用于校准加速度计的Python代码:

上面的代码引导用户完成三个轴中每个轴的校准步骤,并输出类似于以下内容的图:

上面的校准代表连接到校准块的IMU,z方向指向上方。这就是为什么我们在z方向上看到1g加速度,而在其他两个方向上看到接近零值的原因。

在下面的线性拟合方面,我们可以再次看到对每个轴进行校准的好处:

适用于-1g,0g,+ 1g以下所有加速度计轴的线性拟合

接下来,将通过在选定方向上将IMU校准模块移动已知距离来执行加速度计的验证。加速度计测得的相应加速度将被积分两次以近似位移。

通过数值积分验证加速度计的校准(Python代码)

加速度计校准可以通过与陀螺仪类似的方式进行验证-通过数值积分。 陀螺仪积分与加速度计积分之间的区别在于,根据以下积分,加速度值将被积分两次,以输出IMU的近似位移:

a i = d 2 x i d t 2 → d x i d t = ∫ a i d t → x i = ∫ ( ∫ a i d t ) d t a_{i}=\frac{d^{2} x_{i}}{d t^{2}} \rightarrow \frac{d x_{i}}{d t}=\int a_{i} d t \rightarrow x_{i}=\int\left(\int a_{i} d t\right) d t ai=dt2d2xidtdxi=aidtxi=(aidt)dt

同样,上述关系需要离散化以使其适合于现实世界中的运动,该运动首先需要将加速度积分为第一近似速度:

v i = ∑ j = 1 N ( a ( t j − 1 ) + a ( t j ) 2 ) Δ t j v_{i}=\sum_{j=1}^{N}\left(\frac{a\left(t_{j-1}\right)+a\left(t_{j}\right)}{2}\right) \Delta t_{j} vi=j=1N(2a(tj1)+a(tj))Δtj

接下来,必须对速度数组进行积分才能近似位移:

x i = ∑ j = 1 N ( v ( t j − 1 ) + v ( t j ) 2 ) Δ t j x_{i}=\sum_{j=1}^{N}\left(\frac{v\left(t_{j-1}\right)+v\left(t_{j}\right)}{2}\right) \Delta t_{j} xi=j=1N(2v(tj1)+v(tj))Δtj

在Python中,我们首先使用“ intergrate.cumtrapz”,它以逐步的增量实现梯形数值积分。第一次积分产生速度矢量,而第二次积分产生位移阵列。

加速测试的双重集成有几个假设:

  1. 对象(IMU校准块)处于静止状态
  2. 样本之间的时间是已知的(IMU可能不一致)
  3. IMU向一个方向滑动
  4. 加速度轴垂直于重力(重力影响为0g)

在这些假设下,加速度计值可以很容易地在一个方向上积分。 以下是IMU校准块在一个方向上滑过抽头量度的演示。 将测得的位移与两次积分的加速度计数据进行比较,以验证加速度计的校准。

下面还给出了示例输出,用于IMU在+ y方向上滑动0.5m的测试案例:

可以对上面的图进行一些观察:

  • 即使在校准后,加速度也不为零(可能由于工作台不平衡)
  • 加速度开始为正(加速度),过零,然后变为负(减速度)
  • 整个速度为正(向前移动)
  • 位移为正(向前移动)
  • 由于加速度不平衡(表不平衡),速度和位移不断变化

对于0.5m测试,发现位移的近似值为大约0.4m。 这种不准确性是由于与传感器相关联的双重积分和不确定性,以及不完善的校准。 可以通过确保IMU在校准过程中(与水平仪)垂直于重力,并确保在水平面上进行测试来解决这一问题。

磁力计的校准

背景介绍

可以将地球磁场近似为以地球核心为中心的偶极子,该偶极子具有相反的磁极,这些磁极在称为地磁极的点处与地球表面相交(请在此处了解有关“世界磁模型”的更多信息)。 在表征给定位置处的地球磁场时,三轴磁力计通过将振幅除以磁场的每个分量来计算磁场的水平分量和垂直分量。 以下是放置在地球表面的三轴IMU的示例:

磁力计在水平方向上测得的磁场称为“航向”,而垂直方向有时称为“磁倾角”或“倾角”。 对于大多数目的,航向用于确定磁北的方向,该方向可用于地理定位。

我们可以看到,磁场是由《 2010年世界电磁模型》计算得出的,大约位于纽约市曼哈顿市中心。 磁偏角是磁北和地理北之间的夹角。 倾斜度是地球表面和垂直磁场之间的夹角。 可以通过计算水平方向上分量场的幅度来找到水平强度。 例如,如果IMU的z方向与重力平行,则x/y处的磁场幅度如下,

B H = B x 2 + B y 2 B_{H}=\sqrt{B_{x}^{2}+B_{y}^{2}} BH=Bx2+By2

以上内容可用于在水平平面中使用磁场的两个分量(x / y或取决于传感器方向的任何其他组合)来查找磁场强度(水平强度)。 同样,我们也可以使用两个水平分量的反正切来近似航向:

因此,仅使用磁力计测量的磁场的两个分量(假设传感器垂直于表面)就可以得出在磁北方向上方使用反正切关系的信息。

磁力计的硬铁偏置校准

为了找到三轴磁力计的硬铁偏置,IMU至少需要在两个方向上旋转360度。 理解硬铁效应的最好方法是首先在360°旋转期间进行测量,并可视化平面磁力计传感器(平行于地球垂直磁场的传感器)的磁响应。 如下图所示:

在抵消硬铁效应之前,很容易看到三个传感器平面之间的巨大差异。 传感器围绕每个轴旋转360°,应产生一个以原点(0,0)为中心的圆,我们在抵消了硬铁效果后可以看到该圆。 这对于提高磁力计的航向近似精度至关重要。 因此,在上文中,我们得出了三个偏移值,它们近似于系统的硬铁干扰。 在使用上节给出的反正切线计算航向时,应首先从读取的磁力计值中减去硬铁效应。 这将提高跟踪的准确性和稳定性。

校准磁力计硬偏移的步骤如下:

  1. 运行mag_hard_calibration.py代码(以上)
  2. 出现提示时,围绕规定的轴旋转IMU(规定的轴应平行于重力)
  3. 绕指定的轴旋转后,按CTRL + C中断运行
  4. 对所有三个轴重复

还有另一种涉及校准磁力计的方法,称为软铁校准,该方法会缩放磁力计的每个轴,以确保IMU的旋转形状保持其圆形。 如果存在软铁,IMU的旋转将产生更多的椭圆响应,而不是圆形响应。 由于本系统中缺少软铁材料,因此本教程中未对此进行探讨。

在下一部分中,将介绍所有三个传感器(9个自由度)的融合,它将结合所有校准例程,这些例程将在一个脚本中输出校准系数。 然后,将使用实时绘图仪来实时监视所有九个变量。

9自由度IMU传感器融合(Python代码)

迄今为止,IMU的校准仅涉及将校准系数存储在本地存储器中,并生成变量的曲线图和打印输出。 在本节中,将每个传感器的校准例程组装到一个校准过程中,在其中保存系数以备将来使用。 这使得校准程序对将来的应用很有用,并允许使用校准信息对算法进行验证和扩展验证。 本部分还将介绍一个实时绘图代码,该代码使用户可以实时测试所有9自由度的校准,。

下面给出了通过陀螺仪,加速度计和磁力计进行校准的完整校准实施代码。 该代码还输出实时可视化图像,以查看每个9自由度的校准以及近似航向计算。 可视化允许实时检查校准和验证不同现象。 例如,可以将一块磁铁放入IMU的检测范围,而AK8963磁力计将看到响应。 在项目的GitHub页面上提供了完整的代码。

上面的脚本输出的校准系数的示例打印输出如下所示:

下面是上面代码的另一个示例输出,显示了IMU围绕z轴的360°旋转图:

详情参阅 - 亚图跨际

你可能感兴趣的:(Python,Raspberry,Pi,python)