2011-05-30 34 views
6

我有以下問題:來自一個運動捕獲設備的四元數(q1)需要通過偏航角(並且只偏航!)從另一個方向四元數(q2)由第二個被跟蹤物體導出,以便q1的俯仰和滾轉與以前相同,但q1的偏航爲q2。用另一個偏航角修正一個四元數的偏航部分

工作解決方案是將quats轉換爲矩陣,然後我進行計算以提取旋轉角度,然後進行標題修正。但是,當直接在某個軸的方向上(例如在0°-359°之後)時,這導致「翻轉」。還嘗試了其他不方便的轉換。

有沒有可能直接對四元數進行數學運算而不轉換爲矩陣或歐拉角(即我可以將修正的四元數設置爲跟蹤對象的四元數)?

如上所述 - 校正應該只包括圍繞上軸(偏航)的旋轉。關於數學課程,我沒有太多編程的可能性(不幸的是,來自Virtools的VSL Script在這方面相當有限)。任何人都有一些建議?

+0

我覺得這是後話http://math.stackexchange.com/ – Ishtar 2011-05-30 15:22:55

+0

感謝這個提示 - didn't知道,一個特殊的數學板存在:) – Raboon 2011-05-31 10:14:35

回答

0

簡答:是的,這是可能的。您可以制定旋轉(關於任意軸)並使用四元數運算執行旋轉。

長答案:請參閱Wikipedia article on Quaternions and rotations。我想你描述的問題是萬向節鎖。

+0

感謝答案。我知道它必須是可能的 - 我也知道一些四元數學。但是,對於上面提到的特殊問題,我不知道從頭開始的最佳解決方案。 – Raboon 2011-05-31 10:16:51

1

對於這項任務,歐拉角是最好的選擇,因爲它們的優點(唯一的優點)在於將物體分離成圍繞正交軸的單個旋轉。因此,將兩個四元數轉換爲適合您需要的歐拉角公約,並用q2's代替q1的偏航角。

當然,您需要使用匹配的歐拉角度慣例,其中的其他旋轉不依賴於偏航角度(因此在轉換點時首先應用偏航旋轉?),以便您可以更改該角度不影響其他軸。將三角函數轉換爲四元數時,您應該再次獲得唯一表示,或者我錯過了什麼?

+0

感謝您的回答。但隨着轉換到歐拉角,我有定義問題+90至-90度。我需要的是爲360°定義的解決方案。也許我只是搞錯了。 – Raboon 2011-06-15 10:21:22

+0

@Raboon它只是關於一個軸的旋轉因子,然後改變這個旋轉。我不確定你是否真的遇到了模糊或萬向鎖問題,但我已經準備好相反。 – 2011-06-15 10:49:25

+0

如果您選擇歐拉角慣例,以便首先應用偏航,則不會遇到此方法的任何模糊或萬向節鎖定問題。 – Eric 2017-05-20 18:44:07

0

如果你有四元數Q1Q2和你的「上」方向是Ÿ,然後如果你拿出Ÿ組件的Q1和重新歸一化,那麼你得到一個四元數沒有偏航組件。同樣,如果你拿出XžQ2組件,然後你得到偏航分量的四元數。將第二個乘以第一個(使用四元數乘法),你就在那裏。

Q1[2] = 0; 
normalize4d(Q1); 
Q2[1] = 0; 
Q2[3] = 0; 
normalize4d(Q2); 
Q3 = quatMult(Q2,Q1); 

當然,你可能想看看那裏有恰好是一個循環(或接近)180度的特殊情況,因爲這可以使事情數值不穩定當您嘗試正常化非常小的矢量大小。

+0

你有沒有參考爲什麼「取出y組分」的作品? – Eric 2017-05-19 22:56:27

+0

這不起作用 - 使用傳統的歐拉角度排序,嘗試使用aa'fromYawPitchRoll'的測試用例,並且您會發現它在調零前後產生不同的俯仰和滾轉結果 – Eric 2017-05-20 00:26:51

+0

即,對於四元數'(w,x,y,z)',如果'w * z = x * y',圍繞z軸的旋轉僅爲零,這可以從[本文]的公式362推導出來(https:// www .astro.rug.nl /軟件/卡普坦/ _downloads/attitude.pdf) – Eric 2017-05-20 00:41:39

0

您可以通過計算偏航部分,然後應用其反算來去除四元數的偏航部分。假設您的四元數爲quat(w,x,y,z) == w + xi + yj + zk),並且圍繞Z軸定義偏航(來自this paper的euler 123或213)。

請注意,在這些幀中,圍繞Z軸的yaw的旋轉由四元數quat(cos(yaw/2), 0, 0, sin(yaw/2))表示。

分解四元數到歐拉角,我們已經偏航爲:

yaw = atan2(-2*x*y + 2*w*z, +w*w +x*x -y*y -z*z); // 123 angles (page 24) 
yaw = atan2(-2*x*y + 2*w*z, +w*w -x*x +y*y -z*z); // 213 angles (page 28) 

從中我們可以推導出

quat quat_2yaw = quat(w*w +x*x -y*y -z*z, 0, 0, -2*x*y + 2*w*z).normalize(); // 123 angles 
quat quat_2yaw = quat(w*w -x*x +y*y -z*z, 0, 0, -2*x*y + 2*w*z).normalize(); // 213 angles 

一個簡單的方法減半四元數的角度將其添加到身份四元數和規範:

quat quat_yaw = (1 + quat_2yaw).normalize(); 

要回答你原來的問題 - 我們想從q1採取偏航,並取代q2的偏航。我們能做到這一點,如下所示:

q2 = get_quat_yaw(q1) * get_quat_yaw(q2).conj() * q2;