视觉SLAM补充习题(来源于B站博主)

2024-08-29 06:36

本文主要是介绍视觉SLAM补充习题(来源于B站博主),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目来源于up主全日制学生混的SLAM课程,代码链接如下:

GitHub - cckaixin/Practical_Homework_for_slambook14: This repository is used to store SLAM 14 training exercises

如果打不开github请参考下面两篇博文,亲测有效!!

解决国内 github.com 打不开的最最最准确方法icon-default.png?t=N7T8https://blog.csdn.net/qq_41176055/article/details/128496628

Windows系统下以管理员身份修改系统文件,以修改hosts文件为例icon-default.png?t=N7T8https://blog.csdn.net/m0_58086930/article/details/128462187

下面所有的例子截图均来源于我之前ch3的博客

视觉SLAM ch3—三维空间的刚体运动icon-default.png?t=N7T8https://blog.csdn.net/Johaden/article/details/141023487

题目:

有两个右手系1和2,其中2系的x轴与1系的y轴方向相同,2系的y轴与1系z轴方向相反,2系的z轴与1系的x轴相反,两个坐标系原点重合。求R12,求1系中(1,1,1)在2系中的坐标。请自己编写一个c++程序实现它,并用Cmake编译,得到能输出答案的可执行文件

解答分析:

我们可以发现,从Ⅰ到Ⅱ,x(roll),y(pitch)分别转动了-pi/2,注意先转动的轴可以带动后转动的轴,而后转动的轴无法带动先转动的轴。

 double roll,pitch,yaw;roll = -PI/2;pitch = -PI/2;yaw = 0;

 下面的图片告诉我们创建旋转矩阵的元素,来源于我ch3的博客。

如何创建旋转矩阵

下图中介绍了绕Z轴旋转45度的代码,那么本题该部分的代码也类似于之前的例子

如何表示旋转?
Eigen::AngleAxisd rv_roll(roll, Eigen::Vector3d::UnitX());                  
Eigen::AngleAxisd rv_pitch(pitch, rv_roll*Eigen::Vector3d::UnitY());        
Eigen::AngleAxisd rv_yaw(yaw, rv_pitch*rv_roll*Eigen::Vector3d::UnitZ()); 

上图中的Unix()其实和截图中的表示方法差不多,可以直接写为下面的形式:

Eigen::AngleAxisd rv_roll(roll, Eigen::Vector3d(1,0,0));                  
Eigen::AngleAxisd rv_pitch(pitch, rv_roll*Eigen::Vector3d(0,1,0));        
Eigen::AngleAxisd rv_yaw(yaw, rv_pitch*rv_roll*Eigen::Vector3d(0,0,1));

 如上图所示,之前我们的代码中仅绕一个轴作为旋转轴,可以使用.toRotationMatrix来按罗德里格斯公式的形式生成旋转矩阵

        现在,我们有两、三个轴都进行了旋转操作,那么该如何进行呢?其实很简单,就是需要将三个轴的“分”旋转向量合起来就可以,用*相连。也就是当我们想要执行多个旋转时,可以通过将这些旋转的矩阵相乘来表示复合旋转。

        在数学上,旋转矩阵的乘法遵循特定的顺序。例如,如果我们先绕 X 轴旋转,然后再绕 Y 轴旋转,那么复合旋转矩阵就是 R_Y * R_X,其中 R_X 和 R_Y 分别是绕 X 轴和 Y 轴的旋转矩阵。旋转矩阵的乘法不满足交换律,即 A * B ≠ B * A。这意味着旋转的顺序很重要。

相信大家看到这里会有一个疑问:

既然要用这些旋转的矩阵相乘来表示复合旋转,那么这种相乘是什么?

        其实这种相乘并不是我们所认为的简单的点乘和叉乘。在 Eigen 库内部,Eigen::AngleAxisd 类通过一个四元数来表示旋转。当我们将两个 Eigen::AngleAxisd 对象相乘时,实际上是在将两个四元数相乘。四元数的乘法遵循一定的规则,可以用来表示复合旋转。

所以接下来我们要生成旋转矩阵:

roation_matrix = (rv_yaw*rv_pitch*rv_roll).toRotationMatrix();    // R12

 最后,我们要使用旋转矩阵将Frame1下的已知点(如(1,1,1))转换为Frame2

和例子里面一样,我们需要把点和旋转矩阵相乘

 Eigen::Vector3d point_frame1(1,1,1);   //定义frame1Eigen::Vector3d point_frame2;          //定义point_frame2 = roation_matrix.transpose() * point_frame1;

最后输出我们想关注的元素即可,如:

std::cout << "point in frame2: " << point_frame2.transpose() << std::endl;

 需要编写配置文件:

cmake_minimum_required(VERSION 2.8)project(ch3_homework)find_package(Eigen3)include_directories(${EIGEN3_INCLUDE_DIRS})add_executable(answer ch3_reference.cpp)target_link_libraries(answer ${EIGEN3_LIBRARIES})

上面是up主给的参考代码,运用了find_package,这是为了防止如果我们不知道“包”的位置而进行了一个搜索,其实eigen的位置我们是知道的,而且是不需要写链接的。

cmake_minimum_required(VERSION 2.8)project(ch3_homework)include_directories("/usr/include/eigen3")add_executable(answer ch3_reference.cpp)

运行后我们就可以知道frame2的位置了。 

这篇关于视觉SLAM补充习题(来源于B站博主)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117114

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

计算机视觉工程师所需的基本技能

一、编程技能 熟练掌握编程语言 Python:在计算机视觉领域广泛应用,有丰富的库如 OpenCV、TensorFlow、PyTorch 等,方便进行算法实现和模型开发。 C++:运行效率高,适用于对性能要求严格的计算机视觉应用。 数据结构与算法 掌握常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划等),能够优化代码性能,提高算法效率。 二、数学基础

【多系统萎缩患者必看】✨维生素补充全攻略,守护你的健康每一天!

亲爱的朋友们,今天我们要聊一个既重要又容易被忽视的话题——‌多系统萎缩患者如何科学补充维生素‌!🌟 在这个快节奏的生活中,健康成为了我们最宝贵的财富,而对于多系统萎缩(MSA)的患者来说,合理的营养补充更是维护身体机能、提升生活质量的关键一步。👇 🌈 为什么多系统萎缩患者需要特别关注维生素? 多系统萎缩是一种罕见且复杂的神经系统疾病,它影响身体的多个系统,包括自主神经、锥体外系、小脑及锥

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形

【C++ Primer Plus习题】12.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "String.h"using namespace std;int main(){String s1(" and I am a

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

参会邀请 | 第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)

第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)将于2024年9月13日-15日在中国张家口召开。 MVIPIT 2024聚焦机器视觉、图像处理与影像技术,旨在为专家、学者和研究人员提供一个国际平台,分享研究成果,讨论问题和挑战,探索前沿技术。诚邀高校、科研院所、企业等有关方面的专家学者参加会议。 9月13日(周五):签到日 9月14日(周六):会议日 9月15日(周日

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl