冷饮网站开发背景意义,网站海报做一张多少钱,如何用vps建网站,设计自己的网页1. 环境准备#xff1a;从零开始的Ubuntu18.04系统配置 大家好#xff0c;我是老张#xff0c;在AI和机器人领域摸爬滚打了十几年#xff0c;今天想和大家聊聊怎么在Ubuntu18.04上把ORB-SLAM3这个大名鼎鼎的视觉SLAM系统给跑起来#xff0c;并且用EuRoC这个经典数据集来练…1. 环境准备从零开始的Ubuntu18.04系统配置大家好我是老张在AI和机器人领域摸爬滚打了十几年今天想和大家聊聊怎么在Ubuntu18.04上把ORB-SLAM3这个大名鼎鼎的视觉SLAM系统给跑起来并且用EuRoC这个经典数据集来练练手。我知道很多刚入门SLAM的朋友一看到开源项目那一长串的依赖和编译指令就头疼网上的教程又常常语焉不详一个报错就能卡住一整天。所以我打算用这篇实战记录把我自己从零部署、编译、测试到结果分析的完整过程包括踩过的那些坑都原原本本地分享出来。目标就一个让你照着做就能在自己的电脑上成功运行ORB-SLAM3看到它重建出来的三维轨迹和地图。为什么选Ubuntu18.04因为它是一个长期支持版本非常稳定而且和ROS Melodic是绝配。ORB-SLAM3虽然对系统版本要求不算苛刻但18.04下的软件源和库版本经过多年沉淀兼容性最好能帮你避开很多稀奇古怪的版本冲突问题。在开始之前我建议你先确保你的系统是干净的最好是新装的或者至少没有安装过太多杂七杂八的第三方库这样可以最大程度减少干扰。接下来我们就从最基础的依赖安装说起。1.1 安装核心依赖打好地基才能盖高楼安装依赖是第一步也是最容易出问题的一步。ORB-SLAM3的依赖项不少但别怕我们一步步来。官方文档里列了一堆像C11编译器、Pangolin、OpenCV、Eigen3、DBoW2、g2o等等。如果你之前为了玩机器人装过ROS Melodic那恭喜你OpenCV、g2o这些可能已经自带了一部分。但为了保险起见我们还是从头捋一遍。首先更新一下软件源这是个好习惯sudo apt-get update sudo apt-get upgrade然后安装编译工具和CMakesudo apt-get install build-essential cmake git pkg-config接下来是关键。Pangolin是一个轻量级的OpenGL显示库ORB-SLAM3用它来实时显示相机轨迹和地图点。安装它需要先装一些图形库的依赖sudo apt-get install libgl1-mesa-dev libglew-dev libwayland-dev libxkbcommon-dev wayland-protocols libegl1-mesa-dev sudo apt-get install libjpeg-dev libpng-dev libtiff-dev libopenexr-dev依赖装好后再去GitHub上克隆Pangolin的源码进行编译安装。我习惯把它装在/usr/local目录下这样系统全局都能找到。cd ~ git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build cd build cmake .. make -j4 sudo make install这里make -j4表示用4个线程并行编译速度更快数字可以根据你电脑的CPU核心数来调整。然后是Eigen3一个强大的线性代数库。Ubuntu18.04默认软件源里的Eigen3版本可能有点老ORB-SLAM3推荐用3.3.7或以上。稳妥起见我们也用源码安装cd ~ wget https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz tar -xzvf eigen-3.3.9.tar.gz cd eigen-3.3.9 mkdir build cd build cmake .. sudo make install安装后头文件通常会在/usr/local/include/eigen3记得这个路径后面编译时可能会用到。OpenCV的安装是个大工程。ROS Melodic自带的是OpenCV 3.2对于ORB-SLAM3来说基本够用。你可以直接用ROS自带的省去很多麻烦。检查一下pkg-config --modversion opencv如果显示3.2.x那就可以直接用了。如果想用更新的版本比如OpenCV 4那就要自己编译过程会复杂很多而且可能会和ROS产生冲突新手我不建议折腾。1.2 处理其他必要库查漏补缺除了上面几个大头还有一些库也需要准备。比如DBoW2词袋模型库和g2o图优化库它们其实都包含在ORB-SLAM3的源码目录Thirdparty文件夹里了我们后续编译ORB-SLAM3时脚本会自动去编译它们所以这里不需要单独安装系统版本的。但是有一个库经常被忽略那就是libssl-dev。在编译某些依赖或ORB-SLAM3本身时如果遇到与openssl相关的错误安装它就能解决sudo apt-get install libssl-dev另外确保Python2.7是可用的。虽然ORB-SLAM3核心是C但有些脚本或工具可能用到。Ubuntu18.04默认应该就有。可以用python --version查看。做完这些我们的基础软件环境就差不多了。你可以把这些步骤看作是在给房子打地基地基稳了后面编译和运行才能顺风顺水。我建议每完成一步都简单测试一下比如编译一个Pangolin的小例子确保安装真的成功了别把所有问题都留到最后。2. 获取与编译ORB-SLAM3让代码跑起来环境准备好我们就可以请出今天的主角——ORB-SLAM3了。这一步我们要从GitHub上把源码拉下来然后把它编译成可以执行的程序。整个过程有点像拼装一个精密的模型需要按照说明书CMakeLists.txt一步步来。2.1 下载源码与创建工作空间我个人的习惯是为不同的项目创建独立的工作空间这样管理起来清晰不会互相污染。我们就创建一个名为orb_slam3_ws的文件夹作为工作空间。mkdir -p ~/orb_slam3_ws/src cd ~/orb_slam3_ws/src然后使用git克隆ORB-SLAM3的官方仓库。这里要注意网络如果GitHub慢可以尝试配置镜像或者使用其他方式。git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git克隆完成后ORB_SLAM3目录就会出现在src下。这个目录结构非常清晰Examples里是各种运行示例单目、双目、RGB-D、单目惯性等Vocabulary里是ORB特征词袋文件Thirdparty里就是刚才提到的DBoW2和g2o等第三方库。2.2 执行编译脚本与解决常见报错进入ORB-SLAM3目录你会发现有一个build.sh脚本。这个脚本自动化了编译过程非常方便。但在运行前我们先给它加上执行权限cd ~/orb_slam3_ws/src/ORB_SLAM3 chmod x build.sh然后就可以尝试编译了./build.sh编译过程可能会持续几分钟到十几分钟取决于你的电脑性能。在这个过程中大概率会遇到一些报错。别慌这太正常了我每次在新机器上编译几乎都会遇到。下面我列举几个最常见的“坑”和解决办法。第一个常见坑Pangolin找不到。错误信息可能类似于Could not find Pangolin。这是因为build.sh脚本里的CMake在系统默认路径里没找到我们安装的Pangolin。解决方法是指定Pangolin的安装路径。我们可以修改CMakeLists.txt文件但更简单的方法是设置一个环境变量或者在调用cmake时加参数。不过对于build.sh脚本我们可以尝试先手动编译一下Thirdparty中的库有时能解决。更根本的解决方法是确保Pangolin正确安装到了/usr/local并且/usr/local/lib和/usr/local/include在系统的链接路径里。你可以执行sudo ldconfig更新一下链接库缓存。第二个常见坑Eigen3版本不对或找不到。错误信息可能是Eigen3 version 3.3.90 found, but at least version 3.3.7 is required或者直接找不到。这说明系统找到的Eigen版本太老。因为我们用源码安装了新版本需要告诉CMake去哪里找。我们可以修改ORB-SLAM3根目录下的CMakeLists.txt文件找到find_package(Eigen3 3.3.7 REQUIRED)这一行在上面手动设置Eigen3的路径set(Eigen3_DIR /usr/local/share/eigen3/cmake) # 或者是你安装Eigen3的路径 set(Eigen3_INCLUDE_DIR /usr/local/include/eigen3)然后重新运行./build.sh。第三个常见坑OpenCV版本冲突。如果你系统里有多个OpenCV版本比如ROS自带的3.2和自己装的4.xCMake可能会找到错误的那个。可以通过CMake的GUI工具指定OpenCV路径或者在终端编译时用-DOpenCV_DIR参数指定。但最简单的方法是如果你主要用ROS环境就确保只使用ROS自带的OpenCV卸载掉自己装的其他版本。第四个常见坑C14特性不支持。ORB-SLAM3需要C14标准。如果你的g编译器比较老可能不支持。Ubuntu18.04默认的g7.5版本是支持的。检查一下g --version。确保版本不低于5。在CMakeLists.txt中通常已经设置了set(CMAKE_CXX_STANDARD 14)。当编译顺利完成后你会在ORB_SLAM3目录下看到一个lib文件夹里面是编译好的库文件和一堆在Examples子目录下的可执行文件比如mono_euroc,stereo_euroc,mono_inertial_euroc等。看到这些恭喜你ORB-SLAM3的核心引擎已经就位了3. 获取与配置EuRoC数据集准备测试燃料SLAM算法就像引擎没有数据燃料它也跑不起来。EuRoC数据集是苏黎世联邦理工ETH发布的经典视觉惯性数据集包含在微型飞行器MAV上采集的多个室内场景序列有双目图像、IMU数据以及高精度的地面真实轨迹非常适合用来评测ORB-SLAM3这类视觉惯性SLAM系统。3.1 下载数据集选择适合你的渠道官方下载地址是有的但服务器在国外下载速度可能非常慢对于大文件来说简直是折磨。这里我给大家提供两个更可行的方案。方案一使用官方ASL数据集页面。你可以访问苏黎世联邦理工的自主系统实验室ASL页面找到EuRoC MAV数据集。里面有很多序列比如MH_01_easy,V1_03_difficult等。每个序列都是一个独立的压缩包包含mav0文件夹里面有cam0,cam1图像imu0IMU数据等子文件夹。如果你网络条件好可以慢慢下。我实测用官方链接下载一个序列可能需要数小时。方案二使用国内网盘资源推荐。为了方便大家很多热心开发者会把数据集上传到百度网盘等国内平台。就像原始文章里提到的你可以搜索“ORB-SLAM3 EuRoC 数据集 百度网盘”来找到资源。下载后你会得到一系列以序列名命名的.zip或.tar.gz文件。比如MH_01_easy.zip。解压后建议把所有序列都放在一个统一的目录下方便管理。比如我在家目录下创建了一个专门放数据的文件夹mkdir -p ~/Datasets/EuRoC然后把下载解压好的MH_01_easy,V1_03_difficult等文件夹全部放到~/Datasets/EuRoC/下面。这样每个序列的路径就像~/Datasets/EuRoC/MH_01_easy/mav0/...。3.2 理解数据集结构与配置文件把数据下好、放对位置只是第一步。要让ORB-SLAM3正确读取数据我们还需要理解它的数据组织方式并准备好对应的配置文件。进入你解压后的一个序列文件夹例如MH_01_easy/mav0。你会看到类似这样的结构cam0/ data/ # 存放大量以时间戳命名的.png图像文件 data.csv # 图像时间戳文件 cam1/ # 右目相机结构与cam0相同 imu0/ data.csv # IMU数据和时间戳 state_groundtruth_estimate0/ data.csv # 地面真实轨迹位姿ORB-SLAM3在运行时不直接读取这些散乱的图像文件而是通过一个“时间戳文件”和数据集路径动态地按顺序加载图像。这个时间戳文件在ORB-SLAM3源码里已经为我们准备好了它在ORB_SLAM3/Examples/传感器类型/EuRoC_TimeStamps/目录下。比如对于单目惯性模式时间戳文件就在Examples/Monocular-Inertial/EuRoC_TimeStamps/里文件名如MH01.txt。另一个关键文件是配置文件YAML。它告诉ORB-SLAM3相机的内参焦距、畸变系数等、图像尺寸、IMU噪声参数等。这些参数对于SLAM的精度至关重要。ORB-SLAM3也为EuRoC数据集提供了预设的配置文件位于Examples/传感器类型/目录下例如Examples/Monocular-Inertial/EuRoC.yaml。这个文件里的参数是针对EuRoC数据集传感器标定好的我们一般不需要修改除非你做深入的算法研究。所以运行前的准备工作就是1. 数据集放在某个路径比如~/Datasets/EuRoC/MH_01_easy。2. 准备好对应的可执行程序、词袋文件、配置文件和时间戳文件。词袋文件ORBvoc.txt是通用的在Vocabulary目录下。4. 运行与评测见证SLAM的魔法一切就绪最激动人心的时刻来了——让ORB-SLAM3“吃”进数据看看它能不能实时构建出地图和轨迹。我们分别以单目惯性和双目模式为例跑一下看看。4.1 运行单目惯性模式单目惯性模式是ORB-SLAM3的亮点之一它只用一个相机和一个IMU就能实现尺度可观、鲁棒性很高的定位与建图。我们以MH_01_easy这个简单序列为例。首先打开终端进入到ORB-SLAM3的根目录cd ~/orb_slam3_ws/src/ORB_SLAM3然后运行以下命令。注意你需要将[YOUR_DATASET_PATH]替换成你实际存放MH_01_easy文件夹的父目录。这一点很关键ORB-SLAM3的示例程序期望传入的是数据集序列的父目录加上序列名称。它会在内部拼接成完整路径。./Examples/Monocular-Inertial/mono_inertial_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/EuRoC.yaml [YOUR_DATASET_PATH]/EuRoC MH01 ./Examples/Monocular-Inertial/EuRoC_TimeStamps/MH01.txt举个例子如果你的数据集放在/home/yourname/Datasets/EuRoC/那么[YOUR_DATASET_PATH]就是/home/yourname/Datasets命令应该写成./Examples/Monocular-Inertial/mono_inertial_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/EuRoC.yaml /home/yourname/Datasets/EuRoC MH01 ./Examples/Monocular-Inertial/EuRoC_TimeStamps/MH01.txt按下回车如果一切顺利你会看到两个窗口弹出来。一个是Pangolin的3D可视化窗口里面会动态地显示出相机估计的轨迹红色、关键帧蓝色和地图点黑色另一个是图像窗口显示当前帧的特征点匹配情况。同时终端里会疯狂滚动输出信息包括特征提取数量、跟踪状态、局部建图、回环检测等等。第一次运行可能会比较慢因为要加载很大的词袋文件ORBvoc.txt。耐心等待一下当图像开始一帧帧处理轨迹一点点延伸出来时那种感觉真的很棒。你可以看到相机是如何在未知环境中“摸索”前进并逐渐构建出一个稀疏的3D点云地图的。4.2 运行双目模式双目模式因为有了两个相机的视差信息可以直接得到像素的深度所以不需要像单目那样估计尺度初始化也更快更稳定。我们换一个稍微有挑战的序列V1_03_difficult试试。命令格式类似但使用的是双目示例程序和对应的配置文件、时间戳./Examples/Stereo/stereo_euroc ./Vocabulary/ORBvoc.txt ./Examples/Stereo/EuRoC.yaml [YOUR_DATASET_PATH]/EuRoC V103 ./Examples/Stereo/EuRoC_TimeStamps/V103.txt同样替换你的路径。运行后你会看到类似的可视化效果。双目模式下跟踪通常会更稳定对于快速运动或纹理较弱的区域表现可能比单目惯性更好。4.3 解读运行结果与常见问题程序运行结束后或者你按CtrlC终止它之后会在终端里输出一些统计信息更重要的是它会在当前目录下生成几个轨迹文件例如CameraTrajectory.txt和KeyFrameTrajectory.txt。这些文件记录了每一帧或每一个关键帧相机在世界坐标系下的位姿位置和姿态用四元数或旋转矩阵表示。如何评价跑得好不好直观感受看Pangolin窗口。轨迹是否平滑有没有突然的、大幅度的跳动地图点是否稳定地附着在场景中的物体上比如墙角、桌沿当相机绕回之前到过的地方时是否发生了回环检测你会看到一条绿色的线连接当前帧和历史帧并且轨迹和地图被修正对齐定量评测这就需要用到地面真实轨迹了。EuRoC数据集提供了state_groundtruth_estimate0/data.csv。我们可以使用像evo这样的轨迹评估工具将ORB-SLAM3输出的KeyFrameTrajectory.txt时间戳和位姿与地面真实轨迹进行对齐然后计算绝对位姿误差APE或相对位姿误差RPE。这是一个更严谨的评测方式可以给出像均方根误差RMSE这样的具体数值。不过对于初次上手先能直观地、稳定地跑通就已经是巨大的成功了。运行中可能遇到的问题程序一闪而过/崩溃最可能的原因是数据集路径不对。请再三检查路径是否正确、完整并且序列文件夹名称如MH01是否与时间戳文件名匹配。另一个可能是配置文件EuRoC.yaml的路径不对确保使用相对路径./Examples/.../EuRoC.yaml。Pangolin窗口黑屏/无响应可能是OpenGL驱动问题。尝试更新显卡驱动。或者在运行程序前试试用LIBGL_ALWAYS_SOFTWARE1这个环境变量来强制使用软件渲染会很卡仅用于测试LIBGL_ALWAYS_SOFTWARE1 ./Examples/...。跟踪丢失Tracking Lost在终端里看到大量的“Tracking Lost”信息。这说明相机运动太快、画面太模糊、或者场景纹理太单一比如白墙导致特征点跟踪不上。可以尝试运行更简单的序列如MH_01_easy或者调整ORB特征提取的参数在源码里需要重新编译。内存不足Killed处理高分辨率图像或长序列时可能发生。可以尝试降低图像分辨率如果数据集提供多分辨率版本或者关闭一些可视化选项来节省内存。5. ROS节点集成与实战技巧虽然直接运行可执行文件已经很直观但ORB-SLAM3也提供了ROS节点在Examples_old/ROS/ORB_SLAM3目录下这可以让你更方便地接入真实的相机话题比如来自USB相机或机器人上的相机或者播放ROS格式的bag包数据。对于EuRoC数据集官方也提供了ROS bag格式的文件.bag。5.1 编译ROS节点首先需要设置ROS工作环境并编译ORB-SLAM3的ROS部分。假设你已经安装了ROS MelodicUbuntu18.04的标配ROS版本。将ORB-SLAM3的ROS路径添加到ROS包路径中。编辑你的~/.bashrc文件在末尾添加一行请将PATH替换为你的ORB_SLAM3绝对路径export ROS_PACKAGE_PATH${ROS_PACKAGE_PATH}:PATH/ORB_SLAM3/Examples_old/ROS例如export ROS_PACKAGE_PATH${ROS_PACKAGE_PATH}:/home/zhang/orb_slam3_ws/src/ORB_SLAM3/Examples_old/ROS保存后执行source ~/.bashrc使环境变量生效。编译ROS节点。进入ROS节点目录用catkin工具的风格进行编译cd ~/orb_slam3_ws/src/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3 mkdir build cd build cmake .. -DROS_BUILD_TYPERelease make -j4编译成功后会生成名为ORB_SLAM3的ROS可执行文件。5.2 使用ROS Bag运行EuRoC的ROS bag包可以从其官网下载。下载后我们以双目模式为例播放V1_03_difficult.bag。打开第一个终端启动ROS核心roscore打开第二个终端启动ORB-SLAM3的双目ROS节点。这个节点会订阅特定的图像和IMU话题。rosrun ORB_SLAM3 Stereo Vocabulary/ORBvoc.txt Examples_old/Stereo/EuRoC.yaml true注意这里的路径是相对于ORB_SLAM3根目录的。最后一个参数true表示使用ROS模式。打开第三个终端进入到存放bag文件的目录播放bag包。关键的一步来了EuRoC bag包里的原始话题名可能和ORB-SLAM3节点订阅的话题名不一致。我们需要在播放时进行话题重映射remapcd ~/Datasets/EuRoC/bag_files # 假设bag文件在这里 rosbag play --pause V1_03_difficult.bag /cam0/image_raw:/camera/left/image_raw /cam1/image_raw:/camera/right/image_raw /imu0:/imu这条命令的意思是播放bag文件并将bag里的/cam0/image_raw话题映射到节点订阅的/camera/left/image_raw/cam1/image_raw映射到/camera/right/image_raw/imu0映射到/imu。--pause参数是先暂停等所有节点都准备好再按空格键开始播放这样不容易丢数据。如果一切配置正确你应该能看到和直接运行可执行程序类似的可视化效果。ROS模式的好处是它更贴近真实的机器人应用场景数据通过话题异步传输灵活性更高。5.3 调试与性能优化心得折腾了这么久最后分享几点我个人的实战心得。关于调试当程序跑不起来或者结果不对时一定要学会看终端输出的信息。ORB-SLAM3的输出信息非常详细从系统初始化、跟踪状态、局部建图、回环检测到全局BA光束法平差都有日志。Tracking lost是常见问题除了前面说的场景原因也可能是相机内参配置文件EuRoC.yaml不对。务必确认你用的配置文件和你运行的传感器模式单目/双目/单目惯性以及数据集序列匹配。关于性能ORB-SLAM3对CPU要求比较高尤其是特征提取和匹配部分。如果你的电脑比较老可能会处理得很慢跟不上数据集的帧率EuRoC通常是20Hz。在EuRoC.yaml配置文件中可以尝试调小ORBextractor的特征点数量nFeatures比如从1000调到500这能显著加快速度当然会以牺牲一些定位精度为代价。在ROS模式下还可以使用rosrun的--gui参数来动态调整一些参数但这需要对代码有更深的理解。关于扩展成功运行EuRoC只是第一步。ORB-SLAM3的强大之处在于它是一个完整的SLAM系统框架。你可以尝试用它跑跑其他数据集比如TUM RGB-D、KITTI甚至接入你自己的USB摄像头需要写一个简单的ROS发布节点。在这个过程中你会对特征提取、相机模型、非线性优化、回环检测这些SLAM核心概念有更感性的认识。