视觉学习笔记9——边缘分离式计算EdgeSLAM结合ORBSLAM3

系列文章目录

参考我的opencv配置博客
参考我的orbslam3配置博客



前言

众所周知,视觉 SLAM 在内存和处理时间方面是资源密集型的。此外,一些操作随着时间的推移变得越来越复杂,这使得在移动设备上连续运行变得具有挑战性。边缘计算为移动设备提供额外的计算和内存资源,以允许卸载某些任务,而不会出现卸载到云时出现的大延迟。 Edge-SLAM是一种使用边缘计算资源来卸载部分 Visual-SLAM 的系统。使用 ORB-SLAM3 作为原型 Visual-SLAM 系统,并将其修改为边缘和移动设备之间的分离架构。将跟踪计算保留在移动设备上,并将其余计算(即局部映射和闭环)移动到边缘,可以允许 Visual-SLAM 系统在资源有限的情况下长期运行,而不会影响操作的准确性。它还使移动设备上的计算和内存成本保持不变,这将允许部署其他使用 Visual-SLAM 的终端应用程序。

Edge-SLAM 是一种边缘辅助视觉同步定位和建图。Edge-SLAM 将 Visual-SLAM 适配到边缘计算架构中,以实现 Visual-SLAM 在移动设备上的长时间运行。这是通过将计算密集型模块卸载到边缘来实现的。因此,Edge-SLAM 减少了移动设备上的资源使用并保持不变。Edge-SLAM 是在ORB-SLAM2之上实现的。

我本来构思自己该怎么去实现的,后来逛github时发现了一个新项目AdapSLAM,发现有人和我的想法不谋而合且思路更成熟并已实现,真np啊。

EdgeSlam源码
EdgeSlam论文

在这里插入图片描述


一、电脑EdgeSlam安装配置

安装EdgeSlam前先安装好ORB-SLAM3

1.错误1

执行build.sh最后的

cmake .. -DCMAKE_BUILD_TYPE=Release

出现:
Found package configuration file:
/usr/local/lib/cmake/Pangolin/PangolinConfig.cmake
but it set Pangolin_FOUND to FALSE so package “Pangolin” is considered to
be NOT FOUND. Reason given by package:
Pangolin could not be found because dependency Eigen3 could not be found.

/usr/bin/ld: 找不到 -lEigen3::Eigen
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
解决办法:
不重新安装Pangolin及Eigen的临时办法,修改CMakeLists.txt如下:
在find_package(Eigen3 REQUIRED)后加NO_MUDULE,

find_package(Eigen3 REQUIRED NO_MODULE)

在这里插入图片描述

2.错误2

 [rosbuild] rospack found package "Edge_SLAM" at "", but the current
  directory is "/home/llw/Guide_blind/edgeslam/Examples/ROS/Edge_SLAM".  You
  should double-check your ROS_PACKAGE_PATH to ensure that packages are found
  in the correct precedence order.

解决:
首先在~/.bashrc上设置了路径(注意这个path是我的路径,读者需要自己修改):

sudo vim ~/.bashrc
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/llw/Guide_blind/edgeslam/Examples/ROS
source ~/.bashrc

在ROS的安装路径下更改路径:

cd /opt/ros/melodic/
sudo vim setup.bash 
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/llw/Guide_blind/edgeslam/Examples/ROS
source setup.bash

查看路径是否添加成功:

echo $ROS_PACKAGE_PATH

3.错误3

CMake Warning (dev) at /opt/ros/melodic/share/ros/core/rosbuild/public.cmake:507 (add_executable):
  Policy CMP0028 is not set: Double colon in target name means ALIAS or
  IMPORTED target.  Run "cmake --help-policy CMP0028" for policy details.
  Use the cmake_policy command to set the policy and suppress this warning.

  Target "Mono" links to target "Eigen3::Eigen" but the target was not found.
  Perhaps a find_package() call is missing for an IMPORTED target, or an
  ALIAS target is missing?
Call Stack (most recent call first):
  CMakeLists.txt:126 (rosbuild_add_executable)
This warning is for project developers.  Use -Wno-dev to suppress it.

解决办法:
Eigen检测不到,同样是修改CMakeLists.txt如下:
在find_package(Eigen3 REQUIRED)后加NO_MUDULE,

find_package(Eigen3 REQUIRED NO_MODULE)

在这里插入图片描述

4.错误4

OpenCV Error: Unknown error code -49 (Input file is empty) in cvOpenFileStorage, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/core/src/persistence.cpp, line 4422
terminate called after throwing an instance of 'cv::Exception'
  what():  /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/core/src/persistence.cpp:4422: error: (-49) Input file is empty in function cvOpenFileStorage

解决:
主要问题是配置文件中没有添加“%YAML:1.0”
在这里插入图片描述

二、jetson nano安装ORB SLAM3

1、jetson nano问题

问题1

鉴于nano自己的算力问题,有时导致编译卡死,可以选择关闭图形界面

关闭图形界面

sudo systemctl set-default multi-user.target 
sudo reboot

开启图形界面

sudo systemctl set-default graphical.target 
sudo reboot

问题2

apt-get锁

E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) 
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
1.方法一:
用这个命令查看一下apt-get的相关进程:
ps -e | grep apt

显示:
11669 ? 00:00:02 aptd
25379 ? 00:00:00 update-apt-xapi

然后执行:
sudo kill 11669
sudo kill 25379
2.方法二:
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
3.方法三
sudo rm /var/lib/dpkg/lock-frontend

2、jetson nano的自带opencv问题

1.卸载opencv3.3.0

sudo apt-get purge libopencv*
sudo apt autoremove
sudo apt-get update

查看linux下是否有opencv以及安装版本:

pkg-config opencv --modversion
pkg-config opencv4 --modversion

2.安装opencv4.4.0

参考我的博客

  1. 把opencv的依赖安装好
  2. 下载并处理好4.4Sources版本、opencv_contrib、boostdesc和vgg文件
  3. cmake-gui及以下部分不用管了,回来看这篇博客

查看cmake版本,有就行没有就下载:

cmake -version

配置与编译opencv:

1、创建build文件夹
mkdir build
cd build

2、cmake设置配置opencv
cmake \

-DCMAKE_BUILD_TYPE=Release \
-DBUILD_PNG=OFF \
-DBUILD_TIFF=OFF \
-DBUILD_TBB=OFF \
-DBUILD_JPEG=OFF \
-DBUILD_JASPER=OFF \
-DBUILD_ZLIB=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_opencv_java=OFF \
-DBUILD_opencv_python2=OFF \
-DBUILD_opencv_python3=ON \
-DENABLE_PRECOMPILED_HEADERS=OFF \
-DWITH_OPENCL=OFF \
-DWITH_OPENMP=OFF \
-DWITH_FFMPEG=ON \
-DWITH_GSTREAMER=OFF \
-DWITH_GSTREAMER_0_10=OFF \
-DWITH_CUDA=ON \
-DWITH_GTK=ON \
-DWITH_VTK=OFF \
-DWITH_TBB=ON \
-DWITH_1394=OFF \
-DWITH_OPENEXR=OFF \
-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.0 \
-DCUDA_ARCH_BIN=5.3 \
-DCUDA_ARCH_PTX="" \
-DINSTALL_C_EXAMPLES=OFF \
-DOPENCV_ENABLE_NONFREE=ON \
-DINSTALL_TESTS=OFF \
-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.4.0/modules \
..

设置错误:

CUDA: OpenCV requires enabled ‘cudev‘ module from ‘opencv_contrib‘

错误解决:路径不对

-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.4.0/modules \

设置配置完成并检查无误后开始编译,-j1是害怕死机,j1-j4都可以,越大越快但越容易挂,j1比较稳但是我编译了一个晚上:

sudo make -j1

漫长编译结束,进行安装

sudo make install

3、ros问题

建议解决自带的opencv问题,再安装ROS,最后安装ORBSLAM3,安装参考这篇博客

里面有一个脚本命令直接安装,非常小白,不过需要注意脚本安装时的选项选择。

wget http://fishros.com/install -O fishros && . fishros

脚本安装完后,直接跳到这篇博客的6.rosdep init 初始化步骤直到画海龟。

问题1

工作空间编译问题,执行catkin_make时报错:catkin_make libusb_cam.so 未定义的引用

解决:
似乎是版本更新导致的问题,下载了usb_cam 0.3.6版本 ,并在 catkin 工作区中重建执行它。

4、orbslam3问题

直接用的是ORB-SLAM3 1.0版本,参考我的博客
安装完成后测试单目与双目效果,看看有没有成功。

1.问题1

Couldn’t query v4l fps! error 25, Inappropriate ioctl for device

解决:

video编号是否正确对应

2.问题2

运行./build_ros.sh时出现报错:

error: no matching function for call to ‘std::vector<cv::Mat>::push_back(Eigen::Vector3f)

解决:
打开ViewerAR.cc文件第405行

删除或注释
vPoints.push_back(pMP->GetWorldPos())

改为:

vPoints.push_back(ORB_SLAM3::Converter::toCvMat(pMP->GetWorldPos()));

5、zed问题

问题1

 CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):   Could not find a package configuration file provided by "zed_interfaces"   

解决:
只需要安装一个zed_interfaces,放在catkin_make下就可以了。

git clone https://github.com/stereolabs/zed-ros-interfaces

问题2

double free or corruption (out)
Aborted (core dumped)

解决:
经过多次测试回调,发现似乎是opencv的版本原因,这是github的orb讨论区的建议

因为jetson nano安装的是官方提供的镜像,自带opencv3.3.0,这个与ros自带的opencv3.2.0发生冲突,所以选择卸载opencv3.3.0,卸载步骤已经放在前面了。

在这里插入图片描述

成功通过ZED2调用ORB-SLAM3双目IMU
在这里插入图片描述

三、jetson nano EdgeSlam安装测试

安装步骤基本和章节一的一样,就不在写了。

1、测试

1.在移动设备上

打开一个新的终端窗口,导航到项目根目录,然后运行

roscore

打开第二个终端窗口,导航到项目根目录,然后运行

cd Examples/ROS/Edge_SLAM/
rosrun Edge_SLAM RGBD ../../../Vocabulary/ORBvoc.txt ../../RGB-D/TUM2.yaml client

2.在边缘设备上

打开一个新的终端窗口,导航到项目根目录,然后运行

roscore

打开第二个终端窗口,导航到项目根目录,然后运行

cd Examples/ROS/Edge_SLAM/
rosrun Edge_SLAM RGBD ../../../Vocabulary/ORBvoc.txt ../../RGB-D/TUM2.yaml server

3.IP和端口号通信

当 Edge-SLAM 在两个设备上运行时,您将被要求在 Edge-SLAM 终端中输入 IP 和端口号以设置网络连接。Edge-SLAM 使用三个 TCP 连接。第一个连接传输关键帧,第二个连接传输帧,第三个连接传输地图更新。按照显示的顺序执行以下步骤以设置网络

  1. 在边缘设备上
  • 输入边缘设备 IP 地址
  • 输入用于边缘关键帧连接的端口号,比如6661
  1. 在移动设备上
  • 输入移动设备IP地址
  • 输入边缘设备 IP 地址
  • 输入用于移动设备上关键帧连接的端口号,比如6662
  • 输入用于边缘关键帧连接的端口号,比如6661
  • 如果建立了关键帧连接,系统将继续要求建立第二个连接
  1. 在边缘设备上
  • 输入用于边缘上的帧连接的端口号,比如6663
  1. 在移动设备上
  • 输入用于移动设备上的帧连接的端口号,比如6664
  • 输入用于边缘上的帧连接的端口号,比如6663
  • 如果帧连接建立,系统会继续要求建立第三个连接
  1. 在边缘设备上
  • 输入用于边缘地图更新连接的端口号,比如6665
  1. 在移动设备上
  • 输入用于移动设备地图更新连接的端口号,比如6666
  • 输入用于边缘地图更新连接的端口号,比如6665
  • 如果建立了地图更新连接,移动设备上的系统应该打开查看器窗口,边缘设备应该等待接收数据。
  1. 在移动设备上
  • 打开第三个终端窗口,导航到项目根目录,然后运行包文件
rosbag play ./rgbd_dataset_freiburg2_desk.bag /camera/rgb/image_color:=/camera/rgb/image_raw /camera/depth/image:=/camera/depth_registered/image_raw

端口残留或被占用

查询端口
sudo netstat -nplt

杀死端口中的进程
kill -9 xxx

在这里插入图片描述

四、ORB_SLAM3调整

待解决问题:

Usage: rosrun ORB_SLAM3 Mono path_to_vocabulary path_to_settings
OpenCV Error: Assertion failed (tlsSlots.size() > slotIdx) in releaseSlot, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/core/src/system.cpp, line 1092
terminate called after throwing an instance of 'cv::Exception'
  what():  /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/core/src/system.cpp:1092: error: (-215) tlsSlots.size() > slotIdx in function releaseSlot

1、更新cv_bridge

cv_bridge下载地址,需要注意要与系统进行版本对应,我把它解压在catkin_ws/vision_opencv-melodic/cv_bridge目录

cd cv_bridge
mkdir build
cd build
cmake …
make
sudo make install

报错1

执行cmake …时表示找不到opencv4

解决方法
修改cv_bridge/CMakeLists.txt中的cv版本

find_package(OpenCV 4 REQUIRED
  COMPONENTS
    opencv_core
    opencv_imgproc
    opencv_imgcodecs
  CONFIG
)

报错2

执行cmake时表示

/home/nvidia/software/catkin_workspace/src/vision_opencv/cv_bridge/src/module_opencv2.cpp
或
/home/nvidia/software/catkin_workspace/src/vision_opencv/cv_bridge/src/module_opencv3.cpp
中的
error: cannot declare variable ‘g_numpyAllocator’ to be of abstract type ‘NumpyAllocator’
 NumpyAllocator g_numpyAllocator;

解决方法
1、进入cv_bridge/src/CMakeLists.txt文件,修改第35行为

if (OpenCV_VERSION_MAJOR VERSION_EQUAL 4)

2、进入cv_bridge/src/module_opencv3.cpp文件,修改以下两行:

UMatData* allocate(int dims0, const int* sizes, int type, void* data, size_t* step, int flags, UMatUsageFlags usageFlags) const
改为
UMatData* allocate(int dims0, const int* sizes, int type, void* data, size_t* step, AccessFlag flags, UMatUsageFlags usageFlags) const
 bool allocate(UMatData* u, int accessFlags, UMatUsageFlags usageFlags) const
改为
bool allocate(UMatData* u, AccessFlag accessFlags, UMatUsageFlags usageFlags) const

编译成功

Writing /usr/local/lib/python2.7/dist-packages/cv_bridge-1.13.0.egg-info
-- Up-to-date: /usr/local/include/cv_bridge
-- Installing: /usr/local/include/cv_bridge/rgb_colors.h
-- Installing: /usr/local/include/cv_bridge/cv_bridge.h
-- Installing: /usr/local/lib/python2.7/dist-packages/cv_bridge/boost/__init__.py
-- Installing: /usr/local/lib/libcv_bridge.so
-- Set runtime path of "/usr/local/lib/libcv_bridge.so" to ""
-- Installing: /usr/local/lib/python2.7/dist-packages/cv_bridge/boost/cv_bridge_boost.so
-- Set runtime path of "/usr/local/lib/python2.7/dist-packages/cv_bridge/boost/cv_bridge_boost.so" to ""

2、编译调用

结束之后你就可以更改你的其他代码了,由于以前的cv_bridge不见了,所以要在其他代码的cmakelists.txt添加路径,这个路径是自己的安装路径,以orbslam3的 ./build.sh./build_ros.sh编译为例。

报错1

不编译去使用,表示有一些库找不到

/opt/ros/melodic/share/ORB_SLAM3/zed2_stereo_inertial:
 error while loading shared libraries: libopencv_imgproc.so.3.2: cannot open shared object file: No such file or directory

解决方法
调用./build.sh和 ./build_ros.sh编译

报错2

调用./build.sh和 ./build_ros.sh编译时报错

Error: package 'ORB_SLAM3' depends on non-existent package 'cv_bridge' and rosdep claims that it is not a system dependency. Check the ROS_PACKAGE_PATH or try calling 'rosdep update'

CMake Error at /opt/ros/melodic/share/ros/core/rosbuild/public.cmake:129 (message):
 
  Failed to invoke rospack to get compile flags for package 'ORB_SLAM3'.
  Look above for errors from rospack itself.  Aborting.  Please fix the
  broken dependency!

解决方法

大概就是找不到ros的cv_bridge,也找不到我安装的cv_bridge,我也尝试rosdep update,但是没什么用,所以我将在/usr/local/share/cv_bridge文件夹复制到/opt/ros/melodic/share/中,然后再次./build_ros.sh就可以通过了。

sudo ln -s /usr/local/share/cv_bridge /opt/ros/melodic/share

在其他代码的cmakelists.txt添加路径,防止找不到

#在find_package前面
#opencv路径
set(OpenCV_DIR "your-path/opencv-x.x.x/build")
#cv_bridge路径
set(cv_bridge_DIR /usr/local/share/cv_bridge/cmake) 

错误分析

我觉得一开始我使用的是原本的cv_bridge来进行编译的,经过修改后可以使用,然后我将cv_bridge用apt删除后,系统自动在/usr/local/中找到了我安装的cv_bridge,所以也可以正常使用。但是后来尝试从新开始,ros中不做修改,编译ORB-SLAM3会有警告,说明用的还是ros安装时候自带的cv_bridge,删除自带的以后编译又找不到我自己安装的,就会报找不到cv_bridge,这个时候我把我安装的cv_bridge复制到ros中就可以编译通过了。

总结方法

1、修改ros的cv_bridge
2、不删除原来的cv_bridge,安装源码的cvbridge,然后在cmakelist中修改,编译完成后apt删除原来的bridge。
3、删除原来的cv_bridge,安装源码bridge,然后cmakelist中修改,并复制/usr/local/share中的bridge到ros路径中。

报错3

调用./build_ros.sh编译时报错

c++: error: /usr/lib/x86_64-linux-gnu/libopencv_core.so.3.2.0: 没有那个文件或目录
c++: error: /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.3.2.0: 没有那个文件或目录
c++: error: /usr/lib/x86_64-linux-gnu/libopencv_imgcodecs.so.3.2.0: 没有那个文件或目录
c++: error: /usr/lib/x86_64-linux-gnu/libopencv_core.so.3.2.0: 没有那个文件或目录
c++: error: /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.3.2.0: 没有那个文件或目录
c++: error: /usr/lib/x86_64-linux-gnu/libopencv_imgcodecs.so.3.2.0: 没有那个文件或目录

解决方法

这个问题的话将这里的build文件夹删了,回到ORB_SLAM3-1.0/Examples_old/ROS/ORB_SLAM3文件夹重新编译build_ros.sh。

AdapSLAM实现

安装步骤

1.默认ORB-SLAM 3安装环境已经搭建好。
2.

报错1:

/home/llw/Guide_blind/AdaptSLAM/Sim
AdaptSLAM/Examples_old/Monocular-Inertial/mono_inertial_euroc.cc:195:54:
error: no matching function for call to
‘ORB_SLAM3::System::TrackMonocular(cv::Mat&, double&, int,
std::vector<ORB_SLAM3::IMU::Point>&)’
SLAM.TrackMonocular(im,tframe,-1,vImuMeas); // TODO change to monocular_inertial

/home/llw/Guide_blind/AdaptSLAM/Sim
AdaptSLAM/Examples_old/Monocular-Inertial/mono_inertial_tum_vi.cc:207:54:
error: no matching function for call to
‘ORB_SLAM3::System::TrackMonocular(cv::Mat&, double&, int,
std::vector<ORB_SLAM3::IMU::Point>&)’
SLAM.TrackMonocular(im,tframe,-1,vImuMeas); // TODO change to monocular_inertial

/home/llw/Guide_blind/AdaptSLAM/Sim
AdaptSLAM/Examples_old/Monocular/mono_kitti.cc: In function ‘int
main(int, char**)’: /home/llw/Guide_blind/AdaptSLAM/Sim
AdaptSLAM/Examples_old/Monocular/mono_kitti.cc:109:97: error: no
matching function for call to
‘ORB_SLAM3::System::TrackMonocular(cv::Mat&, double&, int,
std::vector<ORB_SLAM3::IMU::Point>,
__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string
::value_type&)’ onocular(im,tframe,-1,vector<ORB_SLAM3::IMU::Point>(),
vstrImageFilenames[ni]);

解决方法1:
打开这三个错误文件,找到错误代码,删去其中的-1,因为在调用的System.cc文件中并没有-1的参数的定义和类型,不清楚为什么有一个-1。
最终make -j4成功

报错2:

Exception CMake Error at
/opt/ros/melodic/share/ros/core/rosbuild/private.cmake:99 (message):
[rosbuild] rospack found package “ORB_SLAM3” at
“/opt/ros/melodic/share/ORB_SLAM3”, but the current directory is
“/home/llw/Guide_blind/AdaptSLAM/Sim
AdaptSLAM/Examples_old/ROS/ORB_SLAM3”. You should double-check your
ROS_PACKAGE_PATH to ensure that packages are found in the correct
precedence order.

解决方法1:
修改gedit ~/.bashrc路径,添加AdaptSLAM/Sim-AdaptSLAM/Examples_old/ROS路径

gedit ~/.bashrc 
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/xxx/AdaptSLAM/Sim-AdaptSLAM/Examples_old/ROS
source ~/.bashrc 

解决失败。。。

解决方法2:
许多方案说是没设置环境变量,在bashrc或其他一些文件中加入环境变量
进行检查环境变量,可我使用了解决方法1就是检查不出来
后来使用之前的一个解决方案,就是重新建立了一个软链接ORB_SLAM3
先到/opt/ros/melodic/share目录下,删除原来的ORB_SLAM3软连接(如果有的话)

sudo rm -r ORB_SLAM3

在/opt/ros/melodic/share目录下建立软链接

sudo ln -s /home/xxx/Guide_blind/ORB_SLAM3/Examples/ROS/ORB_SLAM3 /opt/ros/melodic/share/ORB_SLAM3

其实之前运行过ORB的其他变种SLAM,那时ROS就会在/opt/ros/melodic/share文件夹下建立了一个软连接ORB_SLAM3,现在的工程需要把原来的软链接换成当前你的工作空间下的路径。

报错3:

CMake Error at CMakeLists.txt:37 (message): OpenCV > 2.4.3 not
found.

之前也有一个OpenCV 版本问题,直接更改CMakeLists.txt文件

find_package(OpenCV 4.0 QUIET)

报错4:

不间断运行 ./build_ros.sh,会持续出现一些问题,这些问题我在之间的博客有详细解决过程,不过这次又有一些新的不同的报错,故重新做一个记录。

问题一:
在这里插入图片描述
提示找不到sophus库,修改Examples/ROS/ORB_SLAM3下的CMAKELISTS中添加修改为

${PROJECT_SOURCE_DIR}/../../../Thirdparty/Sophus

问题二:

AdaptSLAM/Sim-AdaptSLAM/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc:151:41:
error: conversion from ‘Sophus::SE3f {aka Sophus::SE3}’ to
non-scalar type ‘cv::Mat’ requested
cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
#include <Eigen/Dense>
#include <opencv2/core/eigen.hpp>

删除ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc第151行,由下面内容替换

cv::Mat Tcw;
Sophus::SE3f Tcw_SE3f = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
Eigen::Matrix4f Tcw_Matrix = Tcw_SE3f.matrix();
cv::eigen2cv(Tcw_Matrix, Tcw);

引入两个头文件

#include <Eigen/Dense>
#include <opencv2/core/eigen.hpp>

问题三:

AdaptSLAM/Sim-AdaptSLAM/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc:
In member function ‘void ORB_SLAM3::Plane::Recompute()’:
/home/llw/Guide_blind/AdaptSLAM/Sim-AdaptSLAM/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc:530:42:
error: conversion from ‘Eigen::Vector3f {aka Eigen::Matrix<float, 3,
1>}’ to non-scalar type ‘cv::Mat’ requested
cv::Mat Xw = pMP->GetWorldPos();

删除ROS/ORB_SLAM3/src/AR/ViewerAR.cc第530行,由以下内容替换

cv::Mat Xw;
cv::eigen2cv(pMP->GetWorldPos(), Xw);

引入两个头文件

#include <Eigen/Dense>
#include <opencv2/core/eigen.hpp>

问题四:

error: no matching function for call to
‘std::vectorcv::Mat::push_back(Eigen::Vector3f)’
vPoints.push_back(pMP->GetWorldPos());

删除ROS/ORB_SLAM3/src/AR/ViewerAR.cc第408行,由以下内容替换

cv::Mat WorldPos;
cv::eigen2cv(pMP->GetWorldPos(), WorldPos);
vPoints.push_back(WorldPos);

引入两个头文件

#include <Eigen/Dense>
#include <opencv2/core/eigen.hpp>

问题五:

/home/llw/Guide_blind/AdaptSLAM/Sim-AdaptSLAM/Examples_old/ROS/ORB_SLAM3/src/ros_mono_inertial.cc:
In member function ‘void ImageGrabber::SyncWithImu()’:
/home/llw/Guide_blind/AdaptSLAM/Sim-AdaptSLAM/Examples_old/ROS/ORB_SLAM3/src/ros_mono_inertial.cc:178:48: error: no matching function for call to
‘ORB_SLAM3::System::TrackMonocular(cv::Mat&, double&, int,
std::vector<ORB_SLAM3::IMU::Point>&)’
mpSLAM->TrackMonocular(im,tIm,-1,vImuMeas);

和上面一样找到错误代码,删去其中的-1,因为在调用的System.cc文件中并没有-1的参数的定义和类型,不清楚为什么有一个-1。

问题六:

/usr/bin/ld: warning: libopencv_xxx.so.3.4, needed by…/…/…/…/lib/libORB_SLAM3.so, not found (try using -rpath or-rpath-link)

…/…/…/…/lib/libORB_SLAM3.so:对‘cv::xxx’未定义的引用

一步错步步错,在C语言中cv::xxx是opencv3.x的库与函数,但是我在之前edgeSLAM的尝试中,把ros的opencv3.2删除了,现在调用的是opencv4,所以我需要重新搭建ros环境才能解决这个问题。

重装ROS

输入以下命令逐步卸载ros即可。

//先卸载ros包
sudo apt-get purge ros-*
//删除ros相关依赖和配置
sudo apt-get autoremove

使用一个脚本命令直接安装ROS,非常小白,不过需要注意脚本安装时的选项选择。

wget http://fishros.com/install -O fishros && . fishros

脚本安装完后,直接跳到这篇博客的6.rosdep init 初始化步骤直到画海龟。

虚拟环境中的QT环境冲突
比如anaconda创建的虚拟环境中存在pyqt,与cv2里自带的libqxcb.so版本冲突,而使用cv2.imshow时优先选择了pyqt中的libqxcb.so,就会导致上面的加载错误。

解决方法也很简单,把anaconda中的pyqt卸载:

conda remove pyqt5
pip uninstall pyqt5
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值