SLAM从入门到精通(基础数学)

news2024/11/26 21:34:45

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

        不可否认,slam中的有一部分内容来自于数学。但是,我们在学习使用的过程中,也不用纠结于整个数学的推导过程,能正确使用数学结论也是可以的。有能力的同学,按照书本提示的方法,自己推导一下,也无可厚非。实在觉得麻烦,可以暂时先放下,或者用的比较熟练了,再来查看相关的推导原理也可以。和那些复杂的高维矩阵运算、优化算法相比,有一些基本的数学和规则,可能大家在日常处理中遇到的机会更大,这里不妨总结一下。

1、浮点数

        过去我们自己编写web前后端、或者写os、db的时候,遇到浮点数的机会并不多。即使遇到,也是简单的加减法。但是slam学习中,大量的操作都是浮点数。既然是浮点数,那么就离不开比较、除法、滤波、平方根这些计算。

1.1 数值比较

        既然做浮点运算,那么数值比较肯定是少不了的。这个时候,大家一定要理解,浮点数之间是没有绝对相等的。要比较他们是否相等,只要判断是不是在一个范围内即可,

if(fabs(f1 - f2) < 1e-6)
{
    std::cout << "equal" << std::endl;
}
else
{
    std::cout << "not equal" << std::endl;
}

1.2 除法运算

        用浮点做除法运算,本身是一件很危险的事情。因为f1/f2的时候,如果f2很小,那么f1/f2就会是非常大的一个数值。这样的话,这个结果本身其实是没有任何意义的。所以,即使要做除法运算,一定、一定要约束一下f2的数值范围。

1.3 数值滤波

        SLAM中用到的数据大部分都是从传感器采集过来的。既然是采集的物理数据,就会不可避免地引入噪声。所以这个时候,就要对浮点数进行降噪处理,常用的方法一般有,

1)取平均值;

2)去掉最大值、最小值,取平均值;

3)v_new = v_old * 0.95 + v_capture * (1 - 0.95);

4)连续满足某个条件之后,才开始采样等等。

1.4 平方根

        SLAM中的欧氏距离真的很好用。有的时候,最简单的方法往往就是最鲁棒的方法。所以distance = sqrt (pow(x, 2) + pow(y, 2))这样的计算方法一定要多看多用。

2、角度的计算

        在一个平面上面,假设有一个x轴和一个y轴,那么任何的坐标p都会被拆解为(x0,y0)。其中它和x轴的角度称之为theta,那么就会有了下面一些列的计算,

2.1 点p到原点的距离

r = sqrt (pow(x, 2) + pow(y, 2))

2.2 对应的角度theta该如何计算

theta = atan(y0 / x0)

2.3 角度和弧度的对应关系

rad = (angle * 2 * pi) / 360

2.4 sin、cos、tan

        由于时间的关系,大家对于sin、cos、tan的周期性可能没有那么熟悉了,这里为了方便大家回忆。我们分别贴上sin&cos的周期图、tan的周期图。首先是sin&cos的周期图,

        其次是tan的周期图,

        仔细观察下,sin的周期是2*pi,其中(-pi,0)为负,(0,pi)为正。cos的周期也是2*pi,其中(-pi/2,pi/2)为正,(-pi,-pi/2)&(pi/2,pi)为负。tan的周期是pi,其中(-pi/2,0)为负,(0,pi/2)为正。

2.5 一个有意思的旋转

        之前我们谈到,假设有一个点,他处在(x0,y0),这个时候,如果逆时针旋转alpha角度,新的坐标是多少。要注意,这里面其实是有一个不变的量,那就是距离distance,也可以记着为r。按照道理,新的坐标应该是,

x1 = r * cos(theta + alpha)
y1 = r * sin(theta + alpha)

        如果仅仅是这样,那么数值并不太容易求出来,所以这里需要进一步分解一下,

x1 = r * cos(alpha + theta)
   = r * (cos(alpha) * cos(theta) - sin(alpha) * sin(theta))
   = x * cos(alpha) - y * sin(alpha)

y1 = r * sin(alpha + theta)
   = r * (sin(alpha) * cos(theta) + cos(alpha) * sin(theta))
   = x * sin(alpha) + y * cos(alpha)

        如果换成矩阵,其实写起来就很容易了,

[x1, y1] = [cos(alpha), -sin(alpha); sin(alpha), cos(alpha)] * [x, y]

3、矩阵的计算

        大学数学里面除了高等代数,也就是微分和积分之外,最重要的两门数学课就是线性代数和概率。而线性代数中最重要的计算就是矩阵。例2中提到的旋转,大家就可以转变成矩阵乘法的形式来进行处理,就是这样的,

pos_new = matrix * pos_old;

        有些同学也许忘记了矩阵的相关内容,没关系。其实大家只要会使用eigen这个库就好了。这个库是一个模板库,本身没有.a或者.so文件,直接使用即可。

sudo apt-get install libeigen3-dev

4、概率的计算

        概率这部分,大部分都是浮点的相关计算。中间以统计、加减法为主,本身困难不大。需要注意的地方就两个,一个是随机数的生成;一个就是高斯分布的生成。两个都很重要。

        如果是随机数的生成,一般是先给一个种子,然后生成随机数,

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
    int i;
    srand((int) time(0));
    for(i=0;i< 10;i++)
    {
        printf(" %d ", rand());
    }
    printf("n");
    return 0;
}

        另外一个就是高斯分布的生成,两个参数,一个是平均值,一个是方差,

#include <random>
#include <chrono>
#include <iostream>
 
int main(int argc, char* argv[]) 
{
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
  
    std::default_random_engine generator(seed);
    std::normal_distribution<double> distribution(0.0, 1.0);
 
    for (int i = 0; i < 10; ++i)
    {
        std::cout << distribution(generator) << std::endl;
    }
    
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

营收纯利双增长,朝云集团通过了消费品市场的层层筛选

8月28日晚&#xff0c;朝云集团发布了一份惊喜的半年报。 上半年&#xff0c;公司收入11.33亿元&#xff0c;同比增长10.7%&#xff1b;纯利1.36亿元&#xff0c;同比增长51.7%&#xff0c;毛利率同比增长2.2个百分点。 上半年整体消费活跃&#xff0c;对朝云集团的一系列消费…

day 43 | ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III func maxProfit(prices []int) int {dp : make([][]int , len(prices))dp[0] []int{0, -prices[0], 0, -prices[0], 0}for i : 1; i < len(prices);i{val0 : dp[i - 1][0]val1 : max(dp[i - 1][0] - prices[i], dp[i - 1][1])val2 : max(dp[i - …

Overleaf,MDPI模板,参考文献,BibTex转换为bibitem格式

①&#xff1a;新建文件ref.bib。 ②&#xff1a;将BibTex格式的参考文献考入ref.bib中&#xff08;红框中的文字后面有用&#xff0c;此处先不用管&#xff09;。 ③&#xff1a;在template.tex文件中&#xff0c;直接将整个{thebibliography}部分从begin到end全部删除。 ④&a…

什么是自动语音识别?

在人工智能发展和全球疫情的双重作用下&#xff0c;企业加强了与客户的线上沟通。企业越发依赖于虚拟助手、聊天机器人以及其他的语音技术&#xff0c;以实现与客户的高效互动。这几类人工智能&#xff0c;都是依赖于自动语音识别技术&#xff0c;简称为ASR。ASR涉及到将语音转…

初识Redis之分布式

一.简单介绍: Redis是用来在内存中, 存储数据的, 他的初心是用来搞消息中间件(或者说消息队列 很熟悉了吧~~),但是呢用的不多,他现在主要是用来做 数据库,缓存 用来存储数据, 为什么不直接存储呢? Redis的优势就在于分布式系统 二.分布式系统 要说其分布式系统,简单想想都能…

相同二叉树判断

目录 题目题目要求示例 解答方法一、实现思路时间复杂度和空间复杂度代码 方法二、实现思路时间复杂度和空间复杂度代码 题目 相同二叉树判断 题目要求 题目链接 示例 解答 方法一、 递归 实现思路 如果两棵树从根结点一起访问&#xff0c;当有一个结点不相等时就返回f…

MindSponge分子动力学模拟——定义一个分子系统(2023.08)

技术背景 在前面两篇文章中&#xff0c;我们分别介绍了分子动力学模拟软件MindSponge的软件架构和安装与使用教程。这里我们进入到实用化阶段&#xff0c;假定大家都已经在本地部署好了基于MindSpore的MindSponge的编程环境&#xff0c;开始用MindSponge去做一些真正的分子模拟…

版本控制 Git工具的使用

版本控制的概念&#xff1a; 版本控制&#xff08;Revision control&#xff09;是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。简单来说就是用于管理多人协同开发…

Nacos使用(中):Java项目和Spring项目使用Nacos

Nacos使用(上)&#xff1a;Nacos安装 Nacos使用(中)&#xff1a;Java项目和Spring项目使用Nacos Nacos使用(下)&#xff1a;SpringBoot和SpringCloud项目中使用Nacos 3.使用Nacos 3.1 java SDK 引入jar包 <dependency><groupId>com.alibaba.nacos</groupId>…

Android集成Unity,实现3D看房效果

引子 前几天有人找小编问能不能把3D模型放入到Unity中&#xff0c;再把Unity放入到Android APP中&#xff0c;在APP中实现观看房屋家具的功能&#xff0c;这次小编便来分享一下吧&#xff0c;如果还需要了解Android 集成Unity知识的&#xff0c;可以翻我主页其他文章 演示效果…

为什么关键词优化很重要,以及如何进行网络营销?

随着互联网的发展&#xff0c;越来越多的企业开始将重心放在网络营销上。在网络营销中&#xff0c;关键词优化是一个非常重要的环节。本文一秒推小编将介绍什么是关键词优化&#xff0c;为什么关键词优化很重要&#xff0c;以及如何进行关键词优化。 一、什么是关键词优化&…

性能瓶颈分析及调优

分析流程&#xff1a; 很多情况下压测流量并没有完全进入到后端&#xff08;服务端&#xff09;&#xff0c;在网络接入层&#xff08;云化的架构比如&#xff1a;SLB/WAF/高防IP&#xff0c;甚至是CDN/全站加速等&#xff09;可能就会出现由于各种规格&#xff08;带宽、最大…

人员位置管理,点亮矿山安全之路

矿山作为一个高危行业&#xff0c;安全问题一直备受关注。人员定位置管理是现代矿山安全管理的重要一环&#xff0c;可以帮助企业更好地实现对人员的实时监控和管理。因此&#xff0c;矿山人员位置管理系统对于矿山安全生产和管理非常重要&#xff0c;可以帮助减少安全事故的发…

LeetCode——无重复的最长子串(中等)

题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

【GAN】pix2pix算法的数据集制作

一、A、B合并代码&#xff08;此代码由官方提供&#xff09; import os import numpy as np import cv2 import argparseparser argparse.ArgumentParser(create image pairs) parser.add_argument(--fold_A, destfold_A, helpinput directory for image A, typestr, default…

ITIL帮助台怎样帮助企业建设IT服务?

大多数企业都是从邮件开始IT支持建设的&#xff0c;随着企业的规模扩大、服务请求的增长&#xff0c;服务质量不可避免出现了急剧的下降。IT支持团队进入消防员模式&#xff0c;他们只能奔波于解决请求&#xff0c;避免服务失败。没有ITIL所定义的流程体系&#xff0c;IT团队失…

实时同步!从MySQL到SelectDB的无缝数据迁移

随着数据分析在业务决策中变得日益重要&#xff0c;数据实时同步和分析成为企业提升竞争力的关键。MySQL 作为广泛使用的关系型数据库&#xff0c;其数据存储丰富&#xff0c;但无法满足大规模数据分析和高并发查询的需求。而 SelectDB 作为一款专为大数据分析设计的分布式数据…

leetcode121. 买卖股票的最佳时机

题目&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…

【前端】JQ实时显示当前日期、时间、星期

效果图 html <span id"time"></span> JS // 实时显示当前时间 $(document).ready(function () {function showTime() {var today new Date;var y today.getFullYear();var M today.getMonth() 1;var d today.getDate();var w today.getDay();va…

Django报错:SystemCheckError: System check identified some issues解决办法

今天练习django自定义标签时&#xff0c;一开始在APPbook中写了自定义标签book_tags.py 测试成功&#xff0c;之后新建了一个APPblogs&#xff0c;测试在blogs中创建模板使用自定义标签&#xff0c;于是直接把book/templatetags包直接赋值到blogs目录里。在页面里加载自定义标…