第一次在商场里看到AR导航大屏的人,多半会“哇”一声:虚拟箭头像贴在地面上一样,拐弯处自动转向,店铺招牌上方漂浮着距离信息,整个画面跟实景严丝合缝。但真正做过这套系统的人,心里想的往往是另一句话:精度够不够?卡不卡?会不会漂?
我前前后后参与过几套商场智能导视系统的方案设计和落地,踩了不少坑,也对AR和SLAM这套组合有了比较完整的认识。这篇文章不讲花活,直接从技术原理和工程实现角度,把“基于AR和SLAM技术的商场智能导视系统”拆开揉碎讲清楚。内容涉及系统架构、视觉SLAM定位原理、AR虚实注册、商场场景特有的精度陷阱,以及一批来自现场的经验教训,希望能给正在做类似室内定位、AR导航、互动导视项目的朋友一些参考。
先说清楚一件事:商场智能导视系统要的不是“能用”,而是“稳定能用”。用户在商场里走路时视线是晃动的,光线是复杂的,人群是流动的,玻璃和镜面到处都会骗人。这些放到算法层面全是问题,而且都是必须在真实场景里硬扛过去的问题。
1. 商场导视为什么非AR+SLAM不可
1.1 传统导视方案的三个死穴
大家逛商场时都见过传统导视的几种形态:入口处的总览指示牌、电梯口的方向箭牌、每层中庭的触摸查询屏,以及这两年很常见的“小程序内导航”。它们各有各的问题,总结下来是三个死穴。
第一个是信息密度严重不足。一面静态指示牌只能标注十几个主力店铺和设施,商场里动辄两三百家店,大量信息被折叠在“更多店铺请到查询屏查看”里,用户要么绕远路找查询屏,要么干脆放弃。第二个是定位精度根本不够看。商场内部GPS基本废掉,Wi-Fi指纹定位的精度通常在5到10米,蓝牙iBeacon好一些也就3到5米,而且信号受楼层板、金属货架和人群遮挡影响极大。对导航来说,3到5米意味着什么?意味着你可能站在两家店正中间,系统根本分不清你要去的是哪一家。第三个是实时性差。店铺调整、临时专柜、活动围挡,这些一变化,静态物料就要重做,成本高、更新慢,用户看到的很可能是过期信息。
1.2 AR+SLAM带来的是维度上的变化
AR和SLAM的组合能把这些痛点一次性解决大半。SLAM负责回答“我在哪里”,AR负责回答“我该怎么走”。这不是新瓶装旧酒,而是把定位从“告诉你一个坐标”升级成“告诉你一条和实景对齐的路径”。
先说SLAM的价值。视觉SLAM通过摄像头捕捉周围环境,提取特征点,实时估计设备在空间中的六自由度位姿,也就是X、Y、Z三个平移加俯仰、偏航、横滚三个旋转。配合预建的离线高精地图,用户一打开摄像头,系统就能在1到2秒内完成重定位,给出10到30厘米级别的定位结果。这个精度对导视来说非常够用——它足以判断你面朝哪个店铺、距离电梯口几步路。
AR部分的价值在于表达方式。跟传统2D地图+箭头导航相比,AR把虚拟信息直接叠加在真实画面上,用户不需要做“地图到现实”的心理映射。虚拟箭头“踩”在地面上,拐弯口会有方向提示,目的地会有明显的悬浮标记。这种直观性是任何平面地图都给不了的。
对商场运营方来说,这套系统带来的还不只是用户体验提升。系统后台可以记录用户的动线轨迹、停留时长、热力分布,这些数据能反哺店铺招商、活动策划、广告位定价,等于导视系统从成本项变成了数据资产。这也是很多商场愿意买单的核心原因之一。
1.3 别被“AR导航”这个名字带偏
有一点必须明确:商场里的AR导视和车载导航的“AR导航”是两套完全不同的技术路线。车载AR导航多数靠GPS+高精地图+车道级定位,车规级传感器的成本摆在那里,而且车的运动约束比人走路简单太多。人的步行是自由的六自由度运动,有上下坡、扶梯、跳层,手还一直在抖,环境又是高度动态的室内场景。这就决定了商场导视必须依靠视觉SLAM这类能输出完整位姿估计的技术,而不是GPS加个方向传感器就算完。
2. 系统架构拆解:从摄像头画面到虚拟路标的完整链路
2.1 一套完整AR导视系统的分层结构
拆解系统架构之前,先给一个整体框架。一个可落地的商场AR导视系统通常分成四层。
- 数据采集与地图生产层:负责离线采集商场空间数据,生成可用的高精地图和导航路网,包括关键帧图像、稀疏点云、语义标签、POI坐标等。
- 终端感知与定位层:运行在用户设备上,实时处理摄像头帧,完成特征提取、匹配、位姿求解、重定位,输出稳定可靠的位姿。
- 路径规划与业务逻辑层:负责计算从当前位置到目标店铺的路径,处理楼层切换、扶梯电梯衔接、跨区导航等逻辑。
- AR渲染与交互层:把虚拟信息按照正确的空间位置渲染到屏幕上,处理遮挡、景深、手势交互、语音反馈等。
这四层从下往上,每一层都依赖下一层输出,同时受上一层需求约束。很多团队把精力全扑在定位算法上,结果忽略了地图生产和AR渲染,最后一样无法落地。实际项目里,每一层都有专门的坑。
2.2 离线建图与在线定位的两段式设计
商场AR导视系统在工程上几乎都采用“离线建图+在线重定位”的两段式设计。为什么不完全依赖在线实时SLAM?因为纯实时的SLAM在没有先验地图的情况下,存在尺度不确定性和累计漂移问题,而且首次定位需要一段时间让系统初始化,用户不可能站在原地等你5秒钟。
离线建图的方式一般是这样的:用一台装有多传感器模组的推车或背包,沿商场动线走一遍,传感器模组包含高帧率相机、IMU(惯性测量单元)、可选激光雷达,同时记录RTK参考点或人工控制点。采集到的数据离线跑批量SLAM,生成带真实尺度的空间地图。地图里不仅有点云和关键帧,还叠了一层逻辑路网,标注了扶梯、电梯、洗手间、服务台等节点的准确坐标和楼层信息。
在线定位则跑在用户手机上,反复做“当前帧特征与地图关键帧特征匹配”这件事。匹配成功就根据2D-3D对应关系求解当前位姿,然后通过跟踪地图点持续输出位姿更新。这套方案的好处是稳定、快、精度高。有了离线地图的绝对坐标,在线端甚至不需要像传统SLAM那样做尺度估计,直接把尺度问题绕过去了。
2.3 终端算力平台怎么选
终端算力平台的选型直接影响系统落地效果,我见过不少项目死在这一步。需要处理的负载包括实时特征提取、特征匹配、位姿优化、路径解算、AR渲染,这些全加起来对CPU和GPU的压力都不小。
主流选择有两种路线。第一种是纯手机端处理,用户扫码即可打开AR导视小程序或APP,所有计算都在手机上完成。这条路线对算法效率要求极高。中低端Android手机的性能差异很大,有的手机跑起来帧率只能到15帧,画面卡顿会严重影响AR效果,甚至让用户头晕。第二种是边缘盒子方案,商场里部署带NPU的嵌入式平台,常见的有RK3588这类芯片的平台,摄像头采集画面交给盒子处理,输出的AR画面投到导视屏或推流到用户端。这种方案适合商场固定点位的大屏互动导视。
两种路线可以并存:用户手机用自研或第三方SDK的SLAM做随身导航,商场固定点位用边缘盒子做交互大屏。说到底,选型逻辑是“在成本可控的前提下,把定位稳定性和渲染流畅度做上去”。
2.4 数据流向梳理
把数据流画出来,整个系统逻辑就很清晰了。相机每一帧图像送入前端,提取ORB或其他特征点;如果系统处于“已定位”状态,就把当前帧特征与局部地图点做匹配,通过PnP求解位姿;如果处于“未定位”状态,就做全局重定位,在词袋数据库中检索最相似关键帧,通过匹配确定初始位姿;然后位姿数据交给路径规划模块和AR渲染模块。路径规划算出的路线是一系列全局坐标点,AR渲染模块把它们从世界坐标系投影到屏幕像素坐标,最终形成我们看到的地面箭头和虚拟标识。
这个链路里最怕的是某个环节延迟抖动。一旦位姿输出延迟超过50毫秒,AR元素就会明显滞后于画面,产生“漂移感”。所以工程上要用环形缓冲区、双线程处理、预测补偿这些手段来稳住延迟。
3. SLAM定位的底层逻辑:商场环境里的特征提取与位姿解算
3.1 前端视觉里程计:从一帧图像到相对运动的推算
SLAM系统的前端,通俗说就是“看画面猜位移”。商场导视系统用得最多的是基于特征点法的视觉里程计,代表作就是ORB-SLAM3、VINS-Mono这一类方案。特征点法不直接使用整张图像,而是先在图像里找到一批容易跟踪的点,比如店铺招牌的角点、柱子的棱边、地砖缝隙、墙面纹理,然后用描述子描述这些点周围的信息,最后在相邻帧之间做特征匹配。
拿到特征点的匹配关系后,算法就可以推算帧间运动是旋转还是平移。原理是:同一个三维点在两个不同位置的相机里,会形成一对匹配的二维像素点。这些匹配点之间存在对极几何约束,用至少8对匹配点可以求出本质矩阵E,分解E得到帧间的旋转矩阵R和平移向量t。如果已知地图中三维点的坐标,问题进一步简化,用PnP算法只需要3对以上匹配点就能求解位姿。为了让结果稳定,实际项目里通常会输入几十对甚至上百对匹配点,再用RANSAC剔除错误匹配,最后做一次最小化重投影误差的优化。
3.2 后端优化:为什么位姿不能只看帧间匹配
如果只用帧间匹配,误差会一点点累积,跑几十米就漂得没法用了。这也是SLAM系统必须有后端优化的原因。
后端做的事情可以理解为“全局拧螺丝”。系统维护一批关键帧和地图点,每次有新的关键帧进来,就把相邻关键帧重新做一次集束调整,也就是Bundle Adjustment,用最小二乘把观测到的所有重投影误差压到最小。重投影误差的意思是:地图中一个三维点,理论上投影到某关键帧的某个像素位置,但因为位姿有误差,实际投影位置和观测像素位置差了一点点,优化目标就是让所有这类误差的和最小。这个优化一般用图优化框架做,比如g2o、Ceres,把相机位姿和地图点当成节点,把观测约束当成边,迭代求解。
商场场景里还有一个特殊难点:用户会坐扶梯上下楼。楼层切换时,视野内容会发生剧烈变化,相机断断续续丢失特征点。这时候IMU的价值就体现出来了——它可以在视觉退化时输出相对准确的短期位姿变化,等视野恢复后再重新对齐视觉特征。视觉惯性融合方案是室内AR导视的首选,既能解决单目的尺度问题,又能扛住快速运动带来的模糊。
3.3 回环检测:让系统知道自己回到了老地方
累计漂移是无法完全消除的,只能靠回环检测来“修正”。回环检测的作用是:当你走了一圈回到最初出发的位置时,系统能认出“这里我来过”,从而把整个轨迹的误差一次性拉回正确位置。
实现方式多用词袋模型,比如DBoW2。把每帧图像提取出的描述子聚成视觉单词,构建视觉词汇表,每帧图像用一组词的频率向量表示。当前帧到达时,用它的词频向量去检索历史关键帧,如果相似度超过阈值,就认为检测到了回环候选;再用几何一致性验证排除误检。一旦确认回环,就把当前帧和回环帧之间的约束加到后端图优化里,全局位姿会被重新调整,漂移显著减小。
在商场场景里,回环检测有坑。下一节我会专门讲,因为很多商场建筑的装修风格是高度重复的,连锁品牌的门头设计几乎一样,这对词袋模型来说是非常容易误判的挑战。
3.4 为什么商场里还需要“预建地图”这个外挂
实时SLAM再强,在首次启动时也需要初始化,单目方案还需要前端平移才能恢复尺度。对用户产品来说,这个“探索期”完全不可接受,你总不能让顾客拿着手机先左右晃两下再导航。预建地图的价值就在这里:系统启动后直接进入重定位阶段,用当前帧去匹配离线地图的关键帧,一次命中就恢复位姿,不需要初始化过程,也不需要实时构建全局地图。
有人可能会问,既然有预建地图,那在线还需要跑SLAM吗?答案是“需要,但跑的是简化版”。在线端不需要维护全局地图,只需要跟踪局部地图点,把当前帧和一小块局部地图对齐,输出高频位姿。这套架构在视觉SLAM里叫“轻量级重定位+局部跟踪”,计算量小、稳定性高,对代码架构和内存占用都非常友好。
4. AR图标的虚实注册:坐标系对齐与渲染叠加
4.1 四个坐标系和一条完整的投影链路
AR渲染最核心的问题是虚实注册,也就是把虚拟物体放到对应真实位置上去。这要求我们明白一个三维点从世界坐标系到屏幕像素坐标系的完整旅程。
这里涉及四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。一个三维点W,其坐标为Pw,先通过相机的外参矩阵(旋转R和平移t)变换到相机坐标系,得到Pc;然后通过相机的内参数(焦距fx、fy,光心cx、cy)和畸变模型,从相机坐标系的Pc投影到归一化平面,再变成像素坐标系的u和v。最终公式可以写成:像素坐标 = 内参矩阵 × 外参矩阵 × 世界坐标。AR渲染引擎每渲染一帧,就要用当前帧的位姿,把路标点、箭头起点终点这些虚拟物体的世界坐标投影为屏幕坐标。
这里有个细节很多人初次接触时会懵:SLAM输出的位姿定义的是“世界坐标系到相机坐标系的变换”,而OpenGL、Unity这些渲染引擎通常要求你给相机一个视图矩阵,含义是“把世界坐标变换到相机坐标”。这两者本质上是一回事,但对矩阵求逆、轴系定义的理解直接决定了你能否把AR元素稳定对齐。很多Demo在电脑上跑得好好的,一到手机端就“箭头满天飞”,八成就是矩阵传反了或者轴系没对齐。
4.2 相机标定:内参和畸变是虚实对齐的地基
相机标定这一步表面上不起眼,实际上是AR导视系统最容易忽略、牺牲最多的环节。实时应用里,手机上每支摄像头模组的焦距、光心、畸变参数都不同,同一款手机的前摄和后摄参数也不一样。不准确的内参会直接导致重投影误差变大,让虚拟路标看起来“贴不住”真实路面,轻微偏转就很明显。
从工程上建议做这么几步:离线对主力机型做标定,拿到精确内参;推导单目相机在用户端的实时自标定方案,利用已知地图点反推内参变化;对畸变严重的超广角镜头,要特别关注边缘区域的畸变校正效果。如果系统里用到华为AR Engine、ARCore、ARKit这类系统级能力,它们内部已经处理了一部分标定问题,但第三方标定仍然是排查问题时的第一道关口。
4.3 给渲染引擎喂位姿时的坐标系统一
把SLAM位姿送给渲染引擎时,我强烈建议做一次显式的坐标变换层,不要直接拿原始状态量去渲染。原因在于不同SLAM算法和渲染引擎的轴系定义不统一。有些算法用右手系,Y轴向上;有些AR SDK用右手系,Z轴向上;Unity则是左手系。不加转换直接把四元数和矩阵传进去,视觉表现就是虚拟物体在三个轴向上转来转去,时对时错。
我的做法是:定义一个统一的应用坐标系,比如“米制、右手系、X向前、Z向上”,SLAM输出统一转成这个坐标系,渲染引擎再转成自己的局部坐标系。中间用Quaternion和位移向量组装4x4矩阵,注意矩阵是行主序还是列主序,这一步错了,AR画面会极其酸爽。
4.4 虚实遮挡和地面贴合是体验的分水岭
AR效果好不好,不是虚拟物体画得多炫,而是“虚拟物体跟真实世界是否互相尊重”。地面箭头如果直接画在画面最上层,遇到一堵墙、一个人,挡不住,体验立马露馅;画在地砖下面,看起来又像沉下去了。这就是虚实遮挡问题。
简单方案是:把虚拟物体渲染在画面的半透明叠加层,不和真实场景做深度比较;进阶方案是给每个障碍物生成深度遮罩,渲染虚拟物体时用深度测试判断是否应该被遮挡。商场场景下,柱子和人是主要的遮挡来源。柱子是静态的,在建图时可以手动标注或自动提取,人则需要靠目标检测模型实时分割。如果算力不够,折中办法是让箭头尽量贴地、不要浮空,这样被遮挡的情况会少很多。
地面贴合也要注意:商场地面瓷砖反光,亮度变化大,用RGB-D相机或平面拟合算法提取地面平面后,把箭头投影到平面上。这里的关键是单应矩阵的计算,确保透视变形正确,让箭头看起来是“躺”在地面上的,而不是“贴”在屏幕上的。
5. 商场场景特有的精度陷阱与工程化调优
5.1 玻璃幕墙和镜面:视觉SLAM的“天敌”
商场最爱用的装修材料——大理石地砖、金属饰面、玻璃围栏,恰好都是视觉SLAM最头疼的材质。它们的共同特点是会产生强烈反光和镜面效应。反光区域里的特征点,前几帧看着还挺稳定,用户一移动,投影关系就彻底乱了,因为那些“特征点”根本不在真实三维表面上,而是在镜面虚像里。
处理办法有几个层面:一是建图阶段做人工标记,把大面积镜面区域从特征匹配中排除或降权;二是在线端做动态异常值剔除,当某些地图点的重投影误差突然变大,说明观察区域很可能出现了反光干扰,就把这些点的权重调低;三是在物理层面做文章,比如在镜面区域附近多布置一些带纹理的导视贴纸或视觉标记物,给算法提供可靠特征。
5.2 光照突变和曝光:从入口到中庭的过山车
商场的采光环境差异极大:入口处白天有强烈太阳光直射,中庭有人造灯带和广告屏,店铺内部又是另一套色温。用户从入口走到中庭,画面亮度可能在几秒内跳变好几个等级。相机自动曝光一调整,特征提取结果就会发生较大变化,之前提取到的一些特征点会消失,影响跟踪稳定性。
工程上的应对方案包括:对图像做自适应直方图均衡化,降低亮度变化的影响;特征提取时设置自适应阈值,在过曝区域降低角点检测阈值,在暗部提高对比度;前端的特征点分布调整,尽量让特征点均匀散布在画面中,避免某一区域过曝导致该区域完全没有特征。
5.3 动态人群:遮挡和误匹配的来源
商场高峰期的客流量非常恐怖,画面里到处都是行人。行人既遮挡了背景特征点,又可能因为衣服纹理产生大量动态特征点。如果这些动态特征点进入了匹配和优化,位置估计就会被往错误方向拉扯,严重时位姿会突然跳一下,AR画面跟着抖。
标准做法是动态物体检测与剔除。传统方案是用几何约束判断哪些特征点不符合静态场景假设,把它们排除;更现代的做法是在线跑一个轻量级语义分割网络,把人物、手提袋等常见动态物体直接mask掉。对于商场AR导视这种对实时性要求高的场景,语义分割可以在边缘盒子上用NPU加速,手机上则用更轻量的小模型。实测下来,动态特征剔除能明显降低位姿抖动率,尤其是原地转身和蹲下再站起来这类动作场景。
5.4 重复纹理:连锁店的门头让回环检测崩溃
前面提到过,商场里连锁品牌的店铺门头设计高度统一,很多还一字排开,相隔不到十米。这在回环检测里是致命问题:同样的招牌在不同位置出现,词袋模型会把它们当成同一个地方,误触发回环,导致位姿突然被“拽”到几米外。
应对策略有几种。一是回环候选必须通过几何一致性验证,只用特征匹配相似度是不够的,还要检查匹配点对应的空间位置是否自洽;二是加一个空间距离前置过滤,候选关键帧与当前关键帧的空间距离太远时,不当作回环;三是主动在地图上放置视觉Anchor,也就是设计独特的图案标签,比如ArUco码或定制品牌图形,作为回环的唯一可信依据。对于商场运营方来说,这种Anchor还可以兼顾品牌露出和活动营销,接受度较高。
5.5 定位质量监控与自动恢复机制
定位系统再稳,也难免出现短暂丢失。判断“定位丢了”不能靠拍脑袋,要设计量化指标。
我的项目里常用的指标有三个:当前帧成功匹配的地图点数量、平均重投影误差、位姿置信度得分。当匹配地图点数量低于阈值,比如20个,或者平均重投影误差超过5个像素,系统就判定为低置信度,进入警戒模式。警戒模式下,AR箭头透明度自动降低,避免用户被错误引导;同时后台启动局部重定位,尝试在当前帧和附近关键帧之间恢复匹配;如果连续3秒无法恢复,就切换到全局重定位,并在界面上提示用户“请环视四周”。这套自动降级机制能让系统从异常中自我恢复,而不是直接白屏或乱指。
5.6 性能预算和发热控制的实战经验
最后必须说性能。商场导视是面向普通用户的,用户手机性能参差不齐,最怕的就是App运行一会就发热降频、掉帧卡顿。视觉SLAM加AR渲染的算力开销系统性的规划不能少。
我实测过的中端Android手机跑一套自研视觉惯性SLAM加OpenGL渲染,720p分辨率、30帧输入条件下,特征提取大约占4到5毫秒,特征匹配和位姿求解占2到3毫秒,后端滑动窗口优化每帧摊销1到2毫秒,AR渲染占6到8毫秒,总体每帧处理在15毫秒上下,可以跑到30帧。如果把分辨率降到640x480,特征点数量控制在300以内,帧率还能更稳。但代价是定位精度下降,在光线暗的区域更容易丢失。所以实际项目中要留几个档位的配置,根据机型自动切换画质和算法密度。
发热是更难处理的问题。持续30帧全负荷跑SLAM加AR,多数手机在10到15分钟后会发热降频。我的经验是:加一个帧率自适应机制,检测到温度升高后,逐步把AR渲染分辨率降一档,同时减少特征点数量;后台优化频率也可以降低,从每帧优化改成每隔三帧优化一次。用户感受到的可能是画质轻微下降,但换来的是更长的稳定工作时间,这个取舍完全值得。
最后再分享一点个人的实际体会
做AR导视系统最大的感悟是:算法永远只是项目的一部分,甚至不是最难的一部分。真正的硬骨头是稳定性、兼容性、场景适配这些“脏活累活”。同一套SLAM算法,在测试环境中跑得再漂亮,放到商场真实环境里都可能被一段玻璃幕墙或一排镜子打到“生活不能自理”。所以在方案落地前,一定要尽量多做真实场景的走测,而且要走不同时段、不同天气、不同人流量,把问题暴露在测试阶段。
如果你正准备启动类似项目,我建议从一个小范围试点切入:比如先选商场的某一层,做完离线地图,跑通在线定位和AR导航的核心闭环,再逐步扩展楼层和功能。同时别忽视POI数据的维护流程——商场店铺变动频繁,地图更新如果跟不上,再好的AR体验也会被一个“已关闭店铺”的导航结果毁掉。
AR+SLAM在商场导视这个赛道,技术成熟度已经够用了,真正比拼的是工程化能力和产品细节的打磨。希望这篇偏实战的技术拆解,能帮你少走一些我走过的弯路。