文章目录
1 环境
1.1 宿主机
WIN11
Docker Desktop
WSL
Ubuntu 24.04 For WSL
nvidia/cuda:11.6.1-devel-ubuntu20.04
镜像
1.2 容器
Ubuntu 20.04
OpenCV 4.2
VTK
PCL
Pangolin
Eigen
ROS
首先需要有Docker
环境,以及配置WSL 2
来操作Docker
,然后下载Docker
镜像,就可以开始操作。相比VMWare
虚拟机或双系统,整个过程非常简单和快速,下面是具体的操作步骤。希望对你有点帮助,和节省一点宝贵的时间精力----天朝的牛马真的太累太苦了,尤其是外包牛马!
2 启动容器
打开WSL,执行以下操作
sudo apt install x11-xserver-utils
xhost +local:root
docker run -d \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /mnt/d/docker-ws/shared/:/shared \
--gpus all \
-e DISPLAY=$DISPLAY \
-e QT_X11_NO_MITSHM=1 \
--ipc=host \
--name ub20-cuda-yolo-slam3 \
nvidia/cuda:11.6.1-devel-ubuntu20.04 \
tail -f /dev/null
注意
- 第一次会下载
nvidia/cuda:11.6.1-devel-ubuntu20.0
4镜像,你也可以先使用docker pull nvidia/cuda:11.6.1-devel-ubuntu20.04
进行下载 - 如果你没有
GPU
环境,--gpus all
可能会报错,直接去掉 - 建议在
宿主机
先创建一个共享文件夹
,之后就可以将下载代码和数据集放到共享文件夹中,方便之后使用:-v /mnt/d/docker-ws/shared/:/shared
3 进入容器
docker exec -it ub20-cuda-yolo-slam3 /bin/bash
4 安装基础软件
# 备份
cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 换源
sed -i 's|http://.*archive.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list
sed -i 's|http://.*security.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list
# 更新软件列表
apt update
# 安装基础软件
apt install -y vim wget git cmake pkg-config build-essential unzip sudo
5 安装VTK和PCL
5.1 安装
apt install libpcl-dev pcl-tools -y
5.2 查看版本
dpkg -s libeigen3-dev | grep Version
Version: 3.3.7-2
dpkg -s vtk7 | grep Version
Version: 7.1.1+dfsg2-2ubuntu1
dpkg -s libpcl-dev | grep Version
Version: 1.10.0+dfsg-5ubuntu1
6 安装Noetic ROS桌面版
wget http://fishros.com/install -O fishros && . fishros
使用小鱼大牛的一键安装ROS
,按照提示,分别选择以下这5项:
[1]:一键安装(推荐):ROS(支持ROS/ROS2,树莓派Jetson)
[1]:更换系统源再继续安装
[2]:更换系统源并清理第三方源
[3]:noetic(ROS1)
[1]:noetic(ROS1)桌面版
安装成功后,再执行以下操作:
sudo rosdep init
rosdep update
ROS在安装时,也会安装OpenCV 4.2
,查看它版本
opencv_version
4.2.0
7 安装Pangolin v0.6
# 安装依赖
sudo apt-get install \
libgl1-mesa-dev \
libglew-dev \
libboost-dev \
libboost-thread-dev \
libboost-filesystem-dev -y
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin/
git checkout v0.6 # 切换到v0.6版本
git branch
mkdir build
cd build/
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j
make install
cd examples/HelloPangolin
./HelloPangolin
8 编译YOLO_ORB_SLAM3_with_pointcloud_map
git clone https://github.com/YWL0720/YOLO_ORB_SLAM3_with_pointcloud_map.git
# 下载libtorch
wget https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-1.7.1%2Bcpu.zip
unzip libtorch-cxx11-abi-shared-with-deps-1.7.1+cpu.zip
mv libtorch YOLO_ORB_SLAM3_with_pointcloud_map/Thirdparty/
cd YOLO_ORB_SLAM3_with_pointcloud_map/
sed -i 's/-march=native//g' CMakeLists.txt
sed -i 's/-march=native//g' Thirdparty/DBoW2/CMakeLists.txt
sed -i 's/-march=native//g' Thirdparty/g2o/CMakeLists.txt
sed -i '1 a\add_definitions(-w)' CMakeLists.txt
sed -i '1 a\add_definitions(-w)' Thirdparty/DBoW2/CMakeLists.txt
sed -i '1 a\add_definitions(-w)' Thirdparty/g2o/CMakeLists.txt
# 编译
bash build.sh
# 编译成功后,执行后报错,修改libgomp.so
ln -sf /usr/lib/x86_64-linux-gnu/libgomp.so.1 Thirdparty/libtorch/lib/libgomp-75eea7e8.so.1
9 下载关联python脚本
9.1 下载
wget https://svncvpr.in.tum.de/cvpr-ros-pkg/trunk/rgbd_benchmark/rgbd_benchmark_tools/src/rgbd_benchmark_tools/associate.py
9.2 修改associate.py脚本
# 将86和87行修改
86 # first_keys = first_list.keys()
87 # second_keys = second_list.keys()
88 first_keys = list(first_list.keys())
89 second_keys = list(second_list.keys())
9.3 生成RGB和Depth的关联文件
cd <TUM数据集文件夹中>
# 注意associate.py的路径
python3 ../associate.py rgb.txt depth.txt > ass.txt
10 跑TUM数据集
Examples/RGB-D/rgbd_tum \
Vocabulary/ORBvoc.txt \
Examples/RGB-D/TUM3.yaml \
~/ws/rgbd_dataset_freiburg3_walking_xyz \
~/ws/rgbd_dataset_freiburg3_walking_xyz/ass.txt
11 保存彩色点云图
因为程序跑到最后会报Segmentation fault (core dumped)
,我也不懂是什么原因
median tracking time: 0.0719869
mean tracking time: 0.0730376
Saving camera trajectory to CameraTrajectory.txt …
Saving keyframe trajectory to KeyFrameTrajectory.txt …
Segmentation fault (core dumped)
所以也不知道正常情况会不会有彩色点云图
的保存,但可以通过修改以下代码,增加保存彩色点云图:
vim src/PointCloudMapper.cpp
1 //
2 // Created by yuwenlu on 2022/7/2.
3 //
4 #include <pcl/io/pcd_io.h> // 增加
5 #include "PointCloudMapper.h"
84 *mpGlobalMap += *pointCloud_new;
85 pcl::io::savePCDFileBinary("vslam.pcd", *mpGlobalMap); // 增加
86 PointCloud::Ptr temp(new PointCloud);
重新编译,运行
12 参考
感谢这篇博文https://blog.youkuaiyun.com/qq_57425280/article/details/140227237的博主。