本人基于自己学习SLAM技术、运行SLAM领域相关项目,以及阅读SLAM论文等遇到的数学知识,总结成文。要提高研究机器人领域的能力,数学基础是必不可少的。对于后期实现论文的idea和机器人项目来说,代码能力和数学能力,是最为重要的两个部分。
本文将带领大家,了解入门机器人所需要的数学知识,主要包括:机器人位姿变化(欧拉角、旋转矩阵、四元数等);机器人空间描述(向量空间、坐标系映射、向量变换算子等)、机器人动力学模型(平移动力学、姿态动力学等);李群和李代数;李雅普诺夫稳定性分析。
SLAM指的是同步定位与建图(Simultaneous Localization and Mapping,简称SLAM),问题可以描述为:机器人在未知环境中从一个未知位置开始移动,在移动过程中根据位置和地图进行自身定位,同时在自身定位的基础上建造增量式地图,实现机器人的自主定位和导航。
详细了解SLAM的基本概念,请参照本人之前撰写一篇博客:
机器人领域的SLAM是什么_猪猪的超超的博客-CSDN博客
以坐标系Oxyz和OXYZ为例,星体轴的位置可通过3次旋转达到OXYZ坐标轴的位置。旋转顺序具有多种形式,但不能绕一个轴连续旋转两次,因为连续两次旋转等同于绕这个轴的一次旋转。为此可以得出两类12种可能的旋转顺序如下:
一类称为泰特布莱恩转动;二类称为欧拉转动。
显然,一类是每轴仅旋转一次,二类是某一轴不连续地旋转两次。下面详细介绍被称为经典欧拉转动顺序的“3-2-1”旋转。
偏航角:机体轴在水平面上的投影与地轴之间的夹角,以机体右偏为正。
俯仰角:机体轴与地平面(水平面)之间的夹角,飞机抬头为正。
滚转角:飞机对称面绕机体轴转过的角度,右滚为正。
通过矩阵运算,我们得到一个从e、k、n系到b系的坐标变换关系:
虽然,欧拉角能直观地表达飞机的姿态变化,但是欧拉角存在万向锁现象:
如果我们的飞机俯仰角到达正负90时,你会发现此时绿色代表的滚转运动和蓝色代表的偏航运动他们的旋转轴重合了,这时候你必须要改变最里面自转轴的角度才能够达到你需要的空间位置,而这是违背陀螺定轴性规律的,所以陀螺仪中运动的那个方向其实是被锁住了的,你在俯仰角达到正负90时就不可能有这个方向的运动,这是因为当你俯仰角达到正负90时,你改变了第三个要旋转的轴的方向,它与你第一次旋转的z轴重合了,所以在空间中失去了一个自由度。
对于四元数,大家可以参照该网站,结合可视化进行学习:
Visualizing quaternions, an explorable video series
还有一位大佬写了叫做《四元数与三维旋转》的文章,大家可以去Github上阅读:
Krasjet/quaternion: A brief introduction to the quaternions and its applications in 3D geometry. (github.com)
四元数的基本概念如下:
1)四元数的计算有如下的性质:
2)四元数的共轭:
3)四元数的范数:
在了解了四元数的基本知识之后,我们还需要掌握几个相关的定理:
定理一:
定理三:
综上所述,四元数表示旋转的一般情况如下:
对于位姿变换来说,有一个强大的线性代数库,叫做 Eigen,大家可以搜索进行学习噢。
对于向量空间而言,我们有笛卡尔坐标系、圆柱坐标系和球坐标系。
对于姿态的描述,我们引入旋转矩阵,对位姿变换进行描述,详细内容见后续章节。
特殊情况下的矢量变换为,如平移变换如下图所示:
而一般情况下,矢量变换更为复杂:
向量变换运算主要有两类:分别是映射(Mapping)和算子(Operator)。
映射(Mapping)如下所示:
算子(Operator)如下所示:
作为刚体的机器人的姿态动力学是以刚体的动量矩定理为基础的。因此在确定了描述机器人姿态运动的各种坐标系和运动学之后,了解刚体的动量矩定理就成为研究机器人姿态动力学的一个重要条件。
姿态动力学主要从动量矩定理出发,结合之前的姿态变换中设计的运动学知识,通过坐标轴的形式描述机器人的姿态。本章将学习到机器人的姿态变化和动力学方程,基于此建立方程组,也称为欧拉动力学方程。
由于本人,对于李群李代数的相关知识掌握不是很好,因此只提供一些学习资料,供大家参考:
首先是基础的理论知识,大家可以阅读这篇博客,写得很好:
李群李代数基础_李群 平面-CSDN博客
对于编程实践而言,有一个李群李代数的库,叫做 Sophus,大家可以去搜索进行学习。
关于李雅普诺夫分析的学习,大家可以阅读下面这篇博客噢:
李雅普诺夫稳定性分析_李亚普诺夫半负定-CSDN博客
本人基于SLAM的相关项目,概括性地给出了SLAM工程师必须掌握的数学知识。主要包括欧拉角、旋转矩阵、四元数、向量空间、算子、动力学模型、李群李代数、李雅普诺夫稳定性等。并给出了相关库的学习,如 Eigen 库和 Sophus 库。
后续本人将就编程实践进行详细的讲解。欢迎大家关注噢~