当前位置:   article > 正文

刚体的旋转_eigen::isometry3d t(r)

eigen::isometry3d t(r)

Eigen中的旋转操作

旋转矩阵

  • 构造
Eigen::Matrix3d rotation_matrix;
rotation_matrix<< 0.707107,  -0.707107,  0,
         		  0.707107,   0.707107,  0,
         		  0,          0,         1;
  • 1
  • 2
  • 3
  • 4


四元数

  • 构造
//直接构造
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)); //绕z轴旋转45度
Eigen::Quaterniond q(rotation_vector);

//从数组, 数组的顺序应该是[x y z w]
double array[4]= {1,2,3,4};
Eigen::Quaterniond q1(array); //相当于直接构造 q1(4,1,2,3);


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

  • 读取系数
// 1. 
q.coeffs()  // x, y, z, w 的顺序
q.vec()   // x, y, z  虚数部分
q.x();
q.y();
q.z();
q.w();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  • 其他常用操作
  1. 归一化 normalize() :直接改原始的q,normalized() const :返回一个归一化的q,原始不改变
  2. 返回旋转矩阵toRotationMatrix
  3. 取模 norm()
  4. 模长的平方squaredNorm()
  5. 取共轭conjugate()
  6. 取逆 inverse()
  7. 点乘dot


欧拉角

  • 注意事项:
  1. 常用的一种欧拉角顺序 yaw-pitch-roll, 所对应的坐标轴:Z, Y, X
  2. 我们如果定义欧拉角:Eigen::Vector3d euler_angle(X, Y, Z) , euler_angle(0) : roll …
// 1. 可以从旋转矩阵得到欧拉角
Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles(2, 1, 0); // 旋转顺序z,y,x; 得到欧拉角(yaw, pitch roll) 
  • 1
  • 2


角轴

  • 注意事项:
  1. 角轴的表示的轴必须是单位向量, 角是弧度制
  2. 角轴的表示遵守右手定则,大拇指朝上,四指的方向是正
  3. 角轴1(-M_PI/4, 0, 0, 1) 和 角轴2(M_PI/4, 0, 0, -1) 表示的是同一个旋转,绕z轴旋转-45度

  • 构造
// 1. 从角轴
Eigen::AngleAxisd rotation_vector(M_PI/4, Eigen::Vector3d(0,0,1)); //绕z轴旋转45度, 注意,角度制:弧度,轴:必须是单位的

// 2. 从四元数
Eigen::Quaterniond q1(1,1,1,1);
Eigen::AngleAxisd rotation_vector(q1); // q1可以不是归一化的,自动取q1的归一化之后的q取构造

// 3.从旋转矩阵
Eigen::Matrix3d R;
     R<< 0.707107,  -0.707107,  0,
         0.707107,   0.707107,  0,
         0,          0,         1;
Eigen::AngleAxisd rotation_vector(R);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

  • 其他常用操作
  1. 转到旋转矩阵 toRotationMatrix() const
  2. 取角度(弧度制)angle()
  3. 取轴(单位向量)axis() 自动单位化输出
  4. 相反的旋转inverse() const

变换矩阵

  • 构造
// 1. 可以从角轴和平移
    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);




// 2. 可以从四元数和平移
    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);




// 3. 可以从旋转矩阵和平移
    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);




// 4. 除了创建好对象再传递 旋转 和平移之外,还可以以旋转创建,再传递平移,以下以旋转矩阵为例,其他两种一样可以
    Eigen::Isometry3d T(R);
    T.pretranslate(t);


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

  • 常用操作
  1. p = T*v T内部重载了符号,虽然T是四维的, v和p都是3维的,但是相当于p = Rv+t的操作
  2. translation() 取平移部分
  3. rotation() 取旋转矩阵





各种旋转之间的转化

四元数和角轴

单位四元数: ( q 0 , q 1 , q 2 , q 3 ) (q_0, q_1, q_2, q_3) (q0,q1,q2,q3)   角轴: n θ n\theta nθ    

  • 四元数到角轴,得到轴是单位的

θ = 2 a r c cos ⁡ q 0 \theta=2arc \cos q_0 θ=2arccosq0

n = [ n x , n y , n z ] T = [ q 1 , q 2 , q 3 ] T / s i n θ 2 n= [n_x, n_y, n_z]^T = [q_1, q_2, q_3]^T/sin{\frac{\theta}{2}} n=[nx,ny,nz]T=[q1,q2,q3]T/sin2θ


  • 角轴到四元数轴, n = ( n x , n y , n z ) n= (n_x, n_y, n_z) n=(nx,ny,nz)是单位的,得到四元数是单位的

q = [ q 0 , q 1 , q 2 , q 3 ] T = [ cos ⁡ θ 2 , n s i n θ 2 , ] T = [ cos ⁡ θ 2 , n x s i n θ 2 , n y s i n θ 2 n z s i n θ 2 ] T q = [q_0, q_1, q_2, q_3]^T = [\cos{\frac{\theta}{2}}, \textbf{n}sin {\frac{\theta}{2}},]^T=[\cos{\frac{\theta}{2}}, n_x sin {\frac{\theta}{2}},n_y sin {\frac{\theta}{2}}n_z sin {\frac{\theta}{2}}]^T q=[q0,q1,q2,q3]T=[cos2θ,nsin2θ,]T=[cos2θ,nxsin2θ,nysin2θnzsin2θ]T



四元数和旋转矩阵

单位四元数: ( q 0 , q 1 , q 2 , q 3 ) (q_0, q_1, q_2, q_3) (q0,q1,q2,q3)   旋转矩阵R:

  • 四元数到旋转矩阵

R = [ 1 − 2 q 2 2 − 2 q 3 2 2 q 1 q 2 − 2 q 0 q 3 2 q 1 q 3 + 2 q 0 q 2 2 q 1 q 2 + 2 q 0 q 3 1 − 2 q 1 2 − 2 q 3 2 2 q 2 q 3 − 2 q 0 q 1 2 q 1 q 3 − 2 q 0 q 2 2 q 2 q 3 + 2 q 0 q 1 1 − 2 q 1 2 − 2 q 2 2 ] R= \left[

12q222q32amp;2q1q22q0q3amp;2q1q3+2q0q22q1q2+2q0q3amp;12q122q32amp;2q2q32q0q12q1q32q0q2amp;2q2q3+2q0q1amp;12q122q22
\right] R=12q222q322q1q2+2q0q32q1q32q0q22q1q22q0q312q122q322q2q3+2q0q12q1q3+2q0q22q2q32q0q112q122q22


  • 旋转矩阵到四元数
    假设 R = m i j , i , j ∈ [ 1 , 2 , 3 ] R={m_{ij}},i,j\in[1,2,3] R=mij,i,j[1,2,3]

q 0 = t r ( R ) + 1 2    t r ( R ) 代 表 迹 q_0= \frac{\sqrt{tr(R)+1}}{2} \space\space tr(R)代表迹 q0=2tr(R)+1   tr(R)

q 1 = m 23 − m 32 4 q 0 q_1 =\frac{m_{23}-m_{32}}{4q_0} q1=4q0m23m32

q 2 = m 31 − m 13 4 q 0 q_2 = \frac{m_{31}-m_{13}}{4q_0} q2=4q0m31m13

q 3 = m 12 − m 21 4 q 0 q_3 =\frac{m_{12}-m_{21}}{4q_0} q3=4q0m12m21

注意:当 q 0 → 0 q_0\rightarrow 0 q00的时候,也就是R的迹趋近-1,其他三个分量很大,导致解不稳定,则应用下面的公式转化

  1. 如果 m a x ( m 11 , m 22 , m 33 ) = m 11 max( m_{11}, m_{22}, m_{33}) = m_{11} max(m11,m22,m33)=m11

t = 1 + m 11 − m 22 − m 33    t= \sqrt{1+m_{11}-m_{22}-m_{33}}\space\space t=1+m11m22m33   

q 0 = m 32 − m 23 t q_0 =\frac{m_{32}-m_{23}}{t} q0=tm32m23

q 1 = t 4 q_1 =\frac{t}{4} q1=4t

q 2 = m 31 + m 13 t q_2 = \frac{m_{31}+m_{13}}{t} q2=tm31+m13

q 3 = m 12 + m 21 t q_3 =\frac{m_{12}+m_{21}}{t} q3=tm12+m21


  1. 如果 m a x ( m 11 , m 22 , m 33 ) = m 22 max( m_{11}, m_{22}, m_{33}) = m_{22} max(m11,m22,m33)=m22

t = 1 − m 11 + m 22 − m 33    t= \sqrt{1-m_{11}+m_{22}-m_{33}}\space\space t=1m11+m22m33   

q 0 = m 13 − m 31 t q_0 =\frac{m_{13}-m_{31}}{t} q0=tm13m31

q 1 = m 12 + m 21 t q_1 = \frac{m_{12}+m_{21}}{t} q1=tm12+m21

q 2 = t 4 q_2 = \frac{t}{4} q2=4t

q 3 = m 32 + m 23 t q_3 =\frac{m_{32}+m_{23}}{t} q3=tm32+m23

  1. 如果 m a x ( m 11 , m 22 , m 33 ) = m 33 max( m_{11}, m_{22}, m_{33}) = m_{33} max(m11,m22,m33)=m33

t = 1 − m 11 − m 22 + m 33    t= \sqrt{1-m_{11}-m_{22}+m_{33}}\space\space t=1m11m22+m33   

q 0 = m 21 − m 12 t q_0 =\frac{m_{21}-m_{12}}{t} q0=tm21m12

q 1 = m 13 + m 31 t q_1 =\frac{m_{13}+m_{31}}{t} q1=tm13+m31

q 2 = m 23 − m 32 t q_2 = \frac{m_{23}-m_{32}}{t} q2=tm23m32

q 3 = t 4 q_3 =\frac{t}{4} q3=4t



四元数和欧拉角

单位四元数: ( q 0 , q 1 , q 2 , q 3 ) (q_0, q_1, q_2, q_3) (q0,q1,q2,q3)    欧拉角: ( y a w , p i t c h , r o l l ) (yaw, pitch, roll) (yaw,pitch,roll), 分别为绕Z轴、Y轴、X轴的旋转角度,记作 ψ , θ , ϕ \psi,\theta, \phi ψ,θ,ϕ

  • 四元数到欧拉角

r o l l = ϕ = arctan ⁡ ( 2 ( q 0 q 1 + q 2 q 3 ) 1 − 2 ( q 1 2 + q 2 2 ) ) roll = \phi = \arctan(\frac{2(q_0q_1+q_2q_3)}{1-2(q_1^2+q_2^2)}) roll=ϕ=arctan(12(q12+q22)2(q0q1+q2q3))

p i t c h = θ = arcsin ⁡ ( 2 ( q 0 q 2 − q 3 q 1 ) ) pitch = \theta =\arcsin(2(q_0q_2-q_3q_1)) pitch=θ=arcsin(2(q0q2q3q1))

y a w = ψ = arctan ⁡ ( 2 ( q 0 q 3 + q 1 q 2 ) 1 − 2 ( q 2 2 + q 3 2 ) ) yaw = \psi = \arctan(\frac{2(q_0q_3+q_1q_2)}{1-2(q_2^2+q_3^2)}) yaw=ψ=arctan(12(q22+q32)2(q0q3+q1q2))

  • 欧拉角到四元数

q = [ q 0 q 1 q 2 q 3 ] = [ w x y z ] = [ cos ⁡ ψ 2 cos ⁡ θ 2 cos ⁡ ϕ 2 + sin ⁡ ψ 2 sin ⁡ θ 2 sin ⁡ ϕ 2 cos ⁡ ψ 2 cos ⁡ θ 2 sin ⁡ ϕ 2 − sin ⁡ ψ 2 sin ⁡ θ 2 cos ⁡ ϕ 2 cos ⁡ ψ 2 sin ⁡ θ 2 cos ⁡ ϕ 2 + sin ⁡ ψ 2 cos ⁡ θ 2 sin ⁡ ϕ 2 sin ⁡ ψ 2 cos ⁡ θ 2 cos ⁡ ϕ 2 − cos ⁡ ψ 2 sin ⁡ θ 2 sin ⁡ ϕ 2 ] q=\left[

q0q1q2q3
\right]=\left[
wxyz
\right]=\left[
cosψ2cosθ2cosϕ2+sinψ2sinθ2sinϕ2cosψ2cosθ2sinϕ2sinψ2sinθ2cosϕ2cosψ2sinθ2cosϕ2+sinψ2cosθ2sinϕ2sinψ2cosθ2cosϕ2cosψ2sinθ2sinϕ2
\right] 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ϕ



角轴和旋转矩阵

旋转角 θ \theta θ和单位方向轴 n = ( x , y , z ) n=(x, y, z) n=(x,y,z)

  • 角轴到旋转矩阵

R = [ cos ⁡ θ + x 2 ( 1 − cos ⁡ θ ) − z sin ⁡ θ + x y ( 1 − cos ⁡ θ ) y sin ⁡ θ + x z ( 1 − cos ⁡ θ ) z sin ⁡ θ + x y ( 1 − cos ⁡ θ ) cos ⁡ θ + y 2 ( 1 − cos ⁡ θ ) − x sin ⁡ θ + y z ( 1 − cos ⁡ θ ) − y sin ⁡ θ + x z ( 1 − cos ⁡ θ ) x sin ⁡ θ + y z ( 1 − cos ⁡ θ ) cos ⁡ θ + z 2 ( 1 − cos ⁡ θ ) ] R=\left[

cosθ+x2(1cosθ)amp;zsinθ+xy(1cosθ)amp;ysinθ+xz(1cosθ)zsinθ+xy(1cosθ)amp;cosθ+y2(1cosθ)amp;xsinθ+yz(1cosθ)ysinθ+xz(1cosθ)amp;xsinθ+yz(1cosθ)amp;cosθ+z2(1cosθ)
\right] R=cosθ+x2(1cosθ)zsinθ+xy(1cosθ)ysinθ+xz(1cosθ)zsinθ+xy(1cosθ)cosθ+y2(1cosθ)xsinθ+yz(1cosθ)ysinθ+xz(1cosθ)xsinθ+yz(1cosθ)cosθ+z2(1cosθ)


  • 旋转矩阵到角轴
    θ = arccos ⁡ ( t r ( R ) − 1 2 ) \theta = \arccos(\frac{tr(R)-1}{2}) θ=arccos(2tr(R)1)

    n = R n \textbf{n} = R\textbf{n} n=Rn
    关于旋转轴 n \textbf{n} n,由于旋转轴的向量在旋转后不会变化,即 n = R n n=Rn n=Rn,也说明n是矩阵R的特征值1对应的特征向量,求解此方程,再归一化即可。


角轴和欧拉角

  • 角轴到欧拉角

  • 欧拉角到角轴


欧拉角和旋转矩阵

欧拉角: ( y a w , p i t c h , r o l l ) (yaw, pitch, roll) (yaw,pitch,roll), 分别为绕Z轴、Y轴、X轴的旋转角度,记作 ψ , θ , ϕ \psi,\theta, \phi ψ,θ,ϕ。B:Body系,W: word系

  • 欧拉角到旋转矩阵

R b w = [ 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_{bw}= \left[

cosψcosθamp;sinψcosθamp;sinθcosψsinθsinϕsinψcosϕamp;sinψsinθsinϕ+cosψcosϕamp;cosθsinϕcosψsinθcosϕ+sinψsinϕamp;sinψsinθcosϕcosψsinϕamp;cosθcosϕ
\right] 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ϕ

R w b = R b w T = [ 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 ⁡ ϕ ] R_{wb}=R_{bw}^T= \left[

cosψcosθamp;cosψsinθsinϕsinψcosϕamp;cosψsinθcosϕ+sinψsinϕsinψcosϕamp;sinψsinθsinϕ+cosψcosϕamp;sinψsinθcosϕcosψsinϕsinθamp;cosθsinϕamp;cosθcosϕ
\right] 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 = m i j , i , j ∈ [ 1 , 2 , 3 ] R={m_{ij}},i,j\in[1,2,3] R=mij,i,j[1,2,3]
  1. 正常情况:
    r o l l = ϕ = arctan ⁡ ( m 32 m 33 ) roll = \phi = \arctan(\frac{m_{32}}{m_{33}}) roll=ϕ=arctan(m33m32)

p i t c h = θ = arctan ⁡ ( − m 31 m 32 2 + m 33 2 ) pitch = \theta = \arctan(\frac{-m_{31}}{\sqrt{m_{32}^2+m_{33}^2}}) pitch=θ=arctan(m322+m332 m31)

y a w = ψ = arctan ⁡ ( m 21 m 11 ) yaw = \psi = \arctan(\frac{m_{21}}{m_{11}}) yaw=ψ=arctan(m11m21)

  1. 如果
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/86814
推荐阅读
相关标签
  

闽ICP备14008679号