VINS_FUSION的global融合思想

VINS_FUSION采用全局融合来解决局部观测的累计漂移问题,克服GPS数据的不平滑和低频输出。通过将GPS坐标转换为大地坐标并以第一帧GPS为原点,利用最小二乘法进行优化。在代码实现中,对GPS和VIO数据进行处理,转换坐标系,并通过Ceres进行优化。目标是实现局部精确和全局零漂。

VINS_FUSION的global融合思想


使用全局融合的原因

  • 局部观测存在累计漂移,室外大场景难以运行
  • 局部观测数据缺乏全局约束,导致在不同的位置进行建图和定位都会得到不同坐标系下的结果,难以进行全局结果的观测

GPS的缺点

  • 数据不平滑,噪声过大
  • 输出频率低(1hz)

融合的目的

  • 局部精确
  • 全局零漂

算法架构

Screenshot from 2020-04-09 14-46-33.png-197.7kB

观测和状态约束关系

Screenshot from 2020-04-09 14-49-30.png-97.7kB

  • state: 状态量,位姿,速度,bias等
  • Local Factor: 局部观测约束,VIO相对位姿变换, 计算的是相邻两帧之间位姿的残差

GPS 融合思路

  • 经纬度坐标系转换为大地坐标系(东北天坐标系ENU:local East North Up)
  • 第一帧的gps点为坐标系原点
  • 求最小二乘
    X ∗ = arg ⁡ max ⁡ x    ∏ t = 0 n ∏ k ∈ S e x p ( − 1 2 ∥ z t k − h t k ( X ) ) ∥ Ω t k 2 ) = arg ⁡ min ⁡ x    ∑ t = 0 n ∑ k ∈ S ∥ z t k − h t k ( X ) ) ∥ Ω t k 2 . \begin{aligned}X^* &= \mathop{\arg\max}_{x} \ \ \prod_{t=0}^{n}\prod_{k\in S}exp(-\frac{1}{2} \|z_t^k-h_t^k(X))\|^2_{\Omega_t^k}) \\ &= \mathop{\arg\min}_{x} \ \ \sum_{t=0}^{n}\sum_{k\in S}\|z_t^k -h_t^k(X))\|^2_{\Omega_t^k}. \end{aligned} X=argmaxx  t=0nkSexp(21ztkhtk(X))Ωtk2)=argminx  t=0nkSztkhtk(X))Ωtk2.
  • 注意这里的马氏距离要进行一个分解才可以进行最小二乘
    ∥ r ∥ Ω 2 = r T Ω − 1 r \|r\|^2_Ω = r^T\Omega^{-1}r rΩ2=r
### VINS-Fusion 视觉惯性融合技术原理及应用 #### 技术原理 VINS-Fusion 是一种基于优化的多传感器融合解决方案,主要用于视觉惯性里程计(VIO)系统。其核心思想是通过融合来自相机和惯性测量单元(IMU)的数据,实现对设备位姿的高精度估计。系统首先进行测量预处理,包括特征提取与跟踪,以及IMU测量的预积分。接着通过初始化过程获取必要的初始值,如位姿、速度、重力向量、陀螺仪偏置等,为后续的非线性优化提供支持。 在VIO模块中,预积分的IMU测量与特征观测紧密融合,以提高估计的精度和鲁棒性。此外,重定位模块帮助系统在丢失跟踪后重新找回位置,而位姿图优化模块则负责全局优化,减少漂移[^3]。 #### 数据融合 VINS-Fusion 支持多种传感器数据的融合,包括但不限于GPS。通过ROS订阅器获取VIO输出的位置和姿态信息,并将其输入到全局估计器中,实现与GPS数据的松耦合融合。这种方法允许系统在不同环境下保持较高的定位精度[^5]。 #### 应用 VINS-Fusion 在机器人导航、自动驾驶汽车、无人机等领域有着广泛的应用前景。它能够提供比单一传感器更可靠、更精确的位置估计,特别是在GNSS信号不可用或受限的环境中。例如,在室内导航、地下勘探、森林穿越等场景中,VINS-Fusion 可以作为主要的定位手段。 #### 代码示例 以下是一个简化的VIO回调函数示例,展示了如何从ROS消息中提取VIO数据并输入到全局估计器中: ```cpp void vio_callback(const nav_msgs::Odometry::ConstPtr &pose_msg) { double t = pose_msg->header.stamp.toSec(); last_vio_t = t; // 获取VIO输出的位置(三维向量),姿态(四元数) Eigen::Vector3d vio_t(pose_msg->pose.pose.position.x, pose_msg->pose.pose.position.y, pose_msg->pose.pose.position.z); Eigen::Quaterniond vio_q; vio_q.w() = pose_msg->pose.pose.orientation.w; vio_q.x() = pose_msg->pose.pose.orientation.x; vio_q.y() = pose_msg->pose.pose.orientation.y; vio_q.z() = pose_msg->pose.pose.orientation.z; // 位姿传入global Estimator中 globalEstimator.inputOdom(t, vio_t, vio_q); m_buf.lock(); // 其他操作... } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值