github网址:HKUST-Aerial-Robotics/VINS-Fusion: An optimization-based multi-sensor state estimator

vins和realsence安装

详情见
Ubuntu20.04用D435i运行VINS-Fusion_vins-fusion d435i-CSDN博客

运行

数据集测试

数据集验证安装,Euroc数据集可前往官网下载,从官网[官网](The EuRoC micro aerial vehicle datasets)给的下载地址中下载,下载其中的bag文件,比如V1_01_easy.bag。将其放在目录~/dataset/下,然后分别打开三个终端:运行Stereo cameras + IMU
![[Pasted image 20251226212001.png]]

roslaunch vins vins_rviz.launch

rosrun vins vins_node ~/vinsfusion_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml 

(optional) rosrun loop_fusion loop_fusion_node ~/vinsfusion_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml 

rosbag play ~/dataset/V1_01_easy.bag


实机测试(IMU+双目)

开四个终端,分别执行以下命令



roslaunch realsense2_camera rs_camera_vins.launch

rosrun vins vins_node ~/vinsfusion_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml

rosrun loop_fusion loop_fusion_node ~/vinsfusion_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml

roslaunch vins vins_rviz.launch 

实机测试(双目)

复制一份realsense_stereo_imu_config.yaml文件改名为realsense_stereo_imu_config.yaml修改3处地方

# 原来是 1 
imu: 0 # 改为 0,表示不使用 IMU
# 原来是 1 
estimate_extrinsic: 0 # 改为 0,不再在线优化外参
# 原来是 1
estimate_td: 0          # 改为 0,不估计时间偏移

开四个终端,分别执行以下命令

roslaunch realsense2_camera rs_camera_vins.launch

rosrun vins vins_node ~/vinsfusion_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_no_imu_config.yaml

rosrun loop_fusion loop_fusion_node ~/vinsfusion_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml

roslaunch vins vins_rviz.launch 

内外参标定

参考第十课-VINS的参数设置与外参标定_哔哩哔哩_bilibili

内参标定

内参采用原厂自带的,

#启动相机
roslaunch realsense2_camera rs_camera_vins.launch
#读取相机内参(左右目相机内参一样)
rostopic echo /camera/infra2/camera_info 
外参标定

先在配置文件输一个大概的参数,例如:

# 1. 配置自动校准外参
estimate_td: 1                      # online,1为启用自动调参
# 2. 配置外参输出路径
output_path: "/home/uav/vinsoutput/"

# 3,输一个大致的外参,旋转矩阵不是单位阵是要变换到飞控的坐标系定义
body_T_cam0: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [ 0, 0, 1, -0.00552,
           -1, 0, 0, 0.0051,
           0, -1, 0, 0.01174,
           0, 0, 0, 1 ]

body_T_cam1: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [ 0, 0, 1, 0.0446571,
           -1, 0, 0, 0.0051,
           0, -1, 0, 0.01174,
           0, 0, 0, 1 ]

启动vins(这里的yaml改成对应的)

roslaunch realsense2_camera rs_camera_vins.launch

rosrun vins vins_node ~/vinsfusion_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_px4imu_config.yaml

然后拿起无人机走一个八字,范围大一点,可以看到设置的output_path: "/home/uav/vinsoutput/"有外参extrinsic_parameter.csv

#终端查看外参文件
cat ~/vinsoutput/extrinsic_parameter.csv

将数据手动输入到yaml文件

遇到的问题

rviz见面里不显示track_image

原因是板子算力不够,加上计算量的,延时严重,解决方法,在launch文件里修改max_cnt的数量
解决方法:~/vinsfusion_ws/src/VINS-Fusion/config/realsense_d435i/下的launch文件打开,修改里面的max_cnt数目(改的越小计算越快延时越短,但是会影响定位精度)

报错1opencv(NX特有)
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.5.4) /home/ubuntu/build_opencv/opencv/modules/core/src/alloc.cpp:73: error: (-4:Insufficient memory) Failed to allocate 415416135248640 bytes in function 'OutOfMemoryError'

Aborted (core dumped)

原因:使用的nx装的ubuntu是预装了opencv4.5,但是一般的ubuntu20.04装的ubuntu是4.2,所以ros编译的时候就把包用4.5的编译了,但是运行的时候却是以为他是4.2
唯一解决方案:在工作空间里“覆盖”掉 ROS 自带的 cv_bridge
解决方法
ROS 自带的 cv_bridge 不听话(非要用 4.2),我们就下载它的源码,在工作空间里用 4.5 重新编译它。这样,工作空间里的 cv_bridge 就会覆盖系统自带的。
下载 cv_bridge 源码
进入vins的工作空间 src 目录:

cd ~/vinsfusion_ws/src
git clone -b noetic https://github.com/ros-perception/vision_opencv.git

修改 CMakeLists 确保找到 4.5
为了防止它再次错误地找到 4.2,我们要强行指定路径。 打开文件:

gedit ~/vinsfusion_ws/src/vision_opencv/cv_bridge/CMakeLists.txt

在文件最开头(project() 下方)添加:

set(OpenCV_DIR "/usr/lib/aarch64-linux-gnu/cmake/opencv4/")

(这是 JetPack 系统自带 OpenCV 4.5 的默认路径)
彻底清理旧编译文件 (非常重要)
必须把之前“被污染”的编译缓存删得干干净净。

cd ~/vinsfusion_ws
rm -rf build/ devel/

重新编译

catkin_make

验证修复结果
编译完成后,再次执行那个 ldd 命令(注意要先 source):

source ~/vinsfusion_ws/devel/setup.bash
ldd ~/vinsfusion_ws/devel/lib/loop_fusion/loop_fusion_node | grep libopencv_core

这次你应该只看到一行 libopencv_core.so.4.5

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐