2017-07-02 99 views
1
theta=acos((trace(R)-1)/2); 
if trace(R)==3 
    vec = [0 0 0]; 
    axang=[0 0 0 0]; 
    vec(1)=R(3,2)-R(2,3); 
    vec(2)=R(1,3)-R(3,1); 
    vec(3)=R(2,1)-R(1,2); 
    vec=(1/(2*sin(theta)))*vec;  
    axang = [vec, theta]; 
elseif trace(R)==-1 
    vec=[0 0 0;0 0 0]; 
    axang=[0 0 0 0;0 0 0 0]; 
    X=[0 0]; 
    Y=[0 0]; 
    Z=[0 0]; 
    Y(1)=sqrt((R(2,2)+1)/2); 
    Y(2)=-Y(1); 
    X(1)=R(2,1)/(2*Y(1)); 
    X(2)=R(2,1)/(2*Y(2)); 
    Z(1)=R(2,3)/(2*Y(1)); 
    Z(2)=R(2,3)/(2*Y(2)); 
    vec(1,:)=[X(1) Y(1) Z(1)]; 
    vec(2,:)=[X(2) Y(2) Z(2)]; 
    axang(1,:)=[vec(1,:), theta]; 
    axang(2,:)=[vec(2,:), theta]; 
else 
    vec = [0 0 0]; 
    axang=[0 0 0 0]; 
    vec(1)=R(3,2)-R(2,3); 
    vec(2)=R(1,3)-R(3,1); 
    vec(3)=R(2,1)-R(1,2); 
    vec=(1/(2*sin(theta)))*vec;  
    axang = [vec, theta]; 
end 

所以這是我的代碼,但是當旋轉矩陣如何將旋轉矩陣轉換爲軸角形式?

R = [-1 0 0; 
    0 -1 0; 
    0 0 1] 

什麼是錯的代碼,它不工作? axang是一個向量,用於存儲前三個位置的軸和最後一個位置的角度。

+2

提供的旋轉矩陣和軸角形式之間的關係。你是什​​麼意思*「沒有工作」*。任何錯誤?錯誤的輸出?什麼?閱讀如何相應地創建[MCVE]和[編輯](https://stackoverflow.com/posts/44874441/edit)您的問題。 –

+0

啊。 @SardarUsama謝謝。新的堆棧溢出。無論如何解決了我的問題。在一個案例中,我除以0。當你說'提供旋轉矩陣和軸角形式之間的關係'時,你最終幫助了我。不管怎麼說,還是要謝謝你。 –

回答

1

在我看來,你正在尋找一個旋轉矩陣到四元,這是一個轉換內置在Matlab的功能,如果你安裝了機器人系統工具箱,即rotm2quat:

axang = rotm2quat(R) 

注意輸出格式是作爲documented by Matlab稍有不同:

單位四元數,返回作爲包含n 四元數的n乘4矩陣。每個四元數,每行一個,形式爲q = [w x y z],其中w爲標量數。

因此,你可能需要交換列如下:

axang = axang(:, [2 3 4 1]); 
0

與此類似上述回答您不妨考慮使用MATLAB的工具Translation1 = se2(StructuringElement, TranslationOffset)的。

變量TranslationOffset可以作爲角度以60*pi/180的形式應用,例如。

0

如果軌跡(R)== - 1,軸項的符號可能會翻轉。爲了擺脫它,下面的步驟計算軸角度矢量。

  1. 找到X(1)= sqrt((R(1,1)+1)/ 2);如果它不爲零,則計算Y(1)= R(1,2)/(2 * X(1))和Y(2)= R(1,2)/(2 * X(2) )和Z(1)= R(1,3)/(2 * X(1))Z(2)= R(1,3)/(2 * X(2));

如果X(1)= 0,則找到Y(1)= SQRT((R(2,2)+1)/ 2),如果Y(1)是 不爲零,則找到的其它術語從Y(1)

別的找到Z(1)和找到Z中的其他條款(1)