本文将系统介绍如何将蓝海光电LDS-M300激光雷达与FAST-LIO2算法相结合,实现高精度3D建图,并借助octomap_server功能包在线实时将3D点云转换为2D栅格地图。
一、蓝海M300激光雷达介绍
1.1 产品定位与技术参数
蓝海光电推出的LDS-M300是一款非重复式多线3D激光雷达,雷达的主要技术参数如下:
-
激光波长:905nm±15nm
-
测距距离:0.05--50m @90%反射率,0.1--25m @10%反射率
-
激光频率:>200KHz
-
刷新频率:10Hz
-
扫描原理:非重复式机械扫描
-
垂直视场角:-10°~60°
-
水平视场角:360°
-
测距精度:±3cm
-
距离分辨率:10mm
-
数据接口:以太网
-
抗强光:100KLux
-
功耗:≤4W
-
防护等级:IP67
-
尺寸:78×78×81mm
1.2 核心特性
高密点云与环境还原能力。 LDS-M300采用非重复式360°旋转扫描方式,在1秒内可输出15万点/秒的高密点云数据,垂直角分辨率高达0.36°,水平分辨率最细可达0.18°(@2.5s积分时间)。这种非重复采样方式使雷达能在动态环境中快速累积空间细节,构建真实可靠的3D模型。
内置IMU提升融合感知精度。 雷达集成了高性能IMU(IIM-42652),可实时输出三轴加速度与角速度信息,增强雷达在运动状态下的数据稳定性与环境建图精度,为SLAM、路径规划等算法提供原始惯性参考。
1.3 点云数据查看与网络配置
在开始建图之前,需要先确认雷达能够正常输出点云数据。官方提供了PaceCatView3D上位机软件,用于查看雷达的点云数据。

网络配置的关键注意事项: 使用PaceCatView3D软件时,必须设置为固定上传模式,且你的电脑IP需要和固定上传的IP一致。这是确保雷达与电脑之间能够正常通信的前提条件。具体配置步骤如下:
-
将电脑IP设置为与雷达固定上传IP处于同一网段
-
打开PaceCatView3D软件,选择对应的雷达型号
-
确认点云数据正常显示后,即可进行后续的FAST-LIO2配置
二、FAST-LIO2算法简介
FAST-LIO2是目前最先进的激光雷达-惯性里程计(LIO)框架之一,基于高效的紧耦合迭代卡尔曼滤波器设计。该算法具有两大核心创新:
第一,直接点云配准。 FAST-LIO2不提取手工设计的特征(如边缘点、平面点),而是直接将原始点配准到地图上并随后更新地图。这种做法能够充分利用环境中的细微特征,显著提高定位精度。同时,消除特征提取模块使得该算法能够自然适应不同扫描模式的新型激光雷达。
第二,ikd-Tree动态数据结构。 FAST-LIO2使用增量式k-d树(ikd-Tree)来维护地图,支持点的增量插入和删除以及动态重平衡。相比于八叉树、R-tree和nanoflann等现有动态数据结构,ikd-Tree在保持优越整体性能的同时,天然支持树上的点云降采样。
大量公开数据集上的对比测试表明,FAST-LIO2在更低计算负载下实现了比现有最先进的激光雷达惯性导航系统更高的精度。特别是对于小型视场的固态激光雷达和旋转式多线激光雷达,该系统均展现出卓越的性能。
三、FAST-LIO2建图配置
3.1 核心参数配置文件解析
FAST-LIO2的建图参数通过YAML配置文件进行管理。以下是针对蓝海M300雷达的详细参数配置及说明。
通用参数设置
common:
lid_topic: "/M300/custommsg" # LiDAR点云话题名称
imu_topic: "/M300/imu" # IMU话题名称
time_sync_en: false # 时间同步开关
time_offset_lidar_to_imu: 0.0 # LiDAR到IMU的时间偏移量 参数说明:
-
lid_topic和
imu_topic需要根据实际发布的ROS话题名称进行设置。蓝海M300雷达的点云话题通常为/M300/custommsg,IMU话题为/M300/imu。 -
time_sync_en设为
false表示使用外部硬件时间同步。如果雷达和IMU之间没有硬件同步信号,可以将其设为true启用软件时间同步。 -
time_offset_lidar_to_imu是通过LI-Init等外部标定工具获得的时间补偿值,如果不确定具体值,请设置为0.0。
预处理参数
preprocess:
lidar_type: 1 # LiDAR类型:1=Livox系列
scan_line: 1 # 扫描线数
blind: 0.0 # 盲区过滤半径 参数说明:
-
lidar_type:1代表Livox系列雷达。由于蓝海M300与Livox雷达具有类似的扫描模式,将其设置为1即可正常工作。
-
scan_line:扫描线数设置。Livox系列通常设为6或4,这里设为1使用默认值。
-
blind:盲区过滤半径(单位:米),用于去除距离过近的噪声点。如果雷达安装位置距离机器人本体较近,可以适当增大此值。
建图参数
如果不打开外参标定,使用固定的安装参数,imu实际的安装位置按照雷达规格书中机械参数来设置。
mapping:
acc_cov: 0.1 # 加速度计测量噪声协方差
gyr_cov: 0.1 # 陀螺仪测量噪声协方差
b_acc_cov: 0.0001 # 加速度计零偏随机游走噪声协方差
b_gyr_cov: 0.0001 # 陀螺仪零偏随机游走噪声协方差
fov_degree: 360 # LiDAR水平视场角
det_range: 40.0 # 有效建图范围
extrinsic_est_en: true # 在线外参标定开关
extrinsic_T: [0.0194, 0.0333, 0.0483] # IMU到LiDAR的平移外参
extrinsic_R: [1, 0, 0, # IMU到LiDAR的旋转外参
0, 1, 0,
0, 0, 1] 参数说明:
-
acc_cov和
gyr_cov:IMU测量噪声协方差参数,直接影响状态估计的精度。对于蓝海M300内置的IIM-42652 IMU,默认值0.1可以获得较好的效果。 -
b_acc_cov和
b_gyr_cov:零偏随机游走噪声协方差,控制IMU零偏估计的收敛速度。 -
fov_degree:激光雷达的水平视场角,蓝海M300为360°,保持默认即可。
-
det_range:有效建图范围,超出此距离的点云将被忽略。根据雷达的最大测距能力,这里设置为40米。
-
extrinsic_est_en:在线外参标定开关。设为
true时,系统会在运行过程中估计IMU与LiDAR之间的外参。 -
extrinsic_T和
extrinsic_R:IMU到LiDAR的平移和旋转外参。如果已经通过离线标定获得了精确的外参,可以在此处填入。此处使用的数值为示例值,实际使用时需要根据雷达的安装位置进行标定。
发布与保存设置
publish:
path_en: true # 是否发布轨迹路径
scan_publish_en: true # 点云发布开关
dense_publish_en: true # 稠密点云发布开关
scan_bodyframe_pub_en: true # 是否发布IMU体坐标系下的点云
pcd_save:
pcd_save_en: true # 是否保存点云为pcd文件
interval: -1 # 每个pcd文件包含的LiDAR帧数 参数说明:
-
pcd_save_en设为
true可将建图结果保存为PCD文件,便于后续离线使用。 -
interval:-1表示将所有帧保存到同一个pcd文件。如果帧数过多可能导致内存问题,可设置为正数(如500),表示每N帧保存为一个独立的pcd文件。
3.2 启动建图
完成参数配置后,使用以下命令启动FAST-LIO2建图:
roslaunch fast_lio mapping_m300.launch 其中mapping_m300.launch是自定义的启动文件,内容如下:
<launch>
<node pkg="fast_lio" type="fastlio_node" name="fastlio_mapping" output="screen">
<rosparam command="load" file="$(find fast_lio)/config/m300.yaml" />
</node>
</launch>
四、在线转栅格图
4.1 octomap_server功能包介绍
octomap_server是ROS官方提供的功能包,用于构建和维护三维八叉树占据地图(OctoMap),并自动将其投影为二维占据栅格地图。该功能包的主要优势在于:
-
实时性
:可以增量式构建地图,边接收点云边更新
-
灵活性
:支持3D八叉树地图的多种输出格式
-
兼容性
:直接对接ROS生态,无需额外的数据转换
4.2 核心参数配置
为了将FAST-LIO2生成的3D点云实时转换为2D栅格地图,需要创建一个专用的launch文件。以下是完整的配置示例:
<launch>
<node pkg="octomap_server" type="octomap_server_node" name="octomap_server">
<!-- 八叉树分辨率:每个体素的大小,单位米 -->
<param name="resolution" value="0.1" />
<!-- 固定坐标系:必须与FAST-LIO2发布的点云坐标系一致 -->
<param name="frame_id" type="str" value="camera_init" />
<!-- 传感器有效探测范围,超过此距离的数据将被忽略 -->
<param name="sensor_model/max_range" value="50.0" />
<!-- 点云高度过滤:忽略低于0.2米和高于2.0米的点 -->
<param name="pointcloud_min_z" value="0.2" />
<param name="pointcloud_max_z" value="2.0" />
<!-- 占据栅格投影的高度范围 -->
<param name="occupancy_min_z" value="0.2" />
<param name="occupancy_max_z" value="2.0" />
<!-- 话题重映射:将默认输入话题映射为FAST-LIO2输出的点云话题 -->
<remap from="cloud_in" to="/cloud_registered" />
</node>
</launch> 关键参数详细说明:
frame_id(坐标系设置)。 这个参数是转接过程中最容易出错的地方。frame_id必须与FAST-LIO2发布的点云话题的坐标系完全一致。FAST-LIO2建图时输出的点云话题/cloud_registered的frame_id通常是camera_init或world_frame,可以通过以下命令确认:
rostopic echo /cloud_registered | grep frame_id 如果坐标系不匹配,octomap_server将无法正确投影栅格图,RVIZ中也不会显示任何内容。
点云高度过滤(pointcloud_min_z / pointcloud_max_z)。 这一组参数用于滤除不需要参与建图的点。在实际应用中,地面点云的投影会使栅格地图中几乎所有区域都显示为占据状态,严重影响导航效果。通过设置pointcloud_min_z(如0.2米)将地面点滤除,可以生成干净的栅格地图。同样,设置pointcloud_max_z可以忽略天花板等不需要的高程信息。
占据栅格投影范围(occupancy_min_z / occupancy_max_z)。 这组参数定义了将3D八叉树中的哪些层投影到2D栅格地图上。通常建议将投影范围设置在机器人通行所需的高度区间内(如0.2米到2.0米),这样生成的栅格地图能够准确反映机器人的可通行区域。
传感器最大范围(sensor_model/max_range)。 设置此参数可以显著提高处理速度,系统将忽略超出设定距离的点云数据。
4.3 运行与可视化
完成上述配置后,按以下顺序启动各节点:
步骤一:启动蓝海M300雷达驱动
roslaunch m300_driver m300.launch 步骤二:启动FAST-LIO2建图
roslaunch fast_lio mapping_m300.launch 步骤三:启动octomap_server节点进行在线栅格转换
roslaunch your_package octomap_2d.launch 步骤四:RVIZ可视化
在RVIZ中添加以下话题进行可视化:
-
/cloud_registered:FAST-LIO2输出的3D点云地图
-
/projected_map:octomap_server投影生成的2D占据栅格地图(Nav2/导航栈标准格式)
-
/octomap_full:3D八叉树占据地图(可选)

4.4 保存栅格地图
建图完成后,可以使用map_saver功能包保存生成的2D栅格地图:
ROS1环境
rosrun map_server map_saver map:=/projected_map -f /path/to/save/mymap
ROS2环境(Humble及以后版本)
ros2 run nav2_map_server map_saver_cli -f my_2d_map --ros-args --remap map:=/projected_map 保存后将生成两个文件:
-
mymap.yaml:地图元数据文件,包含分辨率、原点坐标等参数
-
mymap.pgm:栅格图像文件,可直接用于Nav2等导航框架。
