三维空间的刚体运动
三维空间的刚体运动
-
1)旋转矩阵
-
2)变换矩阵
-
3)欧拉角
-
- 1、旋转向量
- 2、旋转角:
- 3、转轴:
- 4、欧拉角
-
4)四元数
-
-
1、四元数的定义
-
2、四元数的运算
-
- 1)加法和减法
- 2)乘法(每一项相乘后相加.)
- 3)共轭(跟普通复数一样,虚部取反)
- 4)模长
- 5)逆
- 6)数乘和点乘
-
3、用四元数表示旋转
-
-
5)练习
-
- 台湾大学《机器人学》笔记
如何用数学方法来描述三维空间中刚体的运动?我们知道刚体运动可以分解为平移与旋转两部分运算。其中平移运算相对简单直观,在仿射变换下只需要改变物体的位置参数即可完成;而旋转运算则涉及较为复杂的矩阵运算,在欧几里得群SO(3)下需要用旋转向量或四元数来表示。为了便于计算机处理与存储我们通常会采用旋转矩阵或齐次变换矩阵来进行表示;此外还可以通过四元数或者欧拉角等手段来实现对旋转过程的不同描述方式。由于相机作为一个刚体拥有位置信息以及姿态信息在实际应用中我们通常需要同时处理这两方面的信息以实现对物体位置与朝向的精确描述
1)旋转矩阵
欧氏空间中的坐标转换关系:相机运动作为一个刚体运动过程,在不同观察者所建立的坐标系统中描述同一物体位置与方向时其相对关系始终保持恒定这一特性即为欧氏空间中的坐标转换关系。
单位正交基向量定义为\{e_1, e_2, e_3\}。
点P在第一个参考框架下的位置表示为\{a_1, a_2, a_3\}^T。
坐标系2的单位正交基:[e1’,e2’,e3’]
点在坐标系2中的坐标:[a1’,a2’,a3’]
则转换关系如下:

R矩阵则表征了同一向量在不同坐标系下的位置变化规律,并被称为旋转矩阵(一种行列式恒为1的正交矩阵)。
这种矩阵能够表征相机的姿态变化情况。
根据公式a’=Ra+t可知:
其中变量t代表平移向量;
而a则为世界坐标系中的一个点向量,在经过一次旋转变换和平移操作后得到点a’的位置坐标;
最终只需将旋转变换后的结果与平移向量相加即可获得新的位置坐标值。
2、外积:

外积只对三维向量存在定义,我们还能用外积表示向量的旋转
2)变换矩阵
改写说明

那么从a到c的变换就是:

但是这样写太过于复杂吧 ,我们引入齐次坐标和变换矩阵

在三维向量的后部引入一个1值,则将其扩展为四维向量并称为齐次坐标。此时将旋转与平移整合进一个矩阵中,则整体关系转化为线性关系。T即表示变换矩阵。
3)欧拉角
1、旋转向量
旋转向量可视为旋转矩阵的一种表达形式;它通过一个三维向量来进行描述;该向量基于旋转轴n和转角θ进行刻画。该公式用于实现旋转向量与旋转矩阵之间的转换关系;其中涉及方向余弦等多要素。

2、旋转角:

3、转轴:

4、欧拉角
那什么叫做欧拉角呢?

4)四元数
1、四元数的定义
旋转矩阵以9个参数描述仅3个自由度时存在冗余。尽管欧拉角与旋转向量都较为紧凑,但它们均存在奇异性问题。事实上,在三维空间中并不存在一种完全无奇异性的向量描述方法。通过引入四元数这一概念,则可实现类似于复数的一种代数结构。其缺点在于难以直观理解且运算相对繁琐。
一个四元数有一个实部和三个虚部:

三个虚部满足以下关系式:

考虑到其特殊的形式

s是四元数的实部,v是其虚部,当v等于零时,s即为一个实四元数;反之,若s等于零则v构成一个纯虚四元数.
2、四元数的运算
先准备两个四元数:

1)加法和减法

2)乘法(每一项相乘后相加.)

3)共轭(跟普通复数一样,虚部取反)

4)模长

5)逆

6)数乘和点乘


3、用四元数表示旋转

5)练习
机器人A、B均位于同一个世界坐标系中。
A的位姿参数由四元数q₁ = [0.25, 0.2, 0.3, 0.1] 和平移向量t₁ = [−(−)−−−−−−−−−−]表示。
同样地,B的位姿参数由四元数q₂ = [ −(−) − (4), −(−) − (·) ] 和平移向量t₂ = [ −(·), −(·), −(·) ]组成。
值得注意的是,q和t代表的是Tcw变换矩阵,Tc表示第一台机器人的总变换矩阵,Tw表示第二台机器人的总变换矩阵.
给定点p在第一个机器人的局部坐标系中的位置为p = [x,y,z]^T = [x= p_x,y= p_y,z= p_z],求该点在其第二个机器人局部坐标系中的位置.]
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
//Geometry模块提供了各种旋转和平移的表示
#include <Eigen/Geometry>
using namespace std;
int main()
{
//一号的姿态
Eigen::Quaterniond q1(0.35, 0.2, 0.3, 0.1);
Eigen::Vector3d t1(0.3, 0.1, 0.1);
Eigen::Isometry3d Tcw_1 = Eigen::Isometry3d::Identity();
Tcw_1.rotate(q1.normalized().matrix()); //q1.matrix()将四元数转为AngleAxis旋转向量
Tcw_1.pretranslate(t1);
//点P
Eigen::Vector3d Pc1(0.5, 0, 0.2);
Eigen::Vector3d Pw = Tcw_1.inverse()*Pc1;
//二号的姿态
Eigen::Quaterniond q2(-0.5, 0.4, -0.1, 0.2);
Eigen::Vector3d t2(-0.1, 0.5, 0.3);
Eigen::Isometry3d Tcw_2 = Eigen::Isometry3d::Identity();
Tcw_2.rotate(q2.normalized().matrix());
Tcw_2.pretranslate(t2);
Eigen::Vector3d Pc2 = Tcw_2*Pw;
cout << "p向量在小萝卜二号的坐标系下的坐标为:" << endl;
cout << "(" << Pc2.x() << "," << Pc2.y() << "," << Pc2.z() << ")" << endl;
return 0;
}
AI生成项目javascript

6) 台湾大学《机器人学》笔记
下面贴上《台湾大学机器人学》上课笔记(部分)







