利用Android手机摄像头联合Ubuntu20.04建模ORB-SLAM3(20230924)

~~ 第一次编译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 的示例命令:

  1. 更新包列表:

    sudo apt-get update
    
  2. 安装RealSense软件包:

    sudo apt-get install librealsense2-dkms
    sudo apt-get install librealsense2-utils
    
  3. 安装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 的示例命令:

  1. 更新包列表:

    sudo apt-get update
    
  2. 安装RealSense软件包:

    sudo apt-get install librealsense2-dkms
    sudo apt-get install librealsense2-utils
    
  3. 安装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 好像不用写…不管了反正现在能跑了)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
要在Ubuntu 20.04上安装ORB-SLAM3,你需要按照以下步骤进行操作: 1. 首先,确保你的系统满足ORB-SLAM3的安装要求。根据引用中提到的环境说明,你需要在虚拟机VMware上安装Ubuntu 20.04,并且有一个搭载Win10(i5-8500)的主机。 2. 接下来,你需要安装OpenCV 3.3.5。根据引用中的指示,你可以通过以下命令来安装所需的依赖项: ``` sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" sudo apt update sudo apt install libjasper1 libjasper-dev sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev ``` 3. 现在,你需要下载并编译ORB-SLAM3。按照引用中提到的步骤,进入ORB-SLAM3的主目录,打开终端,并执行以下命令: ``` sudo ./bootstrap.sh sudo ./b2 install ``` 4. 最后,你需要安装Pangolin图形库以及它的依赖项。根据引用中的指示,你可以通过以下命令来安装所需的依赖项: ``` sudo apt install libgl1-mesa-dev sudo apt install libglew-dev sudo apt install libpython2.7-dev sudo apt install pkg-config sudo apt install libegl1-mesa-dev libwayland-dev libxkbcommon-dev wayland-protocols ``` 完成以上步骤后,你应该成功地在Ubuntu 20.04上安装了ORB-SLAM3。请确保按照引用内容所列的正确顺序执行每个步骤,并确保你的系统满足所需的依赖项。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迟钝皮纳德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值