ฉันสามารถใช้ quaternions เพื่อควบคุมเฮลิคอปเตอร์ได้หรือไม่?


9

ฉันพยายามที่จะสร้างเฮลิคอปเตอร์แบบง่าย ๆ (สำหรับตอนนี้มันเป็นลูกบาศก์) จำลองในแบบ 3 มิติและฉันมีปัญหากับการหมุน เฮลิคอปเตอร์สามารถหมุนไปตามแกนสามแกน:

  • หมุนตัวเองโดยใช้ใบพัดด้านหลัง: การหมุนแกน y
  • เอียงไปทางซ้ายและขวาเพื่อไปทางซ้ายหรือขวา: การหมุนแกน z
  • เอียงขึ้นและลงเพื่อย้อนกลับหรือไปข้างหน้า: การหมุนแกน x

ฉันต้องการที่จะสามารถควบคุมแต่ละแกนเป็นรายบุคคล จนถึงตอนนี้ฉันได้ลองใช้มุมออยเลอร์แล้ว แต่ไม่ว่าฉันจะใช้คำสั่งหมุนแบบใดฉันก็จะใช้ gimbal lock หรือ axes "switch places"

ฉันดูเหมือนว่าฉันต้องใช้ quaternions แต่ฉันไม่รู้วิธีควบคุมแกนแต่ละอันเนื่องจาก quaternions ใช้ทิศทางและมุม ฉันควรสร้างสามควอเทอร์เนียนและคูณพวกมันเข้าด้วยกันไหม? ฉันจะไม่จบลงด้วยปัญหาเดียวกันหรือไม่?

สิ่งที่แปลกคือถ้าฉันใช้นิ้วของฉันเพื่อเป็นตัวแทนของสามแกนของเฮลิคอปเตอร์ของฉัน (thumb up = y, index = z, middle = x) ดูเหมือนว่าฉันจะไม่พบปัญหาเหล่านั้น ทำไม?


หากคุณมีการเข้าถึงกราฟฉาก, ทางเลือกที่ทำงานได้จะมีภาชนะซ้อนสำหรับแต่ละแกนที่คุณหมุนแต่ละที
bummzack

@ bummzack ใช่ฉันเคยคิดเกี่ยวกับเรื่องนี้ อย่างไรก็ตามมันไม่เหมือนกับการเชื่อมเมทริกซ์การหมุนสามตัวในการเรียงลำดับเฉพาะหรือไม่
ย่อย

คุณถูกต้อง @Subb พยายามอย่าเก็บการหมุนของแต่ละแกนแยกกันมันจะมีปัญหาเช่นเดียวกับ Euler Angles ไม่ว่าคุณจะใช้อะไรก็ตาม Matrices และ Quaternions จะต้องทนทุกข์ทรมานจาก Gimbal Lock
Maik Semder

@ Maik Semder แล้วฉันจะควบคุมเฮลิคอปเตอร์ได้อย่างไร?
ย่อย

@Subb @ Flip's และคำตอบของฉันโดยทั่วไปบอกคุณว่าจะทำอย่างไร
Maik Semder

คำตอบ:


4

คุณควรจะสามารถใช้เมทริกซ์หรือควอเทอเนียนเพื่อเก็บการวางแนวของเฮลิคอปเตอร์ในปัจจุบัน ปัญหาที่คุณพบคือวิธีที่คุณใช้การเปลี่ยนระดับเสียง / หันเห / ม้วนกับเฮลิคอปเตอร์

ฉันคิดว่าคุณต้องการใช้ pitch / yaw / roll กับเฮลิคอปเตอร์ในแต่ละพื้นที่ คุณสามารถทำได้โดยการเปลี่ยน pitch / yaw / roll สำหรับเฟรมนั้นและสร้างเมทริกซ์การหมุน (คุณสามารถทำได้ด้วยมุมออยเลอร์) จากนั้นคุณหมุนการวางแนวก่อนหน้าของเฮลิคอปเตอร์ด้วยเมทริกซ์นี้ (ด้วยการวางแนวก่อนหน้านี้แสดงว่าเป็นเมทริกซ์หรือควอเทอร์เนียน) มันจะให้การวางแนวสำหรับเฟรมใหม่

การเป็นตัวแทนของการปฐมนิเทศของเฮลิคอปเตอร์ในฐานะ quaternion มีความได้เปรียบที่ interpolating ระหว่าง quaternions ง่ายกว่า interpolating ระหว่างเมทริกซ์ ดังนั้นหากในอนาคตคุณมีการปฐมนิเทศปัจจุบันและคุณต้องการทราบการหมุนต่อเฟรมที่จะนำคุณไปสู่การปฐมนิเทศใหม่ในเวลาที่ต้องการตัวแทน quaternion อาจเป็นมิตรกับคุณมากกว่า


นั่นเป็นวิธีที่ฉันได้ทำไปแล้วใช้การอัปเดตส่วนเพิ่มกับเมทริกซ์ที่แสดงถึงการเปลี่ยนแปลงในท้องถิ่น -> โลก จำไว้ว่าให้ทำให้เมทริกซ์กลับสู่มาตรฐานหลังจากสองสามร้อยเฟรมมันจะแสดงการปัดเศษวัตถุหากคุณไม่ทำ
Patrick Hughes

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

3

โดยพื้นฐานแล้วคุณสามารถใช้การหมุนแบบอื่นแทนการหมุน แต่ Euler Angles เมทริกซ์ควอเทอร์เนียนแม้ในแนวแกนจะทำในสิ่งที่คุณต้องการ

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

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

เมื่อคุณต้องการหมุน 10 องศารอบ ๆ y เพียงแค่สร้างเมทริกซ์เดลต้า / ควอเทอเนียนสำหรับนั้นและโพสต์มันคูณด้วยการวางแนวปัจจุบันของคุณ (ถ้าคุณใช้การคูณการโพสต์สำหรับเมทริกซ์) ถ้าคุณคูณมันด้วยวิธีอื่นมันจะหมุนระบบไปรอบ ๆ แกน y ของโลกมากกว่าที่จะหมุนรอบแกน y ของวัตถุ

ฉันพบว่าทรัพยากรนี้มีประโยชน์มากมันมาพร้อมกับซอร์สโค้ดและอธิบายทฤษฎีได้เป็นอย่างดี


-1

ปัญหาที่ฉันคิดว่าคุณอาจจะเห็นคือความแตกต่างในการหมุนของแกนและเวกเตอร์ความเร็ว (รวมถึงที่คุณไม่มีทิศทาง) เมื่อเฮลิคอปเตอร์เอียงไปข้างหน้าเพื่อเคลื่อนที่ไปข้างหน้าแรงขับของใบพัดเฮลิคอปเตอร์จะผลักอากาศทั้งลงและไปข้างหลังในมุมตั้งฉากกับสิ่งที่คุณติดป้ายแกน X

คุณมีอิสระในระดับที่สี่ที่คุณพลาด: ความเร็วของใบมีดจะควบคุมปริมาณอากาศที่ถูกผลักซึ่งควบคุมปริมาณการยกของเฮลิคอปเตอร์ด้วย

แต่ถึงอย่างนั้น "การเอียงซ้ายและขวา" และ "การเอียงขึ้นและลง" ของคุณก็คือควบคุมเฮลิคอปเตอร์บนเครื่องบินที่ให้มา กล่าวคือเฮลิคอปเตอร์ไม่ควรบินลงเมื่อเอียงไปข้างหน้าถอยหลังหรือข้าง - แต่ปริมาณลิฟต์อาจต้องเปลี่ยนและความเร็วจะถูกควบคุมโดยด้านตรงข้ามของสามเหลี่ยมมุมฉากที่เกิดจาก เชื่อมต่อเฮลิคอปเตอร์กับพื้นด้วยเส้นตรงลง (แรงโน้มถ่วง) และด้านตรงข้ามมุมฉาก (ยก) นั่นควรให้เวคเตอร์ความเร็วของคุณใช้

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


แต่นั่นไม่ได้ตอบคำถามจริงๆ เพียงแค่เพิ่มอาหารมากขึ้นสำหรับความคิด
bummzack

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

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