
简介一份针对Ubuntu20.04与OpenCV4环境的PL-VINS源码包面向从事机器人、无人驾驶、无人机等领域的感知定位研究者与开发者重点解决点线特征视觉惯性导航系统在配置中的OpenCV4适配难题。资源压缩包仅6KB共包含3个文件演示用HTML页面便于快速查看呈现效果inscode配置文件用于云端开发环境对接gitignore规则文件辅助版本管理整体结构精简适合直接嵌入个人项目或二次开发。目前已有149人学习使用。通过该资源可获得适配后的PL-VINS项目源码、数据集下载地址及修改后的代码仓库链接内容涉及OpenCV4.2与Eigen3.3.7依赖搭配下的关键改动思路能帮助绕开OpenCV接口升级带来的编译障碍作者还附带了科研互助群入口便于读者围绕视觉定位、决策规划等实际问题继续交流。对需要在Ubuntu20.04下快速完成PL-VINS环境搭建与验证的开发者而言这份源码包能够显著缩短排错周期直接进入算法调试与实际运行阶段。 说实话PL-VINS这套代码本身不算复杂真正让人崩溃的是Ubuntu20.04 ROS环境 各种依赖库之间的排列组合。我在给实验室同门配机器的时候前前后后折腾了三天把编译错误挨个踩了一遍最后完整跑通了EuRoC数据集才敢说“Ubuntu20.04下配置PL-VINS项目源码”这件事其实是有标准答案的只是没人把它一次讲透。这篇博文就是来填这个坑的。不管你是刚入门视觉SLAM的研究生还是之前一直跑VINS-Mono、想看看点线特征联合优化效果的老手只要手头有一台装了Ubuntu20.04的机器这篇内容都能帮你把PL-VINS源码完整配置起来顺便绕开我踩过的那些坑。1. 先搞清楚PL-VINS在配什么项目本身与环境的关系1.1 从VINS-Mono到PL-VINS点线特征联合优化到底多了什么PL-VINS是2021年开源的一套基于点线特征的单目视觉惯性里程计算法可以理解为VINS-Mono的增强版。传统的VINS-Mono只用点特征做视觉重投影约束而PL-VINS在点特征的基础上引入了线段特征用LSD算法提取直线段用LBD描述子做匹配再把线特征的重投影误差加进滑动窗口优化里。这样做的直接好处是在低纹理、墙面、走廊这类场景里点特征经常不够用而线条反而稳定存在系统就不容易跟丢。从实现层面看PL-VINS保留了VINS-Mono的前端光流跟踪、IMU预积分、滑动窗口、回环检测这些模块改动主要集中在特征的表达和约束的构建上。线特征用的是Plücker坐标来表示空间直线优化时又转成正交表示以避免过参数化。这部分知识在你编译运行之后如果想深挖代码会非常有用但在配置阶段你只需要知道一件事PL-VINS对OpenCV、Eigen、Ceres这些数学和图像库的版本比VINS-Mono更敏感配置阶段的不稳定大多来自这里。1.2 为什么Ubuntu20.04会成为配置过程中的主要变量很多人忽视了一个事实PL-VINS的README默认是Ubuntu18.04 ROS Melodic写的到了Ubuntu20.04上ROS版本变成了NoeticOpenCV默认从3.x升到了4.xCeres的版本策略也不一样了。这些“环境变量”直接导致同一个源码在不同系统上出现完全不同的编译表现。我在配置过程中发现Ubuntu20.04本身不是问题问题在于ROS Noetic默认的cv_bridge依赖的是系统自带OpenCV 4.2而PL-VINS源码里的CMake可能会去找系统其它位置的OpenCV两者一旦不一致cv_bridge就报出一堆莫名其妙的链接错误。所以这篇文章虽然标题是配PL-VINS实际操作中大概一半的时间在处理环境依赖。你把依赖之间的关系理顺了PL-VINS的编译其实是一条命令的事。2. 环境准备Ubuntu20.04 ROS Noetic 依赖库2.1 系统初始化应该装哪些基础工具如果你用的是双系统或者实体机硬件上建议内存不低于8G否则后面编译多线程跑起来会比较吃力。虚拟机也不是不行实测在VMware里编译有些慢而且后续跑数据集时实时性会受影响能物理机就物理机吧。装好Ubuntu20.04之后第一步先把系统更新到最新然后安装编译需要的基础工具。这一步是最容易被人跳过、但恰恰是后面很多怪问题的根源。sudo apt update sudo apt upgrade -y sudo apt install -y build-essential cmake git wget unzip有两点值得说明build-essential提供gcc/g和make是编译一切的基石Git用来拉取PL-VINS源码。另外建议顺手装一下kdevelop或者配置好VS Code的Remote-SSH因为后面排查CMake错误时有个顺手看代码的环境效率会高非常多。建议先别装Anaconda或者设置conda环境变量这是我的经验——OpenCV相关的编译冲突十次里有八次和conda里的OpenCV有关。2.2 ROS Noetic的安装与初始化Ubuntu20.04对应的ROS正式版本只有Noetic这也是ROS1最后一个长期支持版本。安装过程网上教程很多我在这里把关键步骤和配置时容易踩坑的地方写清楚。sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt install -y curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update sudo apt install -y ros-noetic-desktop-full如果你在下载时非常慢把packages.ros.org那一段替换成国内镜像站地址就行具体镜像配置网上搜“ROS Noetic国内源”就能找到对应方法替换后执行相同流程。desktop-full版本自带rviz、cv_bridge、tf等PL-VINS运行所需的大部分ROS包所以再单独装的ROS包就不多了。安装完初始化echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc sudo apt install -y python3-rosdep python3-catkin-tools sudo rosdep init rosdep updaterosdep这块经常因为网络问题失败。如果你发现rosdep update一直超时可以直接跳过PL-VINS的依赖并没那么多后面手动用apt补齐完全可行。不要因为rosdep卡住就放弃这是配置过程的第一个劝退点完全可以直接绕过去。2.3 编译PL-VINS的依赖库清单与版本选择PL-VINS运行需要的核心依赖是OpenCV、Eigen3和Ceres Solver。其中Eigen3用apt装就行了OpenCV我们要特别小心因为ROS自带了一套如果你又编译一套很容易打架。依赖库建议版本安装方式说明OpenCV4.2跟随系统无需单独安装由ros-noetic-desktop-full间接安装路径在/usr/lib/x86_64-linux-gnuEigen33.3.7及以上apt安装PL-VINS对Eigen要求不高默认版本即可Ceres Solver1.14或2.xapt或源码编译推荐直接用apt装省事SuiteSparse系统自带apt安装Ceres的依赖之一PCL1.10apt安装部分点云可视化节点需要sudo apt install -y libeigen3-dev libboost-all-dev libceres-dev libsuitesparse-dev sudo apt install -y ros-noetic-cv-bridge ros-noetic-image-transport ros-noetic-tf ros-noetic-message-filters ros-noetic-pcl-ros ros-noetic-rviz这里有个值得说清楚的选择为什么不自己编译OpenCV因为ROS Noetic的cv_bridge只和系统自带的OpenCV 4.2绑定一旦你单独编译了不同版本的OpenCVcv_bridge在编译PL-VINS时就会报版本冲突。我之前没意识到这点硬是编译了OpenCV 4.5结果浪费了整整一下午。后来把自编译的OpenCV卸载、恢复系统默认版本问题立刻消失了。配置PL-VINS请尽量保持系统自带的OpenCV环境干净不要再额外装别的OpenCV。Ceres方面Ubuntu20.04的apt源里是1.14实测PL-VINS编译和运行都没问题。如果你之后想跑较新的VINS系列代码可能需要升级到2.x那就得源码编译在这里用apt完全够用。3. PL-VINS源码编译与运行完整实操记录3.1 源码获取与工作空间布局PL-VINS的项目源码在GitHub上可以找到搜索“PL-VINS”就能看到官方仓库。建一个catkin工作空间把源码clone进去mkdir -p ~/plvins_ws/src cd ~/plvins_ws/src git clone https://github.com/.../pl-vins.git源码目录里会包含plvins_estimator核心估计器、plvins_utils工具、config配置文件、launch启动文件等子目录。建议clone完之后先花十分钟把配置文件里的话题名和数据路径看一遍后面运行阶段会省下很多找茬的时间。工作空间建好后别忘了编译前先初始化ROS工作空间cd ~/plvins_ws catkin_make第一次执行catkin_make会在src目录下生成CMakeLists.txt软链接同时创建devel和build目录。如果没有提前source过ROS环境这一步会直接提示找不到catkin命令确保前面第2.2节已经source过setup.bash。3.2 catkin_make编译全过程PL-VINS的编译用标准catkin流程即可我在实际配置时直接执行了cd ~/plvins_ws catkin_make -j4这里特意用-j4而不是默认的-j8或者更高是因为PL-VINS里线特征提取的第三方库比较吃内存并行编译任务太多的话在8G内存的机器上很容易出现“Killed”或者g进程直接被系统杀掉的情况。如果你机器内存大可以加到-j8但保守一点没坏处。编译过程第一次会花不少时间尤其是plvins_estimator这个包编译时需要等Ceres和OpenCV的头文件全部展开。看到大概类似这样的输出就说明一切正常[ 50%] Building CXX object plvins_estimator/CMakeFiles/plvins_estimator.dir/src/estimator.cpp.o编译结束后如果最后几行出现[100%] Built target plvins_estimator并且没有任何Error字样说明PL-VINS源码本身已经成功编过了。这时候记得echo source ~/plvins_ws/devel/setup.bash ~/.bashrc source ~/.bashrc一个小提醒PL-VINS仓库里如果带有独立的第三方库目录比如line_descriptor之类的它们会被自动加入编译不需要你手动作任何配置。这是我当时翻CMakeLists才确认的新手不要多此一举去单独编译它们。3.3 数据集回放与可视化验证编译通过只是第一步真正验证配置成功是把官方数据集跑起来。PL-VINS官方推荐的数据集是EuRoC MAV DatasetMH01等序列去官网下载对应的rosbag文件即可。数据集下载后解压然后修改config目录下的yaml配置文件把bag_path这一项改为你本机rosbag的实际路径。这个配置项是PL-VINS自己定义的数据集加载方式注意不要和topic的配置弄混了。启动PL-VINS有两种方式我用的是仓库launch目录里的脚本方式roslaunch plvins_estimator plvins_estimator.launch然后在另一个终端执行数据集回放脚本bash plvins_estimator/launch/play_euroc.bash如果你的launch目录里没有现成的回放脚本手动也可以rostopic echo -n 1 /imu/data或者直接用rqt检查话题发布频率是否正常确保IMU和图像数据都在发再往下走。启动后rviz窗口里应该能看到相机的轨迹曲线和当前位姿画面上方叠加显示点特征和线特征的提取结果。我实测下来MH01序列在i5-9400F 16G内存的机器上能稳定跑到接近实时线特征在走廊、白墙这些场景里明显比点特征更能撑住前端。这个现象也验证了PL-VINS论文里说的核心观点点线互补能提升弱纹理环境的鲁棒性。4. 实测中常见的编译问题与排查速查4.1 问题速查表把我在配置过程中遇到的、以及在贴吧群里看到的问题整理成下面的速查表。遇到编译报错先别慌对着表格找找对应关系大多数问题都有明确解法。报错现象可能原因解决办法fatal error: cv_bridge/cv_bridge.h: No such file or directorycv_bridge未安装或环境路径冲突确认sudo apt install ros-noetic-cv-bridge检查source /opt/ros/noetic/setup.bashundefined reference tocv::xxxOpenCV版本冲突自编译OpenCV存在卸载自编译OpenCV恢复系统默认4.2Could not find a package configuration file provided by CeresCeres未安装sudo apt install libceres-deverror: ‘sqrt’ is not a member of ‘std’编译器版本过新或缺少头文件在报错文件里加#include cmath或降低g版本g: fatal error: Killed signal terminated program cc1plus内存不足并行编译太猛使用catkin_make -j2或增加swap空间CMake Error: The following variables are used in this project, but set to NOTFOUND依赖库路径不对检查对应的libxxx-dev包是否安装完整4.2 三个典型报错的完整处理过程第一个是cv_bridge的OpenCV冲突。这个错误基本长这样/usr/include/opencv4/opencv2/core/... no matching function for call to cv::Mat::Mat(...)我当时的排查思路是先用pkg-config --modversion opencv4确认系统OpenCV版本再检查echo $LD_LIBRARY_PATH里有没有指向自己编译OpenCV的库路径。最后发现是~/.bashrc里残留的export LD_LIBRARY_PATH/usr/local/lib把系统OpenCV库和自编译OpenCV库混在一起了。把LD_LIBRARY_PATH里可疑路径清理掉重新开终端再编译问题就解决了。这个坑非常隐蔽因为你看CMake的输出可能一切正常但链接阶段就崩了。第二个是Ceres版本太旧导致的“Too few arguments”类型错误。这个是在Ubuntu18.04遗留下来的老配置习惯导致的——很多人习惯装1.13或更低版本但PL-VINS里用到了较新的Ceres接口直接编译会报Ceres函数参数数量不匹配。解决办法很简单优先用apt源里的libceres-dev如果你是源码编译的Ceres 1.13建议升级到1.14以上。确认Ceres版本可以用下面这条命令pkg-config --modversion ceres-solver第三个是Eigen的对齐问题。报错信息里有EIGEN_MAKE_ALIGNED_OPERATOR_NEW或者static assertion failed字样。原因是Eigen在涉及SSE向量化时要求对齐在C17之前需要手动在结构体里声明宏。PL-VINS源码里有的数据结构的声明是直接写在头文件里的如果你用的编译器默认开启了C17某些eigen版本会报对齐断言。解决方案有两种在编译命令里加-DEIGEN_MAX_ALIGN_BYTES16或者在CMakeLists.txt里让编译器默认使用C14标准。我实测下来C14最稳妥。4.3 编译完成后的小建议虽然PL-VINS已经能正常编译运行了但配置完成不等于万事大吉。我建议你接下来做三件事第一把config目录里的yaml配置文件挨个看一遍尤其是相机内参、IMU噪声参数和话题名这些参数会影响你换自己数据集时的效果第二备份一下你当前的sources.list和~/.bashrc以后万一系统环境变了还能恢复第三如果只是跑通了官方数据就满足了那没问题但如果要对算法做二次开发一定要先看明白estimator.cpp里的processImage()函数和线特征处理部分的addFeatureCheckParallax()调用链这是PL-VINS相比VINS-Mono改动最大的地方也是这个项目的精髓所在。5. 给还在折腾环境的朋友几句大实话折腾这套环境的过程我最大的感受是90%的报错和代码本身无关全是环境依赖打架。如果你改这个装那个改来改去最后把系统搞乱了最简单粗暴的办法就是直接重装一个新的Ubuntu20.04从第2节开始重新走一遍。我后来给另外一个同学配置的时候从零开始走完这套流程因为是干净系统依赖关系清晰全程只花了不到两个小时就跑到rviz出图了。最后再分享一个小技巧如果你后续需要频繁地在不同Ubuntu机器之间迁移这套环境建议用docker把编译好的镜像保存一份或者至少把~/plvins_ws目录整体打包备份。毕竟源码重新clone很容易但那个版本的OpenCV、Ceres、Eigen组合效果怎么样只有你的机器知道。配置环境是个熟练工踩过一次坑下次就快多了。本文还有配套的精品资源点击获取