作者:Yifan Zhang, Yudong Huang, Yuchong Zhang, Changze Li, Haoran Liu, Ming Yang, Tong Qin*
Elevator-LIO 是面向电梯非惯性运动和跨楼层定位的 LiDAR-惯性里程计。主要测试平台为 Livox MID-360,同时支持其他雷达如 Ouster、Velodyne、XT32 等,但除MID360外尚未经过大规模测试。
数据集下载与使用说明见 DATASET.md。
关闭 YAML 中的电梯模式后,Elevator-LIO 可作为普通 LIO 使用,并保留触发式更新和自适应降采样等功能。
Warning
Elevator-LIO 允许机器人在电梯内自由移动,但建议使用 Livox MID-360 这类视场较大的 LiDAR,并采用倾斜安装,以获得尽可能多方向上的几何约束。如果您的 LiDAR 水平安装,且机器人在电梯内基本不会产生上下运动,请将 yaml/runtime 中的 elevator.strong_prior_enable 设置为 true。该选项会将 IMU 垂直方向加速度强约束解释为电梯加速度,使系统在此类安装条件下也能正常工作。
- 2026-05-23:arXiv 预印本公开。
- 2026-05-26:小红书 公开宣传。
- 2026-06-06:@编程猫小渐 复现 Elevator-LIO 论文结果。
- 2026-06-20:Elevator-LIO 数据集公开,包含 20 条序列和 79 次电梯乘坐;额外收录 @编程猫小渐 的两条数据。
- 2026-06-22:发布 rosbag 管理器视频,该工具随 Elevator-LIO 一同开源。
- 2026-06-26:ROS 1 源码发布。
- 计划中:ROS 2 源码发布。
- 计划中:更多数据集发布,包括更多带图像的完整序列。
- 计划中:手持采集平台软硬件源码与文档公开。
欢迎参观课题组其他工作,Elevator-LIO 为以下工作提供了定位支持:
- SCAN-Planner:面向路线引导长距离四足导航的空间碰撞感知局部规划器,可为自主探索、视觉语言导航等上层任务提供底层规划基础。
- TravExplorer:面向跨楼层具身探索的可通行性驱动 3D 规划系统,支持单楼层与跨楼层目标导航。
传统 LIO 假设导航坐标系为惯性系,但在运动的电梯轿厢内,IMU 会感受到电梯运动,而 LiDAR 主要观测轿厢内的相对几何,现有 LIO 方法几乎全部失效。Elevator-LIO 将机器人相对电梯的运动与电梯自身运动解耦,并通过模式相关的迭代误差状态卡尔曼滤波实现连续跨楼层定位:普通室内环境使用标准 LIO 传播,进入电梯后启用非惯性状态传播和约束更新。
系统按照时间顺序处理 IMU 和 LiDAR 数据,依次完成静态 IMU 初始化、自适应降采样、模式相关传播、IESKF LiDAR 更新、可能的退出电梯更新和增量 ikd-Tree 建图。
进入检测使用 LiDAR 距离统计量判断机器人是否由开放区域进入封闭轿厢;退出检测根据估计的电梯竖直运动状态及其方差判断电梯是否停稳。两种事件也可以通过 ROS 话题手动触发。
电梯停稳后,系统施加零速度和零加速度约束,将估计的电梯竖直位移重新锚定到机器人状态,并重置电梯相关状态,从而抑制电梯运行期间累积的高度漂移。
系统在线调整体素大小,使降采样后的有效点数保持在目标值附近,在电梯轿厢内保留足够的几何信息,同时控制开放场景中的计算量。
数据使用集成 Livox MID-360、工业相机和 Jetson Orin Nano 的便携式手持设备采集。
Note
- 后续将开源手持设备的软硬件设计与相关文档。
Elevator-LIO 的设计遵循开箱即用的原则,集成了许多便于使用的功能,具有完善的注释方便您进行后续开发,日志与调试系统比较完善。
小巧思包括:
- 无 Livox_ros_driver 依赖:自定义消息在包内构建,在 ROS 系统上可直接编译使用
- 初始重力对齐:无论雷达以何种方向放置,世界系都会初始化为水平方向
- 球形/长方体包围盒滤除:除了指定球形滤除框,也可以指定长方体区域内点云滤除
- 预留额外的 body 系输出:可在 yaml/sensors 中配置
lidar_R_vehicle和lidar_t_vehicle - 简单的重定位功能:支持加载 PCD 地图,然后在原点启动并运行重定位
- 协方差矩阵可视化:可在 yaml/logging 中打开,方便调试
- 高频输出:可在 yaml/runtime 中打开,将IMU预积分位姿也输出出来,方便下游应用
不同于主流 LIO,Elevator-LIO 没有显式打包概念,遵循“谁来谁更新”的设计理念,在框架上更适合多传感器融合;但这也带来了额外开销:状态机需要以较高频率轮询并检测是否有数据输入。
当前代码主要在以下环境中开发和测试:
- Ubuntu 20.04
- ROS Noetic
OpenCV 目前只用于协方差矩阵和电梯状态曲线的调试窗口,默认配置中这些窗口均关闭;但源码和 CMake 仍会包含并链接 OpenCV,您可以自行修改代码取消这些依赖。
将代码放入 src 目录下编译:
catkin_make直接使用 roslaunch 运行:
roslaunch lio start.launch可以指定对应的 YAML 文件参数。默认配置为 root_config.yaml,也可以创建自己的配置文件:
roslaunch lio start.launch config_path:=path_to_yaml电梯功能由统一开关控制:
elevator:
enable: true自动进入电梯模式由门关闭检测控制:
elevator:
door_detector:
enable: true该检测基于点云距离分位数,在狭窄场景(如楼道)中可能误触发。可以关闭自动检测,改用话题手动触发。
进入电梯模式(通过话题触发):
rostopic pub /LIO/set_elevator_flag std_msgs/Bool "data: true" -1退出电梯模式(通过话题触发):
rostopic pub /LIO/set_elevator_flag std_msgs/Bool "data: false" -1自动退出通过下面参数控制:
elevator:
self_exit_detector: true # 打开时会根据估计出的电梯速度及其方差信息,自动退出电梯模式程序内部的电梯状态会和 LiDAR 信息同频率发布:/LIO/in_elevator 保留布尔模式标志;/LIO/elevator_state 发布电梯模式以及估计的相对位移、速度和加速度,并供 RViz 电梯状态面板显示。
在程序开发早期,我们设计了仿真节点 sim_node,用于构造电梯场景并生成 LiDAR 与 IMU 消息。具体程序与配置位于 src/sim 中。
在 root_config.yaml 中分别选择传感器、运行和日志配置:
sensor_config: "sensors/livox.yaml"
runtime_config: "runtime/mapping.yaml"
logging_config: "logging/default.yaml"详细说明见 yaml/README.md。
部分关键配置:
- 降采样参数。如在嵌入式设备上无法实时运行,可以增大
point_filter_num、降低adaptive.target_points,或增大adaptive.min_voxel:
downsample:
point_filter_num: 2 # 订阅点云时的降采样比例 [确保为正整数]
blind: 0.8 # 忽略距离小于 blind 的点 [m]
use_box_blind: false # true 时改为删除下述长方体内的点
box_corner: # LiDAR 坐标系下的三轴范围 [min, max],单位 m
box_corner_x: [-0.7, 0.1]
box_corner_y: [-0.3, 0.3]
box_corner_z: [-0.4, 0.4]
filter_size: 0.1 # 固定模式的体素大小;自适应模式下的初始体素大小
adaptive:
enable: true # 启用自适应体素降采样
target_points: 20000 # 目标每秒点数(程序会按帧时间折算)
alpha: 1.2 # 幂律调节指数
min_voxel: 0.05 # 最小体素大小
max_voxel: 0.8 # 最大体素大小- 电梯功能配置。关闭
elevator.enable后,系统会退化为普通 LIO;开启时可使用 LiDAR 门关闭检测自动进入电梯模式,并通过 IMU 运动状态自动退出:
elevator:
enable: true # 电梯模式总开关
self_exit_detector: true # 根据 IMU 电梯运动阶段与停稳检测自动退出
door_detector:
enable: true # 是否启用电梯门关闭自动检测
dist_threshold: 3.0 # 过滤后最远点小于该距离时认为轿厢封闭 [m]
time_threshold: 2.0 # 封闭状态持续多久后触发电梯模式 [s]
filter_percent: 0.06 # 计算最远距离时忽略最远端点的比例
cooldown_time: 5.0 # 两次自动触发之间的冷却时间 [s]
zupt:
enable: true # 电梯相关 ZUPT 总开关
waiting:
enable: true # 进入电梯后的等待阶段是否周期性触发 ZUPT
period_s: 3.0
vz_abs_thresh: 0.1
az_abs_thresh: 0.1
exit_icp_z:
enable: false # 退出电梯后是否用已有 ikd-tree 地图做仅 z 方向 ICP 修正Warning
电梯退出检测相对稳定,但自动进入检测在狭窄走廊等封闭环境中可能误触发。您可以根据场景调整 door_detector 相关阈值,或自行发布触发信号;话题触发方式请参考上方“电梯模式说明”中的通过话题触发小节。重定位配置中默认开启 exit_icp_z.enable,建图配置中默认关闭,详细参数见 yaml/README.md。
- 重定位设置,启用重定位时记得修改参考地图文件
relocation:
relocation_enable: false # 是否开启重定位
pcd_load_name: "scans.pcd" # 重定位时加载的 .pcd 文件名称,相对 PCD 文件夹每次建图结束后,地图都会保存到 PCD 文件夹下。
日志文件会生成在新建的 Temp 文件夹下。
核心代码位于 src 和 include 文件夹下。
temp 文件夹下会生成当前批次运行得到的一些关键数据记录。
├── CMakeLists.txt
├── PCD # 建图结果、重定位地图和临时点云
│ └── Temp # 运行过程中生成的临时点云
├── docs # README 使用的说明文档与资源
│ └── images # 项目图片、流程图和效果图
├── include # C++ 头文件
│ ├── support # 公共类型、配置读取、缓存和节点接口
│ │ ├── common_lib.h
│ │ ├── LIONode.h
│ │ ├── SharedBuffers.h
│ │ ├── TopicProcess.h
│ │ ├── YamlReader.*
│ │ └── type.h
│ ├── elevator # 电梯检测、状态机和 ZUPT 接口
│ │ ├── ElevatorProcess.h
│ ├── estimator # ESEKF 与 IMU 预积分/传播接口
│ │ ├── ESEKF.h
│ │ └── IMUProcess.h
│ ├── AdaptiveFilter # 自适应体素降采样
│ │ ├── AdaptiveVoxelFilter.hpp
│ │ └── AdaptiveVoxelPController.hpp
│ ├── ikd_tree # 增量式 ikd-tree 地图与近邻查询
│ │ ├── IkdMap.hpp
│ │ ├── IkdNearestQuery.hpp
│ │ └── ikd_Tree.*
│ ├── node # LiDAR 处理流水线等节点内部接口
│ └── rviz # 算法调试可视化接口
├── launch # ROS 节点启动文件
│ └── start.launch
├── msg # 项目自定义 ROS 消息
│ └── *.msg
├── package.xml
├── README.md
├── README_en.md
├── rviz # RViz 显示配置
│ └── LIO.rviz
├── scripts # Bag Runner、数据分析和绘图脚本
│ └── bag_runner_ui.py
├── src # C++ 源码实现
│ ├── main.cpp
│ ├── elevator # 电梯检测、状态机和 ZUPT 实现
│ │ └── ElevatorProcess.cpp
│ ├── estimator # ESEKF 与 IMU 处理实现
│ │ ├── ESEKF.cpp
│ │ └── IMUProcess.cpp
│ ├── node # ROS 回调、地图、发布、保存和服务
│ │ ├── callbacks.cpp
│ │ ├── map.cpp
│ │ ├── publish.cpp
│ │ ├── save.cpp
│ │ └── service.cpp
│ ├── rviz # rviz 配置文件
│ ├── support # 公共配置、日志和话题接收实现
│ │ ├── common_lib.cpp
│ │ └── TopicReceive.cpp
│ └── sim # 仿真节点
│ └── run_sim_node.cpp
├── yaml # 分层运行配置
│ ├── root_config.yaml
│ ├── sensors # 雷达类型、外参和订阅话题
│ ├── runtime # 建图、重定位、估计器和电梯参数
│ └── logging # 控制台、文件日志和调试可视化
使用本软件或数据集时,请引用 Elevator-LIO 论文:
@misc{zhang2026elevatorlio,
title={Elevator-LIO: Robust LiDAR-Inertial Odometry for Multi-Floor Navigation under Elevator-Induced Non-Inertial Motion},
author={Yifan Zhang and Yudong Huang and Yuchong Zhang and Changze Li and Haoran Liu and Ming Yang and Tong Qin},
year={2026},
eprint={2605.24495},
archivePrefix={arXiv},
primaryClass={cs.RO},
url={https://arxiv.org/abs/2605.24495},
}
本项目整体以 GNU General Public License v2.0 or later 发布。仓库包含的独立 MIT 组件继续保留各自文件头中的 MIT 标识;第三方代码及修改说明见 THIRD_PARTY.md。






