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
记得要不断移动摄像头或者相机,才会有画面!!!