ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

室内无人机定位实战:Livox Mid-360与FAST-LIO指南

2026/9/6 12:20:38 拓冰建站 浏览量
室内无人机定位实战:Livox Mid-360与FAST-LIO指南 1. 为什么室内无人机定位这么难先想一个问题一架无人机在室外飞行GPS 信号正常飞控可以通过卫星定位知道自己在哪姿态、高度、水平位置都能稳定获取。但是把这架无人机搬进室内情况就完全不一样了。GPS 信号在室内基本是不可用的卫星信号被楼板、墙面遮挡之后定位精度急剧下降甚至完全丢失。这时候无人机的飞控就像失去了“方向感”位置环没有反馈仅靠 IMU 积分很快就会出现明显的漂移。这也是很多刚接触无人机开发的同学在室内试飞时发现无人机无法稳定悬停、越飞越偏的根本原因。室内定位本质上是一个“在没有 GPS 的环境中如何让无人机知道自己在哪”的问题。目前常见的方案有几类视觉定位依靠摄像头识别特征点配合 VIO视觉惯性里程计估计位姿对光照要求较高昏暗或纹理贫乏的环境容易失效。UWB 定位通过布置多个基站测量无人机与基站之间的距离来实现定位需要提前部署基站属于基础设施依赖型方案。激光雷达定位通过激光雷达扫描周围环境与已知地图进行匹配或直接利用雷达惯性里程计进行实时位姿估计不依赖外部基站对光照不敏感。其中激光雷达方案在室内环境下的稳定性和精度表现都比较突出。而在激光雷达中Livox Mid-360 又是非常适合室内无人机平台的一款传感器。本文将围绕“Livox Mid-360 室内无人机定位测试”展开从硬件特性、环境搭建、ROS 2 驱动安装、FAST-LIO 算法配置到实际测试流程一步步带大家跑通室内定位链路。内容偏向实战建议边看边操作。2. Livox Mid-360 核心特性解读在开始搭建环境之前有必要先对 Livox Mid-360 有一个整体认识。它和大疆常见的机械式激光雷达不同属于 Livox 系列中的固态激光雷达采用非重复扫描方式视场角和点云形态都很有特点。2.1 Livox Mid-360 是什么Livox Mid-360 是 Livox 推出的一款 360° 非重复扫描固态激光雷达。它的核心参数大致如下视场角水平 360°垂直 -7° 到 52°整体覆盖范围比传统单线或小视场角雷达要大很多。量程40 米左右具体取决于反射率这里指典型量程。点云频率支持 100000 点/秒、200000 点/秒等档位可以在驱动中配置。重量约 265g体积小巧非常适合挂在无人机、机器狗等移动平台上。IMU内置 6 轴 IMU加速度计 陀螺仪数据通过同一接口输出这对 SLAM 算法来说非常方便。非重复扫描是 Livox 系列的一个重要特点。它不像机械雷达那样固定角度均匀旋转扫描而是通过扫描轨迹的不断变化在积分时间内让视场覆盖越来越密。简单说扫描时间越长点云覆盖越完整这也让它在纯旋转或平移场景下能保留更多环境特征。2.2 为什么适合室内无人机室内无人机对传感器有几个硬性要求重量轻、体积小无人机载重有限传感器太重会显著缩短续航甚至导致动力不足。精度足够室内环境空间狭小定位误差稍大就可能撞墙。抗光照干扰室内灯光复杂纯视觉方案容易受影响。能感知近距离物体无人机在室内飞行时周围障碍物通常很近雷达盲区越小越好。Mid-360 的体积和重量优势明显内置 IMU 也可以减少外置 IMU 的接线和标定工作。它 360° 水平视场可以让无人机在飞行过程中获得周围环境的完整点云对避障和定位都有帮助。不过也要提醒Livox 系列雷达使用非重复扫描同一时刻的点云分布并不均匀这点在使用时需要注意。比如在快速旋转或者剧烈运动时点云会产生一定的运动畸变。传统做法是通过 IMU 数据进行运动补偿或者使用 FAST-LIO 这类紧耦合算法在状态估计过程中直接处理这类问题。3. 室内定位方案对比与选型思路为了更清楚地知道 Mid-360 室内定位适合什么场景我们用一张表来对比几种常见方案。方案精度部署成本抗光照室内适用性典型设备GPS/RTK厘米级RTK需要基站或网络差分与光照无关差卫星信号弱常见 RTK 模块视觉定位厘米到分米级低依赖光照和纹理中等双目相机、深度相机UWB 定位厘米到分米级中等需布置基站与光照无关好需提前部署UWB 标签 基站激光雷达 IMU SLAM厘米到分米级中高与光照无关很好无需外部设施Livox Mid-360 IMU从表格可以看到激光雷达 SLAM 方案在室内场景下最大的优势是不依赖外部基础设施。打开雷达启动算法无人机就可以在陌生环境里实时估计自己的位姿。也正是因为这一点Mid-360 搭配 FAST-LIO 或 LIO-SAM 这类算法成了很多室内无人机研究项目的首选配置。另外提一句网络上经常有人搜“贝叶斯定位和粒子群定位区别”这里简单做个延伸。贝叶斯定位是一种概率框架通过状态转移和观测模型递推机器人位姿的后验概率分布粒子滤波是贝叶斯滤波的一种实现方式通过一组带权重的粒子来近似后验分布。在激光 SLAM 中粒子滤波常用于 2D 激光定位如 AMCL而 FAST-LIO 这类基于优化或滤波的 LiDAR-IMU 紧耦合算法则走的是误差状态卡尔曼滤波路线。两者解决的问题类似但实现思路不同。4. 环境准备与版本说明下面进入实战环节。本文测试环境以 Ubuntu 22.04 ROS 2 Humble 为例。之所以选择这个组合是因为当前 ROS 2 Humble 是 22.04 上比较主流的版本社区活跃度高文档也相对完整。如果你使用的是其他版本比如 Ubuntu 20.04 ROS 2 Foxy 或 Ubuntu 20.04 ROS 1 Noetic整体思路一致但部分依赖名称和编译方式会有差异。重点版本说明如下组件推荐版本说明操作系统Ubuntu 22.04 LTS本文示例环境ROS 2Humble Hawksbill与 22.04 对应Livox SDKLivox SDK 2.x适配 ROS 2 驱动livox_ros_driver2最新 release官方 ROS 2 驱动FAST-LIO支持 ROS 2 的分支或自行适配原版为 ROS 1需注意版本点云处理工具pcl_ros / pcl_conversions通过 apt 安装如果你的环境是 Ubuntu 22.04 且尚未安装 ROS 2 Humble可以按下面步骤先完成基础安装。注意以下命令来自 ROS 官方安装文档版本信息务必以官方文档为准。# 1. 设置编码 sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-8 # 2. 添加 ROS 2 软件源 sudo apt install software-properties-common curl sudo add-apt-repository universe sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null # 3. 安装 ROS 2 Humble sudo apt update sudo apt install ros-humble-desktop python3-argcomplete # 4. 配置环境变量 echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc这里有一个非常常见的坑在执行sudo apt install ros-humble-desktop时如果提示“无法定位软件包 ros-humble-desktop”通常说明 ROS 2 的软件源没有正确添加或者系统未执行apt update。可以按照下面顺序排查# 检查软件源文件是否存在 ls -l /etc/apt/sources.list.d/ros2.list # 查看系统版本代号 lsb_release -a # 更新后再安装 sudo apt update sudo apt install ros-humble-desktop如果仍然无法定位检查 Ubuntu 版本是否为 22.04。因为 ROS 2 Humble 只对应 22.04Jammy如果你用的是 20.04Focal应该安装 ROS 2 Foxy 或升级系统。5. 安装 Livox ROS 2 驱动Mid-360 的 ROS 2 驱动是livox_ros_driver2它依赖 Livox SDK 2.x。为了方便管理建议把 SDK 和驱动放在同一个工作空间下编译或者先编译安装 SDK再编译驱动。5.1 创建工作空间mkdir -p ~/livox_ws/src cd ~/livox_ws/src后续所有驱动和算法代码都可以放在这个工作空间内。5.2 编译安装 Livox SDK 2Livox SDK 2 是 Livox 官方提供的软件开发包用于与雷达通信、配置和获取点云数据。这里采用源码编译方式因为 ROS 2 驱动依赖它。cd ~/livox_ws/src git clone https://github.com/Livox-SDK/Livox-SDK2.git cd Livox-SDK2 mkdir build cd build cmake .. make -j$(nproc) sudo make install编译完成后SDK 会安装到系统目录中后续驱动的 CMake 会自动寻找相关库。5.3 编译 livox_ros_driver2cd ~/livox_ws/src git clone https://github.com/Livox-SDK/livox_ros_driver2.git cd ~/livox_ws source /opt/ros/humble/setup.bash colcon build --symlink-install编译过程中需要注意几个问题首次编译可能缺少依赖常见的包括ros-humble-pcl-ros、ros-humble-pcl-conversions、ros-humble-nav-msgs、ros-humble-rclcpp。可以用下面命令补齐sudo apt install ros-humble-pcl-ros ros-humble-pcl-conversions ros-humble-nav-msgs ros-humble-rclcppcolcon build默认会编译工作空间内所有包如果只想编译驱动可以指定包名colcon build --packages-select livox_ros_driver2编译完成后需要 source 环境source ~/livox_ws/install/setup.bash为了方便可以把它写入~/.bashrc但要注意不要与其他工作空间的环境变量冲突。echo source ~/livox_ws/install/setup.bash ~/.bashrc5.4 配置雷达参数livox_ros_driver2的配置文件一般在config目录下常见文件名为config_360.yamlMid-360 对应配置。打开文件后通常需要关注以下几项lidar_configs: - ip: 192.168.1.1 # 雷达 IP pcl_data_type: 0 # 0 表示点云类型为 LivoxPoint lidar_type: 1 # 1 对应 Mid-360 frame_id: livox_frame # 点云 frame_id extr_opt: 1 # 启用外参优化 timestamp_type: 0 # 0: 使用 PTP 同步时间, 1: 使用雷达时间 enable_flow: false实际使用时Mid-360 默认 IP 通常是192.168.1.1电脑端以太网口需要配置为同一网段比如192.168.1.50。具体 IP 以产品标签和说明书为准不同批次的默认配置可能会有差异。6. 适配 FAST-LIO从 ROS 1 到 ROS 2FAST-LIOFast LiDAR-Inertial Odometry是目前使用非常广泛的 LiDAR-IMU 紧耦合定位算法。它通过误差状态卡尔曼滤波ESKF融合激光雷达点云和 IMU 数据实时输出里程计结果精度和鲁棒性都很优秀。但这里有一个关键问题FAST-LIO 官方原版主要基于 ROS 1 开发代码中大量使用livox_ros_driverROS 1 驱动的消息类型和 ROS 1 的时间戳、TF 接口。如果直接用 ROS 2 Humble 编译会报大量错误。因此需要做一轮适配。适配思路主要有两条直接使用社区维护的 ROS 2 分支GitHub 上有多个编译通过的 FAST-LIO ROS 2 移植版本最省事。手动移植理解原版代码的消息格式和依赖逐模块替换成 ROS 2 接口。考虑到初学者可能希望理解原理这里简单介绍手动移植时需要改动的地方。6.1 FAST-LIO 代码结构FAST-LIO 源码的核心目录如下fast_lio/ ├── CMakeLists.txt ├── package.xml ├── include/ │ └── ... ├── launch/ │ └── mapping.launch # ROS 1 的 launch 文件 ├── rviz/ │ └── fast_lio.rviz ├── src/ │ ├── fast_lio_node.cpp # 主节点 │ ├── ikd-Tree/ │ ├── preprocess.cpp # 点云预处理 │ └── ... └── config/ └── mid360.yaml # Mid-360 参数配置文件原版的mapping.launch是 ROS 1 格式使用roslaunch启动。ROS 2 中需要将其转换为 Python launch 文件或 XML launch 文件。6.2 关键适配点下面列举几个最常见的改动点。1livox_ros_driver 改为 livox_ros_driver2原版代码会 include 以下头文件#include livox_ros_driver/CustomMsg.h在 ROS 2 驱动中消息类型改为#include livox_ros_driver2/custom_msg.hpp同时消息命名空间可能也不同需要根据驱动版本调整。2回调函数和话题名称原版订阅话题一般是/livox/lidar和/livox/imuROS 2 驱动发布的话题默认也是类似名称。在 launch 文件中可以重映射# mapping.launch.py 片段 def generate_launch_description(): return LaunchDescription([ Node( packagefast_lio, executablefast_lio_mapping, parameters[config_path], outputscreen, remappings[ (/livox/lidar, /livox/lidar), (/livox/imu, /livox/imu), ] ) ])3TF 和时间戳ROS 1 中使用tf::TransformBroadcasterROS 2 中应改为tf2_ros::TransformBroadcaster。时间戳方面ros::Time需要改为rclcpp::Timeros::Duration改为rclcpp::Duration。4参数服务器接口ROS 1 中读取参数使用ros::param::get或private_nh.paramROS 2 中需要通过Node::declare_parameter和Node::get_parameter实现。这里不贴完整替换代码因为每个 fork 的具体实现存在差异。如果你不想折腾建议直接找现成的 ROS 2 分支。如果你愿意挑战可以参考原版逻辑逐步替换虽然过程繁琐但对理解 ROS 2 编程模型很有帮助。6.3 mid360.yaml 参数配置FAST-LIO 的配置文件中有几个参数对 Mid-360 来说比较关键。common: lid_topic: /livox/lidar imu_topic: /livox/imu time_sync_en: false # 时间同步开关基于时间戳对齐 point_filter_num: 0 # 降采样0 表示不过滤 preprocess: lidar_type: 1 # 1 表示 Livox 系列 scan_line: 64 blind: 0.5 # 最小有效距离过滤近距离噪声 mapping: acc_cov: 0.1 gyr_cov: 0.1 b_acc_cov: 0.0001 b_gyr_cov: 0.0001 fov_degree: 360 # Mid-360 水平视场角 360° det_range: 40.0 # 最大检测距离关于time_sync_en如果雷达与 IMU 时间戳来自不同时钟源建议开启时间同步或保证 PTP 同步。Mid-360 内置 IMU 与雷达共用时钟时间同步问题相对容易处理但仍建议在代码中校验消息时间戳的单调性。7. Livox Mid-360 室内定位测试完整流程前面环境都准备好之后就可以进行实际测试了。整个流程可以拆成四步启动雷达驱动确认点云话题正常发布。启动 FAST-LIO观察里程计输出。录制 rosbag 包离线重放。检查定位结果与建图效果。7.1 启动雷达驱动确保电脑与 Mid-360 通过网线连接并配置好静态 IP。比如将电脑端 IP 设置为192.168.1.50子网掩码255.255.255.0。# 终端 1启动 ROS 2 source /opt/ros/humble/setup.bash source ~/livox_ws/install/setup.bash # 终端 2启动雷达驱动以 config_360.yaml 为例 ros2 launch livox_ros_driver2 rviz_HAP.launch.py这里使用官方提供的 RViz launch 文件可以快速查看点云。确认点云话题是否发布可以用ros2 topic list ros2 topic hz /livox/lidar正常情况下/livox/lidar的频率在 10 Hz 左右和配置有关/livox/imu频率为 200 Hz 左右。如果看不到话题先检查网络连通性ping 192.168.1.17.2 启动 FAST-LIO另开终端启动 FAST-LIOsource /opt/ros/humble/setup.bash source ~/fastlio_ws/install/setup.bash ros2 launch fast_lio mapping.launch.pyFAST-LIO 启动后终端会持续输出里程计信息同时在 RViz 中会显示实时点云地图和轨迹。这里需要特别注意启动后先把雷达保持静止几秒钟让算法完成 IMU 初始化。如果一上来就剧烈晃动雷达IMU 内参估计可能不准导致后续轨迹漂移。7.3 录制 rosbag 数据室内测试时建议先录制 rosbag再离线跑算法。这样一方面可以反复调整参数另一方面也方便结果复现。mkdir -p ~/bag_files cd ~/bag_files ros2 bag record /livox/lidar /livox/imu /tf录制时尽量让无人机或手持雷达设备沿固定路径移动不要在原地打转太多次。室内特征较少比如空旷走廊时可以多录一些不同角度的扫描数据方便后端优化。录制完成后按CtrlC结束会生成一个带时间戳的 bag 文件夹。7.4 离线重放与验证重新打开一个终端播放 bag 文件ros2 bag play ~/bag_files/xxx/此时 FAST-LIO 会订阅 bag 中的点云和 IMU 数据重建完整轨迹。播放速度可以控制在 0.5 倍或 1 倍便于观察。验证定位效果可以从几个角度判断轨迹是否平滑是否存在明显跳变。地图点云是否清晰、是否出现重影。当设备回到起点时轨迹终点与起点是否基本重合即回环误差大小。7.5 结果说明理论上在室内环境中FAST-LIO 配合 Mid-360 可以达到厘米级到分米级的定位精度。但实际效果受很多因素影响环境特征稀疏程度、运动速度、IMU 噪声、外参标定精度等。如果测试中发现轨迹发散或地图模糊不要急着怀疑硬件先按下面的排查思路逐项检查。8. 常见问题与排查思路下表整理了 Mid-360 室内定位测试中常见的几类问题。问题现象常见原因解决思路无法定位软件包 ros-humble-desktopROS 2 软件源未正确添加或未执行 apt update检查软件源文件和系统版本代号重新更新并安装雷达话题没有数据网络不通、IP 不在同一网段、驱动配置错误ping 雷达 IP检查网卡 IP核对 yaml 配置IMU 话题频率异常驱动版本与 SDK 不匹配、接线松动重编译驱动检查 USB/网口连接FAST-LIO 编译报错找不到 livox_ros_driver2include 路径或依赖声明缺失检查 CMakeLists、package.xml 中的依赖点云地图有重影外参不准确、时间戳不同步、运动过快重新标定外参开启时间同步降低运动速度启动后里程计发散IMU 初始化未完成、点云过滤过强、参数不合理静止启动等待 2~3 秒检查参数轨迹终点与起点偏差大环境特征不足、累计漂移、回环缺失增加环境特征缩短测试路径考虑加入回环检测8.1 ROS 2 软件包安装失败这个前面提过最典型的就是无法定位软件包 ros-humble-desktop。排查顺序# 1. 检查系统版本 lsb_release -a # 2. 检查软件源 cat /etc/apt/sources.list.d/ros2.list # 3. 更新索引 sudo apt update # 4. 再次尝试安装 apt-cache search ros-humble-desktop如果apt-cache search找不到说明软件源有问题或添加源的架构不对。例如在 x86_64 系统上添加了 arm64 源也会导致无法定位。8.2 FAST-LIO 编译常见问题原版 FAST-LIO 在 ROS 2 下编译时最常见的报错是找不到livox_ros_driver/CustomMsg.h。这是因为原版代码依赖 ROS 1 驱动。解决办法有两个方向改用 ROS 2 分支代码。手动替换为livox_ros_driver2/custom_msg.hpp同时修改回调函数中消息类型为livox_ros_driver2::msg::CustomMsg。另外编译过程中如果报缺少 PCL 头文件记得先安装sudo apt install libpcl-dev ros-humble-pcl-ros ros-humble-pcl-conversions8.3 点云时间戳问题Mid-360 的点云时间戳有几种来源雷达自身时钟、主机接收时间、PTP 同步时间。如果 FAST-LIO 的 IMU 和点云时间戳不一致会出现里程计跳跃或地图模糊。推荐做法是在驱动配置中采用同一时钟源。在采集数据时可以使用ros2 bag record记录原始数据之后在算法中统一处理时间戳。9. 工程建议与最佳实践从“能跑通”到“稳定可用”中间还有一段距离。下面这些建议来自实际测试中的经验总结希望帮你少走弯路。9.1 安装与标定传感器安装要牢固雷达和 IMU 之间的相对位置如果发生微小的震动或位移外参会发生变化直接导致定位精度下降。无人机上建议使用减震板并确保连接无松动。外参标定不能省FAST-LIO 默认使用配置文件中的外参但实际安装角度通常与默认值不同。建议使用标定工具对雷达与 IMU 进行外参标定尤其是旋转角即使误差 1~2 度在远距离点云匹配时也会被放大。IMU 内参初始化启动 FAST-LIO 时尽量保持设备静止让算法自动估计加速度计和陀螺仪的零偏。这一步如果没做好后面轨迹容易出现缓慢漂移。9.2 参数调优FAST-LIO 的参数并不需要经常调但有几个值得关注point_filter_num如果点云太密导致计算量过大可以适当增加过滤数比如设为 2 或 4。但不要太大否则地图特征会变稀疏。det_range室内环境一般不会太远设置 20~40 米即可。过大的检测范围可能引入远处噪声点。fov_degreeMid-360 水平视场角是 360°这里一般填 360。blind近距离盲区值。传感器上可能存在畸变点设置 0.3~0.5 米可以有效过滤。每个参数修改后建议重新跑一遍 bag观察效果变化不要同时修改多个参数否则难以定位问题。9.3 数据记录与复现在科研或工程调试中数据复用非常重要。建议每次测试都录制原始 rosbag并记录好环境描述、传感器固件版本、驱动版本、算法参数。这样即使后面更换了算法或参数也可以基于同一数据集对比效果。9.4 安全提醒室内无人机测试虽然风险比室外小但也不能掉以轻心。在开阔空间进行首次飞行不要在马达全开的状态下测试定位算法。设定飞行范围边界建议先使用手持设备推动无人机模拟飞行确认定位稳定后再上机。如果算法发散无人机位置估计漂移飞控可能给出错误的控制指令务必准备好急停开关或手动遥控接管能力。所有传感器安装、接线、供电操作应在断电状态下进行避免短路。9.5 性能优化方向Mid-360 的点云密度较高FAST-LIO 在嵌入式平台如 Jetson Orin、树莓派 协处理器上运行时要关注 CPU 占用。如果实时性不满足可以考虑降低点云频率或增加点云过滤。降低地图更新频率仅在关键帧时插入地图。使用多线程编译开启-O3优化。在飞控端和计算端分离架构不一定把 FAST-LIO 跑在飞控上可以跑在 companion computer。10. 下一步学习方向到这里你已经完成了 Livox Mid-360 在室内环境下的定位链路搭建和测试。接下来可以继续深入学习几个方向点云预处理理解 Livox 非重复扫描点云的去畸变、去噪和时间戳补偿原理。LIO-SAM 或 LIO-Livox在 FAST-LIO 的基础上加入回环检测和因子图优化进一步降低累积漂移。与飞控集成将 FAST-LIO 输出的里程计通过 MAVROS 或 MAVLink 发送给飞控实现室内自主悬停和导航。多传感器融合将 UWB、视觉、激光雷达做松耦合或紧耦合融合提升复杂环境下的鲁棒性。仿真验证在 Gazebo 或 AirSim 中搭建室内场景先仿真验证算法逻辑再迁移到真实硬件。Livox Mid-360 室内定位测试看起来是个小项目但它涉及的环节其实很完整传感器、驱动、通信、SLAM 算法、ROS 2、数据分析。把这些环节串起来你对无人机定位系统的理解会上一个台阶。如果本文对你有帮助可以收藏备用。实际操作过程中遇到问题建议按照“网络排查 → 驱动排查 → 算法参数排查”的顺序逐步定位不要把问题都归到硬件上。动手测试永远比只看文章收获大有条件就搭一套设备试试吧。