vins博客的一部分8

2023-05-16

目录

    • optimization()
    • slideWindow()

optimization()

优化先验残差、重投影残差、预积分残差。(即要拟合的目标是,之前边缘化后的先验值,前后帧之间的IMU的预积分值,每一个特征点的重投影位置。)

首先通过一个函数vector2double()把vector转为double(ceres支持),然后并把Rs Ps Vs Bas…的数据提出来存到para_Pose para_SpeedBias …中

1 定义问题和核函数

ceres::Problem problem;// 定义ceres的优化问题
ceres::LossFunction *loss_function;//核函数
//loss_function = NULL;
loss_function = new ceres::HuberLoss(1.0);//HuberLoss:当预测偏差小于 δ 时,它采用平方误差,当预测偏差大于 δ 时,采用的线性误差。

2 添加优化参数

用四元数表示旋转不支持加法,通过LocalParameterization定义了新的加法和雅克比。
其成员函数加法Plus:

  • 将位姿的P Q分离开,对于变化δ(位置P和角度theta)
  • P直接相加
  • Q是 先将theta转换为四元数,然后与Q相乘,再归一化为单位四元数.

然后将滑窗内关键帧的P(xyz) Q(xyzw) 和 V Ba Bg添加到Parameter中:

for (int i = 0; i < frame_count + 1; i++)
	problem.AddParameterBlock(para_Pose[i], SIZE_POSE, local_parameterization);
	problem.AddParameterBlock(para_SpeedBias[i], SIZE_SPEEDBIAS);  

把待优化量 “相机与IMU的外参” “td” 也放到优化问题problem中,可以选择不优化:problem.SetParametecrBlockConstant(para_Ex_Pose[i]);

3 添加约束条件

  • 在问题中添加边缘化约束

就是边缘化得到的结果的 J J J e e e,参见marginalize

MarginalizationFactor *marginalization_factor = new MarginalizationFactor(last_marginalization_info);
problem.AddResidualBlock(marginalization_factor, NULL, last_marginalization_parameter_blocks);
  • 在问题中添加IMU约束

pre_integrations[j]是i~j帧间的预积分项,它包含了imu预积分的值、增量误差的雅可比、协方差矩阵、残差计算函数…一起就传进去计算残差和残差的雅可比。
将滑窗内所有的imu预积分需要的优化量,成对传入残差块,para_Pose[i]等为滑窗内的P Q,para_SpeedBias[i]为 V Ba Bg。
利用imu预积分的值等计算残差,详见IMUFactor

for (int i = 0; i < frame_count; i++)
   IMUFactor* imu_factor = new IMUFactor(pre_integrations[j]);//传入不需要优化的常量
   problem.AddResidualBlock(imu_factor, NULL, para_Pose[i], para_SpeedBias[i],para_Pose[j], para_SpeedBias[j]);//每次:ij帧的 pqv 和ba bg
  • 在问题中添加相机约束

将所有的特征点,每个id对应的所有帧上他的归一化平面位置、速度成对传入;
将滑窗内对应刚刚传入的特征点的帧需要的优化量 P Q 外参 逆深度 td 成对传入残差块
详见ProjectionTwoFrameOneCamFactor

for (所有帧)
    ProjectionTwoFrameOneCamFactor *f_td = new ProjectionTwoFrameOneCamFactor(2个xyz,2个u,2个td)//传入不需要优化的常量:点的位置、像素速度
    problem.AddResidualBlock(f_td, loss_function, para_Pose[imu_i], para_Pose[imu_j], para_Ex_Pose[0], para_Feature[feature_index], para_Td[0]);

如果是双目的,对右目也计算一次重投影误差,ProjectionTwoFrameTwoCamFactor和左目完全一样,只是重投影到了右目,外参用的 IMU->右camera

4 配置优化选项求解

ceres::Solver::Options options;//优化选项
ceres::Solver::Summary summary;//优化信息
ceres::Solve(options, &problem, &summary);//求解

5 边缘化掉最老帧

构建边缘化的 H δ x = b Hδx=b Hδx=b,然后舒尔补得到下次的先验约束和先验残差,这里的 H b Hb Hb只和要丢弃的变量有关。

  • 添加与本次要丢弃变量相关的marg约束

  • 添加要marg的imu约束

  • 添加视觉的marg信息

  • preMarginalize()得到IMU和视觉观测对应的参数块,雅克比矩阵,残差值

  • marginalize()进行舒尔补正式边缘化

详见marginalize

//最后
last_marginalization_info = marginalization_info;//本次边缘化结果作为下次的值
last_marginalization_parameter_blocks = parameter_blocks;//优化变量的递归

结束!
我感觉是这个流程:
在这里插入图片描述

slideWindow()

如果标志位是边缘化最老帧

  • 通过一个循环,swap(A[i], A[i+1]), A包括 Rs Ps Vs Ba Bg pre_integrations dt_buf linear_acc angular_v, 将最老帧移到开头,循环的结果是,例如开始A是0123456789,变成1234567890

  • 然后,PVQBaBg最后一个等于上一个,变成1234567899,再把pre_integrations dt_buf linear_acc angular_v最末尾的清掉。

  • 通过Estimator::slideWindowOld()函数及其包含的f_manager.removeBackShiftDepth(R0, P0, R1, P1)在特征点管理器f_manager中更新存储的相关帧信息(作用主要是删除最老帧的特征点)

如果要边缘化前一帧
就把倒数第二帧的值,(主要是 pre_integrations, Ps, Rs, acc, angular_v, Vs, Ba, Bg换成当前帧的值,slideWindowNew()把倒数第二帧的特征点删掉,最后重新new一个预积分项, 为下一次准备

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

vins博客的一部分8 的相关文章

  • 收藏 | 最全深度学习训练过程可视化工具

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 仅作学术分享 xff0c 不代表本公众号立场 xff0c 侵权联系删除 转载于 xff1a 编辑丨极市平台 机器学习实验室 深度学习训
  • 为什么建议大家使用 Linux 开发?真的很很很优雅!

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 编者荐语 Linux 开发不算简单 xff0c 要求同学们掌握的知识广且复杂 xff0c 有一定难度 但是同学们只要静下心来 xff0
  • favicon.ico不显示

    静态页面中 xff0c title前的favicon ico不显示的问题 原因还不详 解决办法 xff1a 清除浏览器缓存或者将favicon ico文件重命名
  • 树莓派系统镜像的下载和烧录

    一 树莓派镜像下载地址 树莓派官网的下载地址 xff1a 树莓派官网 软件安装 可在官网上下载最新的Raspbian树莓派系统 二 树莓派系统镜像烧写 准备 xff1a 一张2G以上的SD卡及读卡器 xff0c 最好是高速卡 xff0c 推
  • TF 坐标变换(已整理)

    文章目录 坐标msg消息静态坐标变换1 C 43 43 实现发布方 demo01 static pub cpp订阅方 demo02 static sub cpp 2 Python实现发布方 demo01 static pub p py订阅方
  • ROS Action通信

    文章目录 自定义action文件 类似msg和service 服务端 action01 server cpp客户端 action02 client cpp服务端 action01 server p py客户端 action02 client
  • 位姿图优化小记2021.10.18

    1 场景描述 现在有一个小车在运动 xff0c 并搭载相机或激光雷达进行建图工作 xff0c 由于SLAM的作用 xff0c 在建图的同时小车也可以进行自身的定位 xff0c 因此建立的地图的参考都是相对于自身坐标系的 xff0c 也就是每
  • 【CRAHNs】CRAHNs网络中多径环境下大规模MIMO接收信道估计均衡技术

    1 软件版本 matlab2017b 2 本算法理论知识 对于大规模MIMO xff0c 通常情况下 xff0c 采用3D MIMO信道来实现 这是由于3D MIMO一般采用大规模的二维天线阵列 xff0c 不仅天线端口数较多 xff0c
  • VINS笔记1——滤波与优化

    1 滤波 1 1 什么是滤波 这里的卡尔曼滤波实际上和信号处理里面的滤波有很大的不同 信号处理里面的滤波 xff0c 假设一个正弦信号有很多毛刺 xff0c 想要对其进行滤波滤除毛刺 信号处理里面的做法是把信号进行FFT变换到频域 xff0
  • Ubuntu设置CMake编译时使用的OpenCV版本

    文章目录 1 方法一 xff1a 统一修改CMakeLists txt文件中的OpenCV版本1 1 具体操作1 2 命令讲解1 2 1 sed命令1 2 2 xargs命令1 2 3 find命令 2 方法二 xff1a 调用cmake命
  • ROS中常见的msg消息类型

    文章目录 1 基本数据类型1 1 三维向量Vector3 msg1 2 标头Header msg1 3 四元数Quaternion msg1 4 空间中三维点Point msg 2 传感器数据类型2 1 Imu msg 3 机器人状态数据类
  • VIO标定工具kalibr和imu_utils的使用

    0 参考资料 Kalibr进行IMU 43 相机的标定 xff1a 这个步骤写的非常好 xff0c 应该是目前看到的最符合的步骤了 使用ROS功能包标定相机内参 Kalibr标定camera IMU详细步骤 xff1a 这篇博客里给出了它的
  • ros功能包安装

    正确指令 xff1a sudo apt get install ros kinetic dwa local planner 以后安装安装包 xff0c 用sudo apt get install ros kinetic 缺少的PACKAGE
  • vins-mono编译问题--rosrun launch问题

    launch is neither a launch file in package nor is a launch file name解决办法 cd catkin ws source devel setup bash catkin ws
  • 软件工程中的框架是什么?什么是框架?

    IT领域 软件工程中所说的框架是什么 xff1f 1 1 什么是框架 xff1f 软件框架 xff08 software framework xff09 的标准定义 xff1a 通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范
  • Docker容器中远程连接实现GUI图形显示的配置方法

    1 输入xhost 43 没有问题的话会提示 access control disabled clients can connect from any host 2 使用echo DISPLAY查看本地显示器localhost 会打印结果
  • HAL库 串口收发函数解析

    一 UART Receive IT 对于CubeMX生成的代码 xff0c USART1 IRQHandler void 函数为了提高中断效率采用了回调机制 xff08 业务代码可以等中断关闭了再去处理 xff0c 这样中断处理不会占用太多
  • c++调用python

    在我们的生活中 xff0c 如果我们想调用其他程序的话 xff0c 往往会需要一些额外的代码 xff0c 比如说我们要调用 python去执行某些函数 在我们使用 python的过程中 xff0c 为了能够调用其他程序 xff0c 我们往往
  • 基于simulink的svm-dtc-adrc控制建模与仿真

    目录 一 理论基础 二 核心程序 三 仿真结论 一 理论基础 永磁电机由于没有励磁绕组和励磁装置 xff0c 不消耗励磁功率 xff0c 对磁极设在转子的电机 如一般同步电机 还可省去滑环和电刷 随着永磁材料和控制技术的发展 xff0c 永
  • 关于自制openmv的一些建议

    从接触到openmv开始一直都想制作一块自己的openmv xff0c 包括从硬件 xff0c 到烧录程序 最开始制作的版本是openmv3 xff0c 其实openmv3并不是属于自己制作 xff0c 而是下载的硬件电路城开源的openm

随机推荐

  • vue3创建文件报“组件名称应该总是由多个单词组成“Component name “index“ should always be multi-word

    在项目根目录下的 eslintrc js 文件中添加 vue multi word component names off 没有该文件就创建一个 module span class token punctuation span export
  • STM32和ARM的区别?

    下面先看一张图 xff1a 这张图是我在意大利与法国合资的意法半导体公司 xff08 ST xff0c 世界几大半导体公司之一 xff09 的官网上看到的 这说明 xff0c STM32是意法半导体公司的产品 意法半导体 xff08 ST
  • OrangePi 5 Docker下安装OpenWRT作软路由(同样适用于树莓派等设备)

    OrangePi5 Docker下安装OpenWRT作软路由 xff08 同样适用于树莓派等设备 xff09 说明 本文的软路由作为家中的二级路由 xff0c 用一根网线连接主路由的LAN口和二级路由的WAN口 xff08 当主路由使用配置
  • kubernetes-----k8s入门详解

    目录 docker的编排工具 k8s的介绍 k8s的特性 pod的分类 service 网络 通信 认证与存储 插件 docker的编排工具 docker的第一类编排工具 xff08 docker三剑客 xff09 docker compo
  • ROS机械臂开发:Moveit + Gazebo仿真/Gazebo配置

    一 ROS中的控制器插件 ros control的功能 xff1a ROS为开发者提供的机器人控制中间件 包含一系列控制器接口 传动装置接口 硬件接口 控制器工具箱等等 可以帮助机器人应用功能包快速落地 xff0c 提高开发效率 ros c
  • 匿名飞控openmv寻色块解读

    作者 xff1a 不会写代码的菜鸟 时间 xff1a 2019 7 26 源码 xff1a 匿名TI板飞控源码 43 openmvH4 说明 xff1a 限于本人水平有限 xff0c 并不能写的很详细 xff0c 还望各位能够补充
  • 校验和的计算方法

    实验要求 编写一个计算机程序用来计算一个文件的16位效验和 最快速的方法是用一个32位的整数来存放这个和 记住要处理进位 xff08 例如 xff0c 超过16位的那些位 xff09 xff0c 把它们加到效验和中 要求 xff1a 1 x
  • MT7621路由器芯片/处理器参数介绍

    MT7621路由器芯片包括一个880 MHz MIPS 1004Kc CPU双核 xff0c 一个5端口10 100 1000交换机 PHY和一个RGMII 嵌入式高性能cpu可以很容易地处理高级应用程序 如路由 安全和VoIP等 MT76
  • 谈谈你对事件的传递链和响应链的理解

    一 xff1a 响应者链 UIResponser包括了各种Touch message 的处理 xff0c 比如开始 xff0c 移动 xff0c 停止等等 常见的 UIResponser 有 UIView及子类 xff0c UIViCont
  • CMake 引入第三方库

    CMake 引入第三方库 在 CMake 中 xff0c 如何引入第三方库是一个常见的问题 在本文中 xff0c 我们将介绍 CMake 中引入第三方库的不同方法 xff0c 以及它们的优缺点 1 使用 find package 命令 在
  • u-boot的启动模式(面试常考)

    交互模式 uboot启动之后 xff0c 在倒计时减到0之前按任意键 xff0c uboot会进入到交互模式 xff0c 此时可以输入各种uboot命令 和uboot进行交互 自启动模式 uboot启动之后 xff0c 在倒计时减到0之前不
  • vins-fusion代码理解

    代码通读了一遍做些总结 xff0c 肯定有很多理解错了的地方 xff0c 清晰起见详细程序都放到引用链接里 从rosNodeTest cpp开始 main函数 ros span class token operator span span
  • vins博客的一部分1

    文章目录 imu callbackimg callback imu callback 从话题中读入各个数据的t x y z g y r xff0c 存放到acc和gry中 span class token comment 从话题读入 spa
  • vins博客的一部分2

    sync process 对两个imgBuf里的图像进行双目时间匹配 xff08 通过判断双目图像时间之差 lt 3ms xff09 xff0c 扔掉匹配不到的老帧 span class token keyword double span
  • vins博客的一部分3

    FeatureTracker trackImage 包含了 xff1a 帧间光流法 区域mask 检测特征点 左右目光流法匹配 计算像素速度 画图 跟踪上一帧的特征点 如果已经有特征点 xff0c 就直接进行LK追踪 xff0c 新的特征点
  • vins博客的一部分4

    processMeasurements 取出数据 将 featureBuf中 xff0c 最早帧的feature取出 xff1a feature 61 featureBuf front 节点的接收IMU的消息再imu callback中被放
  • vins博客的一部分5

    目录 initFirstIMUPose xff08 xff09 processIMU propagate initFirstIMUPose xff08 xff09 得到IUM的Z与重力对齐的旋转矩阵 xff1a IMU开始很大可能不是水平放
  • vins博客的一部分6

    processImage 输入是本帧的特征点 id cam id xyz uv vxvy 包含了检测关键帧 估计外部参数 初始化 状态估计 划窗等等 检测关键帧 选择margin帧 addFeatureCheckParallax 检测和上一
  • vins博客的一部分7

    目录 initFramePoseByPnP frame count Ps Rs tic ric triangulate frame count Ps Rs tic ric initFramePoseByPnP frame count Ps
  • vins博客的一部分8

    目录 optimization slideWindow optimization 优化先验残差 重投影残差 预积分残差 xff08 即要拟合的目标是 xff0c 之前边缘化后的先验值 xff0c 前后帧之间的IMU的预积分值 xff0c 每