磁力计∞形校准

电器工程 校准 伊穆
2022-01-03 23:58:39

在使用 3 轴电子罗盘的手机和其他设备中,使用 ∞/8/S 形运动来校准磁力计,如这些视频中所示。

为什么要执行此动作,理论是什么,任何人都可以提供一些示例 C 代码来实现它吗?

您必须仔细阅读我的另一个包含更多信息的类似问题。


这个特定问题的一些附加信息:平台是 8 位 AtMega32,使用 AVR Studio 5。

直到现在我已经尝试过:我尝试将平均值除以 2的磁力计矢量值来制作形状。思考可能有助于计算偏移量。我认为形状的两个相同部分/侧面如何抵消地球磁场并给出偏移值。我可能错了。但特别是对于基于形状的校准,这是我目前所处的位置。我认为校准是这样进行的。我们的想法是找出这样做是否可行?


好的,我可以计算偏移量的代码,然后简单地从原始磁性 3D 矢量中减去这些偏移量。我可能完全错了,没有解释它是如何工作的。看了视频和绘制在球体上的数据后,不知何故加速了我的思考,我把这个想法用在了方程的形式上。二)

代码:

Read_accl();函数Read_magnato(1);正在读取传感器数据。我希望代码是不言自明的。希望明智的人肯定会以更好的方式使用它。:\

void InfinityShapedCallibration()
{
    unsigned char ProcessStarted = 0;
    unsigned long cnt = 0; 

    while (1)
    {

            Read_accl();

            // Keep reading Acc data
            // Detect Horizontal position
            // Detect Upside down position
            // Then detect the Horizontal position again.
            // Meanwhile an infinity shaped movement will be created.
            // Sum up all the data, divide by the count, divide by 2 .
            // !We've offsets.          

                if (ProcessStarted!=3)
                {
                //
                    //USART_Transmit_String("\r");
                    //rprintfFloat(4, g_structAccelerometerData.accx_RAW);
                    //USART_Transmit_String(",");
                    //rprintfFloat(4, g_structAccelerometerData.accy_RAW);
                    //USART_Transmit_String(",");
                    //rprintfFloat(4, g_structAccelerometerData.accz_RAW);

                }


            if (
             abs( g_structAccelerometerData.accx_RAW) < 100 
            && abs(g_structAccelerometerData.accy_RAW) < 100 
            && g_structAccelerometerData.accz_RAW < -350 
            && ProcessStarted != 2 && ProcessStarted != 3 && ProcessStarted != 1 )
            {
                ProcessStarted = 1; 
            }   

            if (ProcessStarted==1)
            { 

            Read_magnato(1);

                structMagnetometerOffsetDataToEEPROM.Off_X += g_structMegnetometerData.magx_RAW;
                structMagnetometerOffsetDataToEEPROM.Off_Y += g_structMegnetometerData.magy_RAW;
                structMagnetometerOffsetDataToEEPROM.Off_Z += g_structMegnetometerData.magz_RAW;

                cnt++;

            }               
                if ( g_structAccelerometerData.accz_RAW > 350 
                && ProcessStarted==1)
                {
                    ProcessStarted = 2; 
                }

                if ( g_structAccelerometerData.accz_RAW < -350 
                && ProcessStarted == 2 )
                {
                    ProcessStarted=3; 
                    structMagnetometerOffsetDataToEEPROM.Off_X /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_X /= 2;

                    structMagnetometerOffsetDataToEEPROM.Off_Y /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_Y /= 2;

                    structMagnetometerOffsetDataToEEPROM.Off_Z /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_Z /= 2;  

                    UpdateOFFSETDATAinEEPROM();  

                    break;

                } 
    }   
} 

获得这些偏移量后,我按如下方式使用它们:

void main()
{
...

Read_magnato(1);
        g_structMegnetometerData.magx_RAW -= structMagnetometerOffsetDataToEEPROM.Off_X ;
        g_structMegnetometerData.magy_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Y ;
        g_structMegnetometerData.magz_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Z ;
...
}

如我所说。

1个回答

8/S 形图案用于校准手机和其他设备中的磁力计。

背景

典型的手机时代磁力计测量沿三个正交轴的磁场强度,例如:

\$\textbf{m} = m_x\boldsymbol{\hat{\imath}} + m_y\boldsymbol{\hat{\jmath}} + m_z\boldsymbol{\hat{k}}\$

场的大小由下式给出,

\$\|\textbf{m}\| = \sqrt{m_x^2 +m_y^2 + m_z^2}\$

和每个轴的旋转角度为

\$ \theta_k = \cos^{-1} \frac{m_k}{ \| \textbf{m} \| }, \text{ 其中 } k \in [x,y,z] \$

校准

由于地球的磁场是相对恒定的,磁力计测量的磁场大小也应该是恒定的,与传感器的方向无关即,如果要旋转传感器并在 3D 中绘制 \$m_x\$、\$m_y\$ 和 \$m_z\$,则路径应该绘制出具有恒定半径的球体表面。

理想情况下,它应该看起来像这样:

领域

然而,由于硬铁和软铁的影响以及其他变形,它最终看起来像一个变形的球体:

变形

这是因为由传感器测量的磁场大小随方向而变化。结果是根据上述公式计算的磁场方向与真实方向不同。

必须执行校准以调整三个轴读数中的每一个,以便无论方向如何,幅度都是恒定的 - 您可以将其视为变形的球体必须弯曲成完美的球体。LSM303应用笔记有很多关于如何执行此操作的详细说明

那么8字图案呢!?

执行图 8 模式“描出”上面变形球体的一部分。从获得的坐标中,可以估计球体的变形,并获得校准系数。一个好的模式是跟踪最大范围的方向,因此估计与真实恒定幅度的最大偏差。

为了估计变形球体的形状,可以使用最小二乘椭圆拟合。LSM303 应用笔记也有这方面的信息。

基本校准的简单方法

根据应用说明,如果您假设没有软铁变形,变形的球体将不会倾斜。因此,一种简单的基本校准方法是可能的:

  • 求各轴的最大值和最小值,得到1/2范围和零点

\$r_k = \tfrac{1}{2} (\max(m_k) - \min(m_k))\$

\$z_k = \max(m_k) - r_k\$

  • 移动和缩放每个轴测量

\$m_k' = \frac{m_k - z_k}{r_k}\$

  • 除了使用 \$m_k'\$ 之外,像以前一样计算值

这是基于在此处找到的代码。

使用最小二乘法求解

使用最小二乘法求解的 MATLAB 代码如下所示。该代码假定一个变量mag,其中列是 xyz 值。

H = [mag(:,1), mag(:,2), mag(:,3), - mag(:,2).^2, - mag(:,3).^2, ones(size(mag(:,1)))];
w = mag(:,1).^2;
X = (H'*H)\H'*w;
offX = X(1)/2;
offY = X(2)/(2*X(4));
offZ = X(3)/(2*X(5));
temp = X(6) + offX^2 + X(4)*offY^2 + X(5)*offZ^2;
scaleX = sqrt(temp);
scaleY = sqrt(temp / X(4));
scaleZ= sqrt(temp / X(5));

要进行动态 8 字形校准,您可以在每次新读数时运行最小二乘例程,并在偏移和比例因子稳定时终止。

地球磁场

请注意,地球磁场通常平行于地表,并且可能存在较大的向下分量。