想象你是一家快递公司的区域主管,手下一批新快递员被派往一栋从没进去过的大楼送件。他们没有地图,不知道自己在哪,也不知道目的地怎么走。聪明的快递员会一边走一边记:“左转第三条走廊是会议室,电梯口右手边是安全通道”——这叫同时定位与建图(SLAM)。走完一遍,他脑中有了草图——这叫地图表示;第二次进楼,他靠路标确认“我现在在茶水间附近”——这叫定位。而 Nav2,就是快递公司总部那套标准化的调度系统:接单、规划路线、避障、纠错、送达。本文就用这个快递员送件的故事,带你零基础看懂 SLAM 与 Nav2,以及它们如何在仓储 AMR 等真实产品中落地。

岗位关联

掌握 SLAM 与 Nav2 是机器人系统集成工程师的核心技能,直接决定 AMR 产品能否从实验室稳定跑进客户现场。

目录
  1. 可视化演示
  2. SLAM核心原理
  3. 地图表示方法
  4. AMCL定位算法
  5. Nav2系统架构
  6. 代价地图机制
  7. 行为树导航
  8. 工程化部署实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

可视化展示Nav2导航框架的SLAM建图定位、全局路径规划与行为树导航架构,交互调节参数体验机器人自主导航核心流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

SLAM建图与定位过程 激光雷达扫描构建环境栅格地图 AMCL粒子滤波实现实时定位 p(x_t|z_t,x_{t-1}) 机器人同步定位与建图是自主导航基础

SLAM核心原理

快递员第一次走进陌生大楼,看不到全貌,只有眼睛扫过的局部场景和脚下走过的路。他每走一步,就把新看到的走廊、门牌、消防栓装进记忆,同时靠“走了多少步、转了几个弯”的体感估算自己大概在哪——但他很快发现体感会骗人,走得越远偏差越大,必须时不时用“看见熟悉的东西”来校正自己。

这正是 SLAM(Simultaneous Localization and Mapping,同时定位与建图)的本质:机器人进入未知环境,一边用激光雷达或相机感知周围(相当于眼睛),一边用里程计记录运动(相当于体感),然后同步回答两个问题:“我在哪里?”和“周围长什么样?”。而这两个问题互为前提——不知道地图就无法精确定位,不知道位置就无法正确建图,只能“鸡生蛋、蛋生鸡”地联合求解。

在技术实现上,SLAM 被建模为一个贝叶斯估计问题:给定 1 到 t 时刻的全部传感器观测 z 和运动控制输入 u,求解环境地图 m 与机器人轨迹 x 的联合后验概率分布。

实际工程中,SLAM 系统会把问题拆成前端(帧间匹配、回环检测)和后端(图优化)。就像快递员既要处理“眼前这几步能不能接上”,也要定期掏出整张草图回头检查:“这扇门我在记忆里见过两次,位置对得上吗?”对得上,说明整栋楼的结构画得靠谱。

p(x1:t,m∣z1:t,u1:t)\displaystyle p(x_{1:t}, m \mid z_{1:t}, u_{1:t})
这个公式翻译成人话就是:在看了这么多“眼睛看到的画面”和“体感记录”之后,机器人最可能走过怎样的路线、画出怎样的地图。
  1. 已知条件把每一时刻的传感器观测和运动指令收集起来,作为推断的依据
    z1:t, u1:tz_{1:t}, \ u_{1:t}
  2. 待求未知量同时求解机器人历史位姿轨迹与环境地图两个未知数
    x1:t, mx_{1:t}, \ m
  3. 联合后验概率在已知全部观测和运动输入的前提下,轨迹与地图的联合概率分布
    p(x1:t, m∣z1:t, u1:t)p(x_{1:t}, \ m \mid z_{1:t}, \ u_{1:t})

地图表示方法

快递员画草图有许多画法:有人画精确比例图,连每扇门多宽都标出来;有人只画拓扑关系——“从电梯出来左拐到底就是大会议室”,不标距离,只记连通性。两种画法各有适用场景,机器人世界也是如此。

在机器人里,第一种对应栅格地图(Occupancy Grid Map):把环境切成等大的小方格,每个格子记录一个“被占据概率”。第二种对应拓扑地图(Topological Map):用节点代表地点、边代表通路,只关心连通关系。Nav2 系列最常用的是栅格地图——它天然适合像素级的路径搜索和避障,就像快递员拿着一张精确平面图,能提前算出最宽、最安全的路。

栅格地图的更新基于对数几率(log-odds)累加公式:

除了地图本身,机器人还必须知道“这张图贴在地图坐标系的哪个位置”,这就是 TF 坐标变换:机器人基座、激光雷达、地图各有一套坐标系,TF 负责在它们之间换算。坐标没配好,图就贴歪了,快递员对着错位的平面图自然找不到门——地图精度评估在部署时永远是第一道检查关卡。

l(mi∣x1:t,z1:t)=l(mi∣x1:t−1,z1:t−1)+log⁡p(mi∣zt)1−p(mi∣zt)−l0\displaystyle l(m_i \mid x_{1:t}, z_{1:t}) = l(m_i \mid x_{1:t-1}, z_{1:t-1}) + \log\frac{p(m_i \mid z_t)}{1 - p(m_i \mid z_t)} - l_0
每个格子的“被占用信心值”不断累加新证据:激光扫到它就加分,扫空就减分,多走几遍格子状态就越来越可信。
  1. 历史累计置信度到 t-1 时刻为止该格子积累的对数置信值
    l(mi∣x1:t−1,z1:t−1)l(m_i \mid x_{1:t-1}, z_{1:t-1})
  2. 本次观测增量当前这次扫描对格子的新证据,取对数比值形式
    log⁡p(mi∣zt)1−p(mi∣zt)\log\frac{p(m_i \mid z_t)}{1 - p(m_i \mid z_t)}
  3. 先验偏置修正减去初始先验值,避免没有任何观测时格子仍有偏置
    l0l_0

AMCL定位算法

快递员第二次进同一栋楼,手里已有草图,问题变成:“此刻我站在哪?”他左右看看,对照记忆:左手茶水间、右手电梯口——“哦,我在三层走廊中段”。这个“对着地图认路”的动作在机器人里就是定位,AMCL(自适应蒙特卡洛定位)是 ROS 生态最常用的实现。

AMCL 的核心是粒子滤波。想象你在楼层平面图上撒了几百个“猜测点”(粒子),每个粒子代表一个“我可能在这”的假设。机器人每走一步,所有粒子跟着移动并加入噪声(模拟体感误差);每当机器人用激光扫一圈,就把每个粒子位置的“预测扫描”与真实扫描比对,吻合的加分、不吻合的减分,最后按权重重采样,留下好粒子、淘汰差粒子。

粒子权重的计算公式:

AMCL 还有一个关键能力——全局重定位。当机器人被搬到陌生位置或被人为推离原位时,粒子会在地图上重新均匀撒开,像快递员被人蒙住眼睛转了十圈,只能睁眼后重新认路。粒子重新散开再收敛的过程,就是机器人“我是谁、我在哪”的自我修复。

wt(i)=η⋅p(zt∣xt(i),m)\displaystyle w_t^{(i)} = \eta \cdot p(z_t \mid x_t^{(i)}, m)
第 i 个粒子在 t 时刻的权重,正比于“如果机器人真的在这个位置,看到当前这圈激光扫描的可能性”。
  1. 粒子假设位姿第 i 个粒子猜测的机器人当前位置
    xt(i)x_t^{(i)}
  2. 观测似然计算在这个假设位姿上对照地图 m,产生当前观测 z_t 的可能性
    p(zt∣xt(i), m)p(z_t \mid x_t^{(i)}, \ m)
  3. 权重归一化乘上归一化系数,使全部粒子的权重之和等于 1
    η\eta

Nav2系统架构

快递公司决定把派件流程标准化时,就有了“调度中枢”:接单系统知道目的地(目标点),路线规划器算出最优路线(全局规划),执行员沿路行走并微调(局部控制),遇到堵路临时绕道(行为树决策)。Nav2 就是 ROS2 生态里的这套“调度中枢”。

Nav2 采用分层架构,核心模块包括:Planner(全局路径规划器)、Controller(局部轨迹控制器)、Costmap(代价地图)、Behavior Tree(行为树)与 BT Navigator(行为树导航器)。用户通过 Action 服务下发导航目标点,底层各模块通过 ROS2 话题与服务通信协作,整套框架像快递公司的“订单—路线—执行—反馈”闭环一样各司其职。

全局规划最常见的算法是 A*,它在地图网格上搜索代价最小的路径:

Nav2 的模块协作就像快递公司的标准流程:用户下单(发送目标点),Planner 定路线(全局规划),Controller 执行并实时避障(局部控制),行为树全程监控——堵了重新规划,走偏了重新定位,一切都可替换、可扩展。

f(n)=g(n)+h(n)\displaystyle f(n) = g(n) + h(n)
f 是节点 n 的总代价:从起点走到 n 的实际代价 g,加上从 n 到终点的估计代价 h,f 越小越优先扩展它,搜索方向始终朝终点推进。
  1. 实际代价从起点到达当前节点的累计路径代价
    g(n)g(n)
  2. 启发式估计从当前节点到终点的直线距离等估算值
    h(n)h(n)
  3. 总代价排序二者相加得到 f(n),优先队列每次取 f 最小的节点扩展
    f(n)=g(n)+h(n)f(n) = g(n) + h(n)

代价地图机制

快递员虽然认路,但走廊里可能临时堆着货箱、有同事推车经过。他脑子里的草图需要实时叠加一层“今天的临时状况”:哪块地能放心走,哪块有纸箱要绕行,哪块离墙角太近不能贴着走。这层动态信息就是代价地图(Costmap)。

Nav2 维护两张代价地图:全局代价地图覆盖整个地图,供全局规划使用;局部代价地图以机器人为中心的小窗口,供实时避障使用。每一张地图又分多层:静态层(Static Layer,来自 SLAM 建好的地图)、障碍物层(Obstacle Layer,来自实时传感器)、膨胀层(Inflation Layer,把障碍物“吹胖”一圈,让机器人保持安全距离)。

膨胀层的代价随距离呈指数衰减:

调膨胀半径就像调快递员的“安全距离感”:半径调大,他走路保守不蹭箱,但窄通道可能直接判为不可通行;半径调小,他敢钻窄缝,碰撞风险却上升。现场工程师最常听到的“明明能过却说不能过”,多半就是膨胀参数没调好。

c(d)={255,d<rins252⋅e−α(d−rins),rins≤d≤rinfl0,d>rinfl\displaystyle c(d) = \begin{cases} 255, & d < r_{ins} \\ 252 \cdot e^{-\alpha(d - r_{ins})}, & r_{ins} \le d \le r_{infl} \\ 0, & d > r_{infl} \end{cases}
离障碍物越近代价越高,规划器自动避开高代价区域,就像正常人不会贴着墙根走路。
  1. 致命碰撞区距离小于机器人内切半径,代价直接拉满 255
    c(d)=255, d<rinsc(d) = 255, \ d < r_{ins}
  2. 指数衰减区在膨胀半径范围内,代价随距离按指数规律下降
    c(d)=252⋅e−α(d−rins)c(d) = 252 \cdot e^{-\alpha(d - r_{ins})}
  3. 安全区之外超出膨胀半径,代价归零,可自由规划
    c(d)=0, d>rinflc(d) = 0, \ d > r_{infl}

行为树导航

快递员遇突发状况时的决策逻辑,值得画成一张流程图:先按原路线走;前方被堵,退回来换备用路线;备用路线也堵,原地转圈找新路;再不行,通知站点请求人工介入。这张“流程图”在 Nav2 里就是行为树(Behavior Tree)。

行为树是一种树状结构:叶子节点是具体动作(前进、旋转、重规划),控制节点决定如何组合叶子(顺序执行、选择执行、并行执行)。BT Navigator 是 Nav2 中负责执行行为树的导航器,它加载一个 XML 文件定义树结构,把“按计划走—遇到问题—恢复—再试”的整套逻辑串起来。

一颗典型的导航行为树可以形式化表达为:

自定义插件是 BT Navigator 的灵魂:普通场景用官方自带节点就够;但客户要求“送到门口后必须响铃三秒”,你就要写一个自定义行为节点,插到行为树的“送达”位置。这就像快递公司在流程图上加一条新分支:“签收后,按门铃,等待开门确认”。

BT=Fallback(Sequence(Plan,FollowPath),Recovery)\displaystyle \mathrm{BT} = \mathrm{Fallback}\left( \mathrm{Sequence}\left( \mathrm{Plan}, \mathrm{FollowPath} \right), \mathrm{Recovery} \right)
整棵树的意思是:优先尝试“先规划再跟路”的正向流程;一旦某个环节失败,就转入恢复分支执行兜底策略。
  1. 正向流程子序列先执行路径规划,成功后再沿规划路径巡航
    Sequence(Plan,FollowPath)\mathrm{Sequence}(\mathrm{Plan}, \mathrm{FollowPath})
  2. 失败回退机制Fallback 节点表示子节点失败后尝试下一个候选分支
    Fallback(…,Recovery)\mathrm{Fallback}(\dots, \mathrm{Recovery})
  3. 恢复动作集合旋转、后退、重新规划等故障恢复行为组成的子树
    Recovery\mathrm{Recovery}

工程化部署实践

从实验室到客户现场,Nav2 项目的难度曲线陡然上升:实验室地面平整、光线稳定、人员稀少;客户仓库地面有油污、货架反光、托盘随处放。快递公司总部派发的不是一个“能认路的快递员”,而是一整套“在不同大楼都稳定送件”的体系——这就是工程化部署。

参数调优是最直接的一环:最大速度、加速度、转弯半径、膨胀半径、粒子数量、规划超时时间……每个参数都像快递员的工作风格设置。调优方法论遵循固定套路:先确定场景约束(通道宽度、载重、人流),再从安全相关参数入手,逐项验证并记录基线。盲目乱调只会让系统在某一指标上变好、在另一指标上崩溃。

稳定性保障需要冗余与恢复设计:定位丢失时自动触发全局重定位、路径规划超时自动换规划器重试、行为树长时间无响应时看门狗强制重启。衡量整套系统可靠性的核心指标是可用率:

AMR 产品化的最后一步是监控运维:给每台机器人装“体检指标”——定位置信度、规划成功率、绕障次数。这些数据回传云端,像快递公司看每个快递员的数据面板:谁总送错(定位差)、谁总被堵(规划差),然后针对性优化。这就是机器人系统集成工程师的日常:不是写完代码就完事,而是让整套系统在真实世界里持续稳定地跑。

A=MTBFMTBF+MTTR\displaystyle A = \frac{MTBF}{MTBF + MTTR}
A 是系统可用率:平均无故障时间占“平均无故障时间 + 平均修复时间”总和的比例,越接近 1 代表系统越可靠。
  1. 平均无故障时间两次故障之间系统正常工作的平均时长
    MTBFMTBF
  2. 平均修复时间从故障发生到系统恢复的平均耗时
    MTTRMTTR
  3. 可用率计算无故障时间在总时间中的占比,衡量系统可用程度
    A=MTBFMTBF+MTTRA = \frac{MTBF}{MTBF + MTTR}

AI 应用场景

仓储物流 AMR:摆脱磁条束缚的自主搬运

阶段:系统集成与工程化部署

解决的问题:传统 AGV 依赖铺设磁条或二维码导航,改造地面成本高、路线固定不灵活;采用 Nav2 的 AMR 只需先跑一遍建图,之后自主规划路径,路线调整只改代码不动地面。

具体案例:某电商仓库 5000 平方米场地,工程师用 SLAM 工具建图、AMCL 定位、Nav2 导航,将 30 台 AMR 接入拣选流程。快递员“送件路线”随时可改:货架调整后重新扫描局部地图,调度系统即时下发新任务,单任务平均节拍从 90 秒压到 50 秒。

医院配送机器人:让行策略与参数调优

阶段:参数调优与稳定性保障

解决的问题:医院走廊人流密集、轮椅与病床动态穿行,导航参数必须走“保守路线”:降低速度、加大膨胀半径、提高重规划频率,行为树需要增加“让人先行”的等待分支。

具体案例:某三甲医院部署 12 台配送机器人,高峰期走廊人流量大。工程师把局部代价地图膨胀半径从 0.2 米调到 0.35 米,最大速度从 1.2 米每秒降到 0.8 米每秒,并在行为树中插入“检测到前方密集人群→靠边等待”节点。两个月后配送成功率从 92% 提升到 99.2%,投诉率大幅下降。

工厂巡检机器人:导航健康监控体系

阶段:线上监控运维

解决的问题:工厂环境频繁变化——货架移位、地面油污、临时围挡,静态地图会逐渐“过期”。需要持续监控定位置信度与规划成功率,指标恶化时自动触发重定位或重新建图。

具体案例:某汽车零部件厂为 8 台巡检机器人接入导航健康看板,实时展示 AMCL 平均粒子权重、全局规划成功率、绕障次数三类指标。当定位置信度低于阈值时自动触发重定位流程,全年非计划停机时间下降 70%,巡检覆盖率从 85% 提升到 98%。

Python 演示

python96 行
"""简化版蒙特卡洛定位:用粒子滤波让机器人猜出自己在哪"""import randomimport math  class Robot:    """模拟真实机器人:运动与测量都带噪声"""     def __init__(self, x, y):        self.x = x        self.y = y     def move(self, dx, dy):        self.x += dx + random.gauss(0, 0.05)        self.y += dy + random.gauss(0, 0.05)        return self.x, self.y     def sense(self, landmarks):        return [math.hypot(self.x - lx, self.y - ly) + random.gauss(0, 0.05)                for lx, ly in landmarks]  class Particle:    """单个粒子:一个对机器人位姿的猜测"""     def __init__(self, x, y):        self.x = x        self.y = y        self.weight = 1.0     def move(self, dx, dy):        self.x += dx + random.gauss(0, 0.1)        self.y += dy + random.gauss(0, 0.1)     def update_weight(self, measurements, landmarks):        self.weight = 1.0        for z, (lx, ly) in zip(measurements, landmarks):            pred = math.hypot(self.x - lx, self.y - ly)            diff = abs(z - pred)            self.weight *= math.exp(-(diff * diff) / (2 * 0.1 * 0.1))  def resample(particles):    """轮盘赌重采样:好粒子克隆,差粒子淘汰"""    total = sum(p.weight for p in particles)    if total <= 0:        for p in particles:            p.weight = 1.0        total = len(particles)    new_particles = []    step = total / len(particles)    offset = random.uniform(0, step)    idx = 0    acc = particles[0].weight    for _ in range(len(particles)):        while acc < offset:            idx = (idx + 1) % len(particles)            acc += particles[idx].weight        new_particles.append(Particle(particles[idx].x, particles[idx].y))        offset += step    return new_particles  def main():    random.seed(42)    # 四个地标:模拟仓库四角的货架柱子    landmarks = [(2.0, 2.0), (8.0, 2.0), (2.0, 8.0), (8.0, 8.0)]    robot = Robot(5.0, 5.0)    # 初始:粒子均匀撒满地图,代表"完全不知道自己在哪"    particles = [Particle(random.uniform(0, 10), random.uniform(0, 10))                 for _ in range(300)]     for t in range(15):        dx, dy = 0.2, 0.15        robot.move(dx, dy)        for p in particles:            p.move(dx, dy)        measurements = robot.sense(landmarks)        for p in particles:            p.update_weight(measurements, landmarks)        particles = resample(particles)     avg_x = sum(p.x for p in particles) / len(particles)    avg_y = sum(p.y for p in particles) / len(particles)    err = math.hypot(avg_x - robot.x, avg_y - robot.y)    print("真实位置: (%.2f, %.2f)" % (robot.x, robot.y))    print("估计位置: (%.2f, %.2f)" % (avg_x, avg_y))    print("定位误差: %.2f 米" % err)    if err < 1.0:        print("判断: 定位成功,粒子收敛到了真实位置附近")    else:        print("判断: 定位失败,建议增加粒子数或改进传感器模型")  if __name__ == "__main__":    main()
目的:用 300 个粒子模拟 AMCL 定位过程,展示机器人从“完全不知道自己在哪”到“粒子收敛到真实位置附近”的完整链路。
  1. robot.move(dx, dy)真实机器人运动,每次移动都叠加高斯噪声,模拟里程计打滑。
  2. Particle.move(dx, dy)粒子跟随运动指令,噪声比真实机器人更大,模拟体感估算的不确定性。
  3. robot.sense(landmarks)返回机器人到四个地标的距离测量,同样带噪声,模拟激光测距误差。
  4. p.update_weight(measurements, landmarks)对比“粒子预测距离”与“真实测量距离”,差异越小权重越大。
  5. resample(particles)轮盘赌重采样,权重大的粒子被克隆、权重小的粒子被淘汰,如同 AMCL 里的优胜劣汰。
  6. err < 1.0判断平均粒子位置与真实位置的偏差是否小于 1 米,验证定位是否成功。

常见误区

误区“做机器人导航前,得先让机器人把地图建得 100% 精确,否则导航没法用。地图有一点模糊就要重新扫一遍。”

正解SLAM 本身是“边运动边建图边纠正”的过程,地图精度只需满足导航需求——能区分墙、障碍物和空地就够了。Nav2 导航时,代价地图的障碍物层还会实时叠加动态传感器信息,弥补静态地图的不足。就像快递员不需要记住每扇门的宽度,只要知道“哪条走廊通向哪”就能完成送件。

为何常见:人的直觉是“地图先行”,因为我们在地图 App 里看到的都是精度很高的成品地图,很容易忽略 SLAM 本质上是“同时”进行的。

误区“AMCL 的粒子数设成 5000 甚至 10000,定位精度一定更高,毕竟猜得越多越容易猜中。”

正解粒子数增加确实能提升精度,但收益边际递减,计算开销却线性上涨。实际工程中 300~500 个粒子在多数室内场景已足够,真正决定精度的是观测模型准不准、运动模型有没有偏差。粒子滤波是“采样式近似”而非穷举,堆粒子不如校准传感器模型。

为何常见:“枚举所有可能”的直觉根深蒂固,忽略了实时系统里计算资源是有限预算,精度与延迟必须做折中。

误区“Nav2 不是都配好了吗?启动起来就能导航。出了问题就调调速度参数,实在不行重启一下。”

正解Nav2 是一个框架而非成品:行为树要按场景裁剪、代价地图参数要按路面调、规划器要按环境选(宽阔走廊用 A*,狭窄通道考虑混合 A*)。真正做系统集成,恰恰是在 Nav2 的“积木”上搭出适合业务场景的“房子”,这需要理解每个模块的工作原理。

为何常见:ROS 生态的“一键启动”体验让不少人误以为它开箱即用,忽视了“框架”和“产品”之间巨大的工程距离。

误区“行为树结构难懂、XML 写起来又长,用传统状态机照样能实现导航逻辑,没必要上行为树。”

正解行为树的优势在于可视化、可复用、天然支持失败回退:每个节点职责单一,整棵树结构一目了然,新增一条恢复策略只需插入一个分支。状态机节点一多,状态转移矩阵复杂度爆炸。Nav2 选行为树正是因为导航是“流程固定但异常情况多”的场景。

为何常见:初看行为树 XML 文件确实繁琐,容易低估它在组织复杂决策逻辑上的长期价值,特别是团队协作时读树比读状态转移图直观得多。

面试题

Q1. 机器人 SLAM 中的"SLAM"全称含义是?

单选题 · easy

  • A.同时完成定位与地图构建← 正确答案
  • B.同步执行扫描与地图拼接
  • C.传感器融合与里程计标定
  • D.全局路径规划与运动控制

答案:A。SLAM 是 Simultaneous Localization and Mapping 的缩写,强调“同时”完成定位与建图两个互为前提的任务,就像快递员一边认路一边画图。B 少了定位环节,C 只是传感器处理,D 属于导航范畴而非建图。

Q2. 栅格地图将环境空间离散为?

单选题 · easy

  • A.连续坐标与自由空间
  • B.节点与边的拓扑结构
  • C.等大小方格的占据概率← 正确答案
  • D.三维网格与纹理贴图

答案:C。栅格地图把环境切成等大小方格,每格存一个占据概率值,便于路径搜索与避障。A 是连续地图的思路,B 是拓扑地图的定义,D 是三维重建的描述。

Q3. AMCL 定位算法基于哪种滤波方法?

单选题 · mid

  • A.卡尔曼滤波框架
  • B.粒子滤波框架← 正确答案
  • C.滑动窗口滤波框架
  • D.直方图滤波框架

答案:B。AMCL 全称自适应蒙特卡洛定位,核心是粒子滤波——用一组带权重的离散粒子近似位姿分布。卡尔曼滤波假设高斯分布,不适合走廊等非线性非高斯场景,粒子滤波则没有这个限制。

Q4. AMCL 粒子权重衡量的是?

单选题 · mid

  • A.粒子运动速度大小
  • B.粒子在地图的密度
  • C.粒子传感器的能耗
  • D.位姿假设与观测吻合度← 正确答案

答案:D。粒子权重 = 在该粒子假设位姿下产生当前传感器观测的可能性。观测越吻合权重越高,下一次重采样时越有可能被保留,这正是“好粒子聚集、坏粒子淘汰”的机制。

Q5. Nav2 全局路径规划的主要职责是?

单选题 · mid

  • A.实时躲避动态的障碍物
  • B.生成全局最优行驶路线← 正确答案
  • C.控制底盘电机转速
  • D.维护车间通信网络

答案:B。全局规划器在代价地图上搜索从起点到目标点的最优路径,常用 A* 算法。实时避障由局部控制器完成,电机控制属于底层驱动,通信网络不归规划器管。

Q6. 代价地图膨胀层的作用是?

单选题 · mid

  • A.平滑障碍物的边缘线
  • B.提高栅格地图分辨率
  • C.障碍物外围生成安全梯度← 正确答案
  • D.压缩地图节省存储空间

答案:C。膨胀层在障碍物周围生成从高到低递减的代价梯度,让规划器自动远离障碍物、保持安全距离。平滑边缘、提高分辨率、压缩存储都不是膨胀层的职责。

Q7. 行为树 Sequence 节点的执行逻辑是?

单选题 · hard

  • A.全部子节点并行执行
  • B.依次执行有失败则整体失败← 正确答案
  • C.任一个子节点成功即成功
  • D.随机挑选子节点来执行

答案:B。Sequence 按顺序执行所有子节点,任何一个失败就返回失败——像快递流程“先规划路线,再沿路线走”,规划失败就不必走了。并行是 Parallel 节点,任一成功即成功是 Fallback 节点。

Q8. 下列哪些属于 Nav2 的核心模块?(多选)

多选题 · mid

  • A.全局路径规划器← 正确答案
  • B.局部轨迹控制器← 正确答案
  • C.编译优化器
  • D.多层代价地图← 正确答案

答案:ABD。Nav2 的四大核心模块是全局规划器、局部控制器、代价地图与行为树导航器。编译优化器属于软件工程工具,与机器人导航无关。

Q9. 提升 AMR 导航稳定性的工程手段包括?(多选)

多选题 · hard

  • A.定位丢失时自动重定位← 正确答案
  • B.规划超时自动重新规划← 正确答案
  • C.无限提高机器人最大速度
  • D.实时监控导航健康指标← 正确答案

答案:ABD。自动重定位和重新规划属于冗余恢复设计,监控健康指标能提前发现劣化趋势。盲目提速只会增加碰撞与打滑风险,稳定性的核心是可控而非更快。

Q10. 关于 Nav2 参数调优的正确观点有?(多选)

多选题 · hard

  • A.膨胀半径越大一定越安全
  • B.调参需结合场景按序验证← 正确答案
  • C.机器人的速度越快效率越高
  • D.每次调整后记录并回测基线← 正确答案

答案:BD。膨胀半径过大虽然保守,但会让窄通道判为不可通行,反而降低可用性;速度也不是越快越好。正确做法是结合场景约束按序调参,每改一项都记录并回测对比,建立可复现的调参基线。