SLAM常用最小二乘最优化方法学习、分析和总结

2023-11-18

SLAM中二维视觉的定位问题被最终归为一个最小二乘问题,那么紧随其后的就是对最小二乘的最优化求解,对其求解析解显然是不太合适的,所以就需要一些数值的最优化方法对最小二乘问题进行求解,在SLAM中,常用的算法有,梯度下降法,牛顿法,以及牛顿法的变种方法比如高斯牛顿法、Levenberg-Marquardt算法还有DogLeg算法等等,当然还有大名鼎鼎的图优化方法,图优化算法还没有搞透彻,所以就先给前面的算法做个笔记吧。

 

一、梯度下降法

 

梯度下降法又称最速下降法,应该是所有这些爬山法里面最简单了的吧,梯度的数学定义是:梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

 

二、牛顿法

 

牛顿法着实困扰了我很久,计算方法中的牛顿法就是一个简单的迭代比如在单变量函数中,就是利用目标函数在该点梯度与x轴的交点作为迭代结果进行不断迭代来得到的,怎么到了最小二乘问题中,就用到了二阶的海塞矩阵了呢。

去网上找了不少资料,发现在最小二乘寻优问题中,牛顿法并不是直接对目标函数做传统意义上的牛顿法,而是利用了函数在最小值处导数为零这个性质,对目标函数的导数进行寻优,这样自然也就用到了二阶的海塞矩阵。

具体的实现方法同样移步高博的书吧(感谢高博!^-^)。

 

三、高斯牛顿法

 

高斯牛顿法其实与牛顿法类似,但是针对目标函数海塞矩阵难以得到的问题,利用数学推导的方式得到了近似的海塞矩阵。高斯牛顿法不对目标函数进行二阶泰勒展开,而对误差函数进行一阶泰勒展开,即:

 

而观测值被加上了一组均值为0方差为1的高斯噪声,目标是利用这组观测值得到近似的a,b,c的最优解。首先对三个参数取初值,之后取f(a,b,c)为观测值与估计值的误差,按照高斯牛顿法进行迭代。


代码如下:
clc;clear;close all;
syms a b c x;
parameters = [a b c];
fx = (exp(a*x^2+b*x+c));
Jco = jacobian(fx,parameters)
subs(Jco,[a b c x],[1 2 3 4])
xRange = 0:0.01:1;
dataNum = 20;
aTureth = 1;bTureth=1;cTureth=1;
yTureth = zeros(dataNum,1);
yGuss = zeros(dataNum,1);
for i=1:length(xRange)
   yTureth(i)= exp(aTureth*xRange(i)^2+bTureth*xRange(i)+cTureth);
   yGuss(i) = yTureth(i)+ rand(1)*2-1;
end

% figure;
% hold on;box on;
% plot(xRange,yTureth,'red');
% plot(xRange,yGuss,'.');
% legend('The trueth','With Guss Noise')

IterNum = 100;
aEst=4;bEst=4;cEst =4;
Jacobian = zeros(dataNum,3);
yEst =zeros(dataNum,1);
figure;
box on;
YEst = zeros(dataNum,1);
NeededError = 1e-3;
ErrorNow=0;ErrorPast=100;
generate = 0;
for i=1:IterNum
   for j =1:length(xRange)
      Jacobian(j,:) = [ xRange(j)^2*exp(aEst*xRange(j)^2 + bEst*xRange(j) + cEst), ...
      xRange(j)*exp(aEst*xRange(j)^2 + bEst*xRange(j) + cEst), exp(aEst*xRange(j)^2 + bEst*xRange(j) + cEst)];
      yEst(j)= yGuss(j) - (exp(aEst*xRange(j)^2+bEst*xRange(j)+cEst));
   end
   Hass = Jacobian'*Jacobian;
   deta = pinv(Hass)*(Jacobian')*yEst;
   aEst = aEst+deta(1);
   bEst = bEst+deta(2);
   cEst = cEst+deta(3);
   %disp(aEst);disp(bEst);disp(cEst);
   for k=1:length(xRange)
   YEst(k)= exp(aEst*xRange(k)^2+bEst*xRange(k)+cEst);
   end
   hold off;
   ax1=plot(xRange,yTureth,'red','LineWidth',1);hold on;
   ax2=plot(xRange,yGuss,'.');
   ax3=plot(xRange,YEst,'green','LineWidth',1);
   pause(0.1);
   ErrorNow = norm(yEst);
   disp(ErrorNow - ErrorPast);
   if(ErrorNow - ErrorPast)>-1*NeededError && (ErrorNow - ErrorPast)<NeededError
       break;
   end
   %如果收敛了也要退出
   ErrorPast = ErrorNow;
   figure;
   hold on;box on;
   ax1=plot(xRange,yTureth,'red','LineWidth',1);hold on;
   ax2=plot(xRange,yGuss,'.');
   ax3=plot(xRange,YEst,'green','LineWidth',1);
   legend('Real','Observe','Estimate')
   imagename =sprintf('112233/%d',i)
   %print(1,sprintf('112233/%d',i),'-dbmp') 
   print(gcf,'-dbmp',imagename);
   close;
   generate = generate +1;
end
disp(generate);
for j=1:generate
        im=imread(sprintf('112233/%d.bmp',j));  
        [I,map]=rgb2ind(im,20);   
        if j==1  
           imwrite(I,map,'112233/GIF/meow5.gif','gif', 'Loopcount',inf,'DelayTime',0.2);%FIRST  
       else  
           imwrite(I,map,'112233/GIF/meow5.gif','gif','WriteMode','append','DelayTime',0.2);  
       end  
end






 

四、LW算法

LW算法其实都是高斯牛顿算法的变种算法,因为高斯牛顿算法使用了近似的海塞矩阵,因此会导致误差增大的问题,所以需要一个置信度区间来衡量这个近似是否可靠。

实现代码如下:
clc;clear;close all;
syms a b c x;
parameters = [a b c];
fx = (exp(a*x^2+b*x+c));
Jco = jacobian(fx,parameters)
subs(Jco,[a b c x],[1 2 3 4])
xRange = 0:0.01:1;
dataNum = 20;
aTureth = 1;bTureth=1;cTureth=1;
yTureth = zeros(dataNum,1);
yGuss = zeros(dataNum,1);
for i=1:length(xRange)
   yTureth(i)= exp(aTureth*xRange(i)^2+bTureth*xRange(i)+cTureth);
   yGuss(i) = yTureth(i)+ rand(1)*2-1;
end
figure;
hold on;box on;
plot(xRange,yTureth,'red');
plot(xRange,yGuss,'.');
legend('The trueth','With Guss Noise')

IterNum = 150;
aEst=0.01;bEst=0.02;cEst =0.04;
aEstSetForCopy=0;bEstSetForCopy=0;cEstSetForCopy=0
Jacobian = zeros(dataNum,3);
yEst =zeros(dataNum,1);
figure;
box on;
YEst = zeros(dataNum,1);
NeededError = 1e-3;
ErrorNow=0;ErrorPast=100;
lamda = 1e-3;
MatrixD = eye(3);
rho1 = 0;
rhoVector = zeros(dataNum,1);
generate = 0;
for i=1:IterNum
   for j =1:length(xRange)
      Jacobian(j,:) = [ xRange(j)^2*exp(aEst*xRange(j)^2 + bEst*xRange(j) + cEst), ...
      xRange(j)*exp(aEst*xRange(j)^2 + bEst*xRange(j) + cEst), exp(aEst*xRange(j)^2 + bEst*xRange(j) + cEst)];
      yEst(j)= yGuss(j) - (exp(aEst*xRange(j)^2+bEst*xRange(j)+cEst));
   end
   Hass = Jacobian'*Jacobian;
   deta = pinv(Hass)*(Jacobian')*yEst;
   
   aEstSetForCopy = aEst+deta(1);
   bEstSetForCopy = bEst+deta(2);
   cEstSetForCopy = cEst+deta(3);
   for j =1:length(xRange)
      rhoVector(j)= ((exp(aEstSetForCopy*xRange(j)^2+bEstSetForCopy*xRange(j)+cEstSetForCopy))-(exp(aEst*xRange(j)^2+bEst*xRange(j)+cEst)))...
          /(Jacobian(j,:)*deta);
   end
   rho1 = mean(rhoVector);
   if(rho1 > 0.5 && rho1 < 1.5 )
       lamda = lamda /2;
   else
       lamda = lamda *2;
   end
   
   Hass = Jacobian'*Jacobian + lamda * MatrixD;
   deta = pinv(Hass)*(Jacobian')*yEst;
   
   aEst = aEst+deta(1);
   bEst= bEst+deta(2);
   cEst = cEst+deta(3);
   %disp(aEst);disp(bEst);disp(cEst);
   for k=1:length(xRange)
   YEst(k)= exp(aEst*xRange(k)^2+bEst*xRange(k)+cEst);
   end
   hold off;
   ax1=plot(xRange,yTureth,'red','LineWidth',2);hold on;
   ax2=plot(xRange,yGuss,'.');
   ax3=plot(xRange,YEst,'green','LineWidth',2);
   pause(0.1);
   ErrorNow = norm(yEst);
   disp(ErrorNow - ErrorPast);
   if(ErrorNow - ErrorPast)>-1*NeededError && (ErrorNow - ErrorPast)<NeededError
       break;
   end
   %如果收敛了也要退出
   ErrorPast = ErrorNow;
   generate = generate+1;
end
disp(generate);






 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SLAM常用最小二乘最优化方法学习、分析和总结 的相关文章

  • 求平均数的几种方法

    平均数 给定两个数a和b 求其平均值 分析 数学运算中一贯的算法是 a b 2 但在c语言中这种算法存在着一定的缺陷 当a和b足够大时 a和b的和就会存在溢出 从而得不到我们想要的结果 c语言中有相应的操作符可达到求平均数的效果 例如 gt
  • 刷脸支付推动产业智慧升级是大势所趋

    近日 浙江省绍兴市上虞区将 刷脸支付 功能向基层延伸 率先实现全区安全范围内的全覆盖 刷脸就医在全国范围内不断实现 在这个充满诱惑的时代 代理刷脸支付这个蓝海项目是许多想做刷脸支付的创业者急需的内容 刷脸支付 这项技术自面世以来就充斥着各种
  • 解决redis-server.exe不是内部或外部命令

    报错 redis server exe不是内部或外部命令 原因 未进入到redis的安装目录下 解决 先找到redis安装路径 复制之后 在终端中输入cd xxxxx redis的安装路径 进入安装目录之后再次输入redis server
  • 深入学习jquery源码之data()

    深入学习jquery源码之data jQuery data element key value 概述 在元素上存放数据 返回jQuery对象 注意 这是一个底层方法 你应当使用 data 来代替 此方法在jQuery 1 8中删除 但你仍然
  • Java面向对象编程

    将N条长度均为M的有序链表进行合并 合并以后的链表也保持有序 时间复杂度为 A O N M logN B O N M C O N D O M 答案 A 下设栈S的初始状态为空 元素a b c d e f依次入栈S 出栈的序列为b d c f
  • 百度网盘登陆验证提示:无法访问此页面,或者二维码显示失败,弹窗显示:无法访问此页面,确保web地址。。。。

    百度网盘登陆验证提示 无法访问此页面 或者二维码显示失败 弹窗显示 无法访问此页面 确保web地址 遇到百度网盘登陆时显示下面的情况 原因 是自己电脑的IE浏览器设置出了问题 没有显示出来应有的验证界面 解决方案 打开电脑的IE浏览器 在右
  • Apex安装失败(笔记记录分享)

    Apex安装失败 笔记记录 1 错误合集 No 1 error detected in the compilation of csrc multi tensor scale kernel cu No 2 module torch nn ha
  • Java long Long

    转载 https www cnblogs com c2g5201314 p 13024261 html 1 long 是 基本类型 Long 是 对象类型 2 long 默认值是 0 Long 默认值是 null 3 比较方法 1 Long
  • LVS 就是这么简单(数字后端物理验证篇)

    LVS 就是这么简单 数字后端物理验证篇 文章右侧广告为官方硬广告 与吾爱IC社区无关 用户勿点 点击进去后出现任何损失与社区无关 今天吾爱 IC 社区小编为大家带来数字 IC 后端实现物理验证中关于 LVS 的主题分享 其实小编一直觉得这
  • 调整echarts中图与legend的距离

    1 正常调整legend的位置 通过X改变横坐标位置 通过Y改变纵轴位置 x 可设定图例在左 右 居中 y 可设定图例在上 下 居中 legend y bottom data 阳性转阴性 阴性转阳性 阳性无症状转有症状 未检测 2 如果觉得
  • STM32F103ZET6【标准库函数开发】------04 串口USART1控制LED

    一 硬件介绍 STM32F103ZET6有5个串口 查看引脚图可以找到对应的IO口分别如下 串口 USART1 USART2 USART3 UART4 UART5 输入 输出方式 USARTx TX PA9 PA2 PB10 PC10 PC
  • forcats

    引子 最近在整理forcats工具包中的函数 发现该包只有fct reorder2 函数的功能不太容易理解 所以单独写一篇推文来介绍它 根据上篇提到的函数分类 它可以归为 调整类别顺序的函数 与它类似的还有一个fct reorder 函数
  • 九龙战登录只显示一个服务器,九龙战登录失败进不去解决办法

    九龙战是腾讯推出的一款三国题材的动作竞技手游 目前已经开启了不删档测试 但是玩家们在游戏中遇到了登录失败进不去的情况 下面小编就为大家介绍一下九龙战登录失败进不去解决办法 首先玩家们要知道九龙战是一款不删档测试不久的游戏 所以在这期间出现什
  • Android基于BroadcastReceiver和Service、SoundPool开发的防过充助手app

    前段时间换了一个小米4C手机 可是发现它的充电充满没有提醒 上一个手机换了就是因为不爱惜电池 让它过充的次数多了 虽然听别人说小米4c手机充电器是智能充电器 有保护作用 但我自己还是不放心 于是就亲手写了一个防过充小应用 已经在使用 可以达
  • 如何使用LaTeX制作PPT?

    作为LaTeX排版软件 LaTeX主要被用来制作书籍和文章 但由于现代LaTeX系统主要以PDF文件为输出方式 授课 演讲用的计算机幻灯片也日益成为LaTeX的一个重要应用 LaTeX中专门用来制作幻灯片的工具有powerdot文档类 pr
  • 探索.NET:​构建现代软件开发的核心框架

    摘要 在现代软件开发领域 选择一个合适的开发框架对于成功构建可靠 高效的应用程序至关重要 NET 读作 dot net 是一个强大而广泛使用的框架 为开发人员提供了丰富的工具和功能 以简化开发过程并加快交付时间 本文将介绍 NET的基本概念
  • 【手撕RPC服务分几步】

    手撕RPC服务分几步 前言 什么是RPC 从被调用方 provider 来说 从调用方 consumer 来说 扩展思考 dubbo架构图 前言 本文试图通过手撕RPC的理论步骤来帮助我们更好的理解其特性 也更好的理解像Dubbo sofa
  • flutter 填坑之旅(dart学习笔记篇)

    俗话说 工欲善其事必先利其器 想要撸flutter app 而不懂 dart 那就像一个不会英语的人在和英国人交流 懵 安装 dart 就不用说了 比较简单dart 官网 https dart dev 安装完成后就开启学习dart 旅程吧
  • MyEclipse配置Tomcat7

    首先我们打开Myeclipse 进入偏好设置window gt perferences 进入偏好设置 perferences 在偏好设置的搜索栏那里输入tomcat查找tomcat 如下图所示 3 我们可以看到搜索到的有四个tomcat项
  • (笔试前准备)字符串匹配算法总结

    我想说一句 我日 我讨厌KMP KMP虽然经典 但是理解起来极其复杂 好不容易理解好了 便起码来巨麻烦 老子就是今天图书馆在写了几个小时才勉强写了一个有bug的 效率不高的KMP 特别是计算next数组的部分 其实 比KMP算法速度快的算法

随机推荐

  • STM32 HAL库更改中断向量表的偏移地址

    以STM32F767为例 打开system stm32f7xx c文件 定位VECT TAB OFFSET 更改此宏定义的值 即可更改偏移量
  • 富维火焰识别算法

    火灾是威胁公共安全 危害人民生命财产的灾害之一 加强消防安全管理是头等大事 对火灾做到早预防 早发现 尽量避免火灾的发生尤为重要 近年来随着网络摄像机的广泛使用以及图像处理技术的不断发展 基于视频的北京富维图像火焰识别算法得到了越来越多的关
  • Android Rom修改制作工具软件集合

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 SIN2IMG 用于固件ftf中system sin的解包 下载地址 SIN2IMG rar 使用方法 将固件ftf文件用rar打开 解压出system sin文件 将
  • Idea 修改默认的Maven配置及修改为阿里源

    每次使用Idea创建或者导入Maven项目的时候 Idea都会使用系统默认的Maven 此时 如果我们想使用自定义安装的Maven 需要在File gt other settings gt Settings for New Projects
  • STM32-custom usb

    如何建立一个自定义的HID工程呢 下面就来讲讲 首先先介绍下工程的架构 工程的总体架构下图所示 按照下图架构建工程 分析下工程布局 首先是APP 这个组里存放着主文件mian c 管理所有中断服务程序stm3210x it c 及其管理外设
  • PageObjects支持库-Poium使用方法

    PO模式 学过自动化的都知道PageObjects模式 将页面对象封装为类 页面元素和操作封装为类的属性和方法 在测试方法中调用页面对象进行测试 关于PO模式可见 http t csdn cn 0DBlP 在PO模式下 我们一般定义个一个基
  • 想写一本书,而这是序言

    口袋书 序言 现在的风口是什么 很多人会答人工智能 Artificial Intelligence AI 人工智能是一项伟大的发明 我们不得不承认 它已经为社会带来了翻天覆地的变化 并 将在未来卷起更大的风暴 不了解人工智能 就难以在这个
  • 前端js将扁平化数据转化为=菜单树

    let menuList id 1 pid 1 name 江西 id 2 pid 1 name 南昌 id 3 pid 1 name 九江 id 4 pid 1 name 广东 id 5 pid 4 n
  • 【考研】数据结构——线索二叉树

    CSDN话题挑战赛第2期 参赛话题 学习笔记 前言 本文内容源于对 数据结构 C语言版 第2版 王道讲解学习所得心得 笔记整理和总结 本文针对线索二叉树 在最后的练习中 以举例子说明该排序方法 配以图文 讲解详细 含408真题 可搭配以下链
  • 学校与工作(献于在校大学生及入职不久的工作者)

    学校与工作 每个人都把自己眼界的局限当成世界的局限 学校是非常不同于职业工作的 有些人在其早期职业生涯中栽跟头 就是因为未能从已经生活了近20年的学校环境过渡到软件行业的美丽新世界 学生的活动具有高度约束性 工作量都是规定好了的 虽然当你是
  • IEEE-754标准浮点数,十六进制与十进制转换方法(附C代码)

    十进制数与IEEE 754 32 位转换实例讲解 https blog csdn net qq 41629142 article details 83692106 https blog csdn net a627088424 article
  • springboot集成kafka实战项目,kafka生产者、消费者、创建topic,指定消费分区

    springboot集成kafka实战项目 kafka生产者 消费者 创建topic 指定消费分区 前言 本项目代码可直接集成到你现有的springboot项目中 功能包括 1 kafka生产者配置 2 kafka消费者配置 指定分区消费
  • eigen与opencv矩阵转换,eigen与matlab函数比照

    近期 项目需要 学习使用eigen矩阵库 链接时eigen的主页 发现相关中文资料比较少 今天写下使用心得 eigen配置 windows vs系列 eigen的配置很简单 下载解压后 在VC 目录下的包含目录中 将eigen的路径包含进去
  • java多线程使用教程

    文章目录 如何使用多线程 继承Thread类 实现Runnable接口 线程的生命周期 线程同步 线程间通信 shutdown 方法的重要性 如何使用多线程 在Java中 创建多线程的方式有两种 一种是继承Thread类 另一种是实现Run
  • docker中mysql初始化及启动失败解决办法

    在docker中有一个mysql服务 其数据文件是挂在在主机外面的文件 在docker中的root有访问该数据文件的权限 但是docker中mysql访问数据文件的时候提示权限不足 于是只有以root用户来启动mysql了 数据初始化 my
  • 从零开始Vue3+Element Plus后台管理系统(十)——自定义水印指令与全局注册

    在实际项目开发中 自定义指令用得还是比较多的 比如 复制粘贴 输入框防抖 输入框禁止特殊字符 权限校验 背景水印 拖拽等等 指令确实是个优雅的存在 Vue3中定义一个普通的自定义指令的详细说明参见官网 https cn vuejs org
  • Ubuntu 安装 anaconda

    文章目录 写在前面 一 官网下载安装包 二 安装 参考链接 写在前面 Ubuntu安装 anaconda 比较简单 去官网下载 anaconda 安装包 然后安装即可 自己的安装环境 Ubuntu18 04 anaconda3 博客撰写日期
  • MySQL-图形化界面工具 (下)

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有收获 但一定会有收获加油 一起努力 共赴美好人生 树高千尺 落叶归根人生不易 人间真情 目录 MySQL 修改数据 删除数据 DQL 基本语法 MySQL M
  • MySQL导出和导入SQL脚本

    首先 使用mysqldump命令的前提是 在Cmd中进入mysql安装目录下的bin目录下 才可以使用该命令 我的mysql安装在E 盘 所以 首先进入bin目录下 E Program Files MySQL MySQL Server 5
  • SLAM常用最小二乘最优化方法学习、分析和总结

    SLAM中二维视觉的定位问题被最终归为一个最小二乘问题 那么紧随其后的就是对最小二乘的最优化求解 对其求解析解显然是不太合适的 所以就需要一些数值的最优化方法对最小二乘问题进行求解 在SLAM中 常用的算法有 梯度下降法 牛顿法 以及牛顿法