MSCKF

2023-05-16

主要数据结构:StateServer当前里程计状态

// imu状态、若干相机位姿、状态协方差矩阵、噪声协方差
struct StateServer {
  IMUState imu_state;
  CamStateServer cam_states;

  // State covariance matrix
  Eigen::MatrixXd state_cov;
  Eigen::Matrix<double, 12, 12> continuous_noise_cov;
};

主要函数:

initialize() {
	loadParameters() //读取参数,初始化噪声和协方差
	createRosIO()->{	 //发布和订阅topic
		//保存IMU数据,初始化重力和IMU初始方向
		imu_sub = nh.subscribe("imu", 100,
      		&MsckfVio::imuCallback, this);
      	//MSCKF里程计
  		feature_sub = nh.subscribe("features", 40,
      		&MsckfVio::featureCallback, this);
	}
}
void MsckfVio::featureCallback(const CameraMeasurementConstPtr& msg) {
   	@第一帧图像帧为初始帧
   	
   	//对当前帧之前的imu_msg_buffer里所有IMU数据进行处理,得到当前state
   	batchIMUProcessing()->{	
   		for (const auto& imu_msg : imu_msg_buffer) 
   			processModel(imu_time, imu_msg.gyro, imu_msg.acc)->{
   				@IMU量减去bias
   				
   				//误差状态传递方程的两个矩阵 x' = F * x + G * n
   				@根据附录A计算F
   				@根据附录A计算G
   				
   				//F和G是连续时间的误差方程,需要离散化
   				//x(k+1) = Phi * x(k) + W(k)
   				@其中Phi = e^(F*dt) = I + F * dt + 0.5 * F^2 * dt^2 + ...
   				
   				// RK4阶积分传递imu误差状态
   				predictNewState(dtime, gyro, acc)->{
   					@计算Omega矩阵,四元数求导公式[见注1]:  q' = 0.5 * Omega * q
   					
   					@imu当前状态p,v,q
   					
   					@RK4积分pvq,yn+1 = yn + dt/6 * (k1 + 2*k2 + 2*k3 + k4)
   				}
   				
   				@修正状态转移矩阵Phi
   				
   				// 噪声协方差传递
   				Q = Phi * G * state_server.continuous_noise_cov * G.T * Phi.T * dtime;
   				// 状态协方差传递
   				state_server.state_cov = Phi * state_server.state_cov * Phi.T + Q;
   				
   				@若state中存在cam状态,则更改state_cov的相应块
   				@更新state时间戳
   			}
   		end for
        @更新state id
   		@清空用过的imu数据
   	}
   	
   	//预测当前cam位姿并加到msckf的state中,对系统的协方差矩阵进行增广
   	stateAugmentation(msg->header.stamp.toSec())->{
   		//根据imu-cam外参和imu状态估计cam位姿
   		R_w_c = R_i_c * R_w_i;
   		t_c_w = state_server.imu_state.position + R_w_i.T * t_c_i;
   		@将cam位姿加到state_server中
   		
   		@计算增广的cam位姿对已有状态的雅可比
   		@协方差矩阵增广
   		//      [ I(21+6N) ]               [ I(21+6N) ]^T
  		//  P = [          ] * [P11 P12] * [          ]
  		//      [    J J0  ]   [P21 P22]   [    J J0  ]
   	}
   	
   	//更新特征观测:新特征加入到map中,老特征跟踪次数加1
   	addFeatureObservations(msg);
   	
   	//update的两种情况之一:观测大于3的特征跟踪丢失
   	// 剔除不能三角化且观测次数过少的特征点,同时计算残差和雅可比
   	removeLostFeatures()->{
   		//剔除观测次数小于3和不能三角化的特征点
   		@将满足上述条件的特征点加入到invalid_feature_ids,并剔除
   		@否则加入到processed_feature_ids
   		
   		//雅可比维度H_x:(4M-3)*(21+6*N), 残差维度r:(4M-3) 
   		// r = z - H * x
   		@计算processed_feature_ids中特征点的雅可比和残差
   		for (const auto& feature_id : processed_feature_ids)
   			featureJacobian(feature.id, cam_state_ids, H_xj, r_j);
   		
   		//测量更新 
   		// S = H * P * H^T + R
   		// K = P * H^T * S^(-1)
   		// x_new = x + K * r
   		// P_new = (I - K * H) * P
   		measurementUpdate(H_x, r);
   		// 移除processed_feature_ids特征点
   		for (const auto& feature_id : processed_feature_ids)
    		map_server.erase(feature_id);
   	}
   	
   	//update的两种情况之二:slideWindow满了
   	pruneCamStateBuffer()->{
   		//移除最老帧或次新帧
   		findRedundantCamStatus(rm_cam_state_ids);
   		
   		//雅可比维度H_x:(4M-3)*(21+6*N), 残差维度r:(4M-3) 
   		// r = z - H * x
   		@计算processed_feature_ids中特征点的雅可比和残差
   		for (const auto& feature_id : processed_feature_ids)
   			featureJacobian(feature.id, cam_state_ids, H_xj, r_j);
   			
   		//测量更新
   		measurementUpdate(H_x, r);
   		
   		@将cam的对应块从state_cov中剔除
   		@将cam状态从state_server中剔除
   	}
   	
   	//发布里程计到rviz
   	publish(msg->header.stamp);
}

注1:四元数求导
令 q a = [ s a , w a ] , q b [ s b , w b ] , s 为 虚 部 , w 为 实 部 四 元 数 乘 法 : q a ⊗ q b = R ( q b ) q a , 其 中 , R ( q b ) = [ − [ w b ] × w b − w b T 0 ] + s b I = Ω b + s b I 则 四 元 数 导 数 为 : q ˙ t = lim ⁡ d t → 0 1 d t ( q t + d t − q t ) = lim ⁡ d t → 0 1 d t ( q t ⊗ q t + d t t − q t ⊗ [ 0 1 ] ) = lim ⁡ d t → 0 1 d t ( q t ⊗ [ k sin ⁡ θ / 2 cos ⁡ θ / 2 ] − q t ⊗ [ 0 1 ] ) = lim ⁡ d t → 0 1 d t ( q t ⊗ [ k θ / 2 1 ] − q t ⊗ [ 0 1 ] ) = lim ⁡ d t → 0 1 d t ( R ( [ k θ / 2 1 ] ) − R ( [ 0 1 ] ) ) q t = lim ⁡ d t → 0 1 d t [ [ − θ 2 ] × θ 2 − θ T 2 0 ] q t 又 有 角 速 度 w = lim ⁡ d t → 0 θ d t , 因 此 上 式 最 终 化 简 为 : q ˙ t = 1 2 Ω ( w ) q t = 1 2 q t ⊗ [ w 0 ] 令q_a=[s_a,w_a],q_b[s_b,w_b],s为虚部,w为实部 \\ 四元数乘法:q_a \otimes q_b=R(q_b)q_a,\\ 其中,R(q_b)=\begin{bmatrix} -[w_b]_{\times} & w_b\\-w_b^T &0 \end{bmatrix}+s_bI=\Omega_b+s_bI \\ \begin{aligned} 则四元数导数为:\dot q_t&=\lim_{dt\rightarrow0}\frac{1}{dt}(q_{t+dt}-q_t)\\ &=\lim_{dt\rightarrow0}\frac{1}{dt}(q_{t}\otimes q^t_{t+dt}-q_t\otimes\begin{bmatrix}0\\1\end{bmatrix})\\ &=\lim_{dt\rightarrow0}\frac{1}{dt}(q_{t}\otimes \begin{bmatrix}k\sin\theta/2\\\cos\theta/2\end{bmatrix}-q_t\otimes\begin{bmatrix}0\\1\end{bmatrix}) \\ &=\lim_{dt\rightarrow0}\frac{1}{dt}(q_{t}\otimes \begin{bmatrix}k\theta/2\\1\end{bmatrix}-q_t\otimes\begin{bmatrix}0\\1\end{bmatrix}) \\ &=\lim_{dt\rightarrow0}\frac{1}{dt}(R(\begin{bmatrix}k\theta/2\\1\end{bmatrix})-R(\begin{bmatrix}0\\1\end{bmatrix}))q_t \\ &=\lim_{dt\rightarrow0}\frac{1}{dt}\begin{bmatrix}[-\frac{\theta}{2}]_{\times} & \frac{\theta}{2}\\-\frac{\theta^T}{2} & 0\end{bmatrix}q_t \end{aligned} \\ 又有角速度w=\lim_{dt\rightarrow0} \frac{\theta}{dt},因此上式最终化简为:\\ \dot q_t=\frac{1}{2}\Omega(w)q_t=\frac{1}{2}q_t\otimes \begin{bmatrix} w \\ 0\end{bmatrix} qa=[sa,wa],qb[sb,wb],swqaqb=R(qb)qa,R(qb)=[[wb]×wbTwb0]+sbI=Ωb+sbIq˙t=dt0limdt1(qt+dtqt)=dt0limdt1(qtqt+dttqt[01])=dt0limdt1(qt[ksinθ/2cosθ/2]qt[01])=dt0limdt1(qt[kθ/21]qt[01])=dt0limdt1(R([kθ/21])R([01]))qt=dt0limdt1[[2θ]×2θT2θ0]qtw=dt0limdtθq˙t=21Ω(w)qt=21qt[w0]

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

MSCKF 的相关文章

  • 【泡泡机器人公开课】第一O五课:MSCKF介绍-邱笑晨

    转载自 xff1a https mp weixin qq com s sGSxJAZcSJ9uoGyXvx3gEg 泡泡机器人公开课 第一O五课 xff1a MSCKF介绍 邱笑晨 原创 邱笑晨 泡泡机器人SLAM 2019 06 30 欢
  • MSCKF那些事(二)S-MSCKF试用与源码解析

    转载自 xff1a https zhuanlan zhihu com p 76347723
  • 有MSCKF讲解的课程

    有MSCKF讲解的课程 https blog csdn net sinat 16643223 article details 114456269 https www shenlanxueyuan com course 201 source
  • MSCKF_VIO作者就是用小觅双目摄像头跑的

    https gitee com maxibooksiyi msckf vio GPS 我在youtube上也看到有人用小觅摄像头跑MSCKF VIO 还有小觅自己也写过用小觅摄像头跑MSCKF https blog csdn net sin
  • 我感觉要不就先用T265跑一下MSCKF?

    我感觉要不就先用T265跑一下MSCKF xff1f 主要是我现在我笔记本识别D435i不太行 也是受这篇启发 https blog csdn net sinat 16643223 article details 119278857
  • 任何的卡尔曼滤波器的研究都要紧紧围绕状态与方差的传播特性。 让我想起MSCKF是误差状态的EKF模型。

    任何的卡尔曼滤波器的研究都要紧紧围绕状态与方差的传播特性 让我想起MSCKF是误差状态的EKF模型 传播特性应该就是指预测方差或者递推方程 xff1f https blog csdn net sinat 16643223 article d
  • MSCKF

    https github com TurtleZhong msckf mono
  • 运行msckf_vio

    1 编译 cd span class token operator span span class token operator span msckf catkin make span class token operator span p
  • MSCKF代码梳理

    梳理一遍MSCKF代码 xff0c 也作为复习
  • MSCKF-vio源码阅读

    作为一个菜狗来说 xff0c 一开始弄明白kf ekf等滤波方法实属不易 xff0c 但是一旦理解原理之后再发散到基于滤波的状态估计方法 xff0c 学习起来就会事半功倍 xff0c 就像导航包中的robot pose ekf xff0c
  • 视觉惯性里程计 综述 VIO Visual Inertial Odometry msckf ROVIO ssf msf okvis ORB-VINS VINS-Mono gtsam

    视觉惯性里程计 VIO Visual Inertial Odometry 视觉 惯性导航融合SLAM方案 博文末尾支持二维码赞赏哦 视觉惯性SLAM专栏 VINS技术路线与代码详解 VINS理论与代码详解0 理论基础白话篇 vio data
  • S-MSCKF代码阅读

    阅读学习代码 文章目录 第一部分 xff1a 相关库函数介绍1 pluginlib理解与示例2 nodelet3 launch文件4 Eigen内存分配器5 std map的第三个参数6 image transport7 message f
  • MSCKF

    主要数据结构 xff1a StateServer当前里程计状态 imu状态 若干相机位姿 状态协方差矩阵 噪声协方差 struct StateServer IMUState imu state CamStateServer cam stat
  • EKF SLAM 以及MSCKF 学习

    参考 xff1a https zhuanlan zhihu com p 21381490 https citeseerx ist psu edu viewdoc download jsessionid 61 FA1024834F74311E
  • 运行msckf_vio

    MSCKF vio是一种基于多状态约束卡尔曼滤波器的双目视觉里程计 其中多状态约束是指将多帧图像的相机位姿加入卡尔曼状态向量中 xff0c 在进行卡尔曼增益之前通过多帧图像之间的约束进行最小二乘优化来估计特征点的空间位置 xff0c 然后根
  • ROS kinetic 运行s_msckf和 vins_fusion

    s msckf xff1a 采用多状态约束的双目vio系统 注意 imuCallback xff1a 接收IMU数据 xff0c 将IMU数据存到imu msg buffer中 xff0c 这里只会利用开头200帧IMU数据进行静止初始化
  • 20.9.24 msckf_vio学习——源码试用问题

    msckf vio学习参考文见 xff1a https zhuanlan zhihu com p 76347723 本文主要解决在运行时的一些报错问题 xff1a 1 编译时出现没有random numbers的问题 博文 2 测试时 xf
  • msckf_vio使用记录

    使用环境 xff1a ubuntu14 04 indigo indigo版本的ros默认支持的是opencv2 4 8 xff0c 其带的库cv bridge依赖于opencv2 但是 xff0c msckf vio使用的是Ubuntu 1
  • MSCKF 源码解析 一

    论文 xff1a https arxiv org abs 1712 00036 源码路径 https github com daniilidis group msckf mono 源码框架 上图展示了整个msckf源码框架 xff0c 每当
  • msckf_mono构建运行方法

    背景 博主是在读Davide Scaramuzza投稿到ICRA 2018的VIO综述文章 A Benchmark Comparison of Monocular Visual Odometry Algorithms for Flying

随机推荐

  • 搜索文本内容——Java代码的简单实现(修改版)

    文章标题 搜索文本内容 Java 代码的简单实现 修改版 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程
  • 用反射和内省技术实现简单SpringIOC

    文章标题 用反射和内省技术实现简单 SpringIOC 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 作者声
  • 在JSP中用自定义标签实现集合的遍历——山寨版c:foreach

    文章标题 在 JSP 中用自定义标签实现集合的遍历 山寨版 lt c foreach gt 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 在 JSTL 中 xff0c 标签
  • 自定义标签学习笔记

    文章标题 自定义标签学习笔记 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c 敬请各位指出 首先对 JSP 中标签的各
  • 练习瑜伽一个半月的感受(附思维导图)

    文章标题 练习瑜伽一个半月的感受 xff08 附思维导图 xff09 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newju
  • 一套适合理工类学科的学习法——《千万别恨数学》读后感

    文章标题 一套适合理工类学科的学习法 千万别恨数学 读后感 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 编程环境 JDK 1 6 0 01 作者声明 欢迎转载文章 xff0
  • Java Web开发中路径问题小结

    文章标题 Java Web 开发中路径问题小结 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c 敬请各位指出 Java
  • Java中this的用法

    一 this关键字 1 this的类型 xff1a 哪个对象调用就是哪个对象的引用类型 二 用法总结 1 this data 访问属性 2 this func 访问方法 3 this 调用本类中其他构造方法 三 解释用法 1 this da
  • 带你认识Google 屌炸天的AR项目——Project Tango

    这两年虚拟现实VR和增强现实AR简直火的不要不要的 xff0c 众多巨头都在发力 xff0c Google也推出了自己的AR技术解决方案 xff0c 因为目前介绍Tango的中文资料还比较少 xff0c 所以本人结合官网文档和自己的理解写了
  • 山寨版struts的TokenProcessor类

    文章标题 山寨版 struts 的 TokenProcessor 类 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c
  • 用Java代理技术改造HttpServletRequest类

    文章标题 用 Java 代理技术改造 HttpServletRequest 类 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 x
  • app后端设计(13)--IM4JAVA+GraphicsMagick实现中文水印

    在app的后台中 xff0c 有时候为了标示版权 xff0c 需要给图片加上水印 在liunx中 xff0c IM4JAVA 43 GraphicsMagick是个高效处理图片的方案 xff0c 图片的裁剪是使用了这个技术方案 xff0c
  • app后端设计(14)--LBS的偏移问题

    刚开始做LBS的时候 xff0c 有一个问题 xff0c 通过手机获取的坐标 xff0c 放到百度地图或高德地图上 xff0c 总是会出现偏移 xff0c 例如 xff0c 当时是在微信的前总部 南方通讯大厦 附近获取的坐标 xff0c 那
  • 1.用互联网的产品思维打造一本app后端的书

    刚刚接触app后端 xff0c 是做完adidas中国的官方商城的时候 xff0c 那时不清楚app后端应该怎么架构 xff0c 只能摸着石头过河 xff0c 网络上只有一些零散的资料 xff0c 遇到问题 xff0c 只能不断地搜索 xf
  • 2. 网友对app后端写作系列文章的写作建议

    很感谢 app 后端 qq 群的网友 xff0c 在发布消息后 xff0c 就收到了大量网友的反馈 下面的建议会融入到写作当中 xff1a 1 还有 xff0c 对版本升级很感兴趣 xff0c 我们现在为了兼容旧版本 xff0c 已经把工程
  • 3.对经历过的创业项目的总结

    在传统的计算机行业 xff0c 做一个产品先做需求分析 xff0c 然后做设计 xff0c 划分里程碑 xff0c 最后测试 xff0c 上市 但在移动互联网行业 xff0c 这种做产品方法要不得 移动互联网变得太快了 xff0c 有可能之
  • 4.app是怎么炼成的

    很多刚进入app后端的小伙伴 xff0c 有的是之前没有接触过这个行业 xff0c 有的是只在学校学习了基本的技术知识 xff0c 不知道开发app的整个流程是怎么样的 xff0c 因此心里会有一股恐惧 听着别人口中的一大串app相关的术语
  • 5.两分钟让你明白app后端有啥用

    app后端 xff0c 也称为app后台 xff0c 称呼不一样 xff0c 但指的是同一个东西 我一直都以app后端有啥用这个问题不用解释 但在网络上 xff0c 有准备进行app创业的网友 xff08 是从传统行业过来的 xff09 问
  • 6.app架构基础

    app架构 xff0c 一个听起来高大尚的名字 xff0c 很多小伙伴听到这个词语感觉很迷茫 xff0c 不知道架构具体说的是啥 xff1f 在 xff51 群里 xff0c 34 app后端应该怎么架构 34 这个问题被问了无数次 通过阅
  • MSCKF

    主要数据结构 xff1a StateServer当前里程计状态 imu状态 若干相机位姿 状态协方差矩阵 噪声协方差 struct StateServer IMUState imu state CamStateServer cam stat