如何将四元数方向转化为旋转举证_旋转表示法(持续更新)
旋轉矩陣:
旋轉矩陣轉歐拉角
歐拉角:
歐拉角轉旋轉矩陣
function rot = rpy2rot(roll,pitch,yaw)Cphi = cos(roll); Sphi = sin(roll); Cthe = cos(pitch); Sthe = sin(pitch); Cpsi = cos(yaw); Spsi = sin(yaw);rot = [Cpsi*Cthe -Spsi*Cphi+Cpsi*Sthe*Sphi Spsi*Sphi+Cpsi*Sthe*Cphi;Spsi*Cthe Cpsi*Cphi+Spsi*Sthe*Sphi -Cpsi*Sphi+Spsi*Sthe*Cphi;-Sthe Cthe*Sphi Cthe*Cphi ];歐拉角轉四元數
%將Z-Y-X歐拉角(或RPY角:繞固定坐標系的X-Y-Z依次旋轉α,β,γ角)轉換為四元數:function q=EtoQ(alpha,belta,gamma) q=[cos(alpha/2)*cos(belta/2)*cos(gamma/2)+sin(alpha/2)*sin(belta/2)*sin(gamma/2);sin(alpha/2)*cos(belta/2)*cos(gamma/2)-cos(alpha/2)*sin(belta/2)*sin(gamma/2);cos(alpha/2)*sin(belta/2)*cos(gamma/2)+sin(alpha/2)*cos(belta/2)*sin(gamma/2);cos(alpha/2)*cos(belta/2)*sin(gamma/2)-sin(alpha/2)*sin(belta/2)*cos(gamma/2); ]; end%[InternetShortcut] %URL=https://www.cnblogs.com/21207-iHome/p/6894128.html單位四元數:
單位四元數轉旋轉矩陣:
function R = quatern2rotMat(q)[rows,cols] = size(q);R = zeros(3,3, rows);R(1,1,:) = 2.*q(:,1).^2-1+2.*q(:,2).^2;R(1,2,:) = 2.*(q(:,2).*q(:,3)+q(:,1).*q(:,4));R(1,3,:) = 2.*(q(:,2).*q(:,4)-q(:,1).*q(:,3));R(2,1,:) = 2.*(q(:,2).*q(:,3)-q(:,1).*q(:,4));R(2,2,:) = 2.*q(:,1).^2-1+2.*q(:,3).^2;R(2,3,:) = 2.*(q(:,3).*q(:,4)+q(:,1).*q(:,2));R(3,1,:) = 2.*(q(:,2).*q(:,4)+q(:,1).*q(:,3));R(3,2,:) = 2.*(q(:,3).*q(:,4)-q(:,1).*q(:,2));R(3,3,:) = 2.*q(:,1).^2-1+2.*q(:,4).^2; end % --------------------- % 作者:聲時刻 % 來源:CSDN % 原文:https://blog.csdn.net/shenshikexmu/article/details/53608224?utm_source=copy % 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!因為
,所以 function R=Quaternion_To_RotationMatrix(q) s = q(1); a = q(2); b = q(3); c = q(4); R = [1-2*(b^2+c^2) 2*a*b-2*s*c 2*s*b+2*a*c;2*a*b+2*s*c 1-2*(a^2+c^2) -2*s*a+2*b*c;-2*s*b+2*a*c 2*s*a+2*b*c 1-2*(a^2+b^2)]; end兩種方法是一致的。
function R=quatoR(q) w=q(1); x=q(2); y=q(3); z=q(4);R=[1-2*y^2-2*z^2 2*x*y+2*w*z 2*x*z-2*w*y;2*x*y-2*w*z 1-2*x^2-2*z^2 2*y*z+2*w*x2*x*z+2*w*y 2*y*z-2*w*x 1-2*x^2-2*y^2];Matlab自帶單位四元數轉旋轉矩陣:
% function R=QtoR(q) % % %q1=quatnormalize(q); %單位化 % R=quat2dcm(q);%q1的第一位是實部q=[cos(pi/6) sin(pi/6)*(1/sqrt(14)) sin(pi/6)*(2/sqrt(14)) sin(pi/6)*(3/sqrt(14))]'; q1=quatnormalize(q); %單位化 R=quat2dcm(q1);%q1的第一位是實部四元數轉歐拉角:
function E=QtoE(q) w=q(1); x=q(2); y=q(3); z=q(4);Euler_x=atan(2*((w*x)+(y*z)))/(1-2*((x*x)+(y*y))); Euler_y=asin(2*((w*y)-(x*z))); Euler_z=atan(2*((w*z)+(x*y))/(1-2*((y*y)+(z*z))));E=[Euler_x;Euler_y;Euler_z];end %https://www.cnblogs.com/21207-iHome/p/6894128.html描述三維空間中兩個不同笛卡爾坐標系之間姿態(不含位置)關系的方法(求真):
旋轉的正方向:
使用右手坐標系統的是用右手螺旋定則定義的.(右手拇指指向旋轉軸的正方向,其它四個手指彎曲的方向即為旋轉的方向)
旋轉矩陣:
矩陣就是變換,旋轉矩陣就是用來做旋轉操作的變換。旋轉矩陣是用來描述三維空間中兩個不同笛卡爾坐標系之間姿態(不含位置)關系的一個3×3矩陣。
旋轉矩陣一般分 3 個理解,
,分別對應繞 軸旋轉 角。先直接(可直接記住)寫出來如下:由羅德里格斯(Rodrigues)formula可以推出來這個結果,代入 即可,以下同理。這是map(exp)的形式,由 一個旋轉軸+一個角度 onto映射到 .什么是
:一個梨子:
A frame和B frame一開始重合,
B frame 先繞z-axis of B frame 轉
角度然后 繞y-axis of B frame(New)轉
角度最后 繞z-axis of B frame(New)轉
角度- 被稱為 ZYZ Euler angles,因為分別繞了 旋轉。
- :B frame 到 A frame 的旋轉變換
故該旋轉矩陣:
TBD旋轉矩陣與四元數
給定一個單位四元數
,一個旋轉矩陣 ,那么,對點 的旋轉可以表示為: .四元數與3D旋轉的關系并不是一對一的,同一個3D旋轉可以使用兩個不同的四元數來表示.對任意的單位四元數,
和 代表的是同一個旋轉.如果 表示的是沿著旋轉軸 旋轉 度,那么 代表的是沿著相反的旋轉軸 旋轉 度。四元數轉化為旋轉矩陣的公式為:
旋轉矩陣轉四元數:link
旋轉矩陣轉歐拉角:看起來很全
- 二維旋轉:(TBD)
現在看看復數與二維旋轉的關系:
- 三維旋轉:
思路:旋轉的分解
其中 為其大小, 為其方向因為
而
與旋轉軸 正交,由俯視角,可以看作是平面的旋轉。左圖中,
為 繞 旋轉右圖中,
,我們現在可以把 投影到 和 上,以下補充推導向量點乘公式(求角度余弦):
proof:
設向量
, 為二維向量, 為 與 軸的夾角,設 為 與 軸的夾角,向量 , 間的夾角 。定理
:當
平行于旋轉軸 時,旋轉 角度后的 用四元數可以寫為:2. (垂直情況)
當
正交于旋轉軸 時,旋轉 角度后的 用四元數可以寫為:歐拉角:
歐拉角轉四元數時的單位是什么?取值范圍是什么?圖示,旋轉步驟如下:
- 物體繞全局的 軸旋轉 角(因為要和世界保持聯系,否則就和世界完全沒有關系了。)
- 繼續繞自己的 軸旋轉 角
- 最后繞自己的 軸旋轉 角
很顯然,按照不同的旋轉步驟,旋轉的結果是不一樣的。
會導致 ,而且依賴于三個坐標軸的選定。局部坐標是很直觀,但是導致歐拉角有一個重大缺陷,萬向節死鎖!
要規避萬向節死鎖,需要選擇合適的旋轉順序(有12種旋轉順序),在編程中很難規避死鎖問題,所以現在很多時候都使用四元數實現旋轉。歐拉角是用來表示三維坐標系中方向和方向變換的。要指出,我們平時說的歐拉角其實還可以細分為歐拉角(Euler-angles)和泰特布萊恩角(Tait-Bryan-angles),這兩種方法都利用了笛卡爾坐標系的三軸作為旋轉軸,主要區別在于選取順序。歐拉角的選取順序有
這6種,可見選取順序是a,b,a這樣的順序,也就是繞a軸旋轉某角度后,繞新生成的b軸旋轉一個角度,最后繞兩次旋轉以后的a軸再旋轉一個角度,以此表示最終的方向。泰特布萊恩角的旋轉軸選取有 這6種,也就是歷遍笛卡爾坐標系的三軸,比如我們最常見到的Roll-Pitch-Yaw角就是其中 的情況。但這兩種方法,其實都是在空間中用最直觀的方式和最少的參數表示任意方向的通用方法,用它們表示方向沒有計算要求和容量需求的區別。——出處
如何通俗地解釋歐拉角?之后為何要引入四元數??www.zhihu.com四元數:
四元數是由愛爾蘭數學家哈密頓在 年提出。大多數人用漢密爾頓四元數就只是做三維空間的旋轉變換。三維空間的任意旋轉,都可以用繞三維空間的某個軸旋轉過某個角度來表示,即所謂的 (軸角式)表示方法。這種表示方法里,Axis可用一個三維向量 來表示,θ可以用一個角度值來表示,直觀來講,一個四維向量 就可以表示出三維空間任意的旋轉。
右手坐標系統,也就是說旋轉的正方向是用右手螺 旋定則定義的.你可以用右手拇指指向旋轉軸 的正方向,其它四個手指彎曲的方向即為旋轉的方向.
如果∥q∥ = 1,也就是說q是一個 單位四元數(UnitQuaternion),單位四元數(norm=1)則存在于四維空間的一個球面上。因為這個映射是滿射,我們可以說所有的單位四元數都對應著一個3D旋轉.或者說,一個四維單位超球面(也叫做
)上任意一點所對應的四元數(∥q∥ = 1)都對應著一個3D旋轉,這一點會在之后討論旋轉插值的時候會用到。表格最左列中一個元素右乘以頂行中一個元素的結果就位于這兩個元素行列的交叉處
數值計算怎么防止矩陣出現數值問題
四元數插值:
先復習一下怎么用 四元數 旋轉 矢量
,可對照下圖只需要三步:
第一步,定義純四元數
第二步,確定旋轉軸
,比如 ,轉過的角度那么對應的變換四元數
此時它的共軛
對于單位四元數來說,它的逆
第三步,進行四元數運算,則在這個旋轉下的新的坐標
其中,
,即對四元數 進行一個 的左旋轉,和一個 的右旋轉。 四元數左乘 右乘。那么,依據上圖,假設設有兩個旋轉變換
和 ,我們希望找出一些中間變換 ,讓初始變換 能夠平滑地過渡到最終變換 . 的取值可以 是 .當 時, 等同于初始變換 ,而 時, 等同于最終變換 .由于插值的對象是兩個變換,想象起來可能非常困難,我們不妨假設3D空間中有任意一個向量
.那么變換四元數 會將 變換到四元數形式的 ,而變換四元數 會將 變換到四元數形式的 . 我們需要找出中間向量的四元數形式 所對應的變換 ,使 旋轉到 與 中間的某個 位置 。我們可以看到,這個旋轉的變化量其實對應的仍是一個旋轉.它將由
變換到 的向量進一步旋轉到 .這個旋轉擁有某一個固定的旋轉軸 ,我們只需要縮放這 個變換所對應的?度 就能夠達到插值的目的了.page38
四元數乘法的順序,和矩陣與函數的復合非常相似,都是從右往左疊加.總結
以上是生活随笔為你收集整理的如何将四元数方向转化为旋转举证_旋转表示法(持续更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本框换行_多行文本框的认识以及代码详解
- 下一篇: 扫地机器人湿地_口碑最好,用户认可度最高