刚体的旋转

这篇博客详细介绍了如何使用Eigen库进行刚体旋转的数学操作,包括旋转矩阵、四元数、欧拉角和角轴之间的转换,并提供了相关的构造、读取和常用操作。此外,还探讨了旋转矩阵、四元数、欧拉角和角轴在3D空间中的相互转化方法。
摘要由CSDN通过智能技术生成

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)); //绕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. 
q.coeffs()  // x, y, z, w 的顺序
q.vec()   // x, y, z  虚数部分
q.x();
q.y();
q.z();
q.w();

  • 其他常用操作
  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. 角轴的表示遵守右手定则,大拇指朝上,四指的方向是正
  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. 转到旋转矩阵 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. 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[ \begin{matrix} 1-2q_2^2-2q_3^2 &amp; 2q_1q_2-2q_0q_3 &amp; 2q_1q_3+2q_0q_2 \\ 2q_1q_2+2q_0q_3 &amp; 1-2q_1^2-2q_3^2 &amp; 2q_2q_3-2q_0q_1 \\ 2q_1q_3-2q_0q_2 &amp; 2q_2q_3+2q_0q_1 &amp; 1-2q_1^2-2q_2^2 \end{matrix} \right] R=12q222q322q1<

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
刚体运动中,我们可以使用旋转矩阵、旋转向量和平移矩阵来描述坐标变换。旋转矩阵是一个3x3的正交矩阵,用来表示旋转的方向和角度。然而,旋转矩阵有一些缺点,比如冗余和约束条件。为了更紧凑地描述旋转,我们可以使用旋转向量,它只需要一个三维向量来表示旋转的轴和角度。旋转向量和旋转矩阵之间可以通过罗德里格斯公式进行转换。平移矩阵用来描述坐标系的平移变换。在刚体运动中,坐标系的平移变换和旋转变换是相互独立的。因此,我们可以使用旋转矩阵和平移矩阵来描述刚体的运动。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [刚体运动中的坐标变换-旋转矩阵、旋转向量、欧拉角及四元数](https://blog.csdn.net/hu_hao/article/details/117197727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [三维空间坐标系变换-旋转矩阵](https://blog.csdn.net/baobei0112/article/details/114065256)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值