使用Docker简单快速跑通YOLO_ORB_SLAM3_with_pointcloud_map并保存彩色点云图

1 环境

1.1 宿主机

  1. WIN11
  2. Docker Desktop
  3. WSL
  4. Ubuntu 24.04 For WSL
  5. nvidia/cuda:11.6.1-devel-ubuntu20.04镜像

1.2 容器

  1. Ubuntu 20.04
  2. OpenCV 4.2
  3. VTK
  4. PCL
  5. Pangolin
  6. Eigen
  7. 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

注意

  1. 第一次会下载nvidia/cuda:11.6.1-devel-ubuntu20.04镜像,你也可以先使用docker pull nvidia/cuda:11.6.1-devel-ubuntu20.04进行下载
  2. 如果你没有GPU环境,--gpus all可能会报错,直接去掉
  3. 建议在宿主机先创建一个共享文件夹,之后就可以将下载代码和数据集放到共享文件夹中,方便之后使用:-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. [1]:一键安装(推荐):ROS(支持ROS/ROS2,树莓派Jetson)
  2. [1]:更换系统源再继续安装
  3. [2]:更换系统源并清理第三方源
  4. [3]:noetic(ROS1)
  5. [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的博主。

<think>好的,我现在需要帮助用户解决在Ubuntu 18.04的ROS环境中集成ORB-SLAM2和YOLO以实现语义建图的问题。首先,我需要理清楚用户的需求。用户已经具备基本的Ubuntu和ROS环境,可能已经安装好了ORB-SLAM2,但需要结合YOLO进行语义建图。 首先,我应该回顾ORB-SLAM2和YOLO的基本工作原理。ORB-SLAM2是一个基于特征点的视觉SLAM系统,用于实时定位与地图构建。而YOLO是一个实时目标检测算法,可以识别图像中的物体给出类别和位置。语义建图的目标是将YOLO检测到的物体语义信息(如类别标签)添加到ORB-SLAM2构建的地图中,使地图不仅包含几何信息,还有物体类别等语义信息。 接下来,我需要考虑如何将两者集成。可能的步骤包括:安装和配置YOLO,确保其能在ROS环境下运行;修改ORB-SLAM2的代码,使其能够接收YOLO的检测结果;设计数据信机制,比如使用ROS的话题或服务来传递图像和检测结果;最后,将语义信息与地图点或关键帧关联,生成语义地图。 然后,我需要参考用户提供的引用内容,特别是引用[2]、[4]、[5],这些涉及到ORB-SLAM3的安装和ROS中的编译问题。用户可能遇到的问题可能包括依赖项安装、编译错误、节点生成失败等。例如,引用[5]提到找不到可执行文件的问题,这可能是因为编译过程中某些步骤未正确完成,需要检查CMakeLists.txt和编译命令。 接下来,我应该分步骤详细说明如何集成。首先,确保ORB-SLAM2在ROS中正确编译运行,可能需要参考引用[5]中的解决方案处理编译错误。然后,安装YOLO的ROS版本,比如darknet_ros,这是一个将YOLO集成到ROS中的常用包。需要安装依赖项,下载源码,编译,测试是否能正确发布检测结果。 然后,需要考虑数据同步的问题。ORB-SLAM2处理图像帧进行定位和建图,而YOLO处理同一帧进行物体检测。由于两者处理速度可能不同,可能需要使用ROS的message_filters库进行时间同步,确保同一时刻的图像帧和检测结果能够对应。 接下来,修改ORB-SLAM2的代码,添加订阅YOLO检测结果的订阅者,在关键帧生成时将检测到的语义信息关联到地图点或关键帧中。可能需要修改地图数据结构,保存每个地图点的语义标签,或者在关键帧中添加元数据。 此外,还需要考虑如何可视化语义地图。可能需要使用Rviz或其他工具,将带有标签的地图点或物体边界框显示出来。 用户可能遇到的常见问题包括:依赖项冲突(如OpenCV版本,因为ORB-SLAM2可能需要特定版本的OpenCV,而YOLO可能依赖另一个版本),ROS话题信问题,数据同步问题,以及编译错误。需要参考引用[3]中提到的VTK和PCL安装问题,确保点云库正确安装,因为语义建图可能涉及点云的生成和处理。 最后,生成相关问题,可能涉及性能优化、具体配置步骤、如何处理不同传感器数据、如何评估语义建图效果等。</think>### 在ROS环境下集成ORB-SLAM2与YOLO实现语义建图的步骤 #### 1. **环境准备** - **确认基础环境** 确保已正确安装Ubuntu 18.04、ROS Melodic、ORB-SLAM2(ROS版本)[^5],配置好OpenCV(建议3.2+)和PCL库[^3]。 - **安装YOLO相关依赖** 使用`darknet_ros`(ROS封装的YOLO版本): ```bash cd ~/catkin_ws/src git clone https://github.com/leggedrobotics/darknet_ros.git cd .. && catkin_make -DCATKIN_WHITELIST_PACKAGES="darknet_ros" ``` #### 2. **ORB-SLAM2与YOLO信** - **数据同步** 过ROS的`message_filters`实现图像与检测结果的同步订阅: ```cpp // 在ORB-SLAM2代码中添加订阅者 message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, "/camera/rgb/image_raw", 1); message_filters::Subscriber<darknet_ros_msgs::BoundingBoxes> yolo_sub(nh, "/darknet_ros/bounding_boxes", 1); typedef message_filters::sync_policies::ApproximateTime<sensor_msgs::Image, darknet_ros_msgs::BoundingBoxes> sync_policy; message_filters::Synchronizer<sync_policy> sync(sync_policy(10), rgb_sub, yolo_sub); sync.registerCallback(boost::bind(&SemanticMapper::callback, this, _1, _2)); ``` #### 3. **语义信息关联** - **修改ORB-SLAM2地图结构** 在`MapPoint`类中添加语义标签字段: ```cpp class MapPoint { public: std::string semantic_label; // 添加语义标签 // 其他原有成员... }; ``` - **关键帧关联检测结果** 在`KeyFrame`类中存储YOLO检测的物体边界框和类别: ```cpp class KeyFrame { public: std::vector<darknet_ros_msgs::BoundingBox> detected_objects; }; ``` #### 4. **语义地图生成** - **可视化与存储** 使用PCL库将带标签的点云保存为`pcd`文件,在Rviz中显示语义信息: ```cpp pcl::PointCloud<pcl::PointXYZRGBL> cloud; for (auto &mp : map_points) { pcl::PointXYZRGBL point; point.x = mp->GetWorldPos().x; point.y = mp->GetWorldPos().y; point.z = mp->GetWorldPos().z; point.label = mp->semantic_label_id; // 标签ID映射 cloud.push_back(point); } pcl::io::savePCDFile("semantic_map.pcd", cloud); ``` #### 5. **常见问题解决** - **依赖冲突** 若OpenCV版本冲突,可在编译时指定路径(例如ORB-SLAM2使用OpenCV 3.2,YOLO使用OpenCV 4.x): ```bash cmake -DOpenCV_DIR=/usr/local/opencv3.2 .. ``` - **节点未生成** 检查`CMakeLists.txt`中是否添加了可执行文件生成指令[^5]: ```cmake add_executable(mono_node src/ros_mono.cc) target_link_libraries(mono_node ${PROJECT_NAME}) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值