準(zhǔn)備工作:
(1)電腦裝有 NVIDIA 顯卡
(2)安裝 ROS noetic/Installation/Ubuntu - ROS Wiki
(3)安裝 cuda Ubuntu安裝cuda_GXU_Wang的博客-CSDN博客
(4)安裝 ceres 1.14.0 Ubuntu20.04安裝Ceres1.14.0_我是你de不死的bug的博客-CSDN博客
一、安裝OpenCV 4.6.0
下載 opencv 源碼,選擇所需要的版本 opencv 4.6.0,相應(yīng)的擴(kuò)展opencv_contrib 4.6.0,以及用于橋接 ROS 和 opencv 的 cv_bridge
Release OpenCV 4.6.0 · opencv/opencv · GitHub
Release 4.6.0 · opencv/opencv_contrib · GitHub
https://github.com/ros-perception/vision_opencv/tree/
考慮將 opencv 安裝在 /usr/local/opencv-4.6.0下,移動(dòng)opencv及其擴(kuò)展模塊并進(jìn)入工作目錄
sudo mv ./opencv-4.6.0/ /usr/local/
sudo mv ./opencv_contirb-4.6.0/ /usr/local/
cd /usr/local/opencv-4.6.0/
編譯前現(xiàn)確定 opencv 的安裝路徑,我的安裝路徑是
CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0
確定自己顯卡的算力
CUDA GPUs - Compute Capability | NVIDIA Developer
注意 cuda 要根據(jù)自己的需求安裝,不要裝 cuda 12 編譯會(huì)報(bào)錯(cuò),可以裝稍微低一點(diǎn),可以參考
不同版本CUDA支持的算力_WenZhaoYang123468的博客-CSDN博客
編譯 opencv 4.6.0,
sudo mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0 \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.6.0/modules \
-D WITH_CUDA=ON \
-D CUDA_ARCH_BIN=7.2 \
-D CUDA_ARCH_PTX="" \
-D ENABLE_FAST_MATH=ON \
-D CUDA_FAST_MATH=ON \
-D WITH_CUBLAS=ON \
-D WITH_LIBV4L=ON \
-D WITH_GSTREAMER=ON \
-D WITH_GSTREAMER_0_10=OFF \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D CUDA_NVCC_FLAGS="--expt-relaxed-constexpr" \
-D WITH_TBB=ON \
..
電腦性能好的話可以多核編譯 make -j8,如果出現(xiàn)兼容性錯(cuò)誤的花建議用 make,速度慢一點(diǎn)
make -j8
sudo make install
這里編譯會(huì)很慢,耐心等待,只要一開始沒有什么報(bào)錯(cuò)后面就不會(huì)報(bào)錯(cuò)。
二、配置自己的 cv_bridge 功能包
因?yàn)?opencv 的數(shù)據(jù)和 ROS 的數(shù)據(jù)需要轉(zhuǎn)化,因此需要通過 cv_bridge 這個(gè)橋接工具,接下來我們介紹怎么自己下載安裝并配置一個(gè)自己的 cv_bridge 功能包。
首先,創(chuàng)建一個(gè) ROS 的工作空間
mkdir -r ~/cv_bridge_460/src/
cd ~/cv_bridge_460/src/
然后,下載對應(yīng)版本的源碼,因?yàn)槭?Ubuntu 20.04 因此下載 noetic 版本
GitHub - ros-perception/vision_opencv at noetic
下載完成后解壓到 ~/cv_bridge_460_ws/src/ 目錄下,因?yàn)槲覀冎恍枰?cv_bridge,所以只需保留 cv_bridge 文件夾,將其放在 ~/cv_bridge_460_ws/src/,重命名為cv_bridge_460,然后修改一下 cv_bridge_460 的配置文件。
(1)CMakeLists.txt 文件
在 set(_opencv_version 4) 前面添加你的 opencv 安裝路徑,大概在第 20 行
set(OpenCV_DIR /usr/local/opencv-4.6.0/build/)
set(_opencv_version 4)
find_package(OpenCV 4 QUIET)
另外由于是自己制作的 cv_bridge 對應(yīng)于 opencv 4.6.0 版本的功能包,因此最好將包名該一下,我這里是改成 cv_bridge_460
# project(cv_bridge)
project(cv_bridge_460)
(2)package.xml
同理在 package.xml 中也改一下報(bào)名
<package format="2">
# <name>cv_bridge</name>
<name>cv_bridge_460</name>
然后編譯這個(gè)功能包
cd ~/cv_bridge_460_ws/
catkin_make
如果編譯成功,則 cv_bridge_460 功能包制作就完成了,這也說明 opencv 4.6.0 已經(jīng)正確安裝了,并且這個(gè)cv_bridge_460 功能包可以正確連接上自己安裝的 opencv 版本,最后我們將這個(gè)功能包的路徑添加到 ~/.bashrc 文件夾中,使得我們在后面編譯 vins-fusion-gpu 時(shí)可以調(diào)用這個(gè) cv_bridge_460 功能包,打開 ~/.bashrc文件夾,在最后加入如下命令
source ~/cv_bridge_460_ws/devel/setup.bash
?最后在終端 source 一下當(dāng)前該路徑
source ~/.bashrc
三、編譯 vins-fusion-gpu
創(chuàng)建 vins-fusion-gpu 工作空間,
mkdir ~/catkin_ws_gpu/src
cd ~/catkin_ws_gpu/src
然后下載 vins-fusion-gpu 包到 catkin_ws/src 工作目錄下
git clone https://github.com/pjrambo/VINS-Fusion-gpu.git
(1)修改 vins_estimator/CMakeLists.txt 文件
將 cv_bridge 改成 cv_bridge_460
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
geometry_msgs
nav_msgs
tf
cv_bridge_460
camera_models
image_transport)
注釋一行
#include(/home/dji/opencv/build/OpenCVConfig.cmake)
添加 cv_bridge_460 功能包的路徑和 opencv-4.6.0 的路徑
set(cv_bridge_460_DIR "/home/lilabws01/cv_bridge_460_ws/devel/share/cv_bridge_460/cmake")
set(OpenCV_DIR "/usr/local/opencv-4.6.0/build/")
?(2)修改 loop_fusion/CMakeLists.txt 文件
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
nav_msgs
camera_models
cv_bridge_460
roslib
)
注釋一行
#include(/home/dji/opencv/build/OpenCVConfig.cmake)
添加 cv_bridge_460 功能包的路徑和 opencv-4.6.0 的路徑
set(cv_bridge_460_DIR "/home/lilabws01/cv_bridge_460_ws/devel/share/cv_bridge_460/cmake")
set(OpenCV_DIR "/usr/local/opencv-4.6.0/build/")
保存并退出,最后進(jìn)入 VINS-Fusion-gpu 文件夾
cd ./VINS-Fusion-gpu/
終端輸入下面代碼使得 VINS-Fusion-gpu 自動(dòng)匹配 OpenCV4 版本(變量名發(fā)生變化)
sed -i 's/CV_FONT_HERSHEY_SIMPLEX/cv::FONT_HERSHEY_SIMPLEX/g' `grep CV_FONT_HERSHEY_SIMPLEX -rl ./`
sed -i 's/CV_LOAD_IMAGE_GRAYSCALE/cv::IMREAD_GRAYSCALE/g' `grep CV_LOAD_IMAGE_GRAYSCALE -rl ./`
sed -i 's/CV_BGR2GRAY/cv::COLOR_BGR2GRAY/g' `grep CV_BGR2GRAY -rl ./`
sed -i 's/CV_RGB2GRAY/cv::COLOR_RGB2GRAY/g' `grep CV_RGB2GRAY -rl ./`
sed -i 's/CV_GRAY2RGB/cv::COLOR_GRAY2RGB/g' `grep CV_GRAY2RGB -rl ./`
sed -i 's/CV_GRAY2BGR/cv::COLOR_GRAY2BGR/g' `grep CV_GRAY2BGR -rl ./`
sed -i 's/CV_CALIB_CB_ADAPTIVE_THRESH/cv::CALIB_CB_ADAPTIVE_THRESH/g' `grep CV_CALIB_CB_ADAPTIVE_THRESH -rl ./`
sed -i 's/CV_CALIB_CB_NORMALIZE_IMAGE/cv::CALIB_CB_NORMALIZE_IMAGE/g' `grep CV_CALIB_CB_NORMALIZE_IMAGE -rl ./`
sed -i 's/CV_CALIB_CB_FILTER_QUADS/cv::CALIB_CB_FILTER_QUADS/g' `grep CV_CALIB_CB_FILTER_QUADS -rl ./`
sed -i 's/CV_CALIB_CB_FAST_CHECK/cv::CALIB_CB_FAST_CHECK/g' `grep CV_CALIB_CB_FAST_CHECK -rl ./`
sed -i 's/CV_ADAPTIVE_THRESH_MEAN_C/cv::ADAPTIVE_THRESH_MEAN_C/g' `grep CV_ADAPTIVE_THRESH_MEAN_C -rl ./`
sed -i 's/CV_THRESH_BINARY/cv::THRESH_BINARY/g' `grep CV_THRESH_BINARY -rl ./`
sed -i 's/CV_SHAPE_CROSS/cv::MORPH_CROSS/g' `grep CV_SHAPE_CROSS -rl ./`
sed -i 's/CV_SHAPE_RECT/cv::MORPH_RECT/g' `grep CV_SHAPE_RECT -rl ./`
sed -i 's/CV_TERMCRIT_EPS/cv::TermCriteria::EPS/g' `grep CV_TERMCRIT_EPS -rl ./`
sed -i 's/CV_TERMCRIT_ITER/cv::TermCriteria::MAX_ITER/g' `grep CV_TERMCRIT_ITER -rl ./`
sed -i 's/CV_RETR_CCOMP/cv::RETR_CCOMP/g' `grep CV_RETR_CCOMP -rl ./`
sed -i 's/CV_CHAIN_APPROX_SIMPLE/cv::CHAIN_APPROX_SIMPLE/g' `grep CV_CHAIN_APPROX_SIMPLE -rl ./`
sed -i 's/CV_AA/cv::LINE_AA/g' `grep CV_AA -rl ./`
解釋參考 Docker 制作各 ROS 版本 VINS-Fusion 鏡像_想要個(gè)小姑娘的博客-CSDN博客
然后進(jìn)入 catkin_ws/ 工作目錄,進(jìn)行編譯
cd ~/catkin_ws/
catkin_make
編譯成功后 VINS-Fusion-gpu 就可以運(yùn)行啦,運(yùn)行方式參考
Jetson Orin NX 開發(fā)指南(6): VINS-Fusion-gpu 的編譯和運(yùn)行_想要個(gè)小姑娘的博客-CSDN博客
最后終端輸入nvidia-smi 可以查看 vins-node 使用 GPU 的情況
四、修改 VINS-Fusion-gpu
在 VINS-Fusion-gpu 中,特征追蹤的圖像是直接顯示在外面的,但是在 VINS-Fusion 中,特征追蹤的圖像是集成在 rviz 中的,下面我們介紹如何修改 VINS-Fusion-gpu 源碼使得特征追蹤的圖像顯示在 rviz 中。
首先用 vscode 打開 VINS-Fusion-gpu 目錄 進(jìn)入 feature_tracker.cpp,找到下圖所示的兩行
這是 VINS-Fusion-gpu 顯示特征追蹤圖像的方式,將其注釋
接下來打開 visualization.h,
在上圖位置添加(聲明發(fā)布特征追蹤圖像的函數(shù))
void pubTrackImage(const cv::Mat &imgTrack, const double t);
然后打開 visualization.cpp,
在上圖位置添加(定義發(fā)布特征追蹤圖像的函數(shù))
void pubTrackImage(const cv::Mat &imgTrack, const double t)
{
std_msgs::Header header;
header.frame_id = "world";
header.stamp = ros::Time(t);
sensor_msgs::ImagePtr imgTrackMsg = cv_bridge::CvImage(header, "bgr8", imgTrack).toImageMsg();
pub_image_track.publish(imgTrackMsg);
}
接下來還是在 visualization.cpp 中,
在上圖兩個(gè)位置添加
ros::Publisher pub_image_track;
以及
pub_image_track = n.advertise<sensor_msgs::Image>("image_track", 1000);
最后在 estimator.cpp 中
在上圖位置添加一行
pubTrackImage(imgTrack, t);
通過編譯后,就可以在 rviz 中找到 /vins_estimator/image_track 話題了!文章來源:http://www.zghlxwxcb.cn/news/detail-518242.html
至此,VINS-Fusion-gpu 就完全實(shí)現(xiàn)了 VINS-Fusion 的效果!文章來源地址http://www.zghlxwxcb.cn/news/detail-518242.html
到了這里,關(guān)于Ubuntu 20.04 配置 VINS-Fusion-gpu + OpenCV 4.6.0的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!