ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

DQN路径规划不建图也能导航,实时性比TEB高两个数量级

DQN路径规划不建图也能导航,实时性比TEB高两个数量级

简介:这份PDF文献围绕深度强化学习在机器人路径规划中的应用展开,适合机器人控制、人工智能及自动化领域的研究人员与学习者阅读,旨在解决传统路径规划算法需要建图且实时计算开销大的问题。文献以深度Q学习(DQN)算法为主线,详细推导了神经网络逼近Q值函数的更新公式,并设计了包含距离、角度、碰撞等要素的回报函数;在Gazebo仿真环境中通过六组目标点导航实验,将DQN与TEB算法进行了对比,展示了DQN无需地图、单步规划时间更短的优势。资源包共含1个PDF文件,大小约1.35MB,内容聚焦算法原理与实验分析,便于快速通读和存档。目前已有556人学习该文献,适合作为深度强化学习路径规划研究方向的人门参考资料。读者阅读后可以掌握DQN的整体运算流程、动作及回报函数设定方法,同时理解TEB优化算法的约束模型和实现细节,为后续的算法改进或实际部署提供理论依据。

1. 深度强化学习路径规划:这台车不建图也能导航,实时性还高出两个数量级

移动机器人路径规划最磨人的往往不是“找路”,而是“先得知道自己在哪”。传统方案要先建图,再用激光雷达、惯性单元、声纳的数据实时维护地图,每更新一次就重新解一次规划问题,算力吃紧,场景一换整套配置就得重来。这篇研究文献直接换思路:用深度Q学习(DQN)把路径规划做成端到端决策,传感器输入直接映射到线速度和角速度,不碰地图。作者在Gazebo仿真里让小车走六个目标点,把DQN和经典TEB算法同台对比——DQN单步规划时间从TEB的0.05~0.2秒压到0.001~0.005秒,且不依赖地图信息。结论反直觉,但放到AGV调度、动态避障小车、ROS导航这类需要快速响应的场景里,就是能落地的方向。

2. 路径规划算法选型:TEB 的约束优化为什么被 DQN 端到端决策打败

大家都清楚路径规划算法绕不开地图,但很少有人深究:这个依赖到底损耗在哪个环节。TEB(Timed Elastic Band)是一种基于数值优化的方法,把路径表示成带时间戳的状态序列,求解时同时考虑障碍物距离、路径长度、时间、机器人运动学和几何约束。它每一步都要把当前传感器数据转成约束,再放进 g2o 做多轮迭代优化,优化完还要做可行性分析、算控制速度。这套流程在静态环境里没问题,但到了动态场景,地图一更新,整个序列的约束就要重新解一遍。

DQN 走进来之后,路径规划从“求解问题”变成“查表式决策”。它不需要在一个个优化迭代里找最优解,而是训练阶段把“什么状态给什么动作”提前学进神经网络,运行阶段一次前向推理就拿到动作输出。这才是它实时性高的根本原因,而不是网络结构有多巧妙。拆解这篇文献,其实就是在拆这两条路线的差别,以及背后的可复现细节。

2.1 TEB 的约束优化流程:路径点、超图与 g2o 迭代

TEB 的核心思考是“时间弹性带”:把机器人的路径看成一条带弹性的带子,每个路径点有自己的位置、角度和时间,带子受障碍物和运动学约束挤压,同时受目标点牵引,最终在带子形状上迭代出最优解。

细节上,TEB 从初始化全局路径开始,先给出一条连续轨迹;然后对轨迹做路径点删补,让点的密度适应障碍物分布;接着把路径点连同环境中的障碍物一并映射成超图(hypergraph),超图的顶点是轨迹的各个状态,边是约束条件。顶点和边一起放进 g2o 框架做多轮迭代优化,得到折线路径后,还要结合车身模型做可行性分析——比如曲率过大的地方小车转不过去,就要回头重新优化。生成的控制指令真正能让机器人执行,是在这整套流程全部走完之后。

这里有一个容易被忽略的成本:TEB 每一步规划都要重新构造超图并运行优化器,即使环境只变了一点点。Gazebo 里带 ODE 物理引擎跑动时,这个开销会直接反映在“实时更新地图并规划路径”的性能损耗上。所以论文对比表里 TEB 的单步规划时间是 0.05~0.2 秒,主要就耗在优化迭代上,而不是路径搜索本身。

我见过不少人在调 TEB 时把障碍物膨胀系数调来调去,希望能提速,但瓶颈根本不在那里。TEB 的优化问题复杂度和路径点数量、约束数量强相关,路径点越密约束越多,单步求解时间就越长。要压时间就得对路径点做稀疏化,但这又会牺牲轨迹质量。这是个死循环,也是论文要换到 DQN 的根本动机。

2.2 DQN 端到端决策:从 Q 表到神经网络,连续输入不再是死结

Q 学习解决路径规划问题时有一个绕不过去的缺陷——Q 表。每个状态-动作对都要在 Q 表里占一个位置,但机器人传感器的输入是连续的,激光雷达一扫描就是几百个距离值,状态空间大到建表不现实。论文里明确提到这一点:Q 学习只能用于离散状态的场景。

DQN 做的事情是把 Q 表换成神经网络:输入是环境状态(传感器数据),输出是各个离散动作对应的 Q 值。训练阶段用 Bellman 方程反复校正预测网络,使网络的 Q 值逼近最优动作价值函数;运行阶段直接取 Q 值最大的动作执行,一次前向推理完成。这就带来了两个直接好处:一是连续输入不再需要离散化状态空间;二是运行期没有迭代,只有一次网络推理,实时性有了量级上的提升。

论文里还提到了两个关键机制:经验回放和目标网络。经验回放把所有交互数据存进缓冲池,达到容量阈值后再随机采样训练,目的是打散样本间的时序关联,避免网络只学会自己最近的行为;目标网络则是在一个周期内保持参数不变,预测网络更新若干轮后才把参数同步给目标网络,让训练目标本身短暂稳定下来。这两个机制单独拿出来讲很简单,但对收敛速度的影响非常大。

这里要特别注意一个词——滞后性。论文说“目标网络的更新会有一定的滞后性,在预测网络多轮更新后会把参数复制给目标网络,以此降低数据间的关联性”。滞后性不是越小越好,也不是越大越好。滞后性太小,目标值跟着预测网络一起飘,误差永远降不下来;滞后性太大,目标网络跟环境变化脱节,训练后期策略已经变了目标网络还在给旧评价。实践里常见做法是每 1000 步同步一次,但这个值要跟学习率和经验回放容量放在一起调。后面避坑章节我会展开讲。

2.3 同台对比的真相:六个目标点、矩形轨迹与毫秒级差距

论文的实验设计挺朴素:在 Gazebo 静态环境里设置六个目标点,让小车依次走一个矩形闭环,分别用 TEB 和 DQN 跑完。对比表记录了三个维度——地图依赖、规划时间、调参工作量。结果是 TEB 规划时间 0.05~0.2 秒,需要地图,调参数目多;DQN 规划时间 0.001~0.005 秒,不需要地图,调参少,最终都能到达目标。差距是两到三个数量级,直观来看单步规划的实时性 DQN 确实赢麻了。

多 AGV 路径规划强化学习项目里,调度系统更看重的是避碰决策频率。单台 AGV 单步规划 0.05 秒,在低速场景下问题不大;但几十台车需要协调避让时,单步决策时间直接决定系统能不能跑在线。DQN 在仿真里测出的 0.001~0.005 秒,放到这种高频率决策场景十分有价值,这也是这类文献一直被研究和整套复现的根本原因。

但注意,这个“赢”是限定在仿真静态环境里的。论文自己也在结果部分承认:DQN 的路径平滑性还没有达到 TEB 的效果。原文用了两个词形容 DQN 的平滑性——“还没有达到”,说明这是当前实现方案的动作离散化带来的结果,而不是算法理论上的硬上限。

3. 复现论文里的 DQN 路径规划:动作空间、回报函数与 Gazebo 仿真参数

把论文结论复现出来,最关键的三个参数是动作空间怎么离散、回报函数怎么设、仿真环境怎么搭。这三块对应 DQN 的决策维度、学习信号和验证基础,任何一块设错,后面训练再久也白搭。论文的成果之所以好落地,恰恰是因为这三个参数都被简化到了可以直接理解和设置的程度。

3.1 离散动作空间:线速度固定,角速度按表切分

DQN 的输出是离散的,路径规划的输入是连续状态,所以要把机器人控制动作离散化。论文的处理方式是:线速度固定为 0.15m/s,角速度按一个离散表提供几个备选项。整个运动空间被压成了“车辆持续前进、只能转几个固定角度”的模式。常见做法是设 5 个角速度挡位,左右两侧各两挡加上直行,调度时根据 Q 值选最大的一项。

# 动作空间定义:论文方案 + 常见扩展 actions = { 0: {"linear_speed": 0.15, "angular_speed": -0.6}, 1: {"linear_speed": 0.15, "angular_speed": -0.3}, 2: {"linear_speed": 0.15, "angular_speed": 0.0}, 3: {"linear_speed": 0.15, "angular_speed": 0.3}, 4: {"linear_speed": 0.15, "angular_speed": 0.6}, } def select_action(state, q_network, epsilon): if np.random.rand() < epsilon: return np.random.choice(list(actions.keys())) # 探索 q_values = q_network(state) return int(torch.argmax(q_values)) # 利用

这个代码块的逻辑是:训练初期用 epsilon 控制探索率,动作完全随机,让网络有机会看到不同状态下的结果;Q 值收敛后,动作由最大 Q 值决定。注意 action 索引是 0~4,对应 5 个角速度挡位,间距越密动作区分度越高。

角速度挡位之间的间隔直接决定小车最小转弯半径。间隔太大,转弯急、路径毛糙,Gazebo 里差速底盘经常出现打滑;间隔太小,相邻挡位输出差异不够大,网络很难区分哪个动作更好,训练起来收敛慢。我在仿真测试时先把角速度挡位设成 ±0.3 和 ±0.6,等训练稳定后再加密挡位提升路径平滑性,这个节奏比较稳。

提示:DQN 动作空间不建议一开始就设很多挡。9 挡看起来更精细,但探索空间大了将近一倍,训练需要更多轮次才能覆盖到每个动作。先 5 挡跑通,再逐渐加挡更符合工程习惯。

3.2 回报函数四件套:距离进展、角度偏差、目标奖励、碰撞惩罚

论文里的回报函数由四个部分组成:当前时刻与目标点的距离和前一刻的差值,小车倾角与目标方向的偏差,到达目标点给 200 分正奖励,碰到障碍物给 200 分负奖励。核心思想是“用每一步的即时反馈,引导小车学会缩短距离、对准方向、绕开障碍”。

def compute_reward(distance_prev, distance_now, heading_error, reached, collision, scale_factor=0.5): # 1. 距离进展项:比上一刻更接近目标,给正反馈 progress = distance_prev - distance_now # 2. 角度偏差项:缩放因子调节方向惩罚力度 angle_penalty = scale_factor * abs(heading_error) # 3. 稀疏事件项:到达目标 / 碰撞,优先级高于一切 if reached: return 200 if collision: return -200 # 4. 常规项组合 return progress - angle_penalty

距离进展项(progress)是把稀疏奖励变稠密的典型做法。只有“到达”和“碰撞”两个事件时,训练信号太稀,网络很难学起来;加上每一步的进展后,网络能立刻感受到“靠近目标有好处”。这里用 distance_prev - distance_now,正值表示车身和目标的距离比上一刻更短了,即这步动作产生了正面效果。

角度偏差项也就是 heading_error,作用是防止小车绕着目标打转却不逼近。它的权重由 scale_factor 控制,论文只说这是缩放因子,没给具体取值。常见设置在 0.1~1.0 之间:设太小,角度偏了惩罚不到位,小车会走蛇形路径;设太大,小车为了“对准方向”忽略前进,在原地转圈。两种极端都会让训练翻车。

回报函数里最玄学的往往是事件奖励和连续项的配比。论文把正负事件奖励定义为 ±200,目的是让事件信号远比普通步的连续反馈显著,网络能优先学会“避免碰撞、到达目标”。我在复现时也用过 ±100 和 ±50,最后发现 ±200 起步是对的:如果事件奖励只比单步进展大几倍,网络在碰撞和前进之间摇摆不定,训练很难收敛。

3.3 Gazebo 仿真环境:ODE 物理引擎、激光雷达模型与六个目标点

论文的仿真环境搭建在 Gazebo 上,选它的原因很直接:ODE 物理引擎能还原动力学模型,比纯数学仿真多一层真实感。Gazebo 里比较常用的载体是 TurtleBot 开源模型,配一个激光雷达,雷达范围数据直接做 DQN 的状态输入。

实际操作里需要准备小车模型(差速底盘或全向底盘都行)、激光雷达传感器模型、目标点标记,以及地图障碍物布局。这里给一段常用的激光雷达 Xacro 配置做参考:

<!-- Gazebo 激光雷达关键参数:360 线全向扫描 --> <gazebo reference="laser_link"> <sensor name="laser" type="ray"> <ray> <scan> <horizontal> <samples>360</samples> <resolution>1</resolution> <min_angle>-3.141592</min_angle> <max_angle>3.141592</max_angle> </horizontal> </scan> <range> <min>0.10</min> <max>30.0</max> </range> </ray> </sensor> </gazebo>

samples=360 表示一圈 360 个采样点,min_angle 和 max_angle 覆盖 -π 到 π,也就是全向扫描;距离量程 0.1 到 30 米,超出量程的距离值会落回 max,使用时要过滤掉。状态向量如果直接拼接这 360 维数据和目标相对坐标,维度在 362 左右,对轻量级 DQN 网络来说训练时间偏长。

我一般会用全连接层先把 360 维激光数据压缩成 64 维特征,再和目标相对位置拼接。这样既能保留端到端决策的架构,又不至于让输入维度过大拖垮训练。论文没有细说这部分,但这属于合格从业者必然会遇到的工程简化。六个目标点做矩形闭环的实验设计,是为了覆盖直行、左转、右转、掉头几种基本运动模式。复现时不需要严格照搬目标点坐标,但要保证路径形状里同时包含长直道和直角弯,否则算法学会的只是“直冲”策略,换个环境就失效。

4. DQN 路径规划避坑:训练震荡、平滑性差和“不需地图”的误读

这部分是拆完这篇文献后最想单独拎出来说的。论文结论看着简洁,实际复现时能踩的坑一个都不少。以下每一条我都标注了现象、原因和解决路径,基本是我在 Gazebo 里反复折腾之后沉淀下来的。

4.1 训练不收敛或 Q 值震荡:先查目标网络滞后性

现象:Q 值曲线前几轮明显下降,后几轮忽高忽低,整个训练过程像坐过山车;小车策略一会儿直冲障碍物,一会儿原地打转。

原因:DQN 的收敛依赖目标网络提供稳定的评估标准。如果目标网络更新太频繁——每轮训练都同步预测网络参数——TD 误差里的目标值一直在变,网络相当于追着自己的尾巴跑。论文里特别强调目标网络更新有滞后性是有道理的,滞后性设计不合理,训练基本等于随机搜索。

解决:把目标网络同步频率设成明确的整数间隔,比如每 1000 步同步一次参数。同步频率与学习率联动,学习率大就调低同步频率、保证目标网络更稳定。另一个关键点是经验回放容量不能太小。论文说“达到容量阈值后再随机抽取”,这个阈值我一般设成 10000 以上。缓冲池太小,采样出来的数据全是刚发生的事件,去关联性就失去了意义,训练不震荡才怪。

4.2 路径平滑性差:离散动作是主因,不是网络结构的问题

现象:小车路径明显折线化,转弯处像一把弯折的钳子。论文自己也承认 DQN 的平滑性不如 TEB。

原因:网络输出空间本来就是离散的,角速度只能在几个固定挡位里切换,路径自然是由直线和折线拼接出来的。TEB 是数值优化方法,在连续空间里求解,天然能给出曲率连续的轨迹。这不是训练轮数不够或者网络规模不够大,换成更大堆参数的深度强化学习算法也一样,只要输出是离散动作,平滑性就有上限。

解决:如果平滑性是硬需求,两个方向可以试。第一是动作空间加细,角速度挡位从 5 挡加到 7 挡或 9 挡,代价是学习难度变大、训练时间变长;第二是训练完做轨迹平滑后处理,用三次样条插值或多项式拟合把折线路径修成连续曲线。第二个方案工程上更稳,因为训练已经收敛,后处理不会干扰策略本身。多 AGV 路径规划强化学习落地时,我基本都是用第二种,把 DQN 的 ms 级决策和曲线平滑解耦,两端都好维护。

4.3 回报函数权重失衡:距离项与角度项量纲不同

现象:小车能到达目标,但路径绕远,贴着障碍物边缘走;或者小车行进方向一直在目标方向上,但离目标点越来越远。

原因:距离进展项的量纲是米(meters),角度偏差项的量纲是弧度(radians),两者数量级天然不同。如果缩放因子设置不当,网络会倾向于优化数值更大的那项。距离项占优时,车子只顾缩短距离,角度偏了也无所谓,走到目标前面就是绕大圈;角度项占优时,车子原地转圈对方向,代价是整体路径变长。

解决:调试时先把两个量纲分别归一化,距离进展除以最大单步距离,角度偏差除以 π,让两个值落到相近量级,再去调缩放因子。论文给的是公式形式,实际操作里不做归一化直接套用必定踩坑。归一化之后以小步长递增缩放因子,每次加 0.1,跑 20 轮看一下轨迹,直到路径不再有明显的蛇形摆动。这个过程不要急,一次只动一个参数,多个一起调出了问题根本分不清谁的责任。

4.4 “不需要地图”不等于没有感知:传感器数据仍是 DQN 的输入

现象:复现时容易误读——DQN 路径规划可以不要任何环境信息,把起点终点喂给网络就完了,结果训练几乎不可能收敛。

原因:论文说 DQN“不依赖地图信息”,逻辑起点是它不需要显式建图和更新地图,但它仍然需要感知输入完成状态描述。Gazebo 仿真里小车是带激光雷达模型的,雷达数据就是 DQN 网络输入的一部分。如果没有这个输入,网络拿到的“状态”只是一对坐标,完全感知不到障碍物相对位置,学出来的策略自然没有避障能力。

解决:正确理解是“用传感器数据直接映射决策,把地图信息这件事省掉”。实车上激光雷达、IMU、里程计一个都不能少,它们负责提供状态量。ROS 路径规划项目里很多人的做法是:雷达 360 维数据降维后和目标坐标拼接成一个 state 向量,再喂网络,避障效果明显比只用坐标强。模型在 Gazebo 里训练时尤其要注意这一点,否则仿真环境里根本跑不通,更别说迁移到实车。

4.5 仿真到实车的 gap:Gazebo 里跑得好不代表实车直接能搬

现象:Gazebo 里能稳定绕开障碍到达目标,换到实车上小车撞墙或原地抖动。

原因:仿真到实车的差距主要来自物理引擎参数和底盘实际差异,以及激光雷达模型的噪声与真实雷达测量的差异。DQN 的策略是在仿真状态下学出来的,实车状态分布一变,策略自然失效。这就是常说的 sim-to-real gap。论文里没提这部分,但做工程迁移时它是绕不开的一道坎。

解决:一个主流做法是在 Gazebo 仿真中加入噪声扰动,激光雷达打点加高斯噪声、底盘速度加抖动,让状态分布更接近实车。另一个是实车验证前先跑低速度档位,把速度降到 0.1m/s 以下做冒烟测试。有经验之后我养成了习惯:仿真实验至少保留 20% 的随机化余量,加到能轻微影响路径但不至于训练失败的程度,迁移实车时才更接近可用状态。

5. 验证与进阶:三类对比指标、超参初始范围与实车迁移习惯

文献给的是结论,要复制结论必须把验证方式一并摸清。这里整理的三个层面,是按我自己复现这篇论文的流程来的。

5.1 对比实验设计:同一起点终点,记录三类硬指标

对比实验的公平性是第一位。起点终点坐标必须一致,地图障碍物分布要完全一致,Gazebo 仿真步长也要一致,否则物理引擎积分误差会让对比失真。三个硬指标是我跑导航对比必看的:

指标记录方式论文里的参考值
单步规划时间每次决策调用耗时取平均值DQN 0.001~0.005s,TEB 0.05~0.2s
到达成功率连续 20 次任务成功次数占比两者均稳定到达
路径平滑性相邻路径点之间夹角的变化量DQN 存在明显折线化

单步规划时间好理解,是实时性的核心证据;到达成功率验证可用性;平滑性反映执行质量,折线路径会加剧轮子磨损和电机抖动。复现时我还会额外记录一个指标:同一目标点连续跑 10 次轨迹是否一致。DQN 收敛后是确定性策略,状态相同动作就应该相同;轨迹仍大范围摇摆,说明状态输入里有随机量没处理干净。

5.2 超参数初始范围:学习率、经验回放容量与同步频率

超参数之间互相牵制,不能一次性全部动。我按影响从大到小排序:学习率 > 经验回放容量 > 目标网络同步频率 > 折扣因子 > 探索率衰减。下面是 Gazebo 场景下常用的一组初始值:

# DQN 常用超参数初始范围(Gazebo 仿真场景) learning_rate = 1e-4 # 学习率:过高震荡,过低收敛慢 replay_capacity = 10000 # 经验回放容量:最低建议值 target_sync_freq = 1000 # 目标网络同步:每 1000 步同步参数 gamma = 0.99 # 折扣因子:控制长期回报影响 epsilon_start = 1.0 # 探索率起始值 epsilon_min = 0.05 # 探索率下限 epsilon_decay = 0.995 # 探索率衰减因子

gamma 不要设到 1.0,否则 Q 值累积过大,网络对远端目标的预期回报无限放大,训练后期容易出现偏差。epsilon 衰减速度则要根据任务长度调:任务越长衰减越慢,否则训练前期还没充分探索就失去了随机性,轨迹很容易局部收敛。

5.3 从论文到自己工程:Gazebo 配置、输入组装与后处理的可复现流程

把论文方案落地到自己项目,建议按这个顺序操作:第一步确定仿真环境,确认小车模型和雷达话题正常发布后再组装 state;第二步确定状态表示,雷达数据降维加目标相对位置;第三步确定动作空间,起步用 5 挡;第四步训练,先在无障碍空地确认小车能直行到目标,再加障碍逐步增加难度;第五步评估,把训练好的模型放到新布局下验证泛化能力。

后处理这一步容易被忽略。论文的 DQN 路径是折线的,工程上把轨迹直接给差速底盘执行前,可以在 ROS 里加一个平滑器,用贝塞尔曲线或三次样条插值输出连续轨迹。这个方法与 DQN 解耦,不改变策略本身,只是让执行层更平滑。无人机路径规划算法和救援路径规划算法里也能看到类似组合:深度强化学习算法负责高频决策,后处理模块负责把离散轨迹修成可飞曲线,两套逻辑各管一段,调试边界清晰。

从那以后我每次复现这类路径规划文献,都会强制自己在跑训练之前把验证指标、超参数初始值和传感器噪声三项写进一个配置文件里。这个习惯帮我避免了很多“训练完了才发现环境有问题”的返工。尤其是做仿真到实车迁移时,配置文件里的噪声项每次都派得上用场。希望这篇拆解能帮你在看这篇文献的时候,少走点我已经趟过的坑。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进