SLAM从入门到精通(矩阵的使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        学习SLAM,离开了矩阵肯定是玩不转的。大学数学里面除了微积分,剩下的就是线性代数和概率论。而矩阵就是线性代数的一部分。到了研究生,高等数学不学了,但是会继续学习矩阵论和随机数学。它们是线性代数和概率论的衍生。很多同学可能会说,学习矩阵有什么用?主要还是为了解决问题,方便描述。

1、一个二元一次方程

        所谓的二元一次方程,写成公式就是这样的形式,这里假设num是一个常数。

ax+by=num

        看上去一切还算正常。学过几何的同学都知道这是一条直线,那么假设我们知道了两组(x,y),是不是就可以画出这个直线了,

\left\{\begin{matrix} 4a+b = 5 \\a+4b = 5 \end{matrix}\right.

        这是一个简单的二元一次方程。简单解一下,可以算出来a=1,b=1。

2、用矩阵怎么描述

        虽然是一个简单的二元一次方程,但是也是可以用矩阵来描述的。还是上面这么一个情况,如果用矩阵描述,是这样的,

\begin{bmatrix} 4 &1 \\ 1&4 \end{bmatrix} * \begin{bmatrix} a\\b \end{bmatrix} = \begin{bmatrix} 5\\5 \end{bmatrix}

3、用矩阵该怎么解

        学过矩阵的同学都知道,按照上面的公式,如果需要求解a和b,那么就要在等式的两边乘以一个逆。这个逆就是矩阵[4 1; 1 4]的逆。所以,a、b的求解是这样的,

\begin{bmatrix} a\\b \end{bmatrix} =\begin{bmatrix} 4 & 1\\ 1&4 \end{bmatrix}^{-1}*\begin{bmatrix} 5\\5 \end{bmatrix}

4、怎么用计算机来解决矩阵的逆

        怎么用计算机来求解逆,这确实是一个问题。不过计算机求解,一般和个人计算是不一样的。计算机的求解大部分是用优化的方法去逼近一个标准答案。而个人如果是完成作业,或者是考试求解逆,则是按照标准的计算流程一步一步去完成。这里,我们可以先安装eigen3-dev的库,

sudo apt-get install libeigen3-dev

        确认矩阵库已经没有问题之后,这个时候就可以编写代码了,

#include <iostream>
#include <eigen3/Eigen/Dense>
using Eigen::MatrixXd;int main()
{MatrixXd m(2,2);MatrixXd n(2,1);m(0,0) = 4;m(1,0) = 1;m(0,1) = 1;m(1,1) = 4;n(0,0) = 5;n(1,0) = 5;MatrixXd param(2,1);param = m.inverse() * n;std::cout << param << std::endl;return 0;
}

        代码本身其实没有什么复杂的,m就代表了整个矩阵,是2行*2列。n代表了最终的数值,是2行*1列。而中间的param则代表了中间的参数,也是2行*1列。整个计算过程,最重要的一句话就是param = m.inverse() * n,m.inverse代表先求解矩阵的逆,然后再和n进行相乘。相乘的结果就是param,其中a=param(0,0),b=param(1,0)。

$ ./eigen 
1
1

        在这计算过程中,对于行和列,一定要分清楚,弄不好,你就看到这样的打印,

$ ./eigen 
eigen: /usr/include/eigen3/Eigen/src/Core/Product.h:95: Eigen::Product<Lhs, Rhs, Option>::Product(const Lhs&, const Rhs&) [with _Lhs = Eigen::Inverse<Eigen::Matrix<double, -1, -1> >; _Rhs = Eigen::Matrix<double, -1, -1>; int Option = 0; Eigen::Product<Lhs, Rhs, Option>::Lhs = Eigen::Inverse<Eigen::Matrix<double, -1, -1> >; Eigen::Product<Lhs, Rhs, Option>::Rhs = Eigen::Matrix<double, -1, -1>]: Assertion `lhs.cols() == rhs.rows() && "invalid matrix product" && "if you wanted a coeff-wise or a dot product use the respective explicit functions"' failed.

        看到这种输出,不要怀疑,直接就是行和列搞反了。

5、SLAM中使用矩阵最终的目的

        关于矩阵,大部分SLAM处理的时候都可以看到这样的方程,即

watch_data * pose = real_data
min(sigma(ground_truth - real_data))

        这里的watch_data是一个矩阵,pose是最终目标,可以认为是局部空间里面找一个最佳结果。而real_data,则是该矩阵的计算结果。此外,对于每个watch_data,它的ground_truth数值,我们都是知道的,所以这里的计算目标就变成求解一个pose,使得它的real_data和ground_truth之间的累计和最小。这就是SLAM pose求解的意义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/122171.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信短链跳转到小程序指定页面调试

首先说下背景&#xff1a;后端给了短链地址&#xff0c;但是无法跳转到指定页面。总是在小程序首页。指定的页面我们是h5页面。排查步骤如下&#xff1a; 1、通过快速URL Scheme 编译。上部普通编译 下拉找到此选项。 、 2、按照小程序的要求的URL Scheme输入。另外后端给的…

事务的优化

例子&#xff1a; 举例&#xff1a;假设我们有一个文件上传的uploadFile方法&#xff0c;在这个方法中我们会先执行上传一个文件到分布式文件系统中的方法addMediaFilesToMinIO( )&#xff0c;上传成功后执行文件资源数据入库的addMediaFilesToDb( ),那么这个时候事务应该加在哪…

Revit SDK 介绍:EventsMonitor 事件监控器

前言 这个例子实现了一个事件监控器&#xff0c;当有事件被触发的时候&#xff0c;会生成一条日志记录。 内容 核心逻辑&#xff1a; 用户通过对话框选择想要注册的事件对选中的事件进行注册&#xff0c;事件处理函数都是app_eventsHandlerMethod当事件被触发&#xff0c;事…

uniapp实现移动端的视频图片轮播组件

1、视频轮播组件app体验地址 https://tt.appc02.com/nesxr6 2、支持小程序、H5、APP&#xff0c;在小程序上运行的效果图 3、使用方法 第一步&#xff0c;按照截图步骤配置好 "app-plus": {"subNVues": [{"id": "videoMask", // 唯…

Vue3+Ts实现父子组件间传值的两种方式

文章目录 写在前面1、v-modelemit传值1.1父向子传递数据1.2子向父传递数据 2、使用v-bindemit2.1父向子传递数据2.2子向父传递数据 总结 写在前面 对于常用的组件间传参最近有了有点小心得总结一下&#xff0c;主要是两种子向父组件传参的方式总结。欢迎评论区讨论 概览&…

Jmeter性能综合实战 —— 签到及批量签到

提取性能测试的三个方面&#xff1a;核心、高频、基础功能 签 到 请 求 步 骤 1、准备工作&#xff1a; 签到线程组n HTTP请求默认值n HTTP cookie 管理器n 首页访问请求n 登录请求n 查看结果树n 调试取样器l HTTP代理服务器 &#xff08;1&#xff09;创建线程组 &#xf…

Build阶段-Maven安装配置

构建Java项目的工具一般有两种选择&#xff0c;一个是Maven&#xff0c;一个是Gradle。 这里我们选择Maven作为项目的编译工具。 具体安装Maven流程不做阐述&#xff0c;但是需要确保配置好Maven仓库私服以及JDK编译版本

哈希的应用——位图

文章目录 前言1. 面试题思考2. 位图2.1 位图的概念2.2 思路讲解及代码实现结构定义构造函数set和reset接口实现set和reset测试观察test接口实现test接口测试思考 3. 位图的应用习题1习题2习题3 4. 总结5. 源码5.1 bitset.h5.2 Test.c 前言 前面的文章里我们学习了哈希表&#x…

vs+opencv+QT调试程序

2021-09-28vsopencvQT简单的图像处理工程_opencv 用qt还是vs_二两山栀子的博客-CSDN博客 【vsopencvQt搭建简单的图像处理界面】https://www.bilibili.com/video/BV16T411j7XQ?vd_source0aeb782d0b9c2e6b0e0cdea3e2121eba 调试过程一直出现这种问题&#xff0c;后来改DEBUG为…

JAVA宝典----容器(理解记忆)

目录 一、Java Collections框架是什么&#xff1f; 二、什么是迭代器&#xff1f; 三、Iterator与ListIterator有什么区别&#xff1f; 四、ArrayList、Vector和LinkedList有什么区别&#xff1f; 五、HashMap、Hashtable、TreeMap和WeakHashMap有哪些区别&#xff1f; 六…

一辆新能源汽车的诞生之旅:比亚迪常州工厂探营

作为在新能源汽车领域首屈一指的国产品牌&#xff0c;比亚迪近年来可以说是捷报频传&#xff0c;高奏凯歌。 以比亚迪常州工厂为例&#xff0c;据介绍该工厂当初规划设计时定下的生产目标&#xff0c;是年产量能够达到20万辆。然而在2023年上半年&#xff0c;该工厂光是主要销往…

自然语言处理实战项目17-基于多种NLP模型的诈骗电话识别方法研究与应用实战

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目17-基于NLP模型的诈骗电话识别方法研究与应用&#xff0c;相信最近小伙伴都都看过《孤注一掷》这部写实的诈骗电影吧&#xff0c;电影主要围绕跨境网络诈骗展开&#xff0c;电影取材自上万起真…

「网页开发|前端开发|Vue」05 Vue实战:从零到一实现一个网站导航栏

本文主要介绍如何从最开始的草图&#xff0c;通过确定基本结构、修改元素布局、美化外观来实现一个网站导航栏&#xff0c;从而熟悉网页开发的基本流程。同时&#xff0c;我们会把性能、规范性、可维护性方面的代码优化也考虑其中。 文章目录 本系列前文传送门一、场景说明&am…

Mac Homebrew中常用的 Brew 命令

Mac 中常用的 Brew 命令集 Brew&#xff08;Homebrew&#xff09;是一个强大的包管理器&#xff0c;用于在 macOS 上安装、更新和管理各种软件包。它使得在 Mac 上安装开发工具、应用程序和库变得轻松和便捷。本博客将介绍一些在 Mac 中常用的 Brew 命令&#xff0c;以帮助您更…

用通俗易懂的方式讲解大模型分布式训练并行技术:流水线并行

近年来&#xff0c;随着Transformer、MOE 架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&…

【SpringBoot】最基础的项目架构(SpringBoot+Mybatis-plus+lombok+knife4j+hutool)

汝之观览&#xff0c;吾之幸也&#xff01; 从本文开始讲下项目中用到的一些框架和技术&#xff0c;最基本的框架使用的是SpringBoot(2.5.10)Mybatis-plus(3.5.3.2)lombok(1.18.28)knife4j(3.0.3)hutool(5.8.21),可以做到代码自动生成&#xff0c;满足最基本的增删查改。 一、新…

Linux 多进程解决客户端与服务器端通信

写一个服务器端用多进程处理并发&#xff0c;使两个以上的客户端可以同时连接服务器端得到响应。每当接受一个新的连接就fork产生一个子进程&#xff0c;让子进程去处理这个连接&#xff0c;父进程只用来接受连接。 与多线程相比的不同点&#xff1a;多线程如果其中一个线程操…

小红书笔记爬虫

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

Ubuntu入门05——磁盘管理与备份压缩

1.检查磁盘空间占用情况 2.统计目录或文件所占磁盘空间大小 3.压缩 3.1 zip、unzip和zipinfo 运行时发现上面命令不成功&#xff0c;换成&#xff1a; &#xff08;将文件lkw放入压缩文件lkw01.zip中&#xff09; sudo zip -m lkw01.zip lkw 解压文件&#xff1a; 实操&…

MySQL从入门到精通【实践篇】之使用Sharding-JDBC 分库分表详解

文章目录 0. 前言本文技术组件版本基本介绍 2. 使用和配置&#xff1a;步骤1 引入依赖步骤2 配置数据源和分片策略步骤3 核心代码MybatisPlusConfig 核心配置OrderServiceOrderServiceImplOrderInfoOrderMapperOrderControllerBaseMapper 3. 数据库分片配置在我的demo工程中大家…