Eigen中的旋轉操作
旋轉矩陣
Eigen::Matrix3d rotation_matrix;
rotation_matrix<< 0.707107, -0.707107, 0,
0.707107, 0.707107, 0,
0, 0, 1;
四元數
Eigen::Quaterniond(1,0,0,0);
Eigen::Matrix3d R;
R<< 0.707107, -0.707107, 0,
0.707107, 0.707107, 0,
0, 0, 1;
Eigen::Quaterniond q(R);
Eigen::AngleAxisd rotation_vector(M_PI/4, Eigen::Vector3d(0,0,1));
Eigen::Quaterniond q(rotation_vector);
double array[4]= {1,2,3,4};
Eigen::Quaterniond q1(array);
q.coeffs()
q.vec()
q.x();
q.y();
q.z();
q.w();
- 歸一化
normalize()
:直接改原始的q,normalized() const
:返回一個歸一化的q,原始不改變
- 返回旋轉矩陣
toRotationMatrix
- 取模
norm()
- 模長的平方
squaredNorm()
- 取共軛
conjugate()
- 取逆
inverse()
- 點乘
dot
歐拉角
- 常用的一種歐拉角順序 yaw-pitch-roll, 所對應的座標軸:Z, Y, X
- 我們如果定義歐拉角:
Eigen::Vector3d euler_angle(X, Y, Z)
, euler_angle(0) : roll …
Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles(2, 1, 0);
角軸
- 角軸的表示的軸必須是單位向量, 角是弧度制
- 角軸的表示遵守右手定則,大拇指朝上,四指的方向是正
- 角軸1(-M_PI/4, 0, 0, 1) 和 角軸2(M_PI/4, 0, 0, -1) 表示的是同一個旋轉,繞z軸旋轉-45度
Eigen::AngleAxisd rotation_vector(M_PI/4, Eigen::Vector3d(0,0,1));
Eigen::Quaterniond q1(1,1,1,1);
Eigen::AngleAxisd rotation_vector(q1);
Eigen::Matrix3d R;
R<< 0.707107, -0.707107, 0,
0.707107, 0.707107, 0,
0, 0, 1;
Eigen::AngleAxisd rotation_vector(R);
- 轉到旋轉矩陣
toRotationMatrix() const
- 取角度(弧度制)
angle()
- 取軸(單位向量)
axis()
自動單位化輸出
- 相反的旋轉
inverse() const
變換矩陣
Eigen::AngleAxisd n(M_PI/4, Eigen::Vector3d(0,0,1));
Eigen::Vector3d t(1,1,1);
Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
T.rotate(n);
T.pretranslate(t);
Eigen::AngleAxisd n(M_PI/4, Eigen::Vector3d(0,0,1));
Eigen::Quaterniond q(n);
Eigen::Vector3d t(1,1,1);
Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
T.rotate(q);
T.pretranslate(t);
Eigen::AngleAxisd n(M_PI/4, Eigen::Vector3d(0,0,1));
Eigen::Matrix3d R = n.matrix();
Eigen::Vector3d t(1,1,1);
Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
T.rotate(R);
T.pretranslate(t);
Eigen::Isometry3d T(R);
T.pretranslate(t);
p = T*v
T內部重載了符號,雖然T是四維的, v和p都是3維的,但是相當於p = Rv+t的操作
translation()
取平移部分
rotation()
取旋轉矩陣
各種旋轉之間的轉化
四元數和角軸
單位四元數:(q0,q1,q2,q3) 角軸:nθ
θ=2arccosq0
n=[nx,ny,nz]T=[q1,q2,q3]T/sin2θ
- 角軸到四元數軸,n=(nx,ny,nz)是單位的,得到四元數是單位的
q=[q0,q1,q2,q3]T=[cos2θ,nsin2θ,]T=[cos2θ,nxsin2θ,nysin2θnzsin2θ]T
四元數和旋轉矩陣
單位四元數:(q0,q1,q2,q3) 旋轉矩陣R:
R=⎣⎡1−2q22−2q322q1q2+2q0q32q1q3−2q0q22q1q2−2q0q31−2q12−2q322q2q3+2q0q12q1q3+2q0q22q2q3−2q0q11−2q12−2q22⎦⎤
- 旋轉矩陣到四元數
假設R=mij,i,j∈[1,2,3]
q0=2tr(R)+1 tr(R)代表跡
q1=4q0m23−m32
q2=4q0m31−m13
q3=4q0m12−m21
注意:當q0→0的時候,也就是R的跡趨近-1,其他三個分量很大,導致解不穩定,則應用下面的公式轉化
- 如果max(m11,m22,m33)=m11
t=1+m11−m22−m33
q0=tm32−m23
q1=4t
q2=tm31+m13
q3=tm12+m21
- 如果max(m11,m22,m33)=m22
t=1−m11+m22−m33
q0=tm13−m31
q1=tm12+m21
q2=4t
q3=tm32+m23
- 如果max(m11,m22,m33)=m33
t=1−m11−m22+m33
q0=tm21−m12
q1=tm13+m31
q2=tm23−m32
q3=4t
四元數和歐拉角
單位四元數:(q0,q1,q2,q3) 歐拉角:(yaw,pitch,roll), 分別爲繞Z軸、Y軸、X軸的旋轉角度,記作ψ,θ,ϕ
roll=ϕ=arctan(1−2(q12+q22)2(q0q1+q2q3))
pitch=θ=arcsin(2(q0q2−q3q1))
yaw=ψ=arctan(1−2(q22+q32)2(q0q3+q1q2))
q=⎣⎢⎢⎡q0q1q2q3⎦⎥⎥⎤=⎣⎢⎢⎡wxyz⎦⎥⎥⎤=⎣⎢⎢⎡cos2ψcos2θcos2ϕ+sin2ψsin2θsin2ϕcos2ψcos2θsin2ϕ−sin2ψsin2θcos2ϕcos2ψsin2θcos2ϕ+sin2ψcos2θsin2ϕsin2ψcos2θcos2ϕ−cos2ψsin2θsin2ϕ⎦⎥⎥⎤
角軸和旋轉矩陣
旋轉角θ和單位方向軸n=(x,y,z)
R=⎣⎡cosθ+x2(1−cosθ)zsinθ+xy(1−cosθ)−ysinθ+xz(1−cosθ)−zsinθ+xy(1−cosθ)cosθ+y2(1−cosθ)xsinθ+yz(1−cosθ)ysinθ+xz(1−cosθ)−xsinθ+yz(1−cosθ)cosθ+z2(1−cosθ)⎦⎤
角軸和歐拉角
歐拉角和旋轉矩陣
歐拉角:(yaw,pitch,roll), 分別爲繞Z軸、Y軸、X軸的旋轉角度,記作ψ,θ,ϕ。B:Body系,W: word系
Rbw=⎣⎡cosψcosθcosψsinθsinϕ−sinψcosϕcosψsinθcosϕ+sinψsinϕsinψcosθsinψsinθsinϕ+cosψcosϕsinψsinθcosϕ−cosψsinϕ−sinθcosθsinϕcosθcosϕ⎦⎤
Rwb=RbwT=⎣⎡cosψcosθsinψcosϕ−sinθcosψsinθsinϕ−sinψcosϕsinψsinθsinϕ+cosψcosϕcosθsinϕcosψsinθcosϕ+sinψsinϕsinψsinθcosϕ−cosψsinϕcosθcosϕ⎦⎤
- 旋轉矩陣到歐拉角
假設R=mij,i,j∈[1,2,3]
- 正常情況:
roll=ϕ=arctan(m33m32)
pitch=θ=arctan(m322+m332−m31)
yaw=ψ=arctan(m11m21)
- 如果