2011-06-29 77 views
0

對不起 - 我應該知道這一點,但我不知道。我已經通過給出兩個不同的4×4仿射變換矩陣的兩個不同的過程來計算參考幀(S1)相對於基準參考幀(S0)的位置。我想計算兩者之間的誤差,但不知道如何處理旋轉分量。會喜歡任何建議。兩次旋轉之間的誤差?

謝謝!

+0

這取決於你希望你的錯誤捕捉什麼。你能詳細說明一下嗎?答案根據你感興趣的內容而改變很多。聽起來你想要處理旋轉*和*翻譯,但我不確定。 –

回答

1

您正在尋找從S1幀到S0幀的單軸旋轉(反之亦然)。這裏的旋轉軸並不重要。你想要旋轉角度。

設R0和R1是來自您的4x4矩陣S0和S1的左上角3x3旋轉矩陣。現在計算E = R0 *轉置(R1)(或轉(R0)* R1,它並沒有真正無論哪個。)

現在計算

d(0) = E(1,2) - E(2,1) 
d(1) = E(2,0) - E(0,2) 
d(2) = E(0,1) - E(1,0) 

dmag = sqrt(d(0)*d(0) + d(1)*d(1) + d(2)*d(2)) 

phi = asin (dmag/2) 

我留下了一些毛茸茸的細節(這些細節可以咬你)。特別是,以上對於非常大的誤差角度(誤差> 90度)無效,對於大的誤差角度(角度> 45度)不精確。

如果您有通用功能從矩陣中提取單軸旋轉,請使用它。或者如果你有一個從矩陣中提取四元數的通用函數,使用它。 (單軸旋轉和四元數相互關係非常密切)。

2

如果R0和R1是兩個應該相同的旋轉矩陣,那麼R0 * R1'應該是一致的。對應於R0 * R1'的旋轉矢量的大小是來自身份的旋轉(通常以弧度表示)。將旋轉矩陣轉換爲旋轉矢量可以通過Rodrigues公式有效地完成。

要與常見的情況回答你的問題,Python和OpenCV的,錯誤是

r, _ = cv2.Rodrigues(R0.dot(R1.T)) 
rotation_error_from_identity = np.linalg.norm(r)