> 技术文档 > WSL2+Ubuntu20.04+ROS1 Noetic下,如何复现ORB-SLAM3算法_wsl ubuntu ros

WSL2+Ubuntu20.04+ROS1 Noetic下,如何复现ORB-SLAM3算法_wsl ubuntu ros


前言

如果想更方便地使用ROS还是建议物理机装上Ubuntu操作系统,WSL2+Ubuntu其实更适合喜欢折腾捣鼓的人,比如博主Qwq。

可以先去自行搜索Windows系统如何开启WSL功能,网络上有很多优质资源可以参考,这里博主不再赘述。可以去参考我以下这篇文章有关WSL2安装的教程,只需要阅读完前四个目录并跟着照做即可。

文章链接:WSL2+Ubuntu22.04下,如何部署RAGFlow知识库-CSDN博客

为什么是Ubuntu20.04?noetic - ROS Wiki

①因为ROS1 Noetic对应的是Ubuntu20.04,最好安装Ubuntu20.04,因此你只需要把我以上链接的博客中的所有Ubuntu-22.04改为Ubuntu-20.04即可。

ROS1 Noetic中支持的SLAM算法更多,更方便配置。

在Ubuntu20.04中安装ROS1 Noetic环境及依赖项

noetic/Installation/Ubuntu - ROS Wiki

从这里开始,参考ROS官方安装教程即可。当然,也可以去选择去看fishros的教程,他的教程也确实特别好,这里我们按照ROS官方的来做。

终端中输入以下命令

sudo sh -c \'echo \"deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main\" > /etc/apt/sources.list.d/ros-latest.list\'sudo apt install curlcurl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

容易报错的步骤是Ubuntu终端执行这个命令。

还是各位懂得都懂的问题,WSL2的Ubuntu默认网络模式是NAT模式,可以将其改为镜像模式与Windows共享局域网,不便透露过多,懂得都懂。相信各位可以自行解决!

正确的输出如下图所示,当然如果你嫌麻烦可以去看fishros的教程,这里我们继续按照ROS官方教程来。

在终端中输入以下命令。

sudo apt updatesudo apt install ros-noetic-desktop-full

耐心等待二十分钟左右!!!!

将ROS1 Noetic添加到环境变量,确保每次WSL2的Ubuntu20.04一启动,就不用再次添加临时环境变量了,在终端中输入以下命令。

echo \"source /opt/ros/noetic/setup.bash\" >> ~/.bashrcsource ~/.bashrc

构建ROS包的其他依赖项,在终端中输入以下命令。

sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

在Windows中安装usbipd

https://github.com/dorssel/usbipd-win/releases/tag/v5.0.0

可以如上图所示安装,也可以在PowerShell中输入以下命令。

winget install usbipd

打开内置摄像头,连接USB摄像头或者USB连接深度相机,在PowerShell中输入以下命令。

usbipd list

我这里使用的是内置摄像头,将摄像头绑定(1-3对应上图的BUSID),在PowerShell中输入以下命令。

usbipd bind -b 1-3

在PowerShell中输入以下命令。

usbipd list

此时内置摄像头的STATE已经变成Shared,在PowerShell中输入以下命令。

usbipd attach --wsl Ubuntu-20.04 --busid 1-3

启动Ubuntu20.04,在终端中输入以下命令。

lsusb

可以看到Ubuntu已经与我的内置摄像头连接起来。

重新编译Ubuntu的Linux内核,以构建USB驱动和多媒体视频流驱动等

启动Ubuntu20.04,在终端中输入以下命令。

uname -r

https://github.com/microsoft/WSL2-Linux-Kernel/tags

找到微软官方WSL2 Linux内核Github的Repo。

在终端中输入以下命令,其中TAGVERNUM请根据自己的实际情况修改,具体来说是看uname -r输出对应的版本是什么。我的是对应5.15.167.4,请一定要根据自己的实际情况!!!

git clone下Linux内核大概需要二十分钟左右,请耐心等待!!!!!

cd /usr/srcTAGVERNUM=5.15.167.4TAGVER=linux-msft-wsl-${TAGVERNUM}sudo git clone -b ${TAGVER} https://github.com/microsoft/WSL2-Linux-Kernel.git ${TAGVERNUM}-microsoft-standardcd ${TAGVERNUM}-microsoft-standard

以上图片其实我已经重新编译好Linux内核并且编译好USB驱动及多媒体视频流驱动了。为什么要这么做呢?因为WSL2的Ubuntu默认是不带这些驱动的,这就意味着Ubuntu无法调用我的内置摄像头运行ORB-SLAM3算法。接着说说如何具体实现的。

在终端中输入以下命令。

sudo cp /proc/config.gz config.gzsudo gunzip config.gzsudo mv config .configsudo make menuconfig

终端会显示以下TUI界面以供我们选择要重新编译Linux内核的哪些部分以及具体选项,由于我们要使得WSL2的Ubuntu能够调用内置摄像头,因此我们要找到menuconfig -> Device Drivers。

按回车键选中以下选项,按Y键表示设置包括该驱动。

menuconfig -> Device Drivers -> Multimedia support -> Filter media drivers

menuconfig -> Device Drivers -> Multimedia support -> Autoselect ancillary drivers

menuconfig -> Device Drivers -> Multimedia support -> Media device types -> Cameras and video grabbers

menuconfig -> Device Drivers -> Multimedia support -> Video4Linux options -> V4L2 sub-device userspace API

menuconfig -> Device Drivers -> Multimedia support -> Media drivers -> Media USB Adapters -> USB Video Class (UVC)

menuconfig -> Device Drivers -> Multimedia support -> Media drivers -> Media USB Adapters -> UVC input events device support

menuconfig -> Device Drivers -> Multimedia support -> Media drivers -> Media USB Adapters -> GSPCA based webcams

按3次小键盘→键,按回车键保存后,按两次Esc键退出以上TUI界面,在终端中输入以下命令。

sudo make -j$(nproc) KCONFIG_CONFIG=.configsudo make modules_install -j$(nproc)sudo make install -j$(nproc)

命令sudo make -j$(nproc) KCONFIG_CONFIG=.config应该会执行得最久,可能需要十分钟左右,具体看你设备的CPU和内存性能。后面两条命令大概一两分钟左右就执行完了,在终端中输入以下命令。

ls

以上,我们成功重新编译了Ubuntu的Linux内核并且打上了USB驱动以及多媒体视频流驱动,我们把重新编译好的Linux内核,即以上图片中的vmlinux文件放在Windows路径D:\\WSL2-Ubuntu-Kernel-5.15.167.4\\下,这个路径可以随意,我们给vmlinux重新命名为kernel-5.15.167.4,这个命名也可以随意,在终端中输入以下命令。

sudo cp vmlinux /mnt/d/WSL2-Ubuntu-Kernel-5.15.167.4/kernel-5.15.167.4

这样,将Ubuntu中重新编译好的内核复制到了Windows中。

之后,我们需要告诉WSL2哪里找到重新编译的Linux内核并加载新的内核,在终端中输入以下命令。

vim /mnt/c/Users//.wslconfig

其中表示你的Windows系统中的用户名,请根据实际情况修改!!!!

在vim中添加以下文本。

其中的路径和文件名均可以修改,可以和我的起一模一样的路径和文件名,也可以自己任意指定路径和文件名,根据实际情况来添加文本!!!!

在PowerShell中输入以下命令。

wsl --shutdown

然后重新启动Ubuntu20.04,在PowerShell中输入以下命令。

usbipd listusbipd attach --wsl Ubuntu-20.04 --busid 1-3

注意--busid后面跟着的m-n也是一样需要根据你的usbipd list输出的实际情况来修改!!!!!!

在终端中输入以下命令。

lsusbuname -r -v

可以看到内核名称末尾看到一个+号,#号后跟着的是构建内核的次数,再后面对应的是内核编译的时间。

在终端中输入以下命令。

guvcview

使用guvcview测试摄像头视频流是否正常工作,如果提示未安装guvcview,那么安装即可,在终端中输入以下命令。

sudo apt install guvcview

在终端中输入以下命令。

guvcview

各位就应该能在Ubuntu20.04中看到自己帅气/美丽的脸庞了!!!

在Ubuntu20.04中安装ORB-SLAM3的依赖项

我们可以在Windows路径中新建一个文件夹以供Ubuntu直接复制Windows中的文件实现共享,例如我在E盘中新建一个Share的文件夹以和WSL2的Ubuntu共享。

安装cv_bridge库

在终端中输入以下命令。

sudo apt install libopencv-devsudo apt install ros-noekit-cv-bridge

安装Eigen库

在终端中输入以下命令。

sudo apt install libeigen3-dev

安装Pangolin库

https://github.com/stevenlovegrove/Pangolin/releases

鼠标移到最底端,点Assets展开,点Source code (tar.gz),下载到路径E:\\Share

在终端中输入以下命令。

cd /mnt/e/Sharecp -r Pangolin-0.6.tar.gz ~cd ~tar -zxvf Pangolin-0.6.tar.gzmv Pangolin-0.6 Pangolincd Pangolin

在终端中输入以下命令。

sudo apt install libglew-dev libboost-dev libboost-thread-dev libboost-filesystem-devsudo apt install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libpng-dev

在终端中输入以下命令。

mkdir buildcd buildcmake -DCPP11_NO_BOOST=1 ..makesudo make install

在终端中输入以下命令。

cd ../examples/HelloPangolinmkdir buildcd buildcmake ..make./HelloPangolin

安装OpenCV库

在终端中输入以下命令。

sudo apt install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-devsudo apt install python3-dev python3-numpysudo apt install libgstreamer-plugins-base1.0-dev libgstreamer1.0-devsudo apt install libpng-dev libopenexr-dev libtiff-dev libwebp-dev

https://github.com/opencv/opencv/releases?page=3

点Assets展开,点Source code (tar.gz),下载到路径E:\\Share

在终端中输入以下命令。

cd /mnt/e/Sharecp -r opencv-4.2.0.tar.gz ~cd ~tar -zxvf opencv-4.2.0.tar.gzmv opencv-4.2.0 opencvcd opencv

在终端中输入以下命令。

mkdir buildcd buildcmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES ..make -j$(nproc)sudo make install

在终端中输入以下命令。

pkg-config --modversion opencv4

安装Boost库

Boost Downloads

下载到路径E:\\Share下,在终端中输入以下命令。

cd /mnt/e/Sharecp -r boost_1_77_0.tar.gz ~cd ~tar -zxvf boost_1_77_0.tar.gzcd boost_1_77_0

在终端中输入以下命令。

./bootstrap.shsudo ./b2 install

下载ORB-SLAM3源码,部署ORB-SLAM3

在终端中输入以下命令。

cd ~git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git

在终端中输入以下命令。

cd ORB_SLAM3vim CMakeLists.txt

第20行,第33行和第41行改为如下图所示。

在终端中输入以下命令。

cd Examples_old/ROS/ORB_SLAM3vim CMakeLists.txt

第12行,第13行,第20行,第33行和第41行改为如下图所示。

在终端中输入以下命令。

cd ..cd ..cd ..cd Thirdparty/DBoW2vim CMakeLists.txt

第8行和第9行改为如下图所示。

在终端中输入以下命令。

cd ..cd g2ovim CMakeLists.txt

第57行,第58行和第72行改为如下图所示。

在终端中输入以下命令。

sudo apt install libpython2.7-dev

在终端中输入以下命令。

cd ~vim ~/.bashrc

添加以下内容后保存并退出。

在终端中输入以下命令。

source ~/.bashrc

编译ORB-SLAM3,在终端中输入以下命令。

cd ~cd ORB_SLAM3chmod +x build.sh./build.sh

如果你严格按照我以上所说的步骤一步一步执行,大概到这一步是没有报错的,CMake会直接成功构建ORB-SLAM3项目,如果有报错欢迎评论区交流!!!

在终端中输入以下命令。

mkdir -p catkin_ws/srccd catkin_wscatkin_make

在终端中输入以下命令。

cd srccatkin_create_pkg orbslam3 roscpp cv_bridge

在终端中输入以下命令。

cd orbslam3/srccp -r ~/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src .cp -r ~/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/Asus.yaml .

在终端中输入以下命令。

cd srcvim ros_mono.cc

第62行改为如下图所示。

在终端中输入以下命令。

cd ARvim ros_mono_ar.cc

第88行改为如下图所示。

在终端中输入以下命令。

cd ~/ORB_SLAM3/catkin_ws/src/orbslam3vim CMakeLists.txt

添加以下内容后保存并退出。

cmake_minimum_required(VERSION 3.0.2) project(orbslam3) set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall -O3\")set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall -O3\")## set pathset(ORBSLAM_PATH \"~/ORB_SLAM3/\") include(CheckCXXCompilerFlag)CHECK_CXX_COMPILER_FLAG(\"-std=c++11\" COMPILER_SUPPORTS_CXX11)if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_STANDARD 14) add_definitions(-DCOMPILEDWITHC11) message(STATUS \"Using flag -std=c++11.\")elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++0x\") add_definitions(-DCOMPILEDWITHC0X) message(STATUS \"Using flag -std=c++0x.\")else() message(FATAL_ERROR \"The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.\")endif() LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}//home/ros/lib/ORB_SLAM3-master/ORB_SLAM3-master/cmake_modules) find_package(OpenCV)if(NOT OpenCV_FOUND) find_package(OpenCV 2.4.3 QUIET) if(NOT OpenCV_FOUND) message(FATAL_ERROR \"OpenCV > 2.4.3 not found.\") endif()endif() find_package(Eigen3 REQUIRED)find_package(Pangolin REQUIRED)find_package(catkin REQUIRED COMPONENTS cv_bridge roscpp) catkin_package(# INCLUDE_DIRS include# LIBRARIES orbslam3 CATKIN_DEPENDS cv_bridge roscpp# DEPENDS system_lib) ## includeinclude_directories( ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIRS} ${Pangolin_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR} ${ORBSLAM_PATH} ${ORBSLAM_PATH}/include ${ORBSLAM_PATH}/include/CameraModels ${Pangolin_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS}) ## libsset(LIBS ${OpenCV_LIBS} ${EIGEN3_LIBS}${Pangolin_LIBRARIES}${ORBSLAM_PATH}/Thirdparty/DBoW2/lib/libDBoW2.so${ORBSLAM_PATH}/Thirdparty/g2o/lib/libg2o.so${ORBSLAM_PATH}/lib/libORB_SLAM3.so-lboost_system) add_executable(${PROJECT_NAME}_node src/src/ros_mono.cc) target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES} ${LIBS}) 

在终端中输入以下命令。

cd ..cd ..catkin_make

编译成功后,在终端中输入以下命令。

vim ~/.bashrc

添加以下内容后保存并退出。

自此,ORB-SLAM3成功部署!!!!!!

对摄像头/相机进行标定,获得内参

在终端中输入以下命令。

sudo apt install ros-noetic-usb-cam

在终端中输入以下命令。

cd /opt/ros/noetic/share/usb_cam/launchvim usb_cam-test.launch

修改以下内容后保存并退出。

在终端中输入以下命令。

sudo apt install ros-noetic-camera-calibration

在终端中输入以下命令。

cd ~/ORB_SLAM3/catkin_ws/srccatkin_create_pkg robot_vision cv_bridge image_transport sensor_msgs std_msgs geometry_msgs message_generation roscpp rospycd robot_visionmkdir doc launchcd launchvim camera_calibration.launch

添加以下内容后保存并退出。

在终端中输入以下命令。

cd ~/ORB_SLAM3/catkin_wscatkin_makesource ~/ORB_SLAM3/catkin_ws/devel/setup.bashroslaunch robot_vision camera_calibration.launch

大约标定了40个样本左右,标定程序得到了我的内置摄像头的内参,将它保存在路径~/.ros/camera_info/head_camera.yaml中

复现ORB-SLAM3算法

新开三个Ubuntu终端,分别输入以下命令,记得一定要将第三个终端中的EuRoC.yaml里的内参改成~/.ros/camera_info/head_camera.yaml中的内参

roscore
rosrun usb_cam usb_cam_node
rosrun orbslam3 orbslam3_node ~/ORB_SLAM3/Vocabulary/ORBvoc.txt ~/ORB_SLAM3/Examples_old/Monocular/EuRoC.yaml

记得要不断移动摄像头或者相机,才会有画面!!!