三维空间刚体的旋转

本文为个人笔记,查看原文请关注公众号:计算机视觉life

刚体:运动过程中不会产生形变的物体,运动过程中同一个向量的长度和夹角都不会发生变化。刚体变换也称为欧式变换

三维空间中刚体旋转的表示

  1. 旋转矩阵
  • 旋转矩阵有较强的约束条件。旋转矩阵R具有正交性,R和RT的乘积是单位矩阵,且行列式为1。即:
    • 旋转矩阵R的逆矩阵表示了一个和R相反的旋转
    • 旋转矩阵R通常和一个平移向量t一起组成齐次的变换矩阵T,描述了欧式坐标的变换。引入齐次坐标是为了可以方便的描述连续的欧式变换
    • 缺点:冗余。用9个元素表示3个自由度的旋转
  1. 四元数

    • 缺点:抽象,不直观
    • 四元数有一个实部和三个虚部组成,是一种非常紧凑、没有奇异的表达方式
    • 在C++ Eigen库中,四元数的顺序为(w, x, y, z),coffes输出顺序为(x, y, z, w)
    • 单位四元数才能描述旋转,所以四元数在定义是必须归一化:q.normalize()
  2. 旋转向量

    • 用一个旋转轴n和旋转角θ来描述一个旋转,所以也成为轴角(或角轴)。旋转角具有周期性,所以这种描述方式具有奇异性
    • 从旋转向量到旋转矩阵的过程称为罗德里格斯公式。
    • 旋转向量和旋转矩阵的转换关系对应于李代数和李群的映射
  3. 欧拉角

    • 把一次旋转分解成3次绕不同的轴旋转。优点:直观
    • 欧拉角在SLAM中应用很少,原因是欧拉角存在致命的缺点:万向锁。在俯仰角为±90°时,第一次和第三次旋转使用的是同一个坐标轴,会丢失一个自由度,引起奇异性。想要表达三维旋转,至少需要四个变量。

矩阵线性代数运算库Eigen

安装方式:

  • debian系:sudo apt install libeigen3-dev
  • arch系:sudo pacman -S eigen
  1. Eigen库只有头文件,没有.so和.a二进制文件,所以在CMakeLists.txt中只需要添加头文件路径,并不需要使用target_link_libraries将程序链接到库上。
    如:include_directories("/usr/include/eigen3")
  2. Eigen以矩阵为基本数据单元,在Eigen中,所有的矩阵和向量都是Matrix模板类的对象,Matrix一般使用3个参数:数据类型,行数,列数
    如:Eigen::Matrix
  3. 已知大小的矩阵建议制定矩阵的大小和类型。如果不确定矩阵的大小,可以使用动态大小矩阵 Eigen::Dynamic
    如:Eigen::Matrix matrix_dynamic;
  4. Eigen要求操作数据类型必须完全一致,不能进行自动类型提升。即不同类型的数据不能进行运算
  5. Eigen除了空间几何变换外,提供了大量矩阵分解、稀疏线性方程求解等函数

你可能感兴趣的:(三维空间刚体的旋转)