~~ 第一次编译ORB_SLAM3花费了我三天的时间,每一天都是在坐牢,有时候盯着一个问题查了好久一点头绪都没有。这也是锻炼自己的一个机会吧。 ~~
目录
利用Android手机摄像头联合Ubuntu20.04建模ORB-SLAM3(20230919)
一、初始环境配置
首先选择编译ROS的环境,我是ubuntu20.04,选择的 ROS-noetic
.
可以在小鱼的一键安装中配置ROS环境。记得配置ROS和rosdep
wget http://fishros.com/install -O fishros && . fishros
这里需要多次执行,安装 ROS-noetic 和 rosdep,有需要还可以安装vscode.
先安装必须的依赖
sudo apt-get install git
sudo apt install g++
sudo apt-get install libopencv-dev
sudo apt-get install ros-noekit-cv-bridge
sudo apt-get 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
sudo apt-get install libeigen3-dev
sudo apt-get install libglew-dev libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libpng-dev
sudo apt install libpython2.7-dev
小鱼的一键安装在我的ubuntu20.04上直接安装了 ROS-noetic 和 OpenCV4,因此后续需要修改opencv的版本号.
安装Pangolin-0.6
下载网址:
https://codeload.github.com/stevenlovegrove/Pangolin/zip/refs/tags/v0.6
编译安装
mkdir build
cd build
cmake -DCPP11_NO_BOOST=1 ..
make -j
sudo make install
多线程数 -j 可以根据自己电脑性能来配置,卡死就删掉,性能好就可以加上-j2,-j4,-j8之类的。
安装Boost库
下载网址:
http://www.boost.org/users/download/
选择历史版本 boost_1_77_0.tar.gz 下载并编译安装,这个时间会很久,需要耐心等待。
cd ./boost_1_77_0
./bootstrap.sh
sudo ./b2 install
如果遇到卡死的情况则修改sh文件中多线程数量即可。
二、编译ORB_SLAM3
配置环境
先创建工作空间:
mkdir -p ~/catkin_ws_orbslam3/src
cd ~/catkin_ws_orbslam3/
catkin_make
下载orb_slam3的项目文件
https://gitcode.net/mirrors/electech6/orb_slam3_detailed_comments/-/archive/master/orb_slam3_detailed_comments-master.zip
将其粘贴至路径:
~/catkin_ws_orbslam3/src/
分别打开修改
~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/CMakeLists.txt
~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Thirdparty/DBoW2/CMakeLists.txt
~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Thirdparty/g2o/CMakeLists.txt
修改c++标准:
set(CMAKE_CXX_STANDARD 14)
修改OpenCV版本号
find_package(OpenCV 4.2.0 REQUIRED)
修改Eigen版本号
find_package(Eigen3 REQUIRED)
在 set(CMAKE_C_FLAGS...)
和 set(CMAKE_CXX_FLAGS...)
中删除 -march=native
防止运行一段时间后核心已转储的问题
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3")
添加ROS路径
打开并编辑 ~/.bashrc
sudo gedit ~/.bashrc
在 ~/.bashrc
的最后一行加入以下代码
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/cmj/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/ROS/ORB_SLAM3
这里路径可以修改成你的路径,一定注意文件夹名称,否则很容易出错
保存并添加环境变量
source ~/.bashrc
检查路径是否添加成功可以在终端输入:
echo ${ROS_PACKAGE_PATH}
输出所添加路径即可.
在ROS的安装路径下更改路径:
cd /opt/ros/noetic/
sudo gedit setup.bash
在最后一行加入以下代码
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/cmj/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/ROS/ORB_SLAM3
保存并添加环境变量
source setup.bash
编译
在 ~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/
路径下执行以下指令编译ORB_SLAM3
chmod +x build.sh
./build.sh
如果遇到报错:
Could not find a package configuration provided by "realsense2" with any of the following names: Realsense2Config.cmake Realsense2-config.cmake
可以运行以下指令解决(来自gpt):
要在终端中安装Intel RealSense 2 (realsense2) SDK,您可以使用以下步骤,具体安装方法取决于您的操作系统。以下是在不同操作系统上安装RealSense 2 SDK 的示例命令:
-
更新包列表:
sudo apt-get update
-
安装RealSense软件包:
sudo apt-get install librealsense2-dkms sudo apt-get install librealsense2-utils
-
安装RealSense开发包(如果需要):
sudo apt-get install librealsense2-dev
这里如果编译卡死可以打开 build.sh 文件修改多线程数即可。
如果需要保存从手机采集来的图像,可以在 ~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/ROS/ORB_SLAM3/
下新建文件 ros_camera_capture.cc
写入
/**
* ros_camera_capture.cc
* This file is to capture images from Android phone, for camera calibration
* This file is used with Android_Camera-IMU
*/
#include<iostream>
#include<algorithm>
#include<fstream>
#include<chrono>
#include<ros/ros.h>
#include <cv_bridge/cv_bridge.h>
#include<opencv2/core/core.hpp>
#include"../../../include/System.h"
using namespace std;
string save_dir = "~/"; // 修改为自己保存图片的路径,注意路径末尾带上/
int imgId = 0;
void GrabImage(const sensor_msgs::ImageConstPtr& msg);
int main(int argc, char **argv)
{
std::cout << "To save the current frame, please press 'Q' or 'q' " << std::endl;
std::cout << "The images will be saved to " << save_dir << std::endl;
ros::init(argc, argv, "PClistener");
ros::start();
ros::NodeHandle nodeHandler;
ros::Subscriber sub = nodeHandler.subscribe("/camera/image_raw", 1, GrabImage);
ros::spin();
ros::shutdown();
return 0;
}
void GrabImage(const sensor_msgs::ImageConstPtr& msg)
{
string imgname;
cv_bridge::CvImageConstPtr cv_ptr;
try
{
cv_ptr = cv_bridge::toCvShare(msg);
cv::Mat img = cv_ptr->image;
cv::imshow("img_name", img);
char key = cv::waitKey(1);
// press "q" to save the image
if(key == 'q' || key == 'Q'){
imgId++;
imgname = "img_" + to_string(imgId) + ".jpg";
cv::imwrite(save_dir + imgname, img);
std::cout << "has saved image "<< imgId << " to " << save_dir << std::endl;
}
}
catch (cv_bridge::Exception& e)
{
ROS_ERROR("cv_bridge exception: %s", e.what());
return;
}
}
打开 ~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/ROS/ORB_SLAM3/CMakeLists.txt
并添加
# Node for capture images for camera calibration
rosbuild_add_executable(CameraCapture
src/ros_camera_capture.cc
)
target_link_libraries(CameraCapture
${LIBS}
)
在 ~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/
路径下执行以下指令编译ROS运行ORB_SLAM3项目的文件
如果你的ubuntu有conda,记得先退出conda环境
conda deactivate
然后再执行下列命令编译,否则会报一堆奇奇怪怪的错误你还找不到原因。
chmod +x build_ros.sh
./build_ros.sh
这里如果编译卡死可以打开 build.sh 文件修改多线程数即可。
如果之前添加ROS路径不成功的话会报错:
[rosbuild] rospack found package “ORB_SLAM2” at “”…
仔细检查路径即可
如果遇到报错:
Could not find a package configuration provided by "realsense2" with any of the following names: Realsense2Config.cmake Realsense2-config.cmake
可以运行以下指令解决(来自gpt):
要在终端中安装Intel RealSense 2 (realsense2) SDK,您可以使用以下步骤,具体安装方法取决于您的操作系统。以下是在不同操作系统上安装RealSense 2 SDK 的示例命令:
-
更新包列表:
sudo apt-get update
-
安装RealSense软件包:
sudo apt-get install librealsense2-dkms sudo apt-get install librealsense2-utils
-
安装RealSense开发包(如果需要):
sudo apt-get install librealsense2-dev
三、Android 手机摄像头与 PC 进行基于 ROS 的通信
下载第三方库
https://github.com/hitcm/Android_Camera-IMU.git
我是直接把这个安装包放在了主文件夹下。
打开终端安装依赖:
sudo apt-get install ros-noetic-imu-tools
将其中的 apk 文件发送给手机端。为了能够使得ubuntu与安卓手机链接,首先需要将电脑和手机置于同一wifi下,并且关掉windows防火墙,对于win11系统,打开设置,搜索防火墙并关闭即可。(这里笔者尝试过使用手机开热点让电脑链接也可以,甚至不用开移动数据)
ubuntu下关闭防火墙:
sudo ufw disable
打开vmware,右键需要跑slam的虚拟机,选择设置→网络配置器,选择桥接模式,再次打开虚拟机。
打开终端,先运行ROS
roscore
再次开启一个终端并输入
ifconfig
检查ip地址,打开手机app,并输入对应的ip地址,点击连接,连接成功安卓端会显示图像。
在切换wifi时需要等待一段时间才能看到变化的ip地址,注意。
进入下载好的Android_Camera-IMU文件夹并运行节点:
roslaunch ~/Android_Camera-IMU/android_cam-imu.launch
这时会弹出一个rviz,没报错的话直接关掉就可以了。
标定相机可以参考文章(可以先测试下面的,通过了再回来标定):
https://blog.csdn.net/caiqidong321/article/details/130811051?spm=1001.2014.3001.5506
检查ip地址并通过局域网将手机和ubuntu链接
ifconfig
打开新窗口运行安卓手机摄像头节点
roslaunch ~/Android_Camera-IMU/android_cam-imu.launch
打开新窗口查看ubuntu接收图像显示情况
rosrun ORB_SLAM3 CameraCapture
打开新窗口运行SLAM节点
rosrun ORB_SLAM3 Mono /home/cmj/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Vocabulary/ORBvoc.txt /home/cmj/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/Monocular-Inertial/EuRoC.yaml
运行该节点后可能会报错:
找不到包libDBoW2.so
先定位
sudo locate libDBoW2.so
找到第一个路径并添加至 /usr/lib
,路径最好是ORBSLAM3项目下的第三方库,以我电脑为例:
sudo ln -s /home/cmj/catkin_ws/src/ORB_SLAM3/Thirdparty/DBoW2/lib/libDBoW2.so /usr/lib
如果遇到 libg2o.so
同理
正常来说运行后 Mono 节点后需要平移相机来进行初始化,如果正常则会成功显示位姿,如果没有成功显示,可以查看节点关系
rqt_graph
拿着电脑和手机招摇过市…
检查话题名称与发布接收的匹配情况。
附录:使用USB摄像头进行ORBSLAM3建图
安装 usb_cam
sudo apt-get install ros-noetic-usb-cam
在VMWare右下角打开摄像头,查看摄像头连接情况:
ls /dev/video*
如果没有正常显示,则检查VMWare中usb控制器选择 USB 3.1
正常会显示摄像头名称:
/dev/video0 /dev/video1
如果需要链接外接摄像头则需要找到对应的名称,并在 usb_cam.launch 中修改
cd /opt/ros/noetic/share/usb_cam/launch
sudo gedit usb_cam.launch
修改其中对应的名称即可
<param name="video_device" value="/dev/video0" />
运行摄像头节点
roslaunch usb_cam usb_cam-test.launch
正常应该可以看到图像
如果报了像我这个非常奇怪的错误
... logging to /home/cmj/.ros/log/72349a50-5515-11ee-8f86-6b52ac0cda18/roslaunch-cmj-virtual-machine-50738.log Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. RLException: Invalid roslaunch XML syntax: syntax error: line 1, column 0 The traceback for the exception was written to the log file
网上都没有解决办法,那就尝试在 usb_cam.launch 中修改摄像头名称,先随便换一个,再换回来说不定就好了,我这就是这么玄学…
标定摄像头
先安装标定软件:
rosdep install camera_calibration
运行标定软件
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.025 image:=/usb_cam/image_raw camera:=/usb_cam
其中:
- –size 8x6: 为当前标定板的大小(如果你的棋盘格的小方格的个数是9x7,那么我们这里就写–size 8x6)
- –square 0.025:为每个小棋盘格的边长,单位是米,上面打印的标定版尺寸
- image:=/usb_cam/image_raw:标定当前订阅图像来源自名为/usb_cam/image_raw的topic
- camera:=/usb_cam:为摄像机名
使用下方标定图片,利用手机显示或者打印均可。
标定完后依次点击右侧三个按钮完成提交保存,找到生成的 yaml
文件,我保存在了 /home/cmj/catkin_ws_orbslam3/src/usb_cam/ost.yaml
打开该文件,修改 camera_name 保证和usb_cam 匹配,否则会有警告提示标定失败
camera_name: head_camera
在usb_cam添加标定文件
cd /opt/ros/noetic/share/usb_cam/launch
sudo gedit usb_cam.launch
在中间添加语句
<param name="camera_info_url" type="string" value="file:///home/cmj/catkin_ws_orbslam3/src/usb_cam/ost.yaml"/>
再次运行摄像头节点即可将标定文件添加至usb_cam中
roslaunch usb_cam usb_cam-test.launch
为了使得 ROS 可以运行该节点,在在 ~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/ROS/ORB_SLAM3/src/
复制一份 ros_mono.cc
并重命名为 ros_usb_cam.cc
,修改其中接收图像的话题订阅内容为 usb_cam,这是因为 usb_cam 发布的话题名称为 usb_cam:
// 修改前
ros::Subscriber sub = nodeHandler.subscribe("/camera/image_raw", 1, &ImageGrabber::GrabImage,&igb);
// 修改后
ros::Subscriber sub = nodeHandler.subscribe("/usb_cam/image_raw", 1, &ImageGrabber::GrabImage,&igb);
打开 ~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/ROS/ORB_SLAM3/CMakeLists.txt
并添加 usb_cam 运行节点
# Node for usb_cam
rosbuild_add_executable(MonoUsbCam
src/ros_usb_cam.cc
)
target_link_libraries(MonoUsbCam
${LIBS}
)
重新编译ROS运行ORB_SLAM3项目的文件:在 ~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/
路径下执行以下指令
chmod +x build_ros.sh
./build_ros.sh
编译过后分别打开三个终端运行:
roscore
roslaunch usb_cam usb_cam-test.launch
rosrun ORB_SLAM3 MonoUsbCam /home/cmj/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Vocabulary/ORBvoc.txt /home/cmj/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/Monocular-Inertial/EuRoC.yaml
初始运行仍旧需要移动摄像头,如果初始化通过就可以正常运行slam了。如果一直黑屏则可以检查下
rqt_graph
查看 MonoUsbCam
节点是否正常接收到了 /usb_cam/raw
话题数据,并仔细检查话题名称是否匹配即可。
编写 launch 文件集中运行节点(20230921)
打开
~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/ROS/ORB_SLAM3/src/ros_usb_cam.cc
~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/ROS/ORB_SLAM3/src/ros_mono.cc
按照同样的方式修改:
// 添加头文件
#include <string.h>
/
// ...中间代码
/
int main(int argc, char **argv)
{
// 开头直接定义传入参数地址
string argv1 = "/home/cmj/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Vocabulary/ORBvoc.txt";
string argv2 = "/home/cmj/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/Monocular-Inertial/EuRoC.yaml";
/
// ...中间代码
/
// 注释掉这部分,因为已经
// if(argc != 3)
// {
// cerr << endl << "Usage: rosrun ORB_SLAM3 Mono path_to_vocabulary path_to_settings" << endl;
// ros::shutdown();
// return 1;
// }
/
// ...中间代码
/
//修改这一行,修改为之前定义的参数
// ORB_SLAM3::System SLAM(argv[0],argv[1],ORB_SLAM3::System::MONOCULAR,true);
ORB_SLAM3::System SLAM(argv1,argv2,ORB_SLAM3::System::MONOCULAR,true);
/
// ...中间代码
/
}
在 ~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/
重新编译
chmod +x build_ros.sh
./build_ros.sh
在 ~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/ROS/ORB_SLAM3/
下新建 ros_mono.launch
,写入
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video2" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="color_format" value="yuv422p" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
<param name="camera_info_url" type="string" value="file:///home/cmj/catkin_ws_orbslam3/src/usb_cam/ost.yaml"/>
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/usb_cam/image_raw"/>
<param name="autosize" value="true" />
</node>
<node name="MonoUsbCam" pkg="ORB_SLAM3" type="MonoUsbCam" output="screen">
</node>
</launch>
终端直接运行
roslaunch ORB_SLAM3 ros_mono.launch
即可同时打开摄像头和slam节点
将 android_cameara_imu.rviz
文件复制到 ~/catkin_ws_orbslam3/src/orb_slam3_detailed_comments/Examples/ROS/ORB_SLAM3/
下并新建 ros_android_mono.launch
,写入
<launch>
<node name="republish" type="republish" pkg="image_transport" output="screen" args="compressed in:=/android/image_raw raw out:=/camera/image_raw" >
</node >
<node pkg="rviz" type="rviz" name="rviz" args="-d android_cameara_imu.rviz" output="log">
</node>
<node name="Mono" pkg="ORB_SLAM3" type="Mono" output="screen">
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/camera/image_raw"/>
<param name="autosize" value="true" />
</node>
</launch>
保存后终端直接运行
roslaunch ORB_SLAM3 ros_android_mono.launch
同时手机链接ip地址即可直接使用手机摄像头完成建图(这似乎印证了之前的 ros_camera_capture.cc
好像不用写…不管了反正现在能跑了)