无人机避障——感知部分(Ubuntu 20.04 复现Vins Fusion跑数据集)胎教级教程

硬件环境:NVIDIA Jeston Orin nx

系统:Ubuntu 20.04

任务:跑通 EuRoC MAV Dataset 数据集

展示结果:

编译Vins Fusion

创建工作空间vins_ws

bash 复制代码
# 创建目录结构
mkdir -p ~/vins_ws/src

cd ~/vins_ws/src

# 初始化工作空间(生成 CMakeLists.txt)
catkin_init_workspace

# 克隆官网的代码
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git

cd ..

catkin_make

遇到了不少报错,参考以下内容可以基本解决前期的编译问题。

将c++11 修改为c++14

用VScode搜索set(CMAKE_CXX_FLAGS "-std=c++11"),全部替换为set(CMAKE_CXX_FLAGS "-std=c++14"),图中我已经全部替换过了。

指定find_package中的OpenCV的版本

用VScode搜索find_package(OpenCV REQUIRED),全部替换为find_package(OpenCV 4 REQUIRED),图中我已经全部替换过了。

添加头文件

camera_models>include>camodocal>chessboard>Chessboard.h中添加

cpp 复制代码
#include <opencv2/imgproc/types_c.h>
#include <opencv2/calib3d/calib3d_c.h>

在以下文件:

camera_models/include/camodocal/calib/CameraCalibration.h

loop_fusion/src/pose_graph.h

vins_estimator/src/featureTracker/feature_tracker.h

loop_fusion/src/ThirdParty/DVision/BRIEF.h

加入以下的头文件:

cpp 复制代码
#include <opencv2/imgproc/types_c.h>
#include <opencv2/imgproc/imgproc_c.h>

修改报错文件

在以下文件

VINS-Fusion/vins_estimator/src/KITTIGPSTest.cpp

VINS-Fusion/vins_estimator/src/KITTIOdomTest.cpp

其中,将 CV_LOAD_IMAGE_GRAYSCALE修改为cv::IMREAD_GRAYSCALE,同样的直接用VScode搜索 CV_LOAD_IMAGE_GRAYSCALE将其替换即可。

然后编译

bash 复制代码
usr/bin/ld: warning: libopencv_video.so.4.2, needed by /home/nvidia/vins_ws/devel/lib/libvins_lib.so, may conflict with libopencv_video.so.405
/usr/bin/ld: warning: libopencv_imgcodecs.so.405, needed by /home/nvidia/vins_ws/devel/lib/libvins_lib.so, may conflict with libopencv_imgcodecs.so.4.2
/usr/bin/ld: warning: libopencv_core.so.405, needed by /usr/local/lib/libopencv_video.so.4.5.5, may conflict with libopencv_core.so.4.2
/usr/bin/ld: warning: libopencv_video.so.4.2, needed by /home/nvidia/vins_ws/devel/lib/libvins_lib.so, may conflict with libopencv_video.so.405
/usr/bin/ld: warning: libopencv_imgcodecs.so.405, needed by /home/nvidia/vins_ws/devel/lib/libvins_lib.so, may conflict with libopencv_imgcodecs.so.4.2
/usr/bin/ld: warning: libopencv_core.so.405, needed by /usr/local/lib/libopencv_video.so.4.5.5, may conflict with libopencv_core.so.4.2
[ 98%] Built target kitti_odom_test
[ 98%] Built target kitti_gps_test
[100%] Linking CXX executable /home/nvidia/vins_ws/devel/lib/vins/vins_node
/usr/bin/ld: warning: libopencv_video.so.4.2, needed by /home/nvidia/vins_ws/devel/lib/libvins_lib.so, may conflict with libopencv_video.so.405
/usr/bin/ld: warning: libopencv_core.so.405, needed by /usr/local/lib/libopencv_video.so.4.5.5, may conflict with libopencv_core.so.4.2

编译虽然通过了,但是有警告,这里是因为在链接过程中存在 OpenCV 库版本冲突。系统检测到两个不同版本的 OpenCV 库(4.2 和 4.5.5)被同时链接 。

段错误

如果不解决上述OpenCV 库版本冲突问题,后续运行vins_node将会出现段错误:

解决OpenCV 库版本冲突问题。

最好的解决方法就是全部统一成一个OpenCV 4.5.5。

bash 复制代码
# 卸载通过 apt 安装的 OpenCV
sudo apt purge -y '^libopencv.*' '^opencv.*'

# 清除残留配置文件
sudo rm -rf /usr/local/include/opencv* /usr/local/lib/libopencv* /usr/local/share/opencv* \
            /usr/include/opencv* /usr/lib/x86_64-linux-gnu/libopencv* \
            ~/.local/lib/python*/*/site-packages/cv2*

# 更新系统库缓存
sudo ldconfig

# 更新下
sudo apt-get update

sudo apt-get upgrade

# 下载Opencv 4.5.5源码
wget https://github.com/opencv/opencv/archive/refs/tags/4.5.5.zip

# 解压
unzip opencv-4.5.5.zip	

# 安装依赖
sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config

# 编译安装
mkdir build

cd build

cmake -D WITH_TBB=ON -D WITH_EIGEN=ON -D OPENCV_GENERATE_PKGCONFIG=ON  -D BUILD_DOCS=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF  -D WITH_OPENCL=OFF -D WITH_CUDA=OFF -D BUILD_opencv_gpu=OFF -D BUILD_opencv_gpuarithm=OFF -D BUILD_opencv_gpubgsegm=O -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

make -j8
sudo make install


# 环境配置
sudo gedit /etc/ld.so.conf.d/opencv.conf

# 添加以下路径
/usr/local/lib

# 保存后,终端执行
sudo ldconfig 

# 更新路径
sudo gedit /etc/bash.bashrc

# 最后添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

# 保存后,终端执行
source /etc/bash.bashrc
sudo updatedb

然后编译Vins Fusion 发现没有 cv_bridge

bash 复制代码
ither need to install the package with the same name or change your environment so that it can be found.
CMake Error at /opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
  Could not find a package configuration file provided by "cv_bridge" with
  any of the following names:

    cv_bridgeConfig.cmake
    cv_bridge-config.cmake

  Add the installation prefix of "cv_bridge" to CMAKE_PREFIX_PATH or set
  "cv_bridge_DIR" to a directory containing one of the above files.  If
  "cv_bridge" provides a separate development package or SDK, be sure it has
  been installed.
Call Stack (most recent call first):
  VINS-Fusion/loop_fusion/CMakeLists.txt:9 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/nvidia/vins_ws/build/CMakeFiles/CMakeOutput.log".
See also "/home/nvidia/vins_ws/build/CMakeFiles/CMakeError.log".
Invoking "cmake" failed

如果用这条ROS相关的安装cv_bridge的指令还会报错:

bash 复制代码
# 安装 ROS Noetic 的 cv_bridge
sudo apt-get install ros-noetic-cv-bridge

原因是系统安装了OpenCV 4.5.5,但通过ROS官方源安装的cv_bridge是针对OpenCV 4.2编译的。而我们的代码需要OpenCV 4.5.5,因此可能需要重新编译cv_bridge以匹配我们安装的OpenCV版本。

重新编译cv_bridge以匹配OpenCV 4.5.5版本

bash 复制代码
# 1. 卸载旧版本(重要!)
sudo apt remove ros-noetic-cv-bridge

# 2. 创建工作空间
mkdir -p ~/cv_bridge_ws/src
cd ~/cv_bridge_ws/src

# 3. 获取vision_opencv源码(noetic分支)
git clone -b noetic https://github.com/ros-perception/vision_opencv.git

# 4. 关键:修改编译配置
sed -i 's/find_package(OpenCV 3 REQUIRED)/find_package(OpenCV 4.5 REQUIRED)/g' vision_opencv/cv_bridge/CMakeLists.txt

# 5. 编译安装
cd ~/cv_bridge_ws
catkin config -DCMAKE_BUILD_TYPE=Release -DOpenCV_DIR=/path/to/opencv4.5.5/build
catkin build cv_bridge

# 6. 添加环境变量(永久生效)
echo "source ~/cv_bridge_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

如果安装完还是报错:

bash 复制代码
# 查找 cv_bridge 的实际安装位置
find / -name "*cv_bridge*Config.cmake" 2>/dev/null

得到下面这个路径

/home/nvidia/cv_bridge_ws/devel/share/cv_bridge/cmake/cv_bridgeConfig.cmake

在VINS-Fusion的CMakeLists.txt中(具体是loop_fusion/CMakeLists.txt)的find_package(cv_bridge)之前加入:

bash 复制代码
set(cv_bridge_DIR "/home/nvidia/cv_bridge_ws/devel/share/cv_bridge/cmake")

最后编译成功,没有warning也没有报错:

最后结果:

bash 复制代码
 
roslaunch vins vins_rviz.launch
 
rosrun vins vins_node src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
 
rosrun loop_fusion loop_fusion_node src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
 
# 数据集去Vins-Fusion github官网上进行下载
rosbag play MH_01_easy.bag
相关推荐
长沙京卓12 小时前
源码交付!AI 无人机智慧巡检平台,20+AI场景智能识别,赋能低空一网通飞新引擎!
无人机·源代码管理
白云千载尽13 小时前
ego_planner算法的仿真环境(主要是ros)-算法的解耦实现.
算法·无人机·规划算法·后端优化·ego·ego_planner
老黄编程15 小时前
视觉SLAM十四讲解读-(v2.p84)李代数求导
算法·slam·李群李代数·视觉slam十四讲
AI浩20 小时前
MMOT:首个面向无人机多光谱多目标跟踪的挑战性基准
人工智能·目标跟踪·无人机
无人机长了一个脑袋20 小时前
Catia曲面设计的相关模块
无人机
Abona21 小时前
自动驾驶、无人机、机器人核心方案对比表
机器人·自动驾驶·无人机
Abona21 小时前
智能移动设备全品类核心方案对比及量产趋势调研报告
机器人·自动驾驶·无人机
点云SLAM1 天前
SLAM文献之A micro Lie theory for state estimation in robotic(2)
机器人·slam·状态估计·李群李代数·位姿优化·流行空间·误差传播
天途小编2 天前
职业本科低空飞行器工程技术专业核心职业素养清单
无人机
上海锝秉工控2 天前
超声波传感器:无人机低空飞行的“隐形守护者”
无人机