使用IC_GVINS从0到1跑自己的数据集(相机+北斗)使用手册

注意:在此感谢武汉大学集成智能导航(i2Nav)团队的唐海亮、牛小骥和张提升等大佬开源该代码供我们学习,并感谢武汉大学的澎师兄等给予我的帮助的人,让我在此次复现代码的过程中除了学习到代码本身的知识,提升工程实践能力之外,也对融合北斗数据的SLAM方案有了新的认识。
在此文章中,笔者会尽量回忆并记录所有在跑代码阶段遇到的问题以及解决方案,希望能给大家提供一些帮助。当然,有很多的问题被忽略了,大家也可以私信我或者留言(越早越好哦~趁我还有热乎的记忆,我会尽力帮助大家。ps:我觉得我几乎是把所有坑都踩了一遍哈哈)。

先放一张运行的效果图:
在这里插入图片描述

在这里插入图片描述

其实我跑出来的效果一般,但是能跑 。下面进入正文:

1. 硬件选型以及源码下载

原项目的方案:
https://www.bilibili.com/video/BV15a411q71D/
https://gitcode.com/gh_mirrors/ic/IC-GVINS/overview?utm_source=csdn_github_accelerator&isLogin=1
笔者的硬件平台如下:
相机:INDEMIND 双目惯导相机模组
IMU:WHEELTEC惯导N100N(其实是和G60模块一起的可以组成INS的,但是我这边信号不好,IMU和北斗的数据融合精度也不会提高所以就没有用融合;此外为什么没有用INDEMIND内置的IMU呢,因为坐标系转换的我实在精疲力竭,后面我也会简单介绍一下)
GNSS:WHEELTEC的G60模块(由于项目要求,我们使用的是北斗数据,问了技术人员,GPS和北斗都采用NMEA0183协议,只是数据表头不一样,不重要不重要,正常在上位机关闭GPS模块只读北斗的数据就行,如果要用GPS数据就关闭北斗模块就行)
注意:笔者在此不对上述传感器怎么在上位机读取数据做进一步的介绍,默认大家都能够正确使用ROS SDK正常读取数据哈,如果确实有需要,可以联系我。题外话,笔者都是用usb直接读取数据哈,没有用无人车底盘,大家如果有的话当然最好啦,因为一手拿设备,一手端着电脑,还要忍受gnss数据时好时坏,非常的影响大家的科研热情。
一些使用传感器的注意点:

  1. 传感器最好都实现在Windows上位机确认一下能够读取数据,像imu和GNSS都需要做校准和调整的工作。
  2. 传感器的频率设置以及消息格式:

插入频率图片:

  1. IMU的坐标系:需要额外注意IMU的数据采用x前y右z下的坐标系,有的厂商会给两个坐标系,一个是硬件本身的坐标系,一个是在ROS里输出的坐标系,我认为作者一再强调imu坐标系这个点,是非常重要的,后面有个大坑就是因为imu坐标系的问题,一般我们的坐标系会采用右手系:x右y前y上,如果坐标系不一致的话,需要在源码和参数做一些调整。

  2. G60模块和北斗/GPS模块
    室内没有信号,需要在室外获取数据;此外,北斗和GPS模块不可以和相机,IMU等靠得太近,最好还要和imu有个位差,就算北斗模块放在imu上面或者下面,不要保持统一水平面,不然会影响数据,在ros里订阅一下话题查看一下北斗GPS数据是否正常。(而G60可以和相机,imu靠的比较近)

    **
    rostopic echo /fix(这里的/fix是北斗数据的topic,改成你自己的即可)
    **
    正常获取数据的界面如下:
    

在这里插入图片描述

如果出现 nan nan nan的情况,说明没有正常获取数据,以下是几种可能的情况:

  1. 将天线拿到高于G60的地方静置3分钟左右,初始化需要一点时间。

  2. 查看该地是否有信号,首先室内是没有信号的,要到室外去,G60模块不能有遮挡。然后根据技术支持提供的WINDOWS端的上位机软件进行检测,查看周围是否有信号:

  3. 查看IMU和相机模块是否被开启,G60的天线离其他传感器模块太近也会导致信号被屏蔽。

根据实验来看,第三种可能性更大。

打开GnssTookit3->打开视图->选择星位图->打开星位图视图
在这里插入图片描述

等待一分钟,检测信号,如果能够看到上面的界面,说明该地有信号。考虑一下上述的第三种状况。
5. 硬件摆放

在这里插入图片描述

比较简陋,以下是几点摆放说明:

  • imu x要指向运行方向(或者车头)
  • G60模块不要有遮挡
  • 相机和imu可以这么固定,找我要外参数据。

2. 环境配置

2. 环境配置

这里主要参考的原文(链接如下):
https://gitcode.com/gh_mirrors/ic/IC-GVINS/overview?utm_source=csdn_github_accelerator&isLogin=1

IC-GVINS
一个稳健、实时、以惯性导航为中心的全球卫星导航系统-视觉惯性导航系统。
在复杂的环境中,视觉导航系统易受影响,而惯性导航系统(INS)则不受外部因素影响。因此,我们提出了一种名为IC-GVINS的强健、实时、以INS为核心的全球导航卫星系统(GNSS)-视觉惯性导航系统,以充分利用INS的优势。通过在INS中补偿地球自转,提高了高精度惯性测量单元(IMU)的准确性。为了提高在高速动态条件下的系统鲁棒性,使用精确的INS信息来辅助特征跟踪和地标三角化。借助GNSS辅助初始化,在因子图优化框架内统一世界坐标系中紧密融合了IMU、视觉和GNSS测量值。
overview.png

**作者:**武汉大学集成智能导航(i2Nav)团队的唐海亮、牛晓吉和张诗胜。

2.1 安装依赖

2.1.2 系统和编译器

建议您使用带有最新编译器(gcc >= 8.0 或 clang >= 6.0)的Ubuntu 18.04或Ubuntu 20.04。
笔者使用的是Ubuntu18.04+ROS,在此提一句,笔者使用的INDEMIND相机最高也只支持Ubuntu18.04。

#安装gcc-8
sudo apt install gcc-8 g++-8
#安装clang
sudo apt install clang
2.1.3 机器人操作系统

这个就是ROS Melodic,给大家推荐个特别方便的安装方法:
鱼香ROS的一键安装步骤:
wget http://fishros.com/install -O fishros && sudo bash fishros
(强力推荐,非常方便)

2.1.4 Ceres求解器及其依赖项

我们在IC-GVINS中使用Ceres求解器解决非线性最小二乘问题。支持的版本是Ceres Solver 2.0.0或2.1.0。请参考Ceres安装说明。

IC-GVINS还需要依赖Eigen(>=3.3.7)、TBB、glog(>=0.4.0)。您可以按如下方式安装:

sudo apt install libeigen3-dev libgoogle-glog-dev libtbb-dev

如果您的系统库无法满足这些版本,应从源代码构建它们。(可以直接装源码)

2.1.5 OpenCV

支持的版本是OpenCV(>=3.2.0)。您可以从系统库安装OpenCV,也可以从源代码构建。IC-GVINS也支持OpenCV 4。

sudo apt install libopencv-dev

我的建议是从源码构建。

2.1.6 yaml-cpp
sudo apt install libyaml-cpp-dev

2.2 安装并运行IC-GVINS

2.2.1 构建源代码
#创建工作区目录并进入
mkdir ~/gvins_ws && cd ~/gvins_ws
mkdir src && cd src

#将仓库克隆到src目录
git clone https://github.com/i2Nav-WHU/IC-GVINS.git

#回到gvins_ws目录
cd ..

#使用catkin_make构建源代码
#使用gcc
catkin_make -j8 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8
#使用clang
#catkin_make -j8 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
2.2.2 运行演示数据集

如果您已下载开源数据集,可以执行以下命令。

#打开一个新的终端并加载工作区环境
#对bash
source ~/gvins_ws/devel/setup.bash
#对zsh
#source ~/gvins_ws/devel/setup.zsh

#运行IC-GVINS节点
#您需要修改配置文件和命令行中的路径
roslaunch ic_gvins ic_gvins.launch configfile:=path/urban38/IC-GVINS/gvins.yaml

#在另一个终端播放ROS bag
rosbag play path/urban38/urban38.bag

2.3 数据集

2.3.1 KAIST复杂城市数据集

KAIST.png

在这里插入图片描述

urban38
链接:https://pan.baidu.com/s/18yRYUQdu_-DmrYnXQy9VNQ#list/path=%2F
密码:gyvr

urban39
链接:https://pan.baidu.com/share/init?surl=4CHl7LaIIkBKpwhyuPPbPA
密码:mnrn

KAIST_1.png

在这里插入图片描述

2.3.2 IC-GVINS机器人数据集

这个数据集是作者提供的他们自己收集的数据集

IC.png

在这里插入图片描述

campus
链接:https://pan.baidu.com/s/18yRYUQdu_-DmrYnXQy9VNQ#list/path=%2F
密码:igks

building
链接:https://pan.baidu.com/share/init?surl=Y48jFmdAOBF4y30KBK9bAw
密码:2drg

IC_1.png

在这里插入图片描述

2.4 使用自己的数据集

您可以使用自己收集的数据集运行IC-GVINS。请注意以下几点:

  1. 准备同步数据:确保GNSS、相机和IMU的数据在ROS包中良好同步;
  2. IMU坐标系要求:IMU数据应采用前右下(Front-Right-Down)格式;
  3. 修改话题名称:调整ic_gvins.launch文件中的主题名称以匹配您的数据;
  4. 配置参数调整:根据实际情况修改配置文件中的参数设置。
    以上是作者介绍的内容。
    但是运行自己的数据集在网上并不能找到一些前辈的记录或者教程,所以想用自己的传感器和数据集复现出效果就显得特别困难。
    下面就具体介绍笔者是如何用IC-GVINS运行自己的数据集的。

3. IC-GVINS运行自己的数据集

下面我们从传感器标定内外参数,时间同步,修改参数文件等步骤一一介绍。

3.1 INDEMINE相机内参标定

我们使用的是INDEMIND相机,根据官方的技术支持进行一些前期工作:
https://imsee-sdk-docs.readthedocs.io/zh/latest/src/sdk/support_platforms.html
在此我再记录一下我的步骤:

  1. 下载安装IMSEE-SDK

    git clone https://github.com/INDEMIND/IMSEE-SDK
    cd <imsee_sdk>
    make ros
    
  2. 安装camera_calibration

    #安装camera_calibration,一般ros已经默认安装
    sudo apt-get install ros-melodic-camera-calibration
    
    
  3. 下载安装imu_utils(用来标定IMU内参)

    在这里额外说明一下,IMU的内参标定需要静置2个小时以上,可能还存在误差,所以我的建议是找商家要现成参数文件。

    此外,imu_utils的安装步骤有一点复杂,在这我推荐个链接,大家按照博客安装进行

    用imu_utils标定IMU,之后用于kalibr中相机和IMU的联合标定_slam标定imu wait for imu data是什么原因-CSDN博客

    使用imu_utils进行IMU的误差标定以及IMU姿态解算_imu的误差标定以及姿态解算-CSDN博客

    基本上在这中途遇到的报错,网上都有解决方案。

  4. 下面开始标定相机内参

    参考链接:使用kalibr标定双目相机以及IMU–安装运行标定全过程以及踩坑记录-CSDN博客

    indemind相机本身设置的相机频率是50hz,为了降低频率过快导致标定误差过大,我们需要先使用rostopic tools来重新发布hz,商家说硬件的频率是没法更改 的,我尝试过修改config文件,但是没有生效,所以我们还是采用topic tools来修改。

    INDEMIND厂家提供了直接获取相机和imu内参以及外参的脚本:

    ./get_devce_info
    
    

    我的建议是直接获取的参数可以和自己标定的做一下对比,差别不太大就行。

    首先运行相机:

    >>进入ros文件夹
    $ sudo su  #和realsense相机不同,indemind相机启动需要权限
    $ source devel/setup.bash
    $ roslaunch imsee_ros_wrapper start.launch  #启动相机
    或者
    $ roslaunch imsee_ros_wrapper display.launch  #启动相机的同时启动rviz,可以在rviz直接看相机传回的图像
    
    

    如果遇到以下报错:报错 libopencv_calib3d3.so.3.3.

    Failed to load nodelet [/imsee/imsee_wrapper_node] of type [imsee/ROSWrapperNodelet] even after refreshing the cache: Failed to load library ../indemind/IMSEE-SDK/ros/devel/lib//libimsee_wrapper.so. 
    Make sure that you are calling the PLUGINLIB_EXPORT_CLASS macro in the library code, and that names are consistent between this macro and your XML. 
    Error string: Could not load library (Poco exception = libopencv_calib3d3.so.3.3.so.3.3: cannot open shared object file: No such file or directory)
    
    

    首先明确一下自己用的设备的架构,如果用的TX2,将lib/others/tx2-opencv3.4.3中的libindemind.so文件放到lib/aarch64中,重新编译。

    如果用的是电脑,就换成对应的.so文件就行。

    tip:INDEMIND相机不支持Jetson Nano的arm架构

具体相机内参和IMU的标定参考下面的链接(写的比较仔细,强烈建议):

使用kalibr标定双目相机以及IMU–安装运行标定全过程以及踩坑记录-CSDN博客

在这里需要注意以下几点:

  • 标定板建议使用提供的aprilgrid标定板,打印到a4纸上,需要注意更改.yaml的内容
  • 录制数据包时要把标定板放在相机的视线里,确保能够提到角点
  • 标定板打印下来要清楚一点,粘贴平整,不然误差会很大(误差在0.2左右就可以了)。
# 进入管理员模式,启动相机,查看相机启动发布的话题
cd IMSEE-SDK/
sudo su
source ros/devel/setup.bash
roslaunch imsee_ros_wrapper display.launch
rostopic list

# 可以通过echo来查看输出、频率
rostopic echo /imsee/..
rostopic hz /imsee/..
#或者用rqt来查看
rosrun rqt_topic rqt_topic

#修改相机发布频率之前,这里面的话题还包括了一个修正后的左右目,接下来用这个rectified话题,畸变参数能小一些:
rosrun topic_tools throttle messages /imsee/image/rectified/left 20.0 /imsee/left_rec_20
rosrun topic_tools throttle messages /imsee/image/rectified/right 20.0 /imsee/right_rec_20

#录制数据包
rosbag record -O stereocam.bag /imsee/left_rec_20 /imsee/right_rec_20

#开始标定
source ~/kalibr_workspace/devel/setup.bash
rosrun kalibr kalibr_calibrate_cameras --bag stereocam.bag --target april.yaml --models pinhole-radtan pinhole-radtan --topics /imsee/left_rec_20 /imsee/right_rec_20

标定完之后会有可视化界面。

3.2 相机和IMU联合标定外参

因为icgvins要求imu满足前右下的坐标系,而indemind自带的imu是右前上,需要做额外的代码修改,为了省事 ,我就选择了使用N100,**imu在ros sdk的launch里可以设置输出的坐标系。**默认输出 的是右前上,所以需要在launch里修改一下输出前右下坐标系。

  1. 固定相机和imu,imu的x保持为前进的方向即可。

  2. 启动相机和IMU,然后修改话题。

    ==注意:==这款IMU默认的频率是100hz,我们需要在上位机修改成200hz(跟着用户手册操作就行,这里就不展示了)

    #启动imu
    ...
    #启动相机
    ...
    
    #修改话题
    rosrun topic_tools throttle messages /imu 200.0 /imu0
    rosrun topic_tools throttle messages /imsee/image/rectified/left 20.0 /imsee/left_rec_20
    rosrun topic_tools throttle messages /imsee/image/rectified/right 20.0 /imsee/right_rec_20
    #录包
    rosbag record -O stereo_imu.bag /imsee/left_rec_20 /imsee/right_rec_20 /imu0
    
    #进行标定
    source ~/kalibr_workspace/devel/setup.bash
    rosrun kalibr kalibr_calibrate_imu_camera --bag stereo_imu.bag --target april.yaml --imu imu.yaml --cam stereocam-camchain.yaml 
    (这里有个imu.yaml文件也需要放在kalibr目录下)
    

    imu.yaml内容如下

    %YAML:1.0
    ---
    type: IMU
    name: N100
    Gyr:
       unit: " rad/s"
       avg-axis:
          gyr_n: 8.0226069504443656e-04     # Gyro误差模型高斯白噪声
          gyr_w: 4.4153147263889589e-05     # Gyro误差模型随机游走噪声
       x-axis:
          gyr_n: 5.3921043773503836e-04
          gyr_w: 2.2364472813436421e-05
       y-axis:
          gyr_n: 5.8344519509160989e-04
          gyr_w: 2.2667820610429897e-05
       z-axis:
          gyr_n: 1.2841264523066615e-03
          gyr_w: 8.7427148367802434e-05
    Acc:
       unit: " m/s^2"
       avg-axis:
          acc_n: 1.0909715156015328e-02     # Acc误差模型高斯白噪声
          acc_w: 4.0347767978459928e-04     # Acc误差模型随机游走噪声
       x-axis:
          acc_n: 1.0761065941039795e-02
          acc_w: 2.6630975523772447e-04
       y-axis:
          acc_n: 8.5197044939375362e-03
          acc_w: 1.6972573784404112e-04
       z-axis:
          acc_n: 1.3448375033068652e-02
          acc_w: 7.7439754627203219e-04
    
    

    使用kalibrb标定外参时需要在目录下放修改后的imu.yaml,参考如下

    #Accelerometers
    accelerometer_noise_density: 1.0909715156015328e-02 
    accelerometer_random_walk:   4.0347767978459928e-04
    
    
    #Gyroscopes
    gyroscope_noise_density: 8.0226069504443656e-04
    gyroscope_random_walk:   4.4153147263889589e-05 
    
    
    rostopic:                /camera/imu
    update_rate:             200.0
    
    

得到的外参不能够直接使用,需要我们转化成四元数的表达,在这里可以直接让Chat-GPT给你算,我是写了一个代码调用了eigen算的,代码也放在下面了:记得将矩阵替换成自己标定出来的外参矩阵

#include <iostream>  
#include <Eigen/Dense>  
  
int main() {  
    // 定义一个旋转矩阵  
    // 
    Eigen::Matrix3d rotationMatrix;  
    rotationMatrix << 0.05498962,  0.03325747,  0.9979329,  
                      0.99758879, -0.04421131, -0.05349726,  
                      0.04234074,  0.99846848, -0.03560844;  
  
    // 使用Eigen库中的函数从旋转矩阵计算四元数  
    Eigen::Quaterniond quaternion(rotationMatrix);  
  
    // 打印四元数  
    std::cout << "四元数: (" << quaternion.w() << ", "  
              << quaternion.x() << ", "  
              << quaternion.y() << ", "  
              << quaternion.z() << ")" << std::endl;  
  
    // 如果你想要从四元数转回旋转矩阵来验证(可选)  
    Eigen::Matrix3d rotationMatrixFromQuaternion = quaternion.matrix();  
  
    // 打印转换回来的旋转矩阵  
    std::cout << "从四元数转换回来的旋转矩阵:\n" << rotationMatrixFromQuaternion << std::endl;  
  
    return 0;  
}

最后修改的完整ic-gvins的config参数文件如下:

# IC-GVINS多源融合定位算法配置文件

# 结果输出路径
# Output directory
outputpath: "/home/suncn/gvins_ws/src/IC-GVINS/output"
is_make_outputdir: true

# 时间信息, s
# Time length for GNSS/INS intialization
initlength: 1

# IMU原始数据频率, Hz
# IMU sample rate
imudatarate: 200.0

# 考虑地球自转补偿项
# Consider the Earth rotation
#iswithearth: true
iswithearth: true

# 天线杆臂, IMU前右下方向, m
# GNSS lever-arm in IMU body frame (front-right-down)
antlever: [-0.37, 0.208, -0.353] 

# IMU噪声建模参数
# IMU noise parameters
imumodel:
    arw: 0.013684      # deg/sqrt(hr)
    vrw: 0.000088       # m/s/sqrt(hr)
    gbstd: 0.000802     # deg/hr
    abstd: 0.010909     # mGal
    corrtime: 1.0   # hr

# GNSS中断配置
# GNSS outage configurations, the GNSS will not be used after the gnssoutagetime 
isusegnssoutage: false
gnssoutagetime: 0

# 固定阈值GNSS抗差
# A fixed threshold (STD, m) for GNSS outlier culling
gnssthreshold: 20

# 是否开启可视化
# Use visualization
is_use_visualization: true

# 跟踪
# Tracking configurations
track_check_histogram: true    # 直方图检查, 避免出现光照变化较大的图像 (Check histogram for drastic illumulation change)
track_min_parallax: 20     # track_min_parallax: 20          # 关键帧最小像素视差 (The minmum parallax in pixels to choose a keyframe)
track_max_interval: 0.5     # track_max_interval: 0.5    # 最大的关键帧间隔, 超过则插入观测帧, s (The maximum lenght to choose a observation frame)
track_max_features: 200
# track_max_features: 300         # 最大提取特征数量 (The maximum features to detect, may be more or less, see tracking.cc)


# 优化
# Optimization configurations
reprojection_error_std: 1.5 # reprojection_error_std: 1.5         # 像素重投影误差 (The reprojection error std for optimizition and outlier culling)
optimize_windows_size: 10  # optimize_windows_size: 10           # 滑动窗口大小 (The size of the sliding window, number of the keyframes )
optimize_num_iterations: 20 # optimize_num_iterations: 20         # 优化迭代次数 (The iterations in total)
optimize_estimate_extrinsic: false   # optimize_estimate_extrinsic: true   # 是否估计相机和IMU的外参 (Estimate the extrinsic)
optimize_estimate_td: false   # optimize_estimate_td: true          # 否估计相机和IMU之间的时间间隔 (Estimate the time delay)

# Camera parameters
cam0:
    # 内参 [fx, fy, cx, cy(, skew)]
    # Intrinsic parameters, pinhole model
    intrinsic: [263.54809325, 263.51860304, 291.92859584, 189.56831071]

    # 畸变参数 [k1, k2, p1, p2(, k3)]
    # Distortion parameters
    distortion: [-0.00805451,  0.00890036,  0.00110142,  0.00142004]

        
    # 图像分辨率
    # Resolution
    resolution: [640, 400]

    # 相机IMU外参 (Camera-IMU extrinsic)
    # Pb = q_b_c * Pc + t_b_c
    # q (x, y, z, w)
    q_b_c: [0.494919, 0.549779, 0.48144, 0.47012]
    t_b_c: [-0.04314436,-0.02309919, -0.07765525]

    # IMU和相机时间延时 (The time delay between the IMU and camera)
    # t_i = t_c + td+-0.9495   
    td_b_c: -0.7694290781145723

3.3 录包和运行

#开启ic_gvins(室外)
#步骤如下:
#1. 开启相机
cd IMSEE-SDK/
sudo su
source ros/devel/setup.bash
roslaunch imsee_ros_wrapper start.launch
#2. 设置相机发布频率:相机原本50hz,这里改为20hz
rosrun topic_tools throttle messages /imsee/image/rectified/left 20.0 /cam0
rosrun topic_tools throttle messages /imsee/image/rectified/right 20.0 /cam1

#3. 开启IMU(N100N):IMU频率200hz,坐标系为前右下(非笛卡尔坐标系)
cd wheeltec-gps-ros1/
source devel/setup.bash
roslaunch fdilink_ahrs ahrs_data.launch

#4. 开启北斗/GPS   topic为:/fix
cd wheeltec-gps-ros1/
source devel/setup.bash
roslaunch wheeltec_gps_driver wheeltec_gps_driver.launch
#5. 查看话题是否有数据
rostopic echo /fix
#6. 开启算法
cd gvins_ws
source devel/setup.bash
roslaunch ic_gvins ic_gvins.launch configfile:=/home/user/gvins_ws/src/IC-GVINS/config/gvins2.yaml

#录制数据包(option)
rosbag record -O test.bag /cam0 /fix /imu0

3.4一些报错和解决方案

  1. 初始化不成功

    答:1)大概率是时间戳相差太大,观察一下算法终端打印的时间戳

    在这里插入图片描述

    这里可以看到三个时间戳相差很大,所以一致初始化没成功(没有运行界面),正常数据读入后,时间戳相差在1s都是可以的。

    在这里插入图片描述

    在算法里可以将这个时间戳误差修改带一点,建议写个shell脚本,同时开启传感器的驱动,这样获取的时间戳几乎一致,初始化也更容易成功。

  2. failed to get rigtht IMU series

在这里插入图片描述

程序运行过程中大概率会出现以上关于imu的一系列报错,如何解决呢?

回归代码本身吧,在具体报错的行打印log,帮助自己判断到底在那里一行执行失败,这里可以看一下MISC::getImuSeriesFromTo这个函数

在这里插入图片描述

红色地方是我修改过的,因为我设置log打印车来imu的值是0,那按照原本的代码,imu1不就是-1,数组越界了,我猜测这可能就是导致程序崩溃的原因,所以这里我们加一组判断情况,过滤掉imu0=0的情况,当然我这里修改的未必严谨,可以再多思考一下。

  1. 不能闭环的问题

    这个其实我也不太清楚解决方案,但是可以做一些尝试,这里放一下大佬给的建议:

    1. 第一个就是检查下外参
    2. 第二个就是视觉,在室外跑数据感觉视觉其实很容易失败的,所以视觉那部分的参数可以调一下,比如关键帧可以多一些,然后特征点少一些之类的
    3. 最后还有一个就是很笨但很有效的方法,其实VINS程序鲁棒性强很多,可以用VINS跑下你的数据试试,如果VINS都跑不好那就说明可能代码得改动一些才能跑个大差不差了
    

    然后我个人认为呢

    1. 外参很重要,如果能跑起来了,那外参就只能决定算法精度了
    2. 之前跑过lio-sam,里面不能闭环的原因是因为imu频率给的不够,所以我们在这至少要保证imu频率在200hz
    3. z轴上很飘,建议调整一下角度,看看不关注z轴的情况下,能否实现转弯,
    4. 打印gnss的数据看一下是否是因为gnss数据不准(大概率不会,z轴上会飘而已,总体还是没啥问题的)
    
  2. …当然还遇到了很多的报错,有一些网上都有解决方案,还有一些时间线太长,我已经记不清了,欢迎大家补充,我会继续修改更新。

4 参考链接

前两个链接非常建议看一看!

  1. 【INDEMIND相机运行SLAM】_indemind github-CSDN博客
  2. 使用kalibr标定双目相机以及IMU–安装运行标定全过程以及踩坑记录-CSDN博客
  3. INDEMIND相机运行VINS-slam_indemind运行vins-fusion-CSDN博客
  4. 【INDEMIND相机运行SLAM】_indemind github-CSDN博客
    最后,如果大家有什么问题,或者需要什么数据,都可以来联系我,希望大家都可以成功~
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐