news 2026/8/21 11:21:25

第221篇 Lattice Planner——基于状态格子的局部规划

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第221篇 Lattice Planner——基于状态格子的局部规划

局部规划系列讲了DWA和TEB。今天讲一个思路不太一样的方法——Lattice Planner(状态格规划器)。说白了,Lattice Planner把连续的空间离散化成一组"状态格子",然后在这些格子上用A*搜索路径。和DWA的区别是:DWA在速度空间中采样,Lattice Planner在位姿空间中搜索。

Lattice Planner最早用于自动驾驶领域——Stanford在DARPA挑战赛中的无人车Junior就用了Lattice Planner。后来被广泛应用到各种移动机器人和自动驾驶系统中。

一、Lattice Planner的原理

Lattice Planner的核心是"状态格子"。什么是状态格子?就是在(x, y, theta)空间中均匀取一组离散点。每个格子代表机器人的一个可能位姿。

但和普通的2D栅格不同,Lattice Planner的格子包含了朝向信息theta。这意味着同一个(x, y)位置,不同朝向是不同的状态。这让Lattice Planner能处理非完整约束(比如车不能横向移动)。

规划流程:

  1. 预计算运动基元:离线计算一组从标准起点出发能到达的轨迹片段(motion primitives)。每个基元连接两个状态格子。
  2. 在线搜索:收到起点和终点后,在状态格子上用A*搜索——从起点格子开始,沿着运动基元跳到相邻格子,直到到达终点格子。
  3. 碰撞检测:搜索时对每条运动基元做碰撞检测——检查基元经过的所有点是否在障碍物中。
class LatticePlanner: def __init__(self, motion_primitives): self.primitives = motion_primitives # 预计算的运动基元 self.lattice = StateLattice(resolution_xy=0.5, resolution_theta=15) def plan(self, start, goal, occupancy_grid): open_set = PriorityQueue() open_set.put(start, heuristic(start, goal)) while not open_set.empty(): state = open_set.get() if state == goal: return self.extract_path(state) for primitive in self.primitives: next_state = apply(state, primitive) if not collision_check(primitive, occupancy_grid): cost = state.cost + primitive.cost if cost < next_state.cost: next_state.cost = cost open_set.put(next_state, cost + heuristic(next_state, goal)) return None

二、运动基元的设计

运动基元是Lattice Planner的核心。基元的质量直接决定规划效果。

怎么生成运动基元?常用方法是模拟机器人的运动学模型。比如对差速驱动机器人,从标准起点(0,0,0)出发,给不同的(v, omega)组合仿真固定时间T,得到一组终点。每条轨迹就是一个运动基元。

基元的数量和分辨率:基元太少,搜索空间受限,可能找不到好的路径。基元太多,搜索慢。工程上一般每个状态格子有6-12个运动基元(前左、前右、直走、原地左转、原地右转等)。

基元的连接性:基元要满足"格子对齐"——基元的终点必须恰好落在状态格子上。如果不巧落在两个格子之间,需要snap到最近的格子。这个snap操作可能引入误差——分辨率越粗,误差越大。

# 典型的运动基元(差速驱动) # 直线前进: v=1.0, omega=0, T=1s # 左转弯: v=0.8, omega=30deg/s, T=1s # 右转弯: v=0.8, omega=-30deg/s, T=1s # 原地左转: v=0, omega=45deg/s, T=1s # 原地右转: v=0, omega=-45deg/s, T=1s # 倒车: v=-0.5, omega=0, T=1s

三、Lattice Planner的优劣

Lattice Planner的优势在于运动学约束天然满足。因为运动基元本身就是根据机器人运动学模型生成的,所以搜索出来的路径一定满足运动学约束——不需要额外处理。

另一个优势是可预测性。搜索空间是离散的,A*保证找到最优解(在离散空间中)。计算时间有上界——取决于状态格子数量和基元数量。

劣势也很明显。离散化误差——状态格子是离散的,真实路径可能不在格子上。分辨率越粗,误差越大。但分辨率太细,状态数量暴增(x * y * theta),搜索变慢。

维度问题:加了theta维度后,状态数量是2D栅格的几十倍(theta通常离散为24-72个方向)。在大规模地图中,搜索时间可能不可接受。

预计算依赖:运动基元需要离线预计算。如果机器人的运动学参数变了(比如换了底盘),基元需要重新计算。

四、面试实战

Q:Lattice Planner和DWA有什么区别?A:DWA在速度空间中采样,前向仿真后选最优速度。Lattice Planner在位姿空间中搜索,用A*在离散的状态格子上找最优路径。DWA更灵活(速度连续),Lattice Planner更有保证(离散最优)。

Q:Lattice Planner和A*在栅格地图上搜索有什么区别?A:栅格A在2D(x,y)空间中搜索,不考虑朝向。Lattice Planner在3D(x,y,theta)空间中搜索,考虑了朝向。Lattice Planner的运动基元满足运动学约束,栅格A的8方向或4方向移动不满足。

Q:实际项目中用过Lattice Planner吗?A:用过。做园区无人车低速导航时用的Lattice Planner。全局用A*在2D栅格上规划粗略路径,局部用Lattice Planner在状态格子中搜索满足Ackermann运动学的轨迹。状态分辨率0.5m/15度,运动基元12个。搜索时间约20-50ms。

Q:Lattice Planner在自动驾驶中还在用吗?A:还在用,但通常作为备选方案。主流的自动驾驶系统更倾向于用优化方法(比如QP、EM Planner)做局部规划。但Lattice Planner在低速场景(园区、港口)中仍然很常见——实现简单,行为可预测。

Q:Lattice Planner怎么处理倒车?A:在运动基元中包含倒车基元就行。但要注意:倒车时朝向和运动方向相反,运动学模型不同。工程上需要分别为前进和倒车生成不同的基元集合。搜索时A*的启发函数也要考虑——倒车代价通常设得比前进高,鼓励机器人优先前进。

小结

Lattice Planner的核心:把(x,y,theta)空间离散成状态格子,预计算运动基元,用A*在状态格子上搜索满足运动学约束的路径。

优势:运动学约束天然满足,可预测性好,离散最优。 劣势:离散化误差,维度问题(加了theta后状态数量暴增),预计算依赖。

Lattice Planner是自动驾驶和移动机器人中经典的局部规划方法之一。Stanford的Junior、Google早期的无人车、很多港口AGV系统都用过Lattice Planner。虽然现在优化方法越来越流行,但Lattice Planner因为实现简单、行为可预测,在工业界仍然有很强的生命力。理解Lattice Planner之后,下一篇讲势场法——另一种经典的局部规划方法。


如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。

「机器人软件开发面试·从入门到精通」连载系列

上一篇:第220篇 TEB局部规划器——用图优化生成局部轨迹

下一篇预告:第222篇 势场法——经典但仍有生命力的局部规划方法

有任何问题欢迎评论区留言,我会尽量回复。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 11:20:30

PROFINET工业以太网:从核心原理到实战配置与诊断

1. 先搞清楚PROFINET到底是什么&#xff0c;以及它和普通以太网的区别 如果你在工业自动化、PLC编程或者设备联网的领域里&#xff0c;听到“PROFINET”这个词&#xff0c;第一反应可能是“这不就是工业用的以太网吗&#xff1f;”。这个理解对了一半&#xff0c;但另一半才是关…

作者头像 李华
网站建设 2026/8/21 11:17:32

企业级AI Agent开发实战:从RAG对接到MCP观测的工程化实践

上周&#xff0c;我和一个在律所做技术负责人的朋友吃饭&#xff0c;他聊起最近团队正在搞的“AI Agent项目”&#xff0c;说每天站会听得他头大。不是“RAG接口又超时了”&#xff0c;就是“MCP服务观测数据对不上”&#xff0c;还有“客户给的合同PDF&#xff0c;Agent解析出…

作者头像 李华
网站建设 2026/8/21 11:16:07

AI辅助数学证明:从GPT到Lean,探索非索菲克群与形式化验证

如果你是一位数学研究者&#xff0c;或者对群论、计算复杂性理论感兴趣&#xff0c;最近可能会被一个看似矛盾的标题所吸引&#xff1a;“GPT has proved nonsofic groups are exist”。这听起来像是一个重磅新闻——一个基于Transformer的语言模型&#xff0c;解决了数学领域一…

作者头像 李华
网站建设 2026/8/21 11:15:21

Java设计模式:从入门到精通

1. 引言 设计模式是软件开发中解决特定问题的经典、可复用的解决方案模板。它们不是可以直接转换为代码的完整设计&#xff0c;而是描述了在特定上下文中解决常见设计问题的通用方法。掌握设计模式能够帮助开发者编写出更加灵活、可维护、可扩展的代码。 在Java生态中&#xff…

作者头像 李华
网站建设 2026/8/21 11:13:52

从原理到实战:基于Real-ESRGAN与RIFE的动画视频4K超分补帧全流程

在实际的视频处理项目中&#xff0c;我们常常会遇到一些经典动画片段或影视素材&#xff0c;它们可能因为年代久远或原始分辨率限制&#xff0c;无法满足当下高清、高流畅度的播放需求。例如&#xff0c;许多动画爱好者希望将《地缚少年花子君》中的经典名场面进行高清化处理&a…

作者头像 李华
网站建设 2026/8/21 11:09:51

FNF Mod开发进阶:QT rewired输入系统与SKY QT扩展整合全攻略

最近在折腾《Friday Night Funkin》(FNF) 的 Mod 开发时&#xff0c;发现社区里关于 QT rewired 和 SKY QT 扩展 的讨论热度很高&#xff0c;尤其是配合“2倍速60帧”这类性能优化需求时&#xff0c;很多开发者对如何整合这些工具、它们到底更新了什么、以及如何实现全流程…

作者头像 李华