# Livox Mid-360 + FAST-LIO2 + ROS 2 Nav2 室内点云建图与自主导航全流程

> 原文链接：https://robotics.hellobike.com/tutorials/ros2-fast-lio2-nav2-mid360-guide
> 频道：tutorials | 更新日期：2026-10-14 | 标签：ROS2, Mid-360, FAST-LIO2, Nav2
> 核心摘要：从驱动安装、外参 TF、FAST-LIO2 建图到 2D 投影与 Nav2 发目标点的命令级步骤，适配四足/轮式底盘共性流程。

本指南假设你已有一块与机器人固连的 Mid-360，且 `base_link` 已在 URDF 或 SDK 中定义。整体流水线分四段：驱动出点云、LIO 建图、投影或体素化、Nav2 规划。任何一段 TF 断了都会在 RViz 里表现为点云整体漂移或代价地图空白，因此建议先用 `ros2 run tf2_tools view_frames` 导出 PDF 核对树结构。

# 依赖与工作空间

```bash
mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src
git clone https://github.com/Livox-SDK/livox_ros_driver2.git
git clone https://github.com/hku-mars/FAST_LIO.git
cd .. && rosdep install --from-paths src -y
colcon build --symlink-install
source install/setup.bash
```

ROS 2 发行版与驱动 README 对齐（Humble/Jazzy 二选一，勿混装）。Mid-360 是非重复扫描雷达，点云密度随时间累积，建图时务必低速移动，否则 FAST-LIO 的前端会因运动畸变发散。工控机网卡与雷达配置在同一二层网段即可，具体 IP 以 Livox Viewer 读到的出厂地址为准，不要硬抄旧教程里的数字。

## 启动雷达与静态外参

编辑 `MID360_config.json` 中的 host 网段，使雷达与工控机同子网（勿把密钥写进仓库）。Launch：

```bash
ros2 launch livox_ros_driver2 msg_MID360_launch.py
```

发布静态 TF（示例数值请换成标定结果）：

```bash
ros2 run tf2_ros static_transform_publisher 0 0 0.15 0 0 0 base_link livox_frame
```

## FAST-LIO2 建图

```bash
ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml
```

手推或遥控慢速覆盖房间，RViz 看点云闭合。第一圈先走外轮廓，第二圈补中间，墙面应呈单层厚度。若出现双层墙，多半是外参 roll/pitch 偏了 1° 量级，回到标定步骤微调。IMU 与雷达时间同步误差大于 5ms 时，FAST-LIO 会在转弯处拉花，可用 `ros2 bag info` 检查消息时间戳单调性。保存 PCD 按包内说明执行，同时记录 `map` → `odom` 是否稳定。

## 点云转 Nav2 可消费格式

Nav2 默认消费二维激光或代价地图层。Mid-360 三维点云需投影：常见做法是用 `pointcloud_to_laserscan` 截取机器人高度带（例如地面以上 0.1–0.6m），输出 `/scan`；或在 `nav2_costmap_2d` 里启用 voxel layer 直接吃 PointCloud2。四足或人形平台要把自遮挡考虑进去，leg 扫过的扇区可在 costmap 里标记为未知而非自由，避免 planner 贴腿根规划。全局定位若仍用 AMCL，需要一份与 FAST-LIO 尺度一致的二维栅格；更稳妥的是整条链路都在 LIO 的 `map` 帧下做局部规划，仅把目标点变换到同一帧。

## Nav2

将点云投影为 `sensor_msgs/LaserScan` 或 elevation layer，启动：

```bash
ros2 launch nav2_bringup navigation_launch.py use_sim_time:=false
```

发目标：

```bash
ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose "{pose: {header: {frame_id: map}, pose: {position: {x: 2.0, y: 1.0, z: 0.0}, orientation: {w: 1.0}}}}"
```

四足底盘请把 `max_vel_theta` 调低，并加长 `controller_server` 的失败容忍时间。Spot/Go2 一类平台实际 yaw 速率低于 diff-drive 标称值，可在 velocity smoother 再加一层上限。动态障碍测试时，把 `obstacle_layer` 的 `observation_persistence` 调到 0.5s 以上，防止行人拖影。若 action 超时，先看 `local_costmap` 是否在机器人脚下误标障碍，通常是 TF 高度或 footprint 半径过大。整条链路联调完成后，用 `ros2 lifecycle` 确认 Nav2 节点均处于 active，再开始长距离任务。

## 录包与回归

联调通过后录一段包含建图与导航的 rosbag，便于回归。回放时先起 LIO 再起 Nav2，顺序反了会出现 map 帧跳变。生产环境建议把 Mid-360 固件与驱动版本 pin 住，Livox 偶发固件升级会改点云字段布局。室内玻璃与长走廊会让激光认为可通行，需在 costmap 加 keep-out 或融合其他传感器。最后把 footprint、外参、最大速度三项写进版本化 yaml，换机器人时只改参数不改代码。若团队同时维护仿真与真机，可在 Gazebo 里用相同样机位验证 Nav2 参数，再迁移到实机，能显著减少首日联调时间。遇到「地图重影」时，优先检查雷达与 IMU 是否在同一时钟域，其次才是算法参数。

## 原始参考来源 (Sources)

- [livox_ros_driver2](https://github.com/Livox-SDK/livox_ros_driver2)
- [FAST_LIO ROS2](https://github.com/hku-mars/FAST_LIO)
- [Nav2](https://docs.nav2.org/)