跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 卖家故事 > Ubuntu 20.04配置ORB-SLAM2和ORB-SLAM3运行环境+ROS实时运行ORB-SLAM+Gazebo仿真运行ORB-SLAM2+各种相关库的安装

Ubuntu 20.04配置ORB-SLAM2和ORB-SLAM3运行环境+ROS实时运行ORB-SLAM+Gazebo仿真运行ORB-SLAM2+各种相关库的安装

时间:2024-04-06 17:30:38 来源:网络cs 作者:欧阳逸 栏目:卖家故事 阅读:

标签: 运行  相关  安装  时运  配置  环境 
阅读本书更多章节>>>>

文章目录

一、换源1.1 通过软件更新1.2 通过修改源文件 二、安装三方库2.1 安装必要的依赖项2.2 安装Pangolin2.3 安装OpenCV32.4 安装Eigen3 三、安装ORB-SLAM2四、安装ORB-SLAM34.1 同时安装OpenCV44.2 安装ORB-SALM3 五、安装ROS noetic六、ROS安装摄像头驱动七、ROS实时运行ORB-SLAM27.1 相机标定7.2 编译ORB_SLAM2 ROS例子7.3 ROS实时运行ORB-SLAM27.4 ORB-SLAM2跑bag数据包7.5 ROS运行ORB-SLAM3 八、Gazebo仿真运行ORB_SLAM28.1 准备8.2 搭建ROS小车8.3 编写lanuch文件:8.4 标定参数8.5 运行ORB_SLAM2 九、安装SLAM测评工具evo9.1 安装evo9.2 测试evo 十、安装PCL和Octomap十一、安装优化库:G2O、GTSAM和Ceres十二、安装Sophus


在新安装的Ubuntu 20.04系统中配置ORB-SLAM2和ORB-SLAM3的运行环境,并安装一些SLAM常用的库,记录走过的路

一、换源

Ubuntu系统自带的源都是国外的网址,国内用户在使用的时候下载比较慢甚至无法获取,在安装各种库或软件时会深受其折磨!解决方案是直接替换成国内的镜像源

1.1 通过软件更新

打开软件更新

在这里插入图片描述

选择Download from->Other,找到China,选择源。关闭界面等待自动更新源

1.2 通过修改源文件

(1)备份源文件:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.old

(2)打开文件:

sudo gedit /etc/apt/sources.list

(3)换源:推荐清华或者阿里云的源(根据自己的网去尝试,选择最快的一个):清华源地址,选择Ubuntu版本(查看ubuntu版本命令:cat /etc/issue)并复制源内容,覆盖sources.list文件原来的内容:

在这里插入图片描述

(4)换过源之后要更新:

sudo apt-get update

二、安装三方库

2.1 安装必要的依赖项

sudo apt-get updatesudo apt-get install git gcc g++ vim make cmake

2.2 安装Pangolin

安装Pangolin 0.6(稳定版)(官网下载地址,不要下载最新master版,编译的时候可能有错误)
(1)安装依赖项

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

(2)配置并编译

cd Pangolin mkdir build && cd buildcmake -DCPP11_NO_BOOST=1 ..makesudo make install

(3) 验证

cd ../examples/HelloPangolinmkdir build && cd buildcmake ..make./HelloPangolin

若安装成功,则会弹出以下窗口:

在这里插入图片描述

2.3 安装OpenCV3

ORB-SLAM2要求至少 2.4.3,作者使用 OpenCV 2.4.11 和 OpenCV 3.2 测试。我测试OpenCV3.4.5和OpenCV3.2.0可行。安装OpenCV-3.4.5(OpenCV老版本可在Github仓库右侧的Releases里找),将文件解压到某个位置,在该文件下打开终端
(1)安装依赖项

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"sudo apt updatesudo apt-get install build-essential libgtk2.0-dev libavcodec-dev sudo apt-get install libavformat-dev libjpeg.dev libtiff5.dev sudo apt-get install libswscale-dev libjasper-dev sudo apt-get install libcanberra-gtk-module libcanberra-gtk3-module #或者sudo apt-get install libcanberra-gtk*

(2) 配置并编译

mkdir build && cd build cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..#电脑性能差可去掉-j4,性能很好可增加数字(线程)make -j4sudo make install

(3)查询OpenCV版本、库以及头文件目录的三个命令来确保上面的OpenCV安装步骤都正常:

pkg-config --modversion opencvpkg-config --cflags opencvpkg-config --libs   opencv

2.4 安装Eigen3

Eigen3是一个纯头文件的库,这个特点让使用者省去了很多安装和环境配置的麻烦
直接安装:

sudo apt-get install libeigen3-dev

建议源码(地址)安装:

cd eigen3mkdir build && cd buildcmake ..makesudo make install

安装后头文件在:

/usr/local/include/eigen3/

复制头文件到/usr/local/include

sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include

三、安装ORB-SLAM2

(1)解压源文件,在该文件夹下打开终端:

cd ORB_SLAM2chmod +x build.sh./build.sh

chmod +x 赋予shell文件运行权限,注意系统若硬件不行(线程少),将build.sh里的make -j(默认启用最大线程)修改为make,防止卡死,电脑性能好可增加数字(线程):如make -j4/j8/jx

编译时如果有错误:
error: ’usleep’ was not declared in this scope

在对应的头文件中加上 :

#include <unistd.h>
出现错误:
error: static assertion failed: std::map must have the same value_type as its allocator

把ORB-SLAM2源码目录中include/LoopClosing.h文件中的

typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,        Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;

修改为:

typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,        Eigen::aligned_allocator<std::pair<KeyFrame *const, g2o::Sim3> > > KeyFrameAndPose;

(2)运行单目例子(彩色是因为我修改了代码,源码黑白,不用在意,Data/rgbd_dataset_freburg2_desk是我下的数据路径,换成你自己的):

./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM2.yaml Data/rgbd_dataset_freburg2_desk

在这里插入图片描述

四、安装ORB-SLAM3

4.1 同时安装OpenCV4

安装OpenCV4.2.0(目的是与3.4.5共存,尽量先装ROS,然后使OpenCV与ROS的版本一样,这样后面用ROS时会少走很多坑,注:后来发现没必要再安装,请先安装ros,装了ROS noetic就可以直接忽略这一步,省了许多麻烦),使能运行ORB-SLAM2和ORB-SLAM3(只使用OpenCV3也是可以的,ORB-SLAM3要求至少 3.0,作者使用 OpenCV 3.2.0 和 4.4.0 测试,不安装OpenCV4请忽略这一节,我测试过4.4.0、4.5.0和4.2.0均可行)
(1)安装依赖库:

sudo apt-get install build-essential cmake git sudo apt-get install libgtk2.0-dev pkg-config libavcodec-devsudo apt-get install libavformat-dev libswscale-devsudo apt-get install python-dev python-numpy python3-dev python3-numpysudo apt-get install libtbb2 libtbb-dev libjasper-dev libdc1394-22-devsudo apt-get install libjpeg-dev libpng-dev libtiff-dev

(2)其他安装步骤都一样,只是camke …改为(防止冲突,安装到不同的路径/usr/local/opencv4下):

mkdir build && cd build cmake -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4 -D CMAKE_BUILD_TYPE="Release" -D OPENCV_GENERATE_PKGCONFIG=ON ..make -j4sudo make install

(3)配置OpenCV变量,编辑文件 /etc/ld.so.conf.d/opencv.conf(如果没有就会自动创建):

sudo gedit /etc/ld.so.conf.d/opencv.conf

然后添加 OpenCV4 的 lib 路径:

/usr/local/opencv4/lib

保存退出,执行:

sudo ldconfig

(4)编辑 ~/.bashrc 文件:

sudo gedit ~/.bashrc

最后添加:

#opencv-4.2.0export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/usr/local/opencv4/lib/pkgconfigexport LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./usr/local/opencv4/lib

保存退出,执行:

source ~/.bashrc

查询OpenCV版本、库以及头文件目录,结果仍然是之前安装的OpenCV3的版本。因为,对于OpenCV4以上的版本要使用OpenCV4才能正确查询到其版本,库以及头文件目录的值。具体命令如下所示:

pkg-config --modversion opencv4pkg-config --cflags opencv4pkg-config --libs   opencv4

(5)使用多版本OpenCV,在写CmakeLists.txt要注意,如果只有一个版本的OpenCV,我们一般直接使用FIND_PACKAGE(OpenCV REQUIRED),如果现在要使用的是默认安装的OpenCV3,则使用上面的指令就足够了。如果现在要使用的是我们自己指定路径的opencv-4.2.0,则在上面指令前面加上如下指令:

set(CMAKE_PREFIX_PATH "/usr/local/opencv4") 

4.2 安装ORB-SALM3

(1)解压源文件修改CMakeLists.txt,调低make -j x,在FIND_PACKAGE(OpenCV REQUIRED)前面加上如下指令(使用OpenCV4,若使用OpenCV3忽略):

set(CMAKE_PREFIX_PATH "/usr/local/opencv4") 

find_package(Eigen3 3.1.0 REQUIRED)修改为:

find_package(Eigen3 REQUIRED)

(2)安装python2.7:

sudo apt install libpython2.7-dev

(3)在源文件夹下打开终端:

cd ORB_SLAM3chmod +x build.sh./build.sh
报opensll错误,缺少对应的库,需安装openssl-devel:
sudo apt-get install libssl-dev
报错:x3D=x3D_h.get_minor<3,1>(0,0)/x3D_h(3); error:no match for ’operator/’ ,应该是是重载了这个符号,但是这里直接这样写是不合格的,两个地方提示出错:
/ORB_SLAM3/src/LocalMapping.cc:628:49: error: no match for ‘operator/’ (operand types are ‘cv::Matx<float, 3, 1>’ and ‘float’) x3D = x3D_h.get_minor<3,1>(0,0) / x3D_h(3);/ORB_SLAM3/src/CameraModels/KannalaBrandt8.cpp:534:41: error: no match for ‘operator/’ (operand types are ‘cv::Matx<float, 3, 1>’ and ‘float’) x3D = x3D_h.get_minor<3,1>(0,0) / x3D_h(3);

在源码中的这两个地方,将x3D = x3D_h.get_minor<3,1>(0,0) / x3D_h(3)修改为:

x3D = cv::Matx31f(x3D_h.get_minor<3,1>(0,0)(0) / x3D_h(3), x3D_h.get_minor<3,1>(0,0)(1) / x3D_h(3), x3D_h.get_minor<3,1>(0,0)(2) / x3D_h(3));
如果因内存不足中断编译进程:
c++: fatal error: Killed signal terminated program cc1plus

调大虚拟机内存/创建swap分区,调低make -j x

(4)运行TUM corridor(Monocular-Inertial)例子:

./Monocular-Inertial/mono_inertial_tum_vi ../Vocabulary/ORBvoc.txt Monocular-Inertial/TUM_512.yaml dataset-corridor1_512_16/mav0/cam0/data Monocular-Inertial/TUM_TimeStamps/dataset-corridor1_512.txt Monocular-Inertial/TUM_IMU/dataset-corridor1_512.txt dataset-corridor1_512_monoi

在这里插入图片描述

五、安装ROS noetic

参考 详细介绍如何在ubuntu20.04中安装ROS系统,超快完成安装(最新版教程) 讲解的非常详细,安装过程中很多错误都给出了解决方法,这里写出大致流程
(1)添加ROS软件源

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'

(2)添加密钥

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

(3)更新软件源

sudo apt update

以上有问题换用:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654

(4)安装ROS noetic

sudo apt install ros-noetic-desktop-full

(5)初始化rosdep

sudo rosdep init
如果找不到命令:
sudo apt install python-rosdep2# 或者sudo apt install python3-rosdep2
ERROR: cannot download default sources list from:https : //raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.listWebsite may be down.
udo gedit /etc/hosts

打开的hosts文件中添加如下的内容,然后保存退出

199.232.28.133 raw.githubusercontent.com

如果出现ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.

访问 https://www.ipaddress.com/ 查询 raw.githubusercontent.com 的ip地址

在这里插入图片描述

将199.232.28.133 raw.githubusercontent.com换为:

185.199.108.133 raw.githubusercontent.com

ERROR: default sources list file already exists: /etc/ros /rosdep/sources.list.d/20-default.listPlease delete if you wish to re-initialize
sudo rm /etc/ros/rosdep/sources.list.d/20-default.list

然后

rosdep update

(6)安装rosinstall

sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool

(7)设置环境变量

sudo gedit .bashrc# 末尾添加source /opt/ros/noetic/setup.bash# 保存退出source ~/.bashrc

(8)验证

roscore
Command ‘roscore’ not found, but can be installed with:sudo apt install python3-roslaunch,按照提示安装:
sudo apt install python3-roslaunch
Resorce not found: roslaunch说明之前的安装没有安装全,继续安装
sudo apt install ros-noetic-desktop-full

(9)测试ROS:

roecorerosrun turtlesim turtlesim_noderosrun turtlesim turtle_teleop_key

在这里插入图片描述

六、ROS安装摄像头驱动

(1)创建一个catkin工作空间:

mkdir -p ~/catkin_ws/src

(2)编译工作空间:

cd ~/catkin_ws/catkin_make

(3)配置环境

source ~/catkin_ws/devel/setup.bash

(4)下载摄像头功能包源码,将功能包解压到~/catkin_ws/src下
(5)重新编译工作空间并配置环境
(6)测试usb摄像头
打开新终端,运行/catkin_ws/src/usb_cam-develop/launch下的launch文件usb_cam-test.launch

roslaunch usb_cam usb_cam-test.launch

在这里插入图片描述

再打开一个窗口输入rqt_graph查看消息,看到usb_cam节点向/usb_cam/image_raw发布了消息,image_view订阅了该消息,消息内容即为图像帧,由image_view显示

报错:
RLException: [usb_cam-test.launch] is neither a launch file in package [usb_cam] nor is [usb_cam] a launch file nameThe traceback for the exception was written to the log file

未配置环境:

source ~/catkin_ws/devel/setup.bash

为了省去每次配置,将这句添加到 ~/.bashrc 文件中

sudo gedit ~/.bashrc

保存退出,执行:

source ~/.bashrc
摄像头图像花屏
摄像头的默认像素格式是mjpeg格式的,launch文件中定义的像素格式是yuyv格式的(第六行),将其修改为mjpeg

在这里插入图片描述

但是此时终端中会提示警告

eprecated pixel format used, make sure you did set range correctly

然后在usb_cam-develop源码src文件中找到usb_cam.cpp文件447行,video_sws_ = sws_getContext...之前添加:

{    AVPixelFormat pixFormat;    switch (avcodec_context_->pix_fmt) {    case AV_PIX_FMT_YUVJ420P :        pixFormat = AV_PIX_FMT_YUV420P;        break;    case AV_PIX_FMT_YUVJ422P  :        pixFormat = AV_PIX_FMT_YUV422P;        break;    case AV_PIX_FMT_YUVJ444P   :        pixFormat = AV_PIX_FMT_YUV444P;        break;    case AV_PIX_FMT_YUVJ440P :        pixFormat = AV_PIX_FMT_YUV440P;        break;    default:        pixFormat = avcodec_context_->pix_fmt;        break;    }    avcodec_context_->pix_fmt = pixFormat;  }

重新编译工作空间并配置环境

七、ROS实时运行ORB-SLAM2

7.1 相机标定

相机的内参标定可以使用MATLAB工具箱和其他工具包,或者我最常用的编写程序调用OpenCV标定,这里使用ros标定

#noetic摄像头标定工具安装sudo apt-get install ros-noetic-camera-calibration#启动摄像头roslaunch usb_cam usb_cam-test.launch#新开一个终端,开始标定rosrun camera_calibration cameracalibrator.py --size 10x7 --square 0.0085 image:=/usb_cam/image_raw camera:=/usb_cam --k-coefficients=4

cameracalibrator.py 标定程序需要以下几个输入参数:
--size为棋盘格的规格(内部角点行列个数),
--square为棋盘格的大小(棋盘格的边长,单位是m),
image:=指定了图像的TOPIC,
--k-coefficients为畸变模型参数个数,
camera:=/usb_cam摄像头
--no-service-check禁用
set_camera_info检查服务

按照x(左右)、y(上下)、size(前后)、skew(倾斜)等方式移动棋盘,直到x,y,size,skew的进度条都变成绿色位置。
我这里用手机大致测了一下,--size 10x7 --square 0.0085,最好用正常的标定板

在这里插入图片描述

都变成绿色位置了就按下CALIBRATE按钮,等一段时间就可以完成标定。
完成后点击SAVE保存标定使用的图像以及标定结果,会显示保存地址,可以打开查看,然后再COMMIT退出程序,标定完成。

在这里插入图片描述

找到标定结果文件后,按照其数据修改Examples/ROS/ORB_SLAM2目录下Asus.yaml

7.2 编译ORB_SLAM2 ROS例子

将ORB_SLAM2源码文件夹复制到~/catkin_ws/src文件夹下,在ORB_SLAM2文件夹下打开终端
(1)修改ros示例源文件
Examples/ROS/ORB_SLAM2/src路径下的所有.cc文件添加头文件

#include <unistd.h>

将单目ros_mono.ccros_mono_ar.cc文件的订阅:

//单目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);

(2)解决OpenCV版本问题
由于2.4节安装了与ROS版本一样的OpenCV(或者直接使用ROS的OpenCV),这里只需要修改ORB_SLAM2使其依赖OpenCV4就行,避免了版本冲突问题。
修改ORB_SLAM2文件夹、ORB_SLAM2/Thirdparty/DBoW2文件夹和ORB_SLAM2/Examples/ROS/ORB_SLAM2三个文件夹下的CMakeLists.txt,将:

find_package(OpenCV 3.0 QUIET)

修改为:

set(CMAKE_PREFIX_PATH "/usr/local/opencv4") find_package(OpenCV 4.0 QUIET)

ORB_SLAM2/Examples/文件夹下的所有示例源文件中导入图像数据的参数 CV_LOAD_IMAGE_UNCHANGED 修改为:

cv::IMREAD_UNCHANGED

若内存不足中断编译,调低make -jx

(3)编译

cd ~/catkin_ws/src/ORB-SLAM2chmod +x build.sh build_ros.sh# 注意如果是复制的已经编译过的源码,请把build文件夹里面的内容删除# 另外这个编译问题参考4.2./build.sh

由于ORBSLAM2中设置了rosbuild_init(),因此,直接在~/.bashrc上配置环境:

echo 'export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:'"`pwd`/Examples/ROS" >> ~/.bashrcsource ~/.bashrc

编译ros节点:

./build_ros.sh
遇到错误: /usr/bin/ld: CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
在ros的CMakeListst.txt链接的库中添加:-lboost_system

在这里插入图片描述

7.3 ROS实时运行ORB-SLAM2

#打开摄像头(可将launch文件的图像显示节点删除)roslaunch usb_cam usb_cam-test.launch#ORB_SLAM2目录下打开终端,运行ORB-SLAM2,参数文件Asus.yaml是测试摄像头标定的rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/Asus.yaml

在这里插入图片描述

新开一个终端查看计算图:

rqt_graph

在这里插入图片描述

7.4 ORB-SLAM2跑bag数据包

以EuRoC数据为例,下载数据包,查看bag数据消息列表

在这里插入图片描述

可以看到双目的图像消息,我们运行双目例子,将双目ros_stereo.cc文件的订阅:

//双目message_filters::Subscriber<sensor_msgs::Image> left_sub(nh, "/camera/left/image_raw", 1);message_filters::Subscriber<sensor_msgs::Image> right_sub(nh, "/camera/right/image_raw", 1);

替换为:

message_filters::Subscriber<sensor_msgs::Image> left_sub(nh, "/cam0/image_raw", 1);message_filters::Subscriber<sensor_msgs::Image> right_sub(nh, "/cam1/image_raw", 1);

重新编译ros节点,然后运行

./build_ros.sh#ORB_SLAM2目录下打开终端,运行ORB-SLAM2rosrun ORB_SLAM2 Stereo Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml true#播放数据包rosbag play V1_01_easy.bag

在这里插入图片描述

7.5 ROS运行ORB-SLAM3

(1)将ORB_SLAM3源码文件夹复制到~/catkin_ws/src文件夹下,在ORB_SLAM2文件夹下打开终端编译

chmod +x build.sh build_ros.sh./build.sh

(2)编译ROS节点
修改CMakeLists.txt,统一OpenCV版本

#find_package(OpenCV 3.0 QUIET)find_package(OpenCV 4.0 QUIET)

以单目VIO为例,将ros_mono_inertial.cc的IMU与图像消息订阅修改为:

ros::Subscriber sub_imu = n.subscribe("/imu0", 1000, &ImuGrabber::GrabImu, &imugb); ros::Subscriber sub_img0 = n.subscribe("/cam0/image_raw", 100, &ImageGrabber::GrabImage,&igb);

编译,然后运行

./build_ros.sh# 配置环境:source Examples/ROS#ORB_SLAM3目录下打开终端,运行ORB-SLAM3rosrun ORB_SLAM3 Mono_Inertial Vocabulary/ORBvoc.txt Examples/Monocular-Inertial/EuRoC.yaml#播放数据包rosbag play V1_01_easy.bag

效果图与ORB-SLAM2那个类似,就不重复了

八、Gazebo仿真运行ORB_SLAM2

8.1 准备

安装teleop_twist_keyboard键盘控制功能包,后面使用该功能包,通过键盘控制ROS小车的运动:

sudo apt-get install ros-noetic-teleop-twist-keyboard

安装gazebo(完整ROS安装时已经安装好 ros-noetic-desktop-full)下载或构建gazebo仿真环境,例如赵虚左老师教程提供的简易环境:box_house.world

在这里插入图片描述

8.2 搭建ROS小车

参考赵虚左老师教程的第六章,搭建自己的ros小车,首先在自己的工作空间中创建功能包:

catkin_create_pkg gazebo_test urdf xacro gazebo_ros gazebo_ros_control gazebo_plugins

功能包下新建文件夹及.xacro文件,编写urdf文件(教程里直接复制内容):
(1)惯性矩阵算法:head.xacro
(2)车体:base.xacro
(3)相机:camera.xacro
(4)运动控制:move.xacro
(5)相机仿真:camera_senser.xacro
(6)组合:car.xacro
将下面的路径修改为自己的:

<!-- file:car.xacro --><!-- 组合小车与摄像头 --><robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro">    <xacro:include filename="路径/head.xacro" />    <xacro:include filename="路径/base.xacro" />    <xacro:include filename="路径/camera.xacro" />        <xacro:include filename="路径/move.xacro" />    <xacro:include filename="路径/camera_senser.xacro" /></robot>

8.3 编写lanuch文件:

功能包和路径修改为自己的:

<launch>    <!-- 将 Urdf 文件的内容加载到参数服务器 -->    <param name="robot_description" command="$(find xacro)/xacro $(find 功能包)/路径/urdf_car.xacro" />    <!-- 启动 gazebo -->    <include file="$(find gazebo_ros)/launch/empty_world.launch">        <arg name="world_name" value="$(find 功能包)/路径/box_house.world" />    </include>    <!-- 在 gazebo 中显示机器人模型 -->    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />    <!-- 关节以及机器人状态发布节点 -->    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />        <!-- 启动键盘控制 -->    <!-- 启动键盘控制节点 -->    <node name="teleop_twist_keyboard" pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py">      <param name="speed" value="0.3"/>      <param name="turn" value="0.5"/>    </node></launch>

在这里插入图片描述

8.4 标定参数

运行launch文件,查看话题列表:

roslaunch gazebo_test roscar_orbsalm2.launchrostopic list

在这里插入图片描述

查看带有内参的话题,根据它修改Asus.yaml

rostopic echo /camera/camera_info

在这里插入图片描述

8.5 运行ORB_SLAM2

将订阅话题修改为camera/image_raw,重新编译:

ros::Subscriber sub = nodeHandler.subscribe("camera/image_raw", 1, &ImageGrabber::GrabImage,&igb);

运行:

roslaunch gazebo_test roscar_orbsalm2.launch
#新开一个终端:
source ~/catkin_ws/src/ORB_SLAM2
rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/Asus.yaml

在这里插入图片描述

键盘控制方法(结合图像窗口):

在这里插入图片描述

九、安装SLAM测评工具evo

evo是一个很好的测评工具,它可以根据时间戳将轨迹进行对齐,同时可以将不同尺度的轨迹按照你指定的标准轨迹进行拉伸对齐,并可以算出均方差等评定参数,用于测评slam算法性能

9.1 安装evo

(1)安装pip:

sudo apt install python-pip#orsudo apt install python3-pip

(2)直接安装:

pip install evo --upgrade --no-binary evo --user#或加速:pip install evo --upgrade --no-binary evo --user -i https://pypi.tuna.tsinghua.edu.cn/simple

(3)源码安装:

cd evopip install --editable . --upgrade --no-binary evo --user

这样会很慢,可以通过国内镜像加速,在pip 语句后面增加指定源路径,如下

pip install --editable . --upgrade --no-binary evo --user -i https://pypi.tuna.tsinghua.edu.cn/simple

9.2 测试evo

(1) 轨迹绘制evo_traj

cd test/dataevo_traj kitti KITTI_00_ORB.txt KITTI_00_SPTAM.txt --ref=KITTI_00_gt.txt  -vas -p --plot_mode=xz --save_plot ../data/image

其中:
kitti是数据格式
ref是参考轨迹(可省)
-vas是对齐后的详细信息,-v表示verbose mode

a表示采用SE(3) Umeyama对齐只处理平移、旋转,不加-s表示默认尺度对齐参数为1.0,即不进行尺度对齐(可省)s表示采用SE(3) Umeyama对齐只处理尺度as表示采用Sim(3) Umeyama对齐,同时处理平移、旋转、尺度

-p是画出图像,也可以使用–plot_mode {xy,xz,yx,yz,zx,zy,xyz}来选择单独绘制某个平面的信息(可省)
--save_plot “保存的路径”+文件名 保存图片(可省)

首次运行若遇到:evo_traj:command not found,重启电脑。

在这里插入图片描述

(2)绝对位姿误差的计算evo_ape

mkdir resultsevo_ape kitti KITTI_00_gt.txt KITTI_00_ORB.txt -r full -vas --plot --plot_mode=xz --save_results results/ORB.zip

其中,-r/–pose_relation可选参数(省去则默认trans_part

full表示同时考虑旋转和平移误差得到的误差,无单位(unit-less)trans_part表示考虑平移部分得到的误差,单位为mrot_part表示考虑旋转部分得到的误差,无单位(unit-less)angle_deg表示考虑旋转角得到的误差,单位°(deg)angle_rad表示考虑旋转角得到的误差,单位弧度(rad)

使用ape的时候无需给出–ref 的文件,第一个文件即为标准/GT文件, --save_results results/ORB.zip为保存结果及路径(可省)

在这里插入图片描述
在这里插入图片描述

(3)相对位姿误差的计算evo_rpe:其使用方法与ape基本一致
(4)处理一个指标的多个结果: evo_res可用于比较来自同样指标的多个结果文件, 包括打印信息和统计信息(默认),绘制结果,将统计信息保存在表中。将上面产生的压缩文件生成图表和表格

evo_rpe kitti KITTI_00_gt.txt KITTI_00_SPTAM.txt -va --plot --plot_mode xz --save_results results/SPTAM.zipevo_res results/*.zip -p --save_table results/table.csv

在这里插入图片描述

(5)数据集格式转换

evo_traj euroc V102_groundtruth.csv --save_as_tumevo_traj tum V102_groundtruth.tum --save_as_kitti

将文件保存为其他类型的文件,可以使用如下句柄

--save_as_tum         save trajectories in TUM format (as *.tum)--save_as_kitti       save poses in KITTI format (as *.kitti)--save_as_bag         save trajectories in ROS bag as <date>.bag

没有–save_as_euroc选项,因为EuRoC格式仅对EuRoC数据集的基本事实有意义

(6)修改全局参数配置
修改背景颜色: whitegrid、 darkgrid、 dark、 white、 ticks

evo_config set plot_seaborn_style whitegrid

修改线条类型:deep, muted, bright, pastel, dark, colorblind

evo_config set plot_seaborn_palette bright

修改线宽

evo_config set plot_linewidth 2.5

修改字体大小

evo_config set plot_fontfamily serif plot_fontscale 3

设置位姿点显示坐标系大小

evo_config set plot_axis_marker_scale 1

打开轨迹同名点连线

evo_config set plot_pose_correspondences true

参考轨迹ref的透明度

evo_config set plot_reference_alpha 0.75

恢复初始设置

evo_config reset

(7)卸载evo
pip list:列出pip安装的软件包
pip uninstall evo:卸载

十、安装PCL和Octomap

在ubuntu18.04之后,安装pcl和octomap只需两行命令(若遇到问题,首先考虑是否已经换源):

# 这样安装的pcl版本为1.10sudo apt-get install libpcl-dev pcl-toolssudo apt-get install liboctomap-dev octovis

(1)使用pcl-tools命令pcl_viewer查看.pcd点云文件:

pcl_viewer map.pcd

在这里插入图片描述

(2)使用octovis查看八叉树点云文件:

octovis octomap.bt

在这里插入图片描述

十一、安装优化库:G2O、GTSAM和Ceres

GTSAM和Ceres的安装参考Ubuntu20.04下运行LOAM系列:A-LOAM、LeGO_LOAM、LIO-SAM 和 LVI-SAM,下面安装G2O,首先安装依赖:

sudo apt-get install libeigen3-dev libsuitesparse-dev qtdeclarative5-dev qt5-qmakesudo apt-get install libqglviewer-dev-qt5 libsuitesparse-dev

下载源码:

git clone https://github.com/RainerKuemmerle/g2o.git

编译安装:

cd g2omkdir buildcd buildcmake ..makesudo make install

(1)如果报cmake版本问题,将cmake要求最小版本改为3.10
(2)如果Could NOT find QGLVIEWER (missing: QGLVIEWER_LIBRARY) ,修改g2o/cmake_modules里面的 FindQGLViewer.cmake文件,让cmake能够找到它。就是在find_library(QGLVIEWER_LIBRARY_RELEASE)find_library(QGLVIEWER_LIBRARY_DEBUG)中添加下QGLViewer-qt5

请添加图片描述

运行高翔十四讲例子:

在这里插入图片描述

(1)编译报错/usr/local/include/g2o/core/base_fixed_sized_edge.h:38:10: fatal error: ceres/internal/fixed_array.h: No such file or directory #include <ceres/internal/fixed_array.h>
先安装Ceres
(2)error while loading shared libraries: libg2o_core.so: cannot open shared object file: No such file or directory
sudo gedit /etc/ld.so.conf打开配置文件,添加一行include /usr/local/lib,保存退出。然后输入sudo ldconfig回车使配置生效
(3)usr/local/include/g2o/core/base_fixed_sized_edge.h:174:32: error: ‘index_sequence’ is not a member of ‘std’ 174 | struct HessianTupleType<std::index_sequence<Ints...>>
解决方法:在Cmakelists中更新至c++14

十二、安装Sophus

安装基于模板的Sophus库,基于模板的Sophus库与Eigen一样仅含有头文件,并且Sophus库是在Eigen基础上开发的,继承了Eigen库中的定义的各个类。因此要先安装Eigen,这里基于上述安装的Eigen3.4.0

git clone https://github.com/strasdat/Sophus.gitcd Sophusmkdir build cd buildcmake ..makesudo make install
cmake错误:Could not find a package configuration file provided by "fmt" with any of the following names: fmtConfig.cmake fmt-config.cmake
解决办法,安装fmt库:
git clone https://github.com/fmtlib/fmt.gitcd fmtmkdir build cd buildcmake ..makesudo make install
报错:error: implicitly-declared ‘Eigen::Map<Sophus::SO2<double> >::Map(const Eigen::Map<Sophus::SO2<double> >&)’ is deprecated [-Werror=deprecated-copy] Eigen::Map<SO2Type> shallow_copy = map_of_so2;

CMakeLists.txt# Add local path for finding packages, set the local version first之前加:

set(CMAKE_CXX_FLAGS "-Wno-error=deprecated-declarations -Wno-deprecated-declarations ")

运行高翔十四讲例子:

在这里插入图片描述

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/gushi/2024-04-06/154910.html,文章来源:网络cs,作者:欧阳逸,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论