题目如下

下面我们来练习如何使用 Eigen/Geometry 计算一个具体的例子。
设有小萝卜 1 一号和小萝卜二号位于世界坐标系中。小萝卜一号的位姿为: q 1 = [0.55, 0.3, 0.2, 0.2], t 1 =
[0.7, 1.1, 0.2] T (q 的第一项为实部)
。这里的 q 和 t 表达的是 T cw ,也就是世界到相机的变换关系。小萝卜
二号的位姿为 q 2 = [−0.1, 0.3, −0.7, 0.2], t 2 = [−0.1, 0.4, 0.8] T 。现在,小萝卜一号看到某个点在自身的坐
标系下,坐标为 p 1 = [0.5, −0.1, 0.2] T ,求该向量在小萝卜二号坐标系下的坐标。请编程实现此事,并提交
你的程序。
提示:
1. 四元数在使用前需要归一化。
2. 请注意 Eigen 在使用四元数时的虚部和实部顺序。
3. 参考答案为 p 2 = [1.08228, 0.663509, 0.686957] T 。你可以用它验证程序是否正确。

1)用四元数的方法计算

整体思路是由  p1,q1, t1 计算点在世界坐标下的坐标pw

先把四元数归一化,题目给出的表达是Tcw,是世界到相机的变换关系,所以要先把q1转化为相机到世界的变换,也就是q1的逆可以表达相反的变换

对于单位四元数,其逆和共轭就是同一个量,而四元数的共轭是把虚部取成相反数,所以在归一化的时候把q1的虚部取为相反数就行了。

pw = q1wc * (p1 - t1)

然后计算pw在萝卜二号坐标系的坐标

p2 = pw * q2  + t2

代码如下

 1 //writed by zhang ning 2018/3/5 20:11
 2 //本程序用来求解位姿变换问题
 3 #include <iostream>
 4 #include <cmath>
 5 using namespace std;
 6
 7 #include <Eigen/Core>
 8 #include <Eigen/Dense>
 9 // Eigen 几何模块
10 #include <Eigen/Geometry>
11
12 int main( int argc, char** argv)
13 {
14   Eigen::Vector3d p1,t1,t2;
15   p1 << 0.5,-0.1,0.2;
16   t1 << 0.7,1.1,0.2;
17   t2 << -0.1,0.4,0.8;
18 // 四元数Eigen::Quaterniond 的正确初始化顺序为Eigen::Quaterniond(w,x,y,z)
19 // 而 coeffs的顺序是(x,y,z,w),w 为实部,前三者为虚部
20 // 因为要表示相反的旋转,故输入为q1的共轭,即实部不变,虚部变为相反数
21   Eigen::Quaterniond q1 = Eigen::Quaterniond(0.55,-0.3,-0.2,-0.2).normalized();
22   cout << q1.coeffs().transpose() << endl;
23
24
25   Eigen::Quaterniond q2 = Eigen::Quaterniond(-0.1,0.3,-0.7,0.2).normalized();
26   cout << q2.coeffs().transpose() << endl;
27
28   Eigen::Vector3d pw = q1*(p1-t1);  //数学上是qpq-1
29   Eigen::Vector3d p2 = q2*pw + t2;
30
31   cout << p2 << endl;
32
33   return 0;
34 }

2)用变换矩阵的方法

同样的思路,先求出两个变换矩阵T1和T2  ,p1和T1 的逆矩阵相乘得到 pw, 然后再和T2相乘得到 p2

p2 = T2 * T1.inverse() * p1

代码如下

 1 //writed by zhang ning 2018/3/5 20:11
 2 //本程序用来求解位姿变换问题
 3 #include <iostream>
 4 #include <cmath>
 5 using namespace std;
 6
 7 #include <Eigen/Core>
 8 #include <Eigen/Dense>
 9 // Eigen 几何模块
10 #include <Eigen/Geometry>
11 //下面这段程序是用变换矩阵来计算的,可以得到相同的计算结果
12
13 int main( int argc, char** argv)
14 {
15   Eigen::Vector3d p1,t1,t2;
16   p1 << 0.5,-0.1,0.2;
17   t1 << 0.7,1.1,0.2;
18   t2 << -0.1,0.4,0.8;
19   Eigen::Quaterniond q1 = Eigen::Quaterniond(0.55,0.3,0.2,0.2).normalized();
20
21   Eigen::Isometry3d T1 = Eigen::Isometry3d::Identity();
22   T1.rotate ( q1 );
23   T1.pretranslate ( t1 );
24   cout << "Transform matrix = \n" << T1.matrix() << endl;
25
26   Eigen::Quaterniond q2 = Eigen::Quaterniond(-0.1,0.3,-0.7,0.2).normalized();
27
28   Eigen::Isometry3d T2 = Eigen::Isometry3d::Identity();
29   T2.rotate ( q2 );
30   T2.pretranslate ( t2 );
31   cout << "Transform matrix = \n" << T2.matrix() << endl;
32
33   Eigen::Vector3d p2 = T2*T1.inverse()*p1;
34   cout << p2 << endl;
35
36   return 0;
37 }

CMakeLists.txt文件内容如下

 1 cmake_minimum_required( VERSION 2.8 )
 2
 3 project( geometry )
 4
 5 # 设置编译模式
 6 set( CMAKE_BUILD_TYPE "Debug" )
 7
 8 # 添加头文件
 9 include_directories( "/usr/include/eigen3")
10
11 add_executable( useGeometry useGeometry.cpp )

相关源码可以在我的github仓库中下载,

项目地址:https://github.com/feifanrensheng/useGeometry

转载于:https://www.cnblogs.com/feifanrensheng/p/8516302.html

高博课程编程作业之计算小萝卜的坐标相关推荐

  1. 南京理工大学 程序设计基础(Ⅰ) SPOC | 学校专有课程 编程作业 第5章

    南京理工大学 程序设计基础(Ⅰ) SPOC | 学校专有课程 编程作业 第5章 第一题:Hanoi问题(100分) 题目内容: 对于Hanoi塔问题,如果要移动n个盘子,假设一秒钟移动1000次,求出 ...

  2. 南京理工大学 程序设计基础(Ⅰ) SPOC | 学校专有课程 编程作业 第4章作业2

    南京理工大学 程序设计基础(Ⅰ) SPOC | 学校专有课程 编程作业 第4章作业2 第一题 某数列的第n项(100分) 题目内容: 某个数列的前5项为: 1/2,3/2,5/3,8/5,13/8,按 ...

  3. 高博课程第三次作业之轨迹的描绘

    我为你准备了一个轨迹文件(code/trajectory.txt).该文件的每一行由若干个数据组成,格式为 [t, t x , t y , t z , q x , q y , q z , q w ], ...

  4. c语言课程设计作业个人所得税计算,C Prime Plus 5th Edition 练习-个人所得税计算

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include int main(void) { int level=0,choice=0; const int l ...

  5. 吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 神经风格转换--编程作业

    吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 神经风格转换–编程作业 注:由于这个作业目前未找到完整的中文版的,所以楼主综合了几篇不完整的,自己完整运行了一遍(pyt ...

  6. 吴恩达deeplearning.ai系列课程笔记+编程作业(13)序列模型(Sequence Models)-第一周 循环序列模型(Recurrent Neural Networks)

    第五门课 序列模型(Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks) 文章目录 第五门课 序列模型(Sequence Models) 第一周 ...

  7. 吴恩达deeplearning.ai系列课程笔记+编程作业(11)第四课 卷积神经网络-第二周 深度卷积网络:实例探究(Deep convolutional models: case studies)

    第四门课 卷积神经网络(Convolutional Neural Networks) 第二周 深度卷积网络:实例探究(Deep convolutional models: case studies) ...

  8. 吴恩达deeplearning.ai系列课程笔记+编程作业(15)序列模型(Sequence Models)-第三周 序列模型和注意力机制

    第五门课 序列模型(Sequence Models) 第三周 序列模型和注意力机制(Sequence models & Attention mechanism) 文章目录 第五门课 序列模型( ...

  9. 吴恩达deeplearning.ai系列课程笔记+编程作业(14)序列模型(Sequence Models)-第二周 自然语言处理与词嵌入

    第五门课 序列模型(Sequence Models) 第二周 自然语言处理与词嵌入(Natural Language Processing and Word Embeddings) 文章目录 第五门课 ...

  10. 吴恩达deeplearning.ai系列课程笔记+编程作业(6)第二课 改善深层神经网络-第二周:优化算法 (Optimization algorithms)

    第二门课 改善深层神经网络:超参数调试.正则化以及优化(Improving Deep Neural Networks:Hyperparameter tuning, Regularization and ...

最新文章

  1. 使用 Pytorch 进行多类图像分类
  2. 异常数据(outlier data)处理基于分位数法(箱图法、箱型法)替换及删除方案
  3. 自动生成Android界面,面向Android的Web Service界面自动生成技术研究
  4. 不“刷脸”回不了家?郑州业主拒绝录入人脸信息回家如做贼,物业:少数服从多数...
  5. 《Google软件测试之道》- Google软件测试介绍
  6. weather_在Weather App中使用Android Location API –搜索城市
  7. python快速编程入门教程-终于懂得python快速编程入门教程
  8. 美团点评业务风控系统构建经验
  9. 解决vc 6在vista下的一些兼容问题
  10. kafka报错打开文件数过多导致kafka关闭
  11. Java设计模式笔记(6)观察者模式
  12. html 多层滚动,如何实现多个div同时滚动(3个以上)
  13. python基础01day
  14. 元年深度 | 侧袋机制应用实务探讨
  15. extjs4 视频教程
  16. webtrends 分析
  17. psn账号修改地址可以转服务器,PSN换卡换服换账户教程
  18. 新年快乐,万事如意,心想事成,恭喜发财
  19. .nte连接数据库常见问题,Unknown column '张三' in 'where clause'
  20. 「 LaTeX 」写论文,单双栏显示行号

热门文章

  1. 通过ESP8266手机或电脑浏览器网页能控制远程任意组任意路继电器开关并收发单片机指令 测试OK
  2. [C++] 开灯问题(两个思路)
  3. 【修真院“正直”系列之三】【修真神界】【修行卷】【第一章】修真院入场券...
  4. 通俗解释Docker
  5. 形象理解计算机网络里的各种抽象概念
  6. 别瞎扯,元宇宙就是没有切实发展?
  7. android共享局域网打印,Android 浅谈同一局域网下使用WiFi连接打印机
  8. webview的一些使用小窍门和需注意的地方
  9. nao机器人刷机记录
  10. 录音文件的比特率的计算方法