以FAST_LIO为例,讲解bag数据集只录制了激光雷达和IMU话题下时,如何运用evo工具

一、FAST-LIO的核心功能与输出

1. FAST-LIO是一种基于 紧耦合迭代卡尔曼滤波(iEKF) 的激光雷达-惯性里程计(LIO)框架,其核心功能包括:

  • 直接点云配准:无需提取特征点,直接将原始点云与全局地图匹配。
  • 增量k-d树(ikd-Tree):高效维护动态地图,支持实时插入和删除点云。
  • IMU与LiDAR融合:通过反向传播补偿运动畸变,实现高精度位姿估计。

2.FAST-LIO 的ROS节点会发布以下关键话题(在lasermapping.cpp文件中):

 /*** ROS subscribe initialization ***/
    ros::Subscriber sub_pcl = p_pre->lidar_type == AVIA ? \
        nh.subscribe(lid_topic, 200000, livox_pcl_cbk) : \
        nh.subscribe(lid_topic, 200000, standard_pcl_cbk);
    ros::Subscriber sub_imu = nh.subscribe(imu_topic, 200000, imu_cbk);
    ros::Publisher pubLaserCloudFull = nh.advertise<sensor_msgs::PointCloud2>
            ("/cloud_registered", 100000);
    ros::Publisher pubLaserCloudFull_body = nh.advertise<sensor_msgs::PointCloud2>
            ("/cloud_registered_body", 100000);
    ros::Publisher pubLaserCloudEffect = nh.advertise<sensor_msgs::PointCloud2>
            ("/cloud_effected", 100000);
    ros::Publisher pubLaserCloudMap = nh.advertise<sensor_msgs::PointCloud2>
            ("/Laser_map", 100000);
    ros::Publisher pubOdomAftMapped = nh.advertise<nav_msgs::Odometry> 
            ("/Odometry", 100000);
    ros::Publisher pubPath          = nh.advertise<nav_msgs::Path> 
            ("/path", 100000);
  • /Odometry:融合后的里程计信息(包含位姿、速度和协方差)。
  • /path:轨迹路径,用于可视化。
  • /cloud_registered:配准后的点云地图。

这些话题是算法处理传感器数据后的输出结果,可直接用于EVO评估。

二、从FAST-LIO中获取里程计数据的步骤

1. 运行FAST-LIO处理bag文件

FAST-LIO需要订阅LiDAR和IMU的原始话题,通过以下命令运行:

roslaunch fast_lio mapping_velodyne.launch
rosbag play your_bag.bag /velodyne/points:=/velodyne_points /imu/data:=/IMU_data
  • 关键参数配置:在config/velodyne.yaml中设置LiDAR和IMU的话题名称、外参标定、噪声参数等。

  • 输出话题:算法处理后,/Odometry会持续发布位姿信息。

在这里,rosbag play命令对话题进行了重映射,其中 /velodyne/points和/imu/data话题是FAST_LIO中config/velodyne.yaml文件对于激光雷达和IMU话题的设置,而/velodyne_points和/IMU_data是录制的bag数据集中激光雷达和IMU的话题名称。

2. 记录算法输出的里程计话题

通过ROS记录FAST-LIO的里程计话题:

rosbag record -O fastlio_odom.bag /Odometry
3. 提取轨迹数据供EVO使用

将bag文件中的里程计话题转为TUM格式:

evo_traj bag fastlio_odom.bag /odometry/imu --save_as_tum --output odometry_imu.tum

生成的文件(odometry_imu.tum)包含时间戳、位置和四元数姿态,可直接用于EVO评估。

其他关于evo工具的使用可以参考下面这篇博客,主要注意数据格式

rosbag命令 | EVO工具 的使用_evo bag 绘制轨迹-优快云博客

三、FAST-LIO生成里程计的代码解析

1. 主函数流程

FAST-LIO的主函数(laserMapping.cpp)流程如下:

  • ROS节点初始化:读取参数(如LiDAR类型、IMU噪声协方差、外参矩阵)。

  • 传感器数据订阅:通过回调函数获取LiDAR点云和IMU数据。

  • 预处理与IMU积分:对点云降采样,通过IMU数据预测位姿。

  • 状态估计:使用iEKF融合点云残差和IMU预测,更新状态。

  • 地图更新:将配准后的点云插入ikd-Tree,维护全局地图。

2. 核心代码片段

void publish_odometry(const ros::Publisher & pubOdomAftMapped)
{
    odomAftMapped.header.frame_id = "camera_init";
    odomAftMapped.child_frame_id = "body";
    odomAftMapped.header.stamp = ros::Time().fromSec(lidar_end_time);// ros::Time().fromSec(lidar_end_time);
    set_posestamp(odomAftMapped.pose);
    pubOdomAftMapped.publish(odomAftMapped);
    auto P = kf.get_P();
    for (int i = 0; i < 6; i ++)
    {
        int k = i < 3 ? i + 3 : i - 3;
        odomAftMapped.pose.covariance[i*6 + 0] = P(k, 3);
        odomAftMapped.pose.covariance[i*6 + 1] = P(k, 4);
        odomAftMapped.pose.covariance[i*6 + 2] = P(k, 5);
        odomAftMapped.pose.covariance[i*6 + 3] = P(k, 0);
        odomAftMapped.pose.covariance[i*6 + 4] = P(k, 1);
        odomAftMapped.pose.covariance[i*6 + 5] = P(k, 2);
    }

    static tf::TransformBroadcaster br;
    tf::Transform                   transform;
    tf::Quaternion                  q;
    transform.setOrigin(tf::Vector3(odomAftMapped.pose.pose.position.x, \
                                    odomAftMapped.pose.pose.position.y, \
                                    odomAftMapped.pose.pose.position.z));
    q.setW(odomAftMapped.pose.pose.orientation.w);
    q.setX(odomAftMapped.pose.pose.orientation.x);
    q.setY(odomAftMapped.pose.pose.orientation.y);
    q.setZ(odomAftMapped.pose.pose.orientation.z);
    transform.setRotation( q );
    br.sendTransform( tf::StampedTransform( transform, odomAftMapped.header.stamp, "camera_init", "body" ) );
}

优化后的位姿数据来自于 kf(卡尔曼滤波器)的状态估计,发布为/Odometry话题。

四、EVO评估的关键注意事项

  1. 真值轨迹对齐:若需计算绝对位姿误差(APE),需提供高精度真值(如运动捕捉系统或RTK-GPS数据)。

  2. 时间同步:确保FAST-LIO的里程计时间戳与真值对齐,可通过evo_ape-t参数调整时间偏移。

  3. 参数调优:FAST-LIO的性能受以下参数影响:

    • IMU噪声协方差gyr_cov, acc_cov):需根据传感器标定结果调整。

    • 地图分辨率cube_len, filter_size_map):影响ikd-Tree的构建效率。

<think>好的,我现在需要帮助用户解决如何使用LVI-SAM算法运行Kitti数据集的问题。首先,我得回忆一下LVI-SAM的基本信息。LVI-SAM是一个紧耦合的激光雷达-视觉-IMU融合的SLAM系统,它结合了LIO-SAMVINS-MONO,适合多传感器融合的场景。用户提到参考了LIO-SAM的保存地图方法,所以可能需要类似的步骤。 接下来,用户的具体需求是运行Kitti数据集。Kitti数据集包含图像、激光雷达点云IMU数据,但可能需要调整间戳同步数据格式的问题。我需要考虑LVI-SAM的数据输入要求,通常这类系统需要ROS bag文件或者特定格式的topic消息。 首先,用户可能需要安装依赖项,比如ROS、GTSAM、OpenCV等。然后需要下载并编译LVI-SAM的源代码。接着,处理Kitti数据集可能需要将原始数据转换为ROS bag,或者修改配置文件指向数据集路径。Kitti的传感器数据可能需要调整参数文件中的话题名称、传感器参数等。 用户可能需要修改params.yaml文件中的参数,类似LIO-SAM的做法。比如设置correct_Lidar=true,调整点云话题IMU图像的话题名称是否匹配。另外,Kitti的IMU数据可能LVI-SAM默认的IMU话题不同,需要修改配置文件中的imu_topic。 数据预处理方面,可能需要使用kitti2bag这样的工具将Kitti数据集转换为ROS bag,或者使用rosrun命令播放数据。运行可能需要启动LVI-SAM的launch文件,并指定bag文件的路径。 此外,用户可能需要处理间戳同步的问题,因为Kitti数据集间戳可能需要调整才能被LVI-SAM正确读取。可能还需要注意传感器的外参标定,比如相机激光雷达之间的坐标变换,是否需要用户自行提供或者修改默认参数。 示代码部分,可能需要给出转换数据集的命令,修改配置文件的步骤,以及运行launch文件的指令。同,用户可能会遇到常见问题,比如话题不匹配、参数错误等,需要给出解决建议,比如检查话题名称是否正确,确认传感器数据的间戳是否同步。 最后,生成的相关问题需要考虑用户可能的后续疑问,比如参数调整、与其他数据集的应用、间戳同步方法以及故障排除等。确保回答结构清晰,步骤明确,引用提供的参考信息中的修改配置文件的方法。</think>以下是如何使用LVI-SAM算法运行KITTI数据集的步骤说明: ### 一、环境准备 1. 安装ROS(建议Noetic或Melodic版本) 2. 安装依赖项: ```bash sudo apt-get install libomp-dev libsuitesparse-dev pip install evo --upgrade --no-binary evo ``` ### 二、数据集准备 1. 下载KITTI原始数据集(需包含双目图像、Velodyne点云、IMU数据) 2. 转换数据集格式: ```bash # 使用kitti2bag工具转换 pip install kitti2bag kitti2bag -t 2011_09_30 -r 0027 raw_synced ``` ### 三、配置文件修改 修改`params.yaml`关键参数(路径:LVI-SAM/config/params.yaml): ```yaml # 传感器设置 use_imu: true use_lidar: true use_camera: true # 数据集路径 image0_topic: "/kitti/camera_gray_left/image_raw" point_cloud_topic: "/kitti/velo/pointcloud" imu_topic: "/kitti/oxts/imu" # 标定参数调整 body_T_cam0: !!opencv-matrix rows: 4 cols: 4 dt: d data: [0, -1, 0, 0.27, 0, 0, -1, -0.08, 1, 0, 0, -0.12, 0, 0, 0, 1] ``` ### 四、运行流程 1. 启动LVI-SAM: ```bash roslaunch lvi_sam run.launch ``` 2. 播放数据集: ```bash rosbag play kitti_2011_09_30_drive_0027_synced.bag --clock ``` ### 五、结果保存 修改`config/params.yaml`保存配置[^1]: ```yaml savePCD: true savePCDDirectory: "~/LVI-SAM/results/" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值