参考我的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之上实现的。
EdgeSlam源码
EdgeSlam论文
安装EdgeSlam前先安装好ORB-SLAM3
执行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
解决办法:
不重新安装Pangolin及Eigen的临时办法,修改CMakeLists.txt如下:
在find_package(Eigen3 REQUIRED)后加NO_MUDULE,
find_package(Eigen3 REQUIRED NO_MODULE)
[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
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)
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
鉴于nano自己的算力问题,有时导致编译卡死,可以选择关闭图形界面
关闭图形界面
sudo systemctl set-default multi-user.target
sudo reboot
开启图形界面
sudo systemctl set-default graphical.target
sudo reboot
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
sudo apt-get purge libopencv*
sudo apt autoremove
sudo apt-get update
查看linux下是否有opencv以及安装版本:
pkg-config opencv --modversion
pkg-config opencv4 --modversion
参考我的博客
查看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
建议解决自带的opencv问题,再安装ROS,最后安装ORBSLAM3,安装参考这篇博客
里面有一个脚本命令直接安装,非常小白,不过需要注意脚本安装时的选项选择。
wget http://fishros.com/install -O fishros && . fishros
脚本安装完后,直接跳到这篇博客的6.rosdep init 初始化步骤直到画海龟。
工作空间编译问题,执行catkin_make时报错:catkin_make libusb_cam.so 未定义的引用
解决:
似乎是版本更新导致的问题,下载了usb_cam 0.3.6版本 ,并在 catkin 工作区中重建执行它。
直接用的是ORB-SLAM3 1.0版本,参考我的博客。
安装完成后测试单目与双目效果,看看有没有成功。
Couldn’t query v4l fps! error 25, Inappropriate ioctl for device
解决:
video编号是否正确对应运行./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()));
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
double free or corruption (out)
Aborted (core dumped)
解决:
经过多次测试回调,发现似乎是opencv的版本原因,这是github的orb讨论区的建议
因为jetson nano安装的是官方提供的镜像,自带opencv3.3.0,这个与ros自带的opencv3.2.0发生冲突,所以选择卸载opencv3.3.0,卸载步骤已经放在前面了。
安装步骤基本和章节一的一样,就不在写了。
打开一个新的终端窗口,导航到项目根目录,然后运行
roscore
打开第二个终端窗口,导航到项目根目录,然后运行
cd Examples/ROS/Edge_SLAM/
rosrun Edge_SLAM RGBD ../../../Vocabulary/ORBvoc.txt ../../RGB-D/TUM2.yaml client
打开一个新的终端窗口,导航到项目根目录,然后运行
roscore
打开第二个终端窗口,导航到项目根目录,然后运行
cd Examples/ROS/Edge_SLAM/
rosrun Edge_SLAM RGBD ../../../Vocabulary/ORBvoc.txt ../../RGB-D/TUM2.yaml server
当 Edge-SLAM 在两个设备上运行时,您将被要求在 Edge-SLAM 终端中输入 IP 和端口号以设置网络连接。Edge-SLAM 使用三个 TCP 连接。第一个连接传输关键帧,第二个连接传输帧,第三个连接传输地图更新。按照显示的顺序执行以下步骤以设置网络
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
很遗憾,它对我的工作起不来太大作用,所以将不再研究它了。