☰
室内无源定位+激光SLAM:无人机自主飞行实战与踩坑
2026/10/17 4:01:59 网站建设 项目流程

这个项目前前后后折腾了一个多月才彻底跑通:一架普通四旋翼无人机,不依赖GPS、不依赖基站和信标,只在机身上带一颗激光雷达加一块机载计算板,就在某园区A栋的地下停车场、三层走廊和大开间办公室里穿梭飞行,实时构建地图的同时完成自身定位。整个过程没有外部动捕、没有UWB基站、没有视觉标签,所有定位信息全靠机载传感器自己算出来——这就是“室内无源定位 + 激光SLAM在无人机上的飞行测试”要解决的核心问题。这篇文章把我从选型、装机器、调参数到实际飞行的完整过程和踩坑记录整理出来,适合正在做无人机感知、移动机器人SLAM,或者在室内场景被定位问题折磨的同学参考。

1. 场地与方案:为什么室内定位非要选激光SLAM

1.1 先搞清楚“无源定位”到底指什么

定位方案我先铺个底。行业里说的“无源定位”,在无人机这个语境下一般指:环境中不需要提前布置任何主动信号设施,机器完全是靠自身搭载的传感器来感知位置。与之相对的,UWB需要先布几个基站当锚点,光学动捕需要在场地周围架一圈相机,这些都是典型的有源方案。有源方案的好处是精度可以做到厘米甚至毫米级,但代价是场地受限制,机器一旦走出覆盖范围立刻失去定位,而且布设调试要占用大量时间。

激光SLAM天然适合做无源定位。激光雷达自己主动发射激光并接收回波,这从电磁波意义上说算”有源“传感器,但它在定位语境下强调的是不需要外部协同设施——雷达装在机身上,IMU装在机身上,计算板也装在机身上,整一套闭环全部自持。这个特性放在无人机上非常关键:飞机要飞越走廊、进房间、绕柱子,环境里不可能预先铺一圈基站等你过去。

我一开始也想过为什么不用视觉SLAM。室内视觉方案在光照均匀、纹理丰富的情况下确实不错,可一旦遇到白墙、玻璃、暗光、强光交替,特征点会大面积丢失。再加上无人机自身振动带来的运动模糊,视觉里程计在飞行场景里崩溃的概率实在是太大了。激光雷达不受光照影响,对白墙和规则几何结构反而特别友好,室内这种走廊、门框、墙角密布的场景,点云特征非常稳定。

1.2 激光SLAM方案里2D和3D怎么选

这个项目里我实际上做了两套方案的对比。一套是2D激光雷达配合Cartographer,另一套是3D固态激光雷达配合FAST-LIO。为什么做两套?因为我更想验证的不是”某一个算法能不能用“,而是”在无人机这个平台上,到底该选哪条技术路线“。

2D方案的优势是传感器便宜、算法轻、实时性容易保障。一颗2D激光雷达只有几百克,机载计算板用入门级的也能跑起来。但问题也明显:2D雷达只能扫一个平面,无人机飞行时一旦有俯仰和横滚,扫描平面就会跟着倾斜,建出来的地图可能会“扭曲”。所以2D方案必须在软件上利用IMU做姿态补偿,硬安装上则尽量把雷达装水平和减震。

3D方案的优势是信息量大,激光点云能覆盖整个三维空间,无人机随便什么姿态都有足够的几何约束。代价是点云数据量大、计算压力翻倍,雷达价格也高。FAST-LIO这类紧耦合算法把IMU和雷达数据一起送入滤波框架,实时性确实好,但对硬件要求也绝对不客气,机载电脑至少得是带GPU的等级,散热、供电都要额外考虑。

我在下面给这两条路线做了个对比,方便大家按自己手头的机器做决策。

对比维度2D激光 + Cartographer3D固态激光 + FAST-LIO
传感器成本低,千元级可入手高,通常是2D雷达的5倍以上
计算负载低,核内嵌入式设备可跑高,需要带GPU的机载电脑
定位精度房间级场景可以做到±20cm内静态场景可以做到±10cm内
对姿态变化敏感,必须IMU补偿不敏感,点云直接覆盖三维
典型应用场景走廊、停车库、规则室内多楼层、复杂环境、自动巡检

如果只看室内无人机巡检这类需求,我现在的结论是:预算充足直接上3D,少走弯路;预算有限、只在相对平整的室内飞,2D做验证完全够用。

2. 硬件选型与装机:雷达、IMU和机载电脑的搭配逻辑

2.1 无人机平台本身才是最大的变量

做激光SLAM飞行测试,飞控、电机、机架这些看似不参与算法的部分,其实对定位结果影响极大。我用的是自组的四旋翼,轴距450mm级别,带桨叶保护罩。选择这个级别的原因很现实:机架有足够的载重能力放雷达和计算板,同时尺寸又没有大到不适合在室内走廊飞行。太小的穿越机载重不够,太大的机架转弯半径惊人,根本没法在标准走廊里灵活飞行。

整机重量控制在3kg以内,起飞重量和动力余量大概保持1.5倍以上的推重比。一开始我犯过错误,为了追求“稳”,把计算板、雷达、数传、图传统统堆上去,结果飞机变得又重又笨,飞起来姿态波动反而更大,SLAM数据更难处理。后来的经验是:载重越轻越好,任何非必需的部件都不要上机。电池我选的是6S 3300mAh锂聚合物电池,实测悬停可以飞12分钟左右,这对SLAM测试足够,再多也没有意义,因为算法的瓶颈和续航无关,数据质量才是关键。

飞控的调参对SLAM的影响经常被忽略。飞控过于激进的姿态控制会让机身频繁小幅度抖动,雷达扫描数据里会混入微小的重复畸变。为了照顾SLAM,我把飞控的姿态增益从默认值稍微往下调软了一些,允许飞机在平稳飞行时有一点自然的漂移,但绝对避免高频振颤。这个取舍听起来反直觉:定位系统不是越“稳”越好,而是让传感器尽量处在一个平滑的运动模型里。

2.2 雷达选型:2D考虑转速,3D考虑视场

2D方案我用了RPLIDAR系列的某款中端型号,有效测距大概12到25米,扫描频率可调。这里注意,不要只看测距远,还要考虑帧率。测距标称25米的雷达如果扫描频率只有5Hz,无人机稍微飞快一点,相邻两帧之间的位姿变化就太大,点云匹配很容易发散。我最终把扫描频率设置在10Hz,配合IMU数据做帧间畸变校正。

2D雷达的安装支架我做了两次才改对。第一版直接用打印件把雷达固定在机架底部,起飞后地图里出现了明显的周期性波浪,排查后发现是机架的低频振动直接传递给了雷达。第二版我在支架和雷达之间加了四颗硅胶减震球,波浪立刻缓解,但减震球又太软,飞行机动时雷达会晃动,地图反而出现大尺度扭曲。最后在减震球里垫了硬橡胶垫片,找到软硬之间的平衡点,才算解决。

3D方案我选了国产某品牌固态激光雷达,这类雷达没有机械旋转部件,抗震性天然比2D机械雷达好,对无人机这种强振动环境非常友好。它的视场角有宽有窄,选型时注意不要只看测距,中近距离覆盖能力比远距离更重要——室内场景里,雷达能看到机身周边两米范围的点,远比看到远处几十米外墙更有价值。

2.3 IMU和机载电脑选型的基本原则

IMU是整个系统里容易被低估的部分。2D方案里IMU负责补偿姿态变化、提供帧间预测;3D方案里IMU直接参与状态估计迭代,数据质量差的话,整个紧耦合框架都会带偏。我用的IMU是飞控内部自带的,同时雷达内置了一个低成本IMU,两个数据源做了软同步融合。实测下来,内置IMU的零偏稳定性和动态响应都明显好于飞控自带的那颗,最终算法里主要信任雷达内置IMU,飞控IMU只作为交叉校验。

机载电脑我用了NVIDIA Jetson系列的一块入门级板子,2D方案跑CPU版本Cartographer绰绰有余,3D方案跑FAST-LIO时GPU参与部分加速,整体占用控制在一半以内。供电方面必须单独加稳压模块,电机启动瞬间会把电源电压拉低很大一块,我就遇到过雷达在电机大油门时直接掉线的情况,后来换成独立的稳压供电模块再也没出现。

安装位置也有讲究。雷达尽量靠近无人机重心下方,这样飞行时的角速度带来的线速度误差最小;计算板则放在重心正上方,防止整机重心偏移导致飞控需要持续补偿,产生不必要的震荡。所有线束全部用扎带固定,并且留出伸缩余量,避免飞行中振动把排线接口甩松。

3. 算法配置与参数调优:从Cartographer到FAST-LIO的取舍

3.1 2D方案的核心配置与原理

2D方案我用的Cartographer是谷歌开源的激光SLAM框架,核心思想是“局部匹配加闭环优化”。它把扫描数据拆成一个个submap,通过Ceres库做非线性最小二乘优化,把每一帧点云匹配到最近的submap上,同时维护一个位姿图来约束全局一致性。

对无人机这个平台,Cartographer的配置有几个关键点。第一,雷达测距范围要设置合理。室内场景距离通常不超过20米,把max_range设置得过大没有意义,反而会把远处窗户外的点云也匹配进来,造成虚实混杂。我设置的范围是0.2米到12米,确保近处有足够的点参与匹配,远处不会引入朝外街道的噪声点。第二,IMU数据必须开启。无人机不是轮式机器人,没有编码器里程计,IMU就是唯一的内源运动预测来源,在配置文件里要显式打开use_imu_data,否则当雷达短暂丢点或者匹配失败时,系统没有预测值兜底,位姿会瞬间跳飞。

还需要调整submap频率。submap创建太频繁会增大局部优化的负担,创建太慢则地图重影模糊。按我的经验,默认每帧点云创建一次submap是合理的,但实际测试中5Hz到10Hz的雷达帧率会造成submap过多,我把submap生成间隔调整为每5帧一次,效果明显改善。

trajectory_builder_2d: use_imu_data: true min_range: 0.2 max_range: 12.0 missing_data_ray_length: 5.0 submaps: num_range_data: 35 ceres_scan_matcher: occupied_space_weight: 3.5 translation_weight: 8.0 rotation_weight: 1.0

这段配置里最值得说的是ceres_scan_matcher三个权重。translation_weight比rotation_weight大,是因为室内走廊场景在沿走廊方向的约束比较弱,必须加大平移方向的惩罚,防止在长直走廊里逐渐漂移。occupied_space_weight控制的是点云与地图栅格的匹配力度,调太大会导致匹配过于激进、对微小误差过度敏感,调太小则地图松散。3.5是我在多次测试后折中的值。

3.2 3D方案的外参标定与参数细节

3D方案我用的FAST-LIO是港大开源的紧耦合激光惯性里程计,核心是迭代误差状态卡尔曼滤波,把雷达点云直接和全局地图匹配的同时,实时修正IMU的零偏和位姿。它比Cartographer更“激进”,因为系统完全依赖IMU传播状态,雷达数据作为残差修正。好处是即使在雷达帧率低的时候也能维持高频位姿输出,坏处是IMU标定不正确的话,误差会直接进入滤波器,几秒钟之内就能把轨迹带飞。

FAST-LIO的第一个硬门槛是外参标定。雷达坐标系和IMU坐标系之间的旋转和平移如果不准,匹配残差里会混入系统性误差。处理办法是用官方提供的标定工具:把雷达和IMU固定在一起,手动沿各个方向旋转并做来回直线运动,采集约两分钟数据,离线优化得到外参。我踩过的坑是标定时运动范围太小,旋转角度不够,解算出的外参精度差,飞行时地图里的墙始终是斜的。后来专门拿到停车场空地上做了大幅度“8字”运动,标定结果才稳定。

第二个关键参数是点云下采样分辨率。FAST-LIO处理原始点云时要做体素滤波,分辨率太小则点云数量巨大,实时性崩;分辨率太大则细节丢失,匹配精度下降。我的3D雷达原始点频率不高,体素分辨率设置在0.2米左右效果最好,走廊墙面轮廓能保持清晰,CPU占用也可控。雷达最大量程我只设置到80米,室内没有任何需要那么远距离的约束,反而要防止远处窗外的点云造成干扰。

common: lid_topic: /livox/lidar imu_topic: /livox/imu extrinsic_est_en: true preprocess: lidar_type: 1 scan_line: 8 point_filter_num: 2 feature_detection_enable: false mapping: acc_cov: 0.1 gyr_cov: 0.1 max_iteration: 3 filter_size_surf: 0.2 filter_size_map: 0.2

acc_cov和gyr_cov分别表示加速度计和陀螺仪的噪声协方差,这个值直接决定滤波器对IMU数据的信任程度。无人机振动环境下,IMU噪声明显高于地面机器人,可以把这两个值适当调大,也就是更信任雷达修正。但焊死不动也不行,调过大会让位姿完全被传感器噪声主导,纯靠点云匹配,激光一丢又飞了。反复试下来,两个值都取0.1对大多数室内场景较稳。

3.3 参数调优的通用思路

单独说调参会觉得每个参数都很玄学,但背后有个通用逻辑:任何SLAM系统都是在“信任传感器”和“信任运动模型”之间找平衡。飞得越激进,就越要信任IMU;点云越稀疏,就越要信任预测;室内几何越空旷,就越要主动降低匹配距离阈值,避免把错误的特征拉进来匹配。

我推荐的调参顺序是固定的:先调外参,再做静止测试,然后做旋转测试,最后做平移测试。每一步只动一个参数,记录地图变化。这个流程虽然慢,但能帮你积累对系统的直觉。不要一上来就全参数扫一遍,那样出了问题根本不知道是哪一步引入的。

4. 飞行测试流程与实测数据

4.1 测试环境与飞行安全准备

测试选在某园区A栋地下停车场、三层办公走廊和一间约400平米的大开间办公室。为什么选这三个场景?因为它们基本覆盖了室内无人机飞行的典型难点:地下车库有一大片空旷区域,几何退化和地面反光问题都会遇到;走廊是狭窄且环境重复的场景,很容易测出累积漂移;大开间办公室则有很多工位隔断和柱子,对点云匹配是很好的检验。

每次飞行前我都会做一套固定的安全流程。第一,检查桨叶保护罩和所有螺丝,确保不会在飞行中松脱。第二,在机身上贴两个独立的安全绳挂点,第一次起飞全程系安全绳,确认系统稳定后才解绳。第三,设置遥控器的急停开关,并把油门锁定在最低位,一旦看到地图漂移或者飞控异常,立刻切入紧急停机。第四,清场,保证测试区域没有人,尤其是雷达扫描面前方不能有人站立——激光雷达是可以对人眼造成潜在伤害的。

电池电量管理也需要格外小心。SLAM测试过程中无法随时更换电池,我通常设定最低返航电压后只计算飞行时间,实际留出三成多的余量就落地。电量不足时电机会加速掉压,飞控姿态不稳,雷达点云会出现大范围抖动,此时数据基本报废。

4.2 四阶段测试方法

整个飞行测试我分成四个阶段,每个阶段都有明确的通过标准。

第一阶段是手持推车验证。把无人机装在一个小推车上,在走廊里来回推,让SLAM系统跑起来,看地图和轨迹是否平滑。这里关键是排除“飞行”这个变量的干扰,先把算法本身的有效性验证掉。如果推车推着都连续跳变,那是算法和参数问题,没必要上机。

第二阶段是系留原地旋转。无人机绑着安全绳低速起飞,悬停在约0.5米高度,手动控制原地左右旋转,每次旋转约90度后悬停几秒。此时观察实时地图的墙面是否平直、墙角是否垂直,如果有明显的斜墙或者地图扭曲,大概率是雷达安装角度或者外参标定问题。

第三阶段是小范围平移飞行。解锁绳子,在停车场的一块空地上以不超过0.5米每秒的速度做前后、左右平移,飞行距离控制在10米以内。这个阶段主要验证定位响应是否跟手,地图会不会因为运动产生拖影。

第四阶段才是完整的任务航线飞行。在走廊里做一趟直线飞过去再飞回来,总距离约120米,要求全程不触碰墙面;然后在办公室里做环绕飞行和一进一出的“回”字形轨迹,让系统有足够机会做闭环检测。

4.3 实测数据记录

我把两个方案在相同场景下的表现做了汇总,数据用的是多次测试中取得的中位值。2D方案在走廊场景表现超出预期,120米往返后航向角度误差在2度以内,闭环前的最大位置漂移约0.6米,闭环修正后回到0.25米左右。这个精度对室内巡检、定点拍照完全是够用的。3D方案在办公室场景中误差更小,80米轨迹走完的最大漂移约0.2米,闭环后收敛到0.1米以内。

测试场景方案飞行距离闭环前最大误差闭环后误差实时帧率
地下车库直线往返2D Cartographer120m0.62m0.28m10Hz
地下车库直线往返3D FAST-LIO120m0.35m0.15m8Hz
办公室回字形2D Cartographer80m0.51m0.22m10Hz
办公室回字形3D FAST-LIO80m0.18m0.09m8Hz

注意看地下车库场景,为什么2D和3D的差距被拉大了?因为地下车库空旷区域太多,2D雷达扫到的墙非常稀疏,沿行进方向的约束很弱,漂移自然增大。而3D雷达垂直方向上还能看到车顶管道和墙面凹凸,几何约束更丰富。越是空旷环境,3D方案的优势越明显。

4.4 怎么读懂一张实时地图

有些同学拿到实时地图不知道该怎么判断系统状态,我分享一个简单的三看方法。一看墙线是否连续:如果墙线中间频繁断开又接上,说明局部匹配不稳定。二看墙线是否笔直:如果有规律的波浪,优先怀疑振动问题;如果整体倾斜,优先怀疑外参标定。三看轨迹是否平滑:轨迹如果出现折线形的拐角,说明有帧间匹配失败后又被IMU拉回的痕迹。

这个方法看起来很粗糙,但在测试现场非常有效。算法内部无数指标,到最后都体现在地图和轨迹这两个直观输出上。不要一上来就看PDF数字,先看图形。

5. 常见问题与排查实录

5.1 振动带来的点云畸变

无人机和地面机器人最大的区别就是振动。电机高速旋转产生的周期振动叠加在雷达扫描上,会让每一帧点云产生细微波浪形畸变。这个问题的排查过程很典型:第一反应是算法参数不对,反复调匹配权重无效;后来把飞机固定在地面,用手扳动雷达支架,发现点云扭曲和机架晃动有直接关系;最终更换减震结构后问题消失。

震动问题的最佳解决方式是物理减震而不是算法补偿。硅胶减震球、橡胶垫圈、泡沫双面胶都可以试,但要注意减震结构本身不能太软。判断标准是:用手轻按雷达支架,松开后能在0.1秒内恢复原状,并且没有显著回弹振荡。如果它像果冻一样晃个不停,飞行中会产生比无减震更严重的低频漂移。

5.2 玻璃墙和反光面的匹配失效

办公楼的玻璃墙是激光SLAM的天然敌人。激光打到玻璃上会直接穿透,无法形成有效回波;打在玻璃边缘的激光又可能产生错误的二次反射点,在点云里形成一层薄雾。最直接的问题是Cartographer会把玻璃当成不存在,明明眼前是一面墙,地图里却显示空旷区域,无人机很容易撞上去。

处理办法有三个。一是在玻璃墙表面不规则地粘贴一些磨砂塑料贴纸,提供一个漫反射平面,成本极低。二是把雷达的测距范围缩短,让远处的玻璃回波不作为主要特征,迫使算法依靠近处稳定的墙体做匹配。三是2D方案里尽量避免让无人机贴着玻璃墙飞行,保持至少1.5米的安全距离;如果非要靠近,改用3D方案,因为3D雷达的扫描线更多,玻璃产生的漏检区域比例更小。

5.3 长走廊场景的累积漂移

长直走廊是所有激光SLAM都会遇到的退化场景。因为雷达在一个方向上能看到的几何约束丰富,但沿走廊前进方向上,两侧墙都是平行的,没有任何特征告诉系统“你走了多远”。2D Cartographer在120米走廊里闭环前漂移60厘米,这个量级并不是参数没调好,而是几何结构本身提供不了足够信息。

处理这个问题的有效手段是闭环检测。飞出去再飞回来,让系统看到之前扫描过的区域,做一次全局优化,误差立刻被压下来。这也提醒我们:在规划无人机飞行航线的时候,最好刻意设计一条能够回到起点的路线,让SLAM有机会闭环。如果任务不允许返回,那就只能依赖IMU积分和更高的激光帧率,但本质上误差累积无可避免。

5.4 回环闭合时的地图跳变

闭环是好事,但也会带来视觉上明显的“跳变”。当飞机飞过一个之前经过的走廊拐角时,系统突然意识到当前位置和之前的位置高度重合,于是全局优化一把把所有历史位姿都做了修正,地图上所有墙壁突然平移了一段距离。这个现象在2D方案里最常见,因为回环检测相对宽松,容易产生“伪闭环”。

解决这个问题的思路不是关掉闭环,而是限制回环优化的范围。Cartographer里可以调整回环检测的置信度阈值,让系统只采纳高置信度的回环,同时限制全局优化对临近位姿的调整幅度。调完之后,地图跳变明显减少,但代价是回环误差收敛变慢。对室内巡检这种任务来说,宁可慢一点,也不要地图突然错位导致飞控误判。

问题现象主要原因解决方向优先级
地图出现周期性波浪机架振动传递到雷达加强减震结构高
墙线整体倾斜雷达安装角度或外参标定不准重新标定/调整安装高
长走廊逐渐漂移几何退化,约束不足设计闭环路线中
玻璃墙区域地图空洞激光穿透无回波贴漫反射膜/缩短测距中
闭环时地图突然跳变回环检测过于宽松调整置信度阈值低
电机大油门雷达掉线电源电压瞬间跌落独立稳压供电高

5.5 机载电脑过热的隐性风险

这套系统功耗最高的是机载电脑,长时间跑FAST-LIO时CPU占用率一直在70%以上,被动散热的壳体在测试十几分钟后就会烫到不能摸。过热的直接后果不是掉线蓝屏,而是处理器降频,SLAM算法实时性下降,帧率从8Hz掉到4Hz,点云匹配开始出现偶发跳变。

我给计算板加了一个小型主动散热风扇,同时调整了车速,让它在负载较低时自动降频。另外,测试前会把机载电脑放在空调房里预冷,这样每次飞行能争取到更长的有效测试时间。硬件散热问题看着不起眼,但它决定了一次飞行测试能在多快的时间内得到稳定数据。

6. 最后的几点体会

整套测试做下来,我最大的感受是:无人机上的SLAM问题和地面机器人完全不是一回事。地面机器人有编码器、有轮式里程计、速度和转向慢、姿态基本恒定,算法最坏情况下也能靠着里程计兜底;无人机姿态变化快、没有任何轮式里程计、还伴随强烈振动,所有运动信息全靠IMU和雷达,任何一个环节出错,系统都会在几秒内完全发散。

如果只能说一条经验,那就是:不要急着上车飞,先用推车把整条链路验证明白。我见过太多人把参数调到感觉差不多了就立刻起飞,结果姿态一抖、光照一换,建图当场崩溃。老老实实花一天时间做地面推车测试,把两个方案的适用场景摸清,再上飞行测试,反而会节约之后好几天的时间。这个习惯我会一直保留,在无人机这个平台上,数据从传感器到算法的每一步都值得你亲自确认。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询