ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu 20.04部署FAST-LIO2与Livox MID-360:从环境配置到SLAM实战

Ubuntu 20.04部署FAST-LIO2与Livox MID-360:从环境配置到SLAM实战 1. 项目缘起当Livox MID-360遇上FAST-LIO最近在折腾一个移动机器人项目核心需求是构建一个实时、高精度的三维环境地图。手头正好有一台Livox MID-360激光雷达这玩意儿号称非重复扫描视场角大点云密度高非常适合SLAM。软件栈方面FAST-LIOFast LiDAR-Inertial Odometry是近年来在学术界和工业界都备受推崇的激光惯性里程计方案它以计算效率高、鲁棒性强著称。于是一个很自然的想法就冒出来了在Ubuntu 20.04这个经典的机器人开发平台上把MID-360和FAST-LIO搭起来跑通看看实际效果到底如何。这个组合听起来很美但实操过程远不是git clone加catkin_make那么简单。Livox的驱动、ROS的版本、FAST-LIO的依赖、IMU和LiDAR的外参标定每一步都可能藏着坑。网上能找到的教程要么过于零散要么版本对不上经常是照着做了一半发现编译报错或者数据跑不起来。我花了差不多一周时间从环境配置、源码编译、参数调试到最终实机测试把整个流程完整地走了一遍也踩了不少坑。这篇文章就是这次实战的完整记录我会详细拆解每一个步骤背后的原理和操作细节目标就是让你能避开我遇到的那些问题一次性成功地在Ubuntu 20.04上用Livox MID-360跑通FAST-LIO。2. 环境基石Ubuntu 20.04与ROS Noetic的精准配置一切的基础是操作系统和机器人中间件。选择Ubuntu 20.04 LTS是因为其长期支持特性和在机器人领域的广泛兼容性。ROS方面对应的官方版本是ROS Noetic Ninjemys。这一步的配置必须精确任何偏差都会导致后续依赖库版本冲突。2.1 系统准备与ROS Noetic安装首先确保你的系统是最新状态。打开终端执行以下命令更新软件源和已安装的包sudo apt update sudo apt upgrade -y接下来安装ROS Noetic。这里我推荐使用中科大的镜像源速度会快很多。sudo sh -c . /etc/lsb-release echo deb http://mirrors.ustc.edu.cn/ros/ubuntu/ lsb_release -cs main /etc/apt/sources.list.d/ros-latest.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update然后安装ROS Noetic完整桌面版这包含了ROS、rqt、rviz等常用工具和库。sudo apt install ros-noetic-desktop-full -y安装完成后必须初始化rosdep这是ROS用来安装系统依赖的工具。sudo rosdep init rosdep update最后将ROS环境变量添加到bashrc中这样每次打开终端都能自动载入ROS环境。echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc为了后续编译我们自己的ROS包还需要安装构建工具。sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool build-essential -y2.2 创建工作空间与必要依赖ROS开发通常在一个独立的工作空间中进行。我们创建一个名为catkin_ws的工作空间。mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make source devel/setup.bash echo source ~/catkin_ws/devel/setup.bash ~/.bashrc注意catkin_make命令可能会提示你安装一些缺失的依赖按照提示安装即可。将source命令加入.bashrc至关重要否则在新的终端窗口中无法找到我们后续编译的ROS包。FAST-LIO和Livox驱动需要一些额外的系统依赖。其中最关键的是PCL点云库和Eigen线性代数库它们通常已随ROS桌面版安装。但我们还需要确保开发版本的存在。sudo apt install libpcl-dev libeigen3-dev -y另一个重要的依赖是livox_ros_driver本身所依赖的livox_sdk。虽然驱动包会处理但提前安装其编译依赖能避免一些问题。sudo apt install cmake libssl-dev libusb-1.0-0-dev -y3. 驱动桥梁Livox MID-360的ROS驱动部署与配置Livox MID-360虽然性能强悍但它使用的是Livox私有的通信协议不能像Velodyne或Ouster雷达那样直接输出标准的ROS点云消息。因此我们必须先部署官方的livox_ros_driver它充当了硬件和ROS生态系统之间的翻译官。3.1 下载与编译Livox ROS驱动进入我们工作空间的src目录克隆Livox官方的ROS驱动仓库。请注意要使用对MID-360支持的版本。cd ~/catkin_ws/src git clone https://github.com/Livox-SDK/livox_ros_driver.git克隆完成后返回工作空间根目录进行编译。这里有一个关键点Livox驱动需要先编译其内部的livox_sdk子模块然后再编译ROS包装层。官方的CMakeLists.txt应该已经处理好了这个顺序。cd ~/catkin_ws catkin_make编译过程可能会持续几分钟。如果一切顺利你会在最后看到类似[100%] Built target livox_ros_driver_node的输出这表示驱动编译成功。3.2 连接设备与配置启动文件用USB-C数据线将Livox MID-360连接到电脑。通过lsusb命令可以检查设备是否被识别。你应该能看到一个包含“Livox”字样的设备条目。lsusb接下来需要配置驱动的启动文件。驱动包提供了示例配置文件我们复制一份并进行修改。cd ~/catkin_ws/src/livox_ros_driver cp livox_ros_driver/config/MID360_config.json livox_ros_driver/config/MID360_config_my.json用文本编辑器如nano或gedit打开这个新配置文件。关键参数需要根据你的实际网络环境和需求调整lidar_configs: 这是一个数组每个元素对应一台雷达。对于MID-360ip地址需要设置为雷达的实际IP。通常将电脑有线网卡配置为192.168.1.5子网掩码255.255.255.0雷达的默认IP是192.168.1.1xx最后一段在100-199之间。你可以在Livox的配套软件Livox Viewer中查看和修改雷达IP。publish_freq: 点云发布频率。单位是Hz。MID-360支持10Hz, 20Hz等。设置越高数据量越大对系统负载也越高。初次测试可以从10Hz开始。multi_topic: 如果有多台雷达设置为1可以为每台雷达发布独立的话题topic。单台雷达设为0即可。data_src和cmd_data_ip: 处理数据接收和命令发送的IP地址通常设置为电脑的IP如192.168.1.5。一个简化后的配置文件核心部分示例如下{ lidar_configs: [ { ip: 192.168.1.120, publish_freq: 10.0, port: 56000, imu_rate: 200, pattern_mode: 0, extrinsic_parameter_source: 0, multi_topic: 0 } ], hub_configs: [], data_src: [ { cmd_data_ip: 192.168.1.5, push_msg_ip: 192.168.1.5, point_data_port: 57000, imu_data_port: 58000, log_data_port: 59000 } ] }保存配置文件后我们可以启动驱动节点进行测试。首先确保ROS核心已经运行在一个新终端执行roscore然后在另一个终端执行source ~/catkin_ws/devel/setup.bash roslaunch livox_ros_driver livox_lidar.launch config_path:/home/你的用户名/catkin_ws/src/livox_ros_driver/livox_ros_driver/config/MID360_config_my.json如果启动成功终端不会有太多输出但你可以通过rostopic list命令查看是否有新的点云话题例如/livox/lidar和IMU话题例如/livox/imu出现。用rostopic echo /livox/imu可以查看IMU数据流这能最快速地验证雷达数据是否已经成功接入ROS。4. 算法核心FAST-LIO2的编译与适配FAST-LIO目前有两个主要版本FAST-LIO和FAST-LIO2。FAST-LIO2采用了新的数据结构IKD-Tree和迭代状态更新策略在保持高精度的同时计算效率有显著提升对大场景和高速运动更友好。因此我们选择部署FAST-LIO2。4.1 获取源码与解决依赖FAST-LIO2的源码托管在GitHub上。我们将其克隆到工作空间的src目录。cd ~/catkin_ws/src git clone https://github.com/hku-mars/FAST_LIO.git进入FAST-LIO目录你会发现它其实包含了FAST-LIO和FAST-LIO2。我们主要关注FAST-LIO2。编译前需要安装一些特定依赖。livox_ros_driver: 我们已经安装。PCLEigen: 系统级依赖之前已安装。numpy: Python数学库通常已预装。devel分支的livox_ros_driver: 有时主分支的驱动可能与FAST-LIO2有兼容性问题如果遇到编译错误可以尝试切换到驱动的devel分支重新编译。cd ~/catkin_ws/src/livox_ros_driver git checkout devel cd ~/catkin_ws catkin_make4.2 编译与可能遇到的坑依赖准备好后就可以编译FAST-LIO2了。cd ~/catkin_ws catkin_make这个过程可能会遇到以下几个典型问题Eigen版本冲突: FAST-LIO2对Eigen版本有要求通常需要3.3.7。Ubuntu 20.04默认仓库的Eigen3版本是3.3.7一般没问题。如果报错可能需要手动升级。可以通过apt show libeigen3-dev查看版本。PCL版本问题: 类似地确保PCL版本在1.10以上。Ubuntu 20.04的libpcl-dev通常是1.10版本。CUDA相关错误: FAST-LIO2支持CUDA加速但非必需。如果你没有NVIDIA显卡或未安装CUDA在CMakeLists.txt中可能会报错。解决方法是修改FAST-LIO2的CMakeLists.txt将find_package(CUDA)相关行注释掉并设置BUILD_WITH_CUDA为OFF。具体位置在FAST_LIO/CMakeLists.txt中。Livox消息类型未找到: 编译时提示找不到livox_ros_driver自定义的消息类型如CustomMsg。这通常是因为工作空间没有正确source或者驱动编译失败。确保在编译前执行了source ~/catkin_ws/devel/setup.bash并且驱动编译没有错误。如果编译最终成功你会看到[100%] Built target fast_lio_node之类的输出。至此算法部分就准备好了。5. 联调实战运行FAST-LIO2并可视化结果环境、驱动、算法都就位后就到了最激动人心的环节让它们联动起来看着地图一点点被构建出来。5.1 启动完整数据流我们需要同时启动三个节点ROS核心、Livox驱动、FAST-LIO2算法节点。最方便的方法是使用launch文件。FAST-LIO2包内已经为Livox雷达提供了示例launch文件。以MID-360为例我们可以直接使用或稍作修改。首先查看并准备launch文件cd ~/catkin_ws/src/FAST_LIO/FAST_LIO/launch ls你会看到mapping_mid360.launch或类似文件。我们可以直接使用它。这个文件已经预设了MID-360的话题名和基本参数。打开三个终端窗口分别执行以下命令终端1启动ROS核心roscore终端2启动Livox驱动source ~/catkin_ws/devel/setup.bash roslaunch livox_ros_driver livox_lidar.launch config_path:/home/你的用户名/catkin_ws/src/livox_ros_driver/livox_ros_driver/config/MID360_config_my.json终端3启动FAST-LIO2source ~/catkin_ws/devel/setup.bash roslaunch fast_lio mapping_mid360.launch如果一切正常第三个终端会开始滚动输出FAST-LIO2的日志信息包括初始化状态、接收到的点云和IMU频率、以及估计的位姿和地图点数。5.2 使用RVIZ进行可视化FAST-LIO2会实时发布几个重要的话题供可视化/cloud_registered: 经过运动畸变校正后注册到当前地图帧的点云。/Odometry: 估计的机器人里程计位姿姿态和位置。/path: 估计的运动轨迹。我们可以使用ROS自带的RVIZ工具来查看这些数据。再打开一个终端source ~/catkin_ws/devel/setup.bash rviz在RVIZ中你需要进行以下配置将Fixed Frame设置为camera_init这是FAST-LIO2默认的固定坐标系。点击左下角的Add按钮添加PointCloud2显示类型。在新增的PointCloud2选项中将Topic设置为/cloud_registered。你可以调整Style为PointsSize (Pixels)为1这样点云看起来更清晰。再次点击Add添加Path显示类型将Topic设置为/path可以修改颜色以便于观察轨迹。可选添加Odometry显示类型来观察位姿箭头。现在拿起你的MID-360雷达缓慢地在房间内移动。你应该能在RVIZ中看到实时的点云地图被构建出来并且路径也随之延伸。初次运行点云可能比较稀疏或有噪点这通常与参数设置和运动速度有关。5.3 关键参数解析与初步调试FAST-LIO2的性能和效果高度依赖于参数配置。配置文件通常位于FAST_LIO/FAST_LIO/config/目录下对应不同的雷达型号。对于MID-360我们使用的是mid360.yaml。打开这个文件有几个参数对结果影响巨大lid_topic和imu_topic: 必须与Livox驱动发布的话题名称严格一致。默认通常是/livox/lidar和/livox/imu。务必用rostopic list确认。max_iteration: 迭代卡尔曼滤波IEKF的最大迭代次数。增加次数可能提高精度但会增加计算量。默认值如4或5对于大多数场景是足够的。cube_side_length: 地图局部区域的边长米。这个参数决定了算法维护的局部地图的大小。对于室内场景10-20米可能合适对于走廊等狭长环境可以适当调整长宽比虽然参数是立方体但理解其影响范围。filter_size_surf和filter_size_map: 点云下采样的体素网格大小米。filter_size_surf用于当前帧点云filter_size_map用于局部地图点云。增大这些值可以显著降低计算量提高频率但会损失细节。初次调试可以从默认值如0.5开始如果帧率太低低于10Hz可以尝试增大到0.8或1.0。extrinsic_T和extrinsic_R: 这是外参即激光雷达坐标系到IMU坐标系的变换矩阵平移和旋转。这是最容易出错的地方MID-360的IMU和激光雷达是固连的厂家会提供标定好的外参。这个参数必须尽可能准确否则会严重影响里程计精度甚至导致算法发散。你需要从Livox官方文档或SDK中查找MID-360的准确外参值并填入这个9维数组3x3旋转矩阵按行展开和3维平移向量。如果启动后发现没有点云输出或者里程计估计完全错误例如静止时位置疯狂漂移请按以下顺序排查话题检查: 用rostopic echo /livox/lidar | head -n 1和rostopic echo /livox/imu | head -n 1确认驱动确实在发布数据且频率正常。参数检查: 核对mid360.yaml中的lid_topic和imu_topic是否与驱动发布的话题完全一致包括大小写。外参检查: 反复确认extrinsic_T和extrinsic_R的值是否正确。这是导致严重漂移的首要原因。数据同步: 确保点云和IMU数据的时间戳是同步的。Livox驱动默认会处理硬件时间同步一般没问题。6. 性能优化与深度调参指南当系统能够跑起来并生成初步地图后下一步就是调优以获得更稳定、更精确、更实时的建图效果。调参是一个系统工程需要理解每个参数的意义并观察其影响。6.1 理解FAST-LIO2的核心参数群FAST-LIO2的参数可以分为几大类传感器输入相关: 如话题名、外参、测量噪声协方差meas_imu。噪声参数一般不需要改动除非你对传感器特性非常了解。滤波器相关:max_iteration迭代次数、esti_plane是否估计平面约束对于室内场景建议开启。地图管理相关:cube_side_length局部地图尺寸、filter_size_surf/map下采样分辨率、runtime_pos_log_enable是否记录运行日志。发布与可视化相关:publish_frame发布点云的坐标系、pub_odometry_without_downsample等。调参的首要原则是每次只修改一个参数并观察其带来的变化。最好能定量评估例如记录位姿估计的漂移量、CPU占用率、算法运行频率Hz等。6.2 针对MID-360的特性优化MID-360的非重复扫描模式使其在近距离能产生极高的点云密度这既是优点也是负担。高密度意味着更多的特征点有利于匹配但也意味着更大的计算量。下采样策略: 这是平衡精度和速度最有效的杠杆。对于室内精细建图filter_size_surf可以设为0.2~0.3米对于快速移动或大场景可以放宽到0.5~1.0米。filter_size_map通常可以设得比filter_size_surf稍大一些以减少局部地图的规模。局部地图尺寸:cube_side_length决定了算法“记住”多少环境信息。太小会导致回环前轨迹漂移无法纠正太大会增加KD-Tree的维护开销。对于一般室内办公环境15-25米是一个合理的起始值。你可以观察RVIZ中远处的点云是否会突然消失如果消失得太快就适当增大这个值。迭代次数:max_iteration默认值如4在大多数情况下已经能保证收敛。如果你发现某些帧匹配误差特别大可以开启调试日志查看可以尝试增加到6或8。但注意每次迭代都涉及一次最近邻搜索和状态更新会线性增加单帧处理时间。6.3 实战中的避坑经验静止初始化: 启动算法后的前几秒尽量保持雷达静止。FAST-LIO2需要这段时间来初始化重力方向、零偏等状态。如果一开始就剧烈运动很容易初始化失败导致后续全部错误。运动速度: 尽管FAST-LIO2号称支持高速运动但过快的角速度快速旋转仍可能导致点云匹配失败。平稳、匀速的运动能获得最好的效果。环境特征: 在特征极度匮乏的环境如长直走廊、空旷大厅里程计容易发生漂移。如果可能尽量让雷达扫描到一些角点、平面边缘等结构性特征。内存与CPU监控: 使用htop或top命令监控系统资源。如果CPU长期满载或内存占用持续增长可能是局部地图没有正确删除旧点或者下采样参数设置不当。长期运行后地图点数量应趋于稳定。数据录制与回放: 为了便于调试强烈建议在第一次成功运行后使用rosbag record命令录制一段数据包含点云和IMU话题。这样你可以反复回放rosbag play同一段数据来测试不同的参数结果具有可比性。cd ~/bagfiles rosbag record -O mid360_test.bag /livox/lidar /livox/imu7. 进阶应用从里程计到完整SLAM与地图保存FAST-LIO2本身是一个激光惯性里程计LIO它提供了高频率、低漂移的局部位姿估计。但要构建一个全局一致的大尺度地图通常需要与回环检测Loop Closure和后端优化结合形成完整的SLAM系统。7.1 与LIO-SAM等框架的集成思路一个常见的方案是将FAST-LIO2作为LIO-SAM的前端。LIO-SAM是一个紧耦合的激光惯性SLAM框架它包含了基于ScanContext的回环检测和位姿图优化。你可以将FAST-LIO2输出的高频里程计/Odometry和点云/cloud_registered作为LIO-SAM的输入。LIO-SAM会在此基础上进行关键帧提取、回环检测和全局优化输出一个全局一致的地图。集成步骤大致如下安装并编译LIO-SAM它同样依赖ROS和PCL等。修改LIO-SAM的配置文件将其pointCloudTopic和imuTopic指向FAST-LIO2输出的话题例如/cloud_registered和/livox/imu并将useImuHeadingInitialization等参数设置为false因为位姿初始化已由FAST-LIO2完成。同时启动FAST-LIO2和LIO-SAM节点。FAST-LIO2提供局部里程计LIO-SAM进行全局优化。这种组合能兼顾FAST-LIO2的前端效率和LIO-SAM的全局一致性是构建大范围地图的强力方案。7.2 地图的保存与后期处理FAST-LIO2实时构建的点云地图存在于内存中。当建图任务完成后我们需要将其保存到硬盘。FAST-LIO2提供了保存地图的功能可以通过发布ROS服务请求来触发。首先确保FAST-LIO2正在运行。然后在一个新的终端中使用rosservice call命令调用保存地图的服务rosservice call /save_map “path: ‘/home/你的用户名/map.pcd’ resolution: 0.0”这里的path是保存文件的路径和名称推荐使用.pcd格式点云数据格式。resolution参数如果设为0.0则保存所有点如果设为大于0的值如0.05则会对保存的地图进行指定体素大小的下采样。保存下来的.pcd文件可以用PCL库提供的工具pcl_viewer查看或者用CloudCompare、MeshLab等更强大的点云处理软件进行后期编辑、滤波、配准等操作。7.3 性能评估与真值对比如果可能要定量评估FAST-LIO2MID-360的性能最好有真值轨迹Ground Truth进行对比。在室内可以使用动作捕捉系统如Vicon、OptiTrack在室外可以使用高精度GNSS/INS组合导航系统。将估计的轨迹FAST-LIO2发布的/Odometry话题和真值轨迹录制到同一个rosbag中。然后使用轨迹评估工具如evohttps://github.com/MichaelGrupp/evo来计算绝对位姿误差APE和相对位姿误差RPE。这些指标能客观地反映里程计的精度和漂移情况。安装evopip install evo --upgrade --no-binary evo使用evo进行评估的基本命令# 将bag文件中的轨迹转为tum格式 evo_bag bag 你的bag文件.bag /Odometry /ground_truth --tum # 计算APE并绘制轨迹 evo_ape tum ground_truth.txt Odometry.txt -va --plot通过分析误差曲线和统计数据你可以更科学地调整参数验证系统在特定场景下的实际性能。
返回列表