前言

如果想更方便地使用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 curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

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

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

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

在终端中输入以下命令。

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

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

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

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.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/src
TAGVERNUM=5.15.167.4
TAGVER=linux-msft-wsl-${TAGVERNUM}
sudo git clone -b ${TAGVER} https://github.com/microsoft/WSL2-Linux-Kernel.git ${TAGVERNUM}-microsoft-standard
cd ${TAGVERNUM}-microsoft-standard

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

在终端中输入以下命令。

sudo cp /proc/config.gz config.gz
sudo gunzip config.gz
sudo mv config .config
sudo 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=.config
sudo 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/<username>/.wslconfig

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

在vim中添加以下文本。

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

在PowerShell中输入以下命令。

wsl --shutdown

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

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

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

在终端中输入以下命令。

lsusb
uname -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-dev
sudo 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/Share
cp -r Pangolin-0.6.tar.gz ~
cd ~
tar -zxvf Pangolin-0.6.tar.gz
mv Pangolin-0.6 Pangolin
cd Pangolin

在终端中输入以下命令。

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

在终端中输入以下命令。

mkdir build
cd build
cmake -DCPP11_NO_BOOST=1 ..
make
sudo make install

在终端中输入以下命令。

cd ../examples/HelloPangolin
mkdir build
cd build
cmake ..
make
./HelloPangolin

安装OpenCV库

在终端中输入以下命令。

sudo apt install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt install python3-dev python3-numpy
sudo apt install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
sudo 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/Share
cp -r opencv-4.2.0.tar.gz ~
cd ~
tar -zxvf opencv-4.2.0.tar.gz
mv opencv-4.2.0 opencv
cd opencv

在终端中输入以下命令。

mkdir build
cd build
cmake -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/Share
cp -r boost_1_77_0.tar.gz ~
cd ~
tar -zxvf boost_1_77_0.tar.gz
cd boost_1_77_0

在终端中输入以下命令。

./bootstrap.sh
sudo ./b2 install

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

在终端中输入以下命令。

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

在终端中输入以下命令。

cd ORB_SLAM3
vim CMakeLists.txt

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

在终端中输入以下命令。

cd Examples_old/ROS/ORB_SLAM3
vim CMakeLists.txt

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

在终端中输入以下命令。

cd ..
cd ..
cd ..
cd Thirdparty/DBoW2
vim CMakeLists.txt

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

在终端中输入以下命令。

cd ..
cd g2o
vim CMakeLists.txt

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

在终端中输入以下命令。

sudo apt install libpython2.7-dev

在终端中输入以下命令。

cd ~
vim ~/.bashrc

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

在终端中输入以下命令。

source ~/.bashrc

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

cd ~
cd ORB_SLAM3
chmod +x build.sh
./build.sh

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

在终端中输入以下命令。

mkdir -p catkin_ws/src
cd catkin_ws
catkin_make

在终端中输入以下命令。

cd src
catkin_create_pkg orbslam3 roscpp cv_bridge

在终端中输入以下命令。

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

在终端中输入以下命令。

cd src
vim ros_mono.cc

第62行改为如下图所示。

在终端中输入以下命令。

cd AR
vim ros_mono_ar.cc

第88行改为如下图所示。

在终端中输入以下命令。

cd ~/ORB_SLAM3/catkin_ws/src/orbslam3
vim 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 path
set(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
)
 
## include
include_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}
)
 
 
## libs
set(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/launch
vim usb_cam-test.launch

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

在终端中输入以下命令。

sudo apt install ros-noetic-camera-calibration

在终端中输入以下命令。

cd ~/ORB_SLAM3/catkin_ws/src
catkin_create_pkg robot_vision cv_bridge image_transport sensor_msgs std_msgs geometry_msgs message_generation roscpp rospy
cd robot_vision
mkdir doc launch
cd launch
vim camera_calibration.launch

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

在终端中输入以下命令。

cd ~/ORB_SLAM3/catkin_ws
catkin_make
source ~/ORB_SLAM3/catkin_ws/devel/setup.bash
roslaunch 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

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐