การสอบเทียบแบบไดนามิก Magnetometer


19

ฉันกำลังทำงานกับ Magnetometer AK8975 ซึ่งเป็นส่วนหนึ่งของ IMU ซึ่งดูเหมือนจะยุ่งยากมากสำหรับฉัน ชิปนี้ให้เวกเตอร์ 3 มิติเป็นเอาต์พุตที่อธิบายสนามแม่เหล็กของโลกได้ทุกที่บนโลกหรือใกล้กับมัน

ฉันลองใช้อัลกอริธึมการคำนวณหัวเรื่องสองประเภท: แบบง่ายarctan(-y/x)และแบบอื่นคือความเอียง (พิทช์) และการยกเลิกทางคณิตศาสตร์ของธนาคาร (ม้วน) ดังที่กล่าวไว้ด้านล่าง ทั้งเรื่องความชอบและเรื่องของธนาคารให้ผลผลิตผิด

ฉันสามารถได้รับหัวเรื่องที่ถูกต้องของโลก (โดยใช้แหล่งข้อมูลการศึกษาแบบเปิดที่มีอยู่อย่างง่าย) เมื่อมีการหมุนเพื่อรักษาแผนพื้นราบโดยใช้ algos ใด ๆ ของทั้งสอง

ฉันลองปรับเทียบเพื่อหาข้อผิดพลาดที่อ่อนและแข็ง ฉันสามารถพล็อตมันในรูปแบบ 3 มิติและแสดงรูปทรงกลม 3 มิติที่สมบูรณ์แบบ ยังคงไม่ทำงานกับความชอบหรือการปฏิเสธ

ตัวชี้ใด ๆ จะเป็นประโยชน์

รหัสและการใช้งานมีดังนี้:

void Compass_Heading()
{
  double MAG_X;
  double MAG_Y;
  double cos_roll;
  double sin_roll;
  double cos_pitch;
  double sin_pitch;

  cos_roll = cos(roll);
  sin_roll = sin(roll);
  cos_pitch = cos(pitch);
  sin_pitch = sin(pitch); 

  //// Tilt compensated Magnetic filed X:
  MAG_X = magnetom_x*cos_pitch + magnetom_y*sin_roll*sin_pitch + magnetom_z*cos_roll*sin_pitch;
  //// Tilt compensated Magnetic filed Y:
  MAG_Y = magnetom_y*cos_roll-magnetom_z*sin_roll;
  //// Magnetic Heading


  MAG_Heading = atan2(-MAG_Y, MAG_X) ;

}

ที่ไหนmagnetom_x, #_yและ#_zส่วนประกอบของเวกเตอร์ 3 มิติซึ่งอันที่จริงเป็นค่า RAW จาก Magnetometer มี ม้วนและระยะพิทช์นั้นมาจากเอาท์พุทคาลมานฟิลเตอร์ลึกลับจากออนบอร์ดมาตรความเร่งและไจโรสโคป ทั้งสามเซ็นเซอร์อยู่ในATAVRSBIN1 การหมุนและระยะห่างก็โอเคจนถึงช่วงนี้

ตอนนี้การคำนวณหัวเรื่องแบบง่ายตามjournal_of_sensors_renaudin และ al_2010c.pdf ควรMAG_Heading = atan2(-magnetom_y, magnetom_x) ;เป็นเช่นนั้นและได้รับค่าตอบแทนตามที่ได้กล่าวไว้ข้างต้น

รหัสโดยรวมก็คือจากการเปิด AHRS


ข้อมูลในรูปแบบ Roll, Pitch และ Yaw ฉันหมุนอุปกรณ์ด้วยมือของฉันเท่านั้น สามคนแรกได้รับการมุ่งเน้นเฉพาะ Roll, Pitch และ Yaw ตามลำดับ ส่วนที่เหลือสองจะหมุนอุปกรณ์เป็นครั้งแรกประมาณ 45 องศาตาม X (สะสม) แล้วหมุนไปตาม Magnetometer ของ Z ในท้องถิ่นจากนั้นทำซ้ำเหมือนกันด้วยการหมุนรอบ 45 องศาตาม Y (แหลม) จากนั้นหมุนไปตาม Magnetometer ท้องถิ่น Z

กราฟที่พล็อตอยู่ในช่วง -180 ถึง 180 องศา

ม้วน มุมเป็นองศาในไฟล์คุณสมบัติ YAW on Roll

ขว้าง มุมเป็นองศาในไฟล์คุณสมบัติ YAW บน Pitch

หันเห มุมเป็นองศาในไฟล์คุณสมบัติ YAW บน Yaw นั้น

หันเห 45 องศาเอียง (รีด) มุมเป็นองศาในไฟล์ คุณสมบัติ YAW บน Yaw ที่มีการหมุน 45 องศา

หันเห 45 องศาเอียง (แหลม) มุมเป็นองศาในไฟล์ คุณสมบัติ YAW บน Yaw ที่มี 45 องศาแหลม

หมายเหตุ: สำหรับรูปภาพ 2 รูปล่าสุด: เก็บไว้ที่ตำแหน่งแรกซึ่งเป็นรูปแบบเดียวกันทั้งหมด (ดูไฟล์ txt) จากนั้นรีด 45 องศาจากนั้นใช้อุปกรณ์ระนาบ (พร้อมสนามแม่เหล็ก) หมุนไปตามแกน Z ของ Magnetometer

ในทำนองเดียวกันสำหรับภาพสุดท้ายอุปกรณ์นั้นได้รับการแหลม 45 องศาแล้วตามแนวแกน Z ของ Magnetometer

ฉันหวังว่าสิ่งเหล่านี้จะช่วยแก้ปัญหาของฉัน


การพัฒนาใหม่มีดังนี้:

ฉันทำงานบางอย่างในหัวข้อ ฉันได้ผลลัพธ์ต่อไปนี้ ม้วน CSV

ขว้าง CSV

หันเห CSV



ยังไม่มีคำตอบ !!

4
ฉันคิดว่าคุณจะได้รับการตอบสนองมากขึ้นถ้าคุณแสดงคณิตศาสตร์ที่คุณพยายามนำไปใช้และรหัสที่คุณใช้ในการปรับใช้ มีน้อยมากที่เราจะไปทำอย่างอื่นนอกจาก "ไม่ทำงานช่วยได้" - ซึ่งเป็นคำถามที่คุณอ่าน ขออภัย!
Martin Thompson

การใช้ Magnetometer เป็นพื้นที่ที่มีความเชี่ยวชาญเป็นพิเศษซึ่งมีคนเพียงไม่กี่คนที่จะมีความเชี่ยวชาญ อ่านคำถามของคุณสองสามครั้งฉันยังไม่แน่ใจว่ามีอะไรผิดปกติ คุณบอกว่ามันให้ "เอาท์พุทผิด" แต่มันค่อนข้างคลุมเครือ บางทีตัวอย่างตัวเลข?
Jason R

1
นี่เป็นคำถามเกี่ยวกับวิธีตีความผลลัพธ์ของเซ็นเซอร์หรือวิธีคำนวณการวัดค่าที่มีประโยชน์ในการนำทางจากเวกเตอร์ x, y, z ที่เซ็นเซอร์ให้หรือไม่ การวัดของคุณสามารถทำซ้ำได้ด้วยอินสแตนซ์อื่นของเซ็นเซอร์เดียวกันหรือไม่?
vicatcu

1
@Rahul - ฉันประหลาดใจที่นี่ไม่ได้รับความสนใจมากขึ้น!
Kevin Vermeer

คำตอบ:


8

ฉันชอบกราฟของคุณ พวกเขาแสดงให้เห็นอย่างชัดเจนว่าการหมุนระยะห่างและการหันเหของมันดูเหมือนจะใช้งานได้ ขอแสดงความยินดี! นั่นเป็นความก้าวหน้าที่มากกว่าที่คนส่วนใหญ่ทำกันอยู่แล้ว

ฉันคาดเดาว่ารหัสที่คุณแสดงนั้นกำลังคำนวณค่า MAG_Heading "ผิด" ซึ่งแตกต่างจากค่า MAG_Heading ที่คุณคาดหวัง

มันจะง่ายขึ้นมากสำหรับเราที่จะช่วยคุณถ้าคุณให้เรา: (นี่คือส่วน "อธิบายอาการ" ของ "วิธีถามคำถามด้วยวิธีที่ชาญฉลาด" )

  • AK8975 magnetometer ค่าเอาท์พุท m_x, m_y และ m_z ในบางจุดเดียวในเวลา
  • ค่าระดับเสียงและม้วนในทันทีเดียวกัน
  • ค่าเอาต์พุตเอาต์พุต MAG_Heading ที่ไม่ถูกต้องซึ่งคำนวณจากค่าเหล่านั้น
  • สิ่งที่คุณคาดหวังว่า MAG_Heading ที่ถูกต้องจะเป็นอย่างไร

ดังนั้นฉันจึงเหลือที่จะคาดเดาว่าบางทีคุณกำลังเจอกับปัญหาที่ฉันสร้างขึ้นด้วยตัวเอง :-)

  • รูปแบบมุมแบบไหนที่คุณทำบาป () และ cos () และ atan2 () ฟังก์ชั่นคาดหวัง? คุณต้องการแปลงรูปแบบบางส่วนระหว่าง pitch pitch และ roll ที่จัดเก็บในรูปแบบนั้นหรือไม่? คุณต้องการแปลงจากรูปแบบนั้นเป็นสิ่งที่คุณต้องการ MAG_heading หรือไม่ (brads, องศาหรือเรเดียน? floating-point หรือ fixed-point?)
  • มีออฟเซ็ตในค่า raw m_x, m_y, m_z ที่ต้องถูกหักออกหรือไม่?
  • ชิ้นส่วนทั้งหมดเรียงกันเป็นไปตามที่สมมุติไว้หรือไม่? โดยเฉพาะอย่างยิ่งแกนพิทช์และม้วนตั้งอยู่กับแกนแมกเนโตมิเตอร์หรือไม่? (m_x ควรจะชี้ไปข้างหน้าตามแนวแกนม้วนหรือไม่ m_y ควรจะชี้ไปทางขวาตามแนวแกนขว้างหรือไม่)
  • อาจมีค่าเซ็นเซอร์หรือค่าอื่น - บางที m_z - ต้องถูกลบล้างก่อนที่จะป้อนเข้าสู่รหัสนี้?
  • อาจรหัสนี้ถูกขัดจังหวะโดยหนึ่งขัดจังหวะหรืออื่น ๆ ที่ทำลายค่าภายในหรือไม่ ฉันดูเหมือนจะจำโครงการที่แตกต่างกันว่าหลังจากมีคนใส่ "หาร" ในรูทีนการขัดจังหวะการคำนวณฟังก์ชันตรีโกณมิติทุกที่ในโปรแกรมมักจะให้ผลลัพธ์ที่ผิด
  • การขัดจังหวะการยิงอาจบ่อยครั้งจนรหัสนี้ไม่ทำงานจริงหรือ?

ดูเหมือนว่ามีคนอื่นพูดถึงรหัสที่คล้ายกันมากที่อื่น: http://diydrones.com/forum/topics/heading-from-3d-magnetometer ; http://diydrones.ning.com/profiles/blogs/dcm-imu-theory-first-draft ; http://aeroquad.com/showthread.php?1138-REVOLUTION!!!-New-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843-Magnetometer ; เป็นต้น


ฉันเห็นแล้วตอนนี้ .. ฉันจะกลับมาอีก
Rick2047

\ 1 / ฉันกำลังสร้างไฟล์ csv สำหรับ [Roll, pitch, yaw และ (Mx, My, Mz)] \ 2 / ฉันคาดหวังว่า MAG_Heading ไม่ควรเปลี่ยนเมื่อมีการเปลี่ยนม้วนและขว้างอย่างน้อยก็จนกว่าสองควอดต่อเนื่อง หัวเรื่องหมายถึงถ้าเป็นหัวเรื่อง NE ก็ควรชี้ไปเรื่อย ๆ จนกว่าจะข้าม 90 องศาจากขอบฟ้าบนทิศทางการหมุนขึ้นหรือลงเพื่อความชอบและควรจะเหมือนกันในกรณีของธนาคารหรือการรวมกัน
Rick2047

\ 3 / การคำนวณภายในทั้งหมดทำในเรเดียนและฟังก์ชันกงสุลทุกคนคาดหวังเรเดียนเท่านั้น สำหรับการแสดงผลเท่านั้นค่าจะถูกคัดลอกและแปลงเป็นองศา 4 / จุดลอยตัว \ 5 / เซ็นเซอร์ทั้งหมดได้รับการจัดตำแหน่งและยังได้พยายามรวมกันที่เกี่ยวข้องทั้งหมดสำหรับการจัดตำแหน่งโดยใช้ SENSOR_SIGN [9] \ 6 / ฉันกำลังทำมันอยู่ในการทำโพล
Rick2047

สำหรับจุดของฉัน \ 1 / ที่นี่สำหรับกราฟทั้งหมดฉันได้แนบไฟล์ csv ที่เกี่ยวข้องด้วย หรือคุณขออย่างอื่น ขอบคุณสำหรับการตอบรับที่ดี :) ฉันจะใช้ "วิธีถามคำถามด้วยวิธีที่ชาญฉลาด" มากเท่ากับความพยายามและเวลาของฉัน :)
Rick2047

\ 1 / ฉันจะทำงานให้กับ [ม้วน, ขว้าง, หันเหและ (Mx, ของฉัน, Mz) (หัวเรื่อง, การปฏิเสธ)]
Rick2047

1

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


ลิงก์แสดงเครื่องหมายต่างกันในสมการเดียวกัน ฉันจะลองชุดค่าผสมอื่น ๆ ทั้งหมด
Rick2047
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.