การสอบเทียบรูป Magnetometer


15

ในโทรศัพท์มือถือและอุปกรณ์อื่น ๆ ที่ใช้ 3 แกนเข็มทิศอิเล็กทรอนิกส์∞ / 8 / S เคลื่อนไหวรูปถูกนำมาใช้ในการสอบเทียบ magnetometer ดังแสดงในวิดีโอเหล่านี้

เหตุใดการเคลื่อนไหวนี้จึงเกิดขึ้นทฤษฎีคืออะไรและทุกคนสามารถให้ตัวอย่างรหัส C เพื่อนำมาใช้

คุณต้องผ่านคำถามอื่นที่คล้ายกันซึ่งมีข้อมูลเพิ่มเติม


ข้อมูลเพิ่มเติมสำหรับคำถามนี้: แพลตฟอร์ม AtMega32 8 บิตโดยใช้ AVR Studio 5

จนถึงตอนนี้ฉันได้ลองแล้ว: ฉันพยายามหารค่าเฉลี่ยด้วย 2ของค่าเวกเตอร์ของ Magnetometer เพื่อสร้างรูปร่าง การคิดอาจช่วยในการคำนวณออฟเซ็ต ฉันคิดว่าชิ้นส่วน / ด้านที่เหมือนกันสองชิ้นของรูปร่างกำลังยกเลิกสนามแม่เหล็กของโลกและให้ค่าออฟเซ็ต ฉันอาจจะผิด. แต่โดยเฉพาะอย่างยิ่งสำหรับการปรับเทียบตามรูปร่างนี่คือที่ฉันอยู่ในขณะนี้ ฉันคิดว่าการสอบเทียบใช้วิธีนี้ได้ แนวคิดคือการค้นหาว่าวิธีนี้ใช้ได้ผลหรือไม่


ตกลงรหัสที่ฉันสามารถคำนวณออฟเซ็ตและต่อมาก็แค่ลบพวกมันออกจากเวกเตอร์ Raw Magnetic 3D ฉันอาจจะผิดทั้งหมดและไม่มีคำอธิบายวิธีการทำงาน หลังจากดูวิดีโอและข้อมูลที่ถูกวางลงบนทรงกลมก็ทำให้ความคิดของฉันเร่งขึ้นและฉันก็ใช้ความคิดนั้นในรูปของสมการ B)

รหัส:

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

อย่างที่ฉันพูดไป


2
คำถามนี้ต้องการความช่วยเหลือมากมาย คุณต้องการความช่วยเหลือในการเขียนโปรแกรมหรือไม่? ทฤษฎีเกี่ยวกับสนามแม่เหล็ก แพลตฟอร์มอะไร คุณลองทำอะไรหรือค้นหาอะไรบ้าง
Kellenjb

รูปที่ 8 เป็นเพียงท่าทางในการเริ่มต้นการสอบเทียบไม่ใช่หรือ
geometrikal

1
ฉันไม่รู้ว่าทำไม ppl ทำตัวเหมือนเป็นหุ่นยนต์ ฉันได้รับลิงค์สำหรับงานเดียวกัน ฉันทำงานหนักมากเกี่ยวกับเรื่องนั้นและ ppl โดยไม่รู้ตัวเพียงแค่โหวตมัน ฉันเกลียดเมื่อฉันลงคะแนนเพราะคำถามที่ไม่ชัดเจน โปรดถามสิ่งที่จำเป็นก่อนลงคะแนน ฉันกำลังจะตายเพื่อรับเอาท์พุทและ ppl ไม่ได้คิดก่อนลงคะแนน รู้สึกไม่ดีและพยายามเบี่ยงเบนความสนใจจากการทำงานในทิศทางที่ถูกต้อง โปรดฉันต้องการความช่วยเหลือไม่ใช่การลงคะแนนทั้งสองด้าน
Rick2047

1
@ Kellenjb: ฉันกำลังทำงานกับ IMU โดยใช้ atmega32 8 บิตที่เรียบง่าย ฉันพยายามทำมันและสรุปว่า 32 บิต uC นั้นเหมือนกับการใช้ดาบแทนเข็ม (ขออภัยสำหรับปริศนาของฉัน:)) ฉันพยายามเพิ่มค่า RAW ทั้งหมดของ Magnetometer ทำให้รูปร่าง จากนั้นหารด้วยหมายเลขของอินพุต การคิดอาจช่วยในการคำนวณออฟเซต ฉันคิดว่าชิ้นส่วน / รูปร่างด้านข้างที่เหมือนกันทั้งสองนั้นมีวิธีการยกเลิกสนามแม่เหล็กของโลกและให้ค่าออฟเซ็ต ฉันอาจจะผิด. แต่โดยเฉพาะอย่างยิ่งสำหรับการปรับเทียบตามรูปร่างนี่คือที่ฉันอยู่ในขณะนี้ ฉันคิดว่า ...
Rick2047

1
ปัญหาไม่ได้เกิดจากคำถาม แต่ด้วยจำนวนของคนในเว็บไซต์นี้ที่จะลงคะแนนคำถามเพียงเพราะพวกเขาไม่คุ้นเคยเพียงพอกับหัวข้อที่จะเข้าใจสิ่งที่ถูกถาม หากคุณไม่รู้ก็แค่ทิ้งไว้คนเดียว!
Chris Stratton

คำตอบ:


21

รูปแบบที่มีรูปร่าง 8 / S ใช้สำหรับปรับเทียบมาตรวัดแม่เหล็กในโทรศัพท์มือถือและอุปกรณ์อื่น ๆ

พื้นหลัง

Magnetometers ยุคโทรศัพท์มือถือทั่วไปวัดความแรงของสนามแม่เหล็กตามแกนสามมุมฉากเช่น:

m=mxı^+myȷ^+mzk^

ด้วยขนาดของสนามที่กำหนดโดย

m=mx2+my2+mz2

และมุมของการหมุนจากแต่ละแกนเป็น

θk=cos1mkm, where k[x,y,z]

การสอบเทียบ

เนื่องจากสนาม magenetic ของโลกค่อนข้างคงที่ดังนั้นขนาดของสนามไฟฟ้าที่วัดโดยเครื่องวัดสนามแม่เหล็กจึงควรมีค่าคงที่ไม่ว่าจะมีการวางแนวของเซ็นเซอร์ก็ตาม นั่นคือถ้ามีใครจะหมุนเซ็นเซอร์ไปรอบ ๆ และพล็อต ,และในแบบ 3 มิติเส้นทางควรพล็อตพื้นผิวของทรงกลมที่มีรัศมีคงที่m y m zmxmymz

เป็นการดีที่มันควรมีลักษณะดังนี้:

รูปทรงกลม

อย่างไรก็ตามเนื่องจากเอฟเฟกต์เหล็กที่แข็งและอ่อนและการบิดเบี้ยวอื่น ๆ ทำให้มันดูเหมือนทรงกลมที่ผิดรูป

พิการ

นี่เป็นเพราะขนาดของสนามแม่เหล็กที่วัดโดยเซ็นเซอร์นั้นเปลี่ยนไปตามทิศทาง ผลที่ได้คือทิศทางของสนามแม่เหล็กเมื่อคำนวณตามสูตรข้างต้นแตกต่างจากทิศทางที่แท้จริง

การปรับเทียบจะต้องดำเนินการเพื่อปรับการอ่านแต่ละแกนสามแกนเพื่อให้ขนาดคงที่โดยไม่คำนึงถึงทิศทาง - คุณสามารถคิดได้เนื่องจากทรงกลมที่เสียรูปจะต้องบิดเป็นทรงกลมที่สมบูรณ์แบบ LSM303เอกสารการใช้งานมีจำนวนมากคำแนะนำรายละเอียดเกี่ยวกับวิธีการดำเนินการนี้

แล้วรูปแบบ 8 รูปเป็นไง?

การดำเนินการส่วนที่ 8 รูปแบบ 'ร่องรอยออก' ของทรงกลมที่ผิดรูปด้านบน จากพิกัดที่ได้รับสามารถประมาณความผิดปกติของทรงกลมและค่าสัมประสิทธิ์การสอบเทียบที่ได้รับ รูปแบบที่ดีคือสิ่งที่ติดตามผ่านช่วงการจัดแนวที่ใหญ่ที่สุดและดังนั้นจึงประเมินความเบี่ยงเบนที่ยิ่งใหญ่ที่สุดจากขนาดคงที่ที่แท้จริง

ในการประมาณรูปร่างของทรงกลมที่ผิดรูปสามารถใช้รูปวงรีสี่เหลี่ยมน้อยที่สุดได้ แอปพลิเคชันโน้ต LSM303 ยังมีข้อมูลเกี่ยวกับสิ่งนี้

วิธีง่าย ๆ สำหรับการสอบเทียบพื้นฐาน

ตามหมายเหตุของแอพหากคุณไม่มีความผิดเพี้ยนของเหล็กทรงกลมที่มีรูปร่างผิดปกติจะไม่ถูกเอียง ดังนั้นวิธีการง่ายๆสำหรับการสอบเทียบขั้นพื้นฐานอาจเป็นไปได้:

  • ค้นหาค่าสูงสุดและต่ำสุดสำหรับแต่ละแกนและรับช่วง 1/2 และจุดศูนย์

rk=12(max(mk)min(mk))

zk=max(mk)rk

  • เลื่อนและปรับขนาดการวัดแต่ละแกน

mk=mkzkrk

  • คำนวณค่าเหมือนก่อนยกเว้นใช้mk

นี่เป็นพื้นฐานของรหัสที่พบที่นี่

การแก้โดยใช้กำลังสองน้อยที่สุด

รหัส 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 แล้วรับครึ่งหนึ่งของค่าเฉลี่ยของเวกเตอร์ทั้งหมดแปลกใจมันทำงานได้สำหรับแผนแนวนอน (โดยบังเอิญ) ดังนั้นฉันอยู่ในที่เดียวกันจาก ที่ฉันเริ่มทำงานกับรูปร่าง 8 อัลโกฉันจะกลับมาหลังจาก "สแควร์น้อย" แต่ฉันไม่สามารถเข้าใจความบังเอิญ
Rick2047

... ดูเหมือนว่าในกรณีของฉันทรงกลมก็ผิดรูปบนแกน Z ด้วย โปรดทราบว่าฉันรับรู้ถึงผลกระทบของฮาร์ดและซอฟท์ไอรอนบนทรงกลม 3 มิติที่วางแผนไว้ ฉันจะพยายามพล็อตมันใน 3D อีกครั้ง มาดูกัน.
Rick2047

@ Rahul2047 ฉันแค่หวังว่ามันจะถูกต้อง แต่มันก็สมเหตุสมผลสำหรับฉัน ฉันต้องทำการสอบเทียบที่คล้ายกันสำหรับเครื่องมือที่ฉันกำลังสร้าง แต่ฉันยังไม่ถึงกับนำรหัสไปใช้
geometrikal

ฉันสงสัยว่าสำหรับโทรศัพท์ที่มักสนใจเฉพาะทิศทางในระนาบแนวนอนท่าทางที่เรียบง่ายครอบคลุมจุดที่ต้องการทั้งหมด คุณใช้ matlab หรือไม่ มันง่ายที่จะทำการฟิตในนั้น กำลังสองน้อยที่สุดหมายถึงวิธีการวัดความผิดพลาด
geometrikal

1
ลิงก์รูปภาพบางส่วนในบทความนี้แตก - คุณสามารถเพิ่มรูปภาพใหม่ได้หรือไม่ ตอนนี้ SE มีฟังก์ชั่นที่อัพโหลดภาพและจัดเก็บไว้ในเครื่องเพื่อป้องกันการแตกหักในอนาคต ขอบคุณ!
Alexandria ใหม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.