磁力计∞形校准


15

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

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

您必须经历另一个包含更多信息的类似问题


有关此特定问题的一些其他信息:该平台是使用AVR Studio 5的8位AtMega32。

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


好的代码,通过它我可以计算出偏移量,然后再从原始3D矢量中简单地减去这些偏移量。我可能完全错了,没有任何解释。看完视频和球面上绘制的数据后,某种程度上加快了我的想法,我将这种想法用于方程式。B)

码:

Read_accl();Read_magnato(1);功能正在阅读的传感器数据。我希望代码可以自我解释。希望明智的ppl一定会以更好的方式使用它。:\

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 ;
...
}

如我所说。


2
这个问题需要很多帮助。您需要编程方面的帮助吗?关于磁力计的理论?什么平台?您尝试或查询了什么?
Kellenjb

图8仅仅是启动校准的手势吗?
geometrikal

1
我不知道为什么ppl表现得像机器人一样。我已经给出了相同工作的链接。我为此做了很多工作,只是不知道,就把它否决了。由于我不清楚的问题,当我的问题投反对票时,我讨厌它。在投票否决之前,请先询问需要什么。我真的很想获得输出,而人民党甚至在投票否决之前都没有想过。感觉很糟糕,试图使我偏离正确方向的工作。请,我需要帮助,而不是投票的任何一方。
Rick2047

1
@Kellenjb:我正在使用简单的8位atmega32进行IMU工作。我尝试过进行研究,得出的结论是32位uC就像用剑代替了针一样。(对不起我的谜语:))我尝试将构成形状的磁力计的所有RAW值相加。然后除以输入编号。思考可能有助于计算偏移量。我认为形状的两个相同部分/侧面是如何抵消地球磁场并给出偏移值的。我可能错了。但是特别是对于基于形状的校准,这是我目前所在的位置。我认为...
Rick2047 2011年

1
问题不在于问题,而在于本网站上将投票否决问题的人数仅仅是因为他们对主题不够熟悉,无法理解所提出的问题。如果您不知道,那就别管它!
克里斯·斯特拉顿

Answers:


21

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

背景

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

=X一世^+ÿȷ^+žķ^

借助给出的场的大小,

=X2+ÿ2+ž2

每个轴的旋转角度为

θķ=cos-1个ķ 哪里 ķ[Xÿž]

校准

Xÿž

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

球

但是,由于硬铁和软铁的作用以及其他变形,它最终看起来像是变形的球体:

变形的

这是因为传感器测得的磁场强度随方向变化。结果是,根据上述公式计算出的磁场方向与真实方向不同。

必须执行校准来调整三个轴读数中的每一个,以使幅度不变,而与方向无关-您可以将其视为变形的球体必须弯曲成一个完美的球体。该LSM303应用笔记有很多关于如何执行这一详细的说明。

那么图8模式又如何呢?

执行图8的图案可以“找出”上方变形球的一部分。根据获得的坐标,可以估计球体的变形,并获得校准系数。良好的模式是在最大范围的方向上进行跟踪,从而估计与真实恒定量值的最大偏差。

为了估计变形球体的形状,可以使用最小二乘椭圆拟合。LSM303应用笔记还提供了有关此信息。

一种简单的基本校准方法

根据应用笔记,如果您假设没有软铁变形,则变形的球体不会倾斜。因此,可以使用一种简单的基本校准方法:

  • 找到每个轴的最大值和最小值,并获得1/2范围和零点

[Rķ=1个2最大值ķ-ķ

žķ=最大值ķ-[Rķ

  • 移动和缩放每个轴的测量

ķ=ķ-žķ[Rķ

  • ķ

这是基于此处找到的代码

用最小二乘法求解

下面显示了使用最小二乘法求解的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校准,可以对每个新读数运行最小二乘例程,并在偏移和比例因子稳定后终止。

地球磁场

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


嗨,这是您为解决图8模式问题所做的相当大的努力。现在我可以将我之前的一些工作与当前的工作联系起来。我确实看到了一些改进,但还没有达到标准。仅是一个问题;在制作8形状后,使用输出数据正确显示了NEWS,然后获得了所有矢量的平均值的一半。令人惊讶的是,它适用于水平计划(通过fluke)。所以我又在同一位置我开始在8型算法中工作。我将在“最小二乘”之后回来。但是我听不懂the幸。
Rick2047

...在我看来,球体也沿Z轴变形。请知道,我知道绘制的3D球面上的硬铁和软铁效果。我将尝试再次将其绘制在3D上。让我们看看。
Rick2047

@ Rahul2047好吧,我只是希望它是正确的,但这对我来说很有意义。我必须对要制造的仪器进行类似的校准,但还不能完全实现代码。
geometrikal

我想知道对于通常只对水平面方向感兴趣的电话,一个简单的手势可以覆盖所有需要的点。您使用matlab吗?在那里很容易合身。最小二乘是指误差测量方法。
geometrikal

1
本文中的某些图片链接损坏了-您可以重新添加图片吗?SE现在具有上载图像并将其存储在本地的功能,以防止将来损坏。谢谢!
新亚历山大(Alexanderia)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.