视觉十四讲第三讲笔记-刚体旋转
目标
1、理论:理解三维空间的刚体运动的表达方法
2、实践:掌握Eigen库的矩阵、几何模块的使用方法
本人专业与惯导相关,接触过较多的惯导运动,故笔记重点在实践部分
理论部分
主要侧重于旋转的定义和表示方法
旋转矩阵
讲述了旋转的矩阵表示,齐次坐标和变换矩阵是我没有接触过的新知识。这样把旋转和平移统一在了一个矩阵中,使得多次变换维持线性关系。
齐次坐标比三维坐标多了一个自由度,[1 1 1 1]T,和[2 2 2 2]T表示的是同一个坐标,两者的变换关系如下
变换矩阵不是正交矩阵,其逆表示反向变换
旋转向量和欧拉角
旋转矩阵表示法的缺点:1、冗余度太高,9个量表示3个自由 2、9个量间有约束
旋转向量
利用一个旋转轴(3)和一个旋转角(1)来刻画旋转,旋转向量和到旋转矩阵的公式

旋转矩阵到旋转向量的转换过程分两步,对于转角

对于旋转旋转轴,由于旋转轴经过旋转后不变的性质,说明

因此,转轴*n*是矩阵***R***特征值1对应的特征向量,求解次方程再归一化即可得到旋转轴
欧拉角
欧拉角通过坐标轴的三个旋转角来表示三维旋转(3个量),形象直观,但是不可避免存在万向锁问题,容易发生奇异,因此一般不用于滤波或优化解算,而用于人机交互
我对本节中旋转向量会奇异的说法存疑
四元数
单位四元数能表示空间任意旋转
任意的旋转都可以由两个互为相反数的单位四元数表示
任意的反向旋转都可以由互为共轭的单位四元数表示
四元数到旋转矩阵的转换
实践部分
Eigen库
问题1
假设我有一个大的 Eigen 矩阵,我想把它的左上角 3 × 3 的块取出来,然后赋值为:I3×3。请编程实现此事
程序如下,本题主要使用block函数对子矩阵进行选取
block函数的两种格式
block(i,j,p,q)
和block<i,j,p,q>
,均表示从位置(i,j)开始选取大小为(p,q)的子矩阵,区别为前一种为动态大小,后一种为固定长度模式***我还没搞明白这两者的区别***
源程序片段如下
Matrix<double,MATRIX_SIZE, MATRIX_SIZE> matrix_NN;
matrix_NN = Matrix<double, MATRIX_SIZE, MATRIX_SIZE>::Random();
cout<<"original matrix = \n"<<matrix_NN<<endl;
cout<<"submatrix from (1,0) size(2,2) = \n"<<matrix_NN.block<2,2>(1,0)<<endl;
输出如下
original matrix =
0.680375 -0.604897 -0.0452059 0.83239 -0.967399
-0.211234 -0.329554 0.257742 0.271423 -0.514226
0.566198 0.536459 -0.270431 0.434594 -0.725537
0.59688 -0.444451 0.0268018 -0.716795 0.608354
0.823295 0.10794 0.904459 0.213938 -0.686642
submatrix from (1,0) size(2,2) =
-0.211234 -0.329554
0.566198 0.536459
问题2
设有小萝卜一号和小萝卜二号位于世界坐标系中。小萝卜一号的位姿为: q1 =[0:35; 0:2; 0:3; 0:1]; t2 = [0:3; 0:1; 0:1]T(q 的第一项为实部请你把 q 归一化后再进行计算)。这里的 q 和 t 表达的是 Tcw,也就是世界到相机的变换关系。小萝卜二号的位姿为 q2 = [−0:5; 0:4; −0:1; 0:2]; t = [−0:1; 0:5; 0:3]T。现在,小萝卜一号看到某个点在自身的坐标系下,坐标为 p = [0:5; 0; 0:2]T,求该向量在小萝卜二号坐标系下的坐标。请编程实现此事
源程序
Quaterniond Q1(0.2, 0.3, 0.1, 0.35);
Quaterniond Q2(0.4,-0.1, 0.2, -0.5);//
Vector3d t1(0.3, 0.1, 0.1);
Vector3d t2(-0.1, 0.5, 0.3);
Vector3d p1(0.5, 0.0, 0.2);
Vector3d p2(0.0, 0.0, 0.0);
Q1.normalized();
Q2.normalized();
Isometry3d T1 = Isometry3d::Identity();//欧式变换矩阵
T1.rotate(Q1);
T1.pretranslate(t1);
Isometry3d T2 = Isometry3d::Identity();
T2.rotate(Q2);
T2.pretranslate(t2);
cout<<"T1 matrix = \n"<<T1.matrix()<<endl;
p2 = T2.inverse() * T1 * p1;
cout<<"the coordinate of p in camera 2 is = \n"<<p2<<endl;
输出结果
T1 matrix =
0.735 -0.08 0.25 0.3
0.2 0.575 -0.05 0.1
0.17 0.19 0.8 0.1
0 0 0 1
the coordinate of p in camera 2 is =
0.47705
0.1329
0.29025
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。1
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎