多传感器融合框架-ESKF

该博客介绍了基于ROS的数据预处理节点和滤波器节点,用于同步和融合IMU与GNSS数据。数据预处理涉及时间戳同步和点云畸变补偿,而滤波器节点使用了时间同步数据进行初始化和滤波预测、观测修正。实验结果显示,该方法能达到约0.3m的绝对轨迹误差,但实时性和稳定性仍有待提升。提供了数据集和框架的下载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

架构

基本同图优化框架差不多

内容简述

请添加图片描述

数据预处理节点

  1. 订阅imu原始数据,gnss原始数据,完成数据时间戳同步、点云畸变补偿
  2. 发布如下消息
    • 畸变补偿后的点云/synced_cloud
    • gnss里程计/synced_gnss,注意这里的里程计包含了Twist数据(imu速度和角速度)
    • 同步后的自定义ros消息/synced_pos_vel:PosVel数据(gnss/imu的位置和速度信息)
    • 同步后的imu数据/synced_imu

滤波器节点

  1. 订阅imu原始数据以及数据预处理节点发布的所有话题消息

  2. 使用时间戳同步好的数据进行初始化,使用scan context进行初始化

  3. 然后就是滤波预测和观测修正

    • 当imu原始数据达到,此时并没有观测,则值进行预测,主要更新协方差矩阵
    • 当前端里程计有观测数据时,对滤波器进行观测修正并重置状态

结果

整体误差如下:

请添加图片描述

APE w.r.t. full transformation (unit-less)
(not aligned)

       max	1.136680
      mean	0.258573
    median	0.224092
       min	0.017928
      rmse	0.306049
       sse	166.163466
       std	0.163726

可以达到0.3m左右的绝对轨迹误差,效果没有图优化好。

缺点

  1. ESKF误差状态的运动方程离散化其实是存在闭式解的,可以参考Quaternion kinematics for the error-state Kalman filter附录B
  2. 实时性的效果并不好,如果高频播放数据集,很容易直接跑飞,有待优化

数据集:

链接: https://pan.baidu.com/s/1oaMtP6jz0My5NEaE-X-83w 密码: vb02
–来自百度网盘超级会员V4的分享
框架:
链接: https://pan.baidu.com/s/1azX1lTFPF0RzLQJDnZxgBA 密码: eshb
–来自百度网盘超级会员V4的分享

ESKF (Error State Kalman Filter) 是一种用于传感器融合的卡尔曼滤波变体,常用于机器人导航和定位中。IMU (Inertial Measurement Unit)、激光雷达 (LiDAR) 和里程计 (Odometry) 的紧耦合是指将这些传感器的数据在一个统一的框架下进行融合,以提高定位和建图的精度。 在C++中实现ESKF IMU LiDAR 里程计紧耦合可以按照以下步骤进行: 1. **传感器数据获取**:首先,需要从IMU、激光雷达和里程计获取原始数据。这些数据通常通过串口或网络接口获取。 2. **数据预处理**:对原始数据进行预处理,例如IMU数据的去偏、加速度计和陀螺仪数据的校准,激光雷达数据的去噪和特征提取,里程计数据的校准等。 3. **状态预测**:使用IMU数据预测机器人的状态(位置、速度、姿态等)。这一步需要使用运动学模型和IMU的测量值。 4. **观测更新**:使用激光雷达和里程计数据进行观测更新。通过将预测的状态与观测数据进行比较,计算出状态估计的误差,并使用卡尔曼滤波器更新状态估计。 5. **误差状态更新**:ESKF的核心在于误差状态更新。通过计算状态估计的误差,并将其应用于当前状态估计,以获得更精确的状态估计。 6. **循环迭代**:不断重复步骤3到5,以实时更新机器人的状态估计。 以下是一个简单的C++代码框架,展示了如何实现ESKF IMU LiDAR 里程计紧耦合: ```cpp #include <iostream> #include <vector> #include <Eigen/Dense> class ESKF { public: ESKF() { // 初始化状态向量和协方差矩阵 state = Eigen::VectorXd::Zero(state_dim); covariance = Eigen::MatrixXd::Identity(state_dim, state_dim); } void predict(const Eigen::VectorXd& imu_data, double dt) { // 使用IMU数据进行状态预测 // ... } void update(const Eigen::VectorXd& lidar_data, const Eigen::VectorXd& odom_data) { // 使用激光雷达和里程计数据进行观测更新 // ... } Eigen::VectorXd getState() const { return state; } private: int state_dim; Eigen::VectorXd state; Eigen::MatrixXd covariance; // 其他必要的成员变量和方法 }; int main() { ESKF eskf; std::vector<Eigen::VectorXd> imu_data, lidar_data, odom_data; double dt = 0.01; // 时间步长 // 假设已经获取了IMU、激光雷达和里程计数据 // ... for (size_t i = 0; i < imu_data.size(); ++i) { eskf.predict(imu_data[i], dt); eskf.update(lidar_data[i], odom_data[i]); Eigen::VectorXd state = eskf.getState(); std::cout << "State: " << state.transpose() << std::endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值