简介:这是一份关于深度强化学习在机器人路径规划中应用的中文研究文献,面向智能机器人、自主导航及相关方向的学生与研发人员。内容以移动机器人无碰撞路径规划为问题背景,指出传统TEB算法需要先建图并在运行中根据传感器数据实时更新地图,导致计算资源消耗大、应用场景受限,进而提出用DQN算法替代传统方法的解决思路。文中讲解了DQN通过神经网络逼近Q值函数、利用回忆单元降低数据关联性的原理,给出动作空间设置、由距离偏差与角度偏差构成的回报函数,以及在Gazebo仿真中设置六个目标点与TEB进行对比的实验方案。对比结果显示DQN不依赖地图、单步规划时间更短,适合复杂动态环境下的实时导航。资源为单个PDF文档,大小1.35MB,包含算法推导、TEB与DQN流程图、实验数据与结论,可作深度学习与机器人控制交叉领域的参考文献或入门研读材料。目前已有554人学习下载,具有较好的参考价值。
1. 深度强化学习进入路径规划:从A*和RRT做不到的地方说起
我见过不少做AGV和移动机器人室内自主导航的团队,前期都用A*、Dijkstra或者RRT做全局路径,再用DWA做局部避障。这套方案在静场地图里很稳,可一旦环境变成未知、障碍物会移动,或者机器人要频繁响应变化,问题就来了:每次环境一变,全局规划就得重新跑一遍,计算量大,而且规划器和控制器之间的参数耦合让整体调起来非常费劲。深度强化学习在路径规划中的应用,本质上是把“感知-规划-控制”压成一个策略网络,输入激光雷达、状态或局部地图,直接输出速度指令。推理时只有一次前向传播,不需要反复搜索,对动态避障、泊车、无人机飞行这类实时场景特别有吸引力。这篇文章顺着这个标题拆开讲:它到底解决了什么、怎么建模、算法怎么选、仿真怎么跑、以及哪些坑会浪费你两到三周时间。
2. 把路径规划写成MDP:状态、动作、奖励这三件事决定成败
深度强化学习不关心你的地图是栅格还是拓扑,它只认马尔可夫决策过程。路径规划本身天然适合写成MDP:机器人每时刻有一个观测,执行一个动作,环境回馈一个奖励,然后进入下一个状态。这一个建模过程直接决定后续算法能不能收敛。很多人拿到题先挑算法,其实状态、动作、奖励才是真正要花时间的地方。
2.1 状态设计:栅格窗口、激光雷达、端到端图像的取舍
做路径规划的状态表示,常见有三种。第一种是局部栅格窗口,以机器人当前位置为中心,截取全局地图的一个局部区域,比如20×20、30×30的栅格,再把目标点坐标叠进去。这种表示的好处是与具体传感器解耦,障碍物信息完整,适合在仿真里做快速验证。缺点是依赖定位精度,而且远处信息被截断,策略天然短视。
第二种是激光雷达扫描,直接把scan数据作为观测向量。真实机器人和Gazebo仿真里最容易拿到,维度通常是180到720维。做法一般是对scan降采样到60到90维,再拼接目标方位角、当前线速度和角速度。激光雷达表示对局部避障很友好,但对“目标在哪里”这类全局信息感知弱,必须靠外部输入补全。
第三种是端到端图像,直接把RGB图像输入网络,适合视觉导航,但训练难度和算力要求都高,实车部署时还有光照泛化问题。我的建议很直接:新手从激光雷达拼接向量做起,成熟后想发论文再碰视觉端到端。状态设计的具体做法是把所有维拼成一个一维向量,然后逐维归一化。
2.2 动作空间:离散航向点与连续速度命令怎么选
动作空间的选择比大多数初学者以为的更关键。你可以把动作定义成离散的8方向或16方向移动,配合DQN家族算法,在栅格环境里很容易跑通,很多DQN路径规划的教程也是这么做的。但真实物理机器人不吃这一套,八方向离散动作输出的是折线轨迹,到目标点附近会来回摆动,控制层再平滑也救不回来。
做移动机器人或者无人机路径规划,我更推荐连续动作空间,典型是两维输出:线速度v和角速度ω。线速度限制在0到0.5 m/s,角速度限制在-0.5到0.5 rad/s。连续动作能让轨迹平滑、贴障碍物更近,也能和底层控制器直接对接。
喷漆路径规划和泊车路径规划尤其要选连续空间。喷漆对轨迹平滑度敏感,离散折线会让漆膜厚度不均匀;泊车需要低速精确控制前轮偏角,离散动作的角度粒度很难满足倒车入库的精度要求。判断标准就一条:动作粒度是否小于你任务允许的误差,如果小于,可以用离散;否则老老实实上连续控制。
2.3 奖励函数:稀疏奖励、势场引导与惩罚项的参数对照
奖励函数是深度强化学习路径规划里最玄学的部分,但玄学也有章法。常见做法是分两层:第一层只用稀疏奖励,到达目标点给一个大正分,碰撞给负分,每走一步给极小的负惩罚。先确认只靠稀疏奖励能不能收敛,不行再加第二层的引导项。
第二层的引导项一般有两个:一个是距离势场,采用当前距离减去上一步距离的正向增量,引导机器人靠近目标;另一个是障碍物距离惩罚,当距离障碍物小于阈值时按接近程度给惩罚。下面是参考权重表。
| 奖励项 | 建议值 | 备注 |
|---|---|---|
| 到达目标 | +10到+50 | 必须给,值越大越容易催生刷分行为 |
| 碰撞 | -10到-30 | 建议设成到达奖励的1到2倍,避免小车“顶着墙冲” |
| 每步惩罚 | -0.01到-0.1 | 鼓励尽快到达,别让它原地耗着 |
| 转向惩罚 | -0.1到-0.5 | 角速度过大时按角速度平方给负值,减少摆动 |
| 距离势场引导 | 0到+0.5 | 增量式给予,防止对远期目标失效 |
| 障碍物距离惩罚 | -0.5到-2 | 距离阈值内生效,越近惩罚越大 |
一个非常常见的翻车点是:距离势场权重给太大,机器人会先往障碍物边缘蹭过去,因为靠近障碍物有时会让目标距离更快缩小,最终学出贴墙走或钻死角的行为。所以势场项上限要压住,主奖励还是要靠到达和碰撞这两项兜底。
提示:奖励函数先写成可配置参数,别写死在代码里。后面调参和真机迁移都会用到。
3. 从DQN到PPO:路径规划场景的算法选型主线
算法选型不是越新越好,而是看你的动作空间、观测类型和实时性要求。路径规划研究报告里出现频率最高的是DQN、PPO、SAC三种,看懂它们的主线,基本就能覆盖绝大多数应用场景。
3.1 离散动作优先看DQN:栅格路径规划的起点
DQN是深度强化学习在路径规划中最容易跑通的算法,适合离散动作空间。核心套路是用一个Q网络对当前状态下的所有可能动作打分,然后选分最高的动作执行。为了打破样本相关性,DQN引入了经验回放,用一个容量2万到10万的缓冲区存历史转移样本,训练时随机采样;为了稳定目标,还用了目标网络,每隔若干步才同步一次参数。
在栅格路径规划里,我见过最可靠的做法是:局部栅格窗口输入Q网络,输出是8个方向分数。训练时用ε-greedy探索,ε从1.0线性降到0.1,回放缓冲区约5万条。收敛速度比Q-learning快很多,但DQN有个老毛病:Q值过估计,会导致策略在目标附近反复抖动。解决办法是直接用Double DQN,把动作选择和Q值计算拆到两个网络里,代码改动很小,效果立竿见影。
3.2 连续动作和动态避障用PPO/SAC:经验对比
到了动态避障小车路径规划、无人机路径规划算法这些连续控制场景,DQN就撑不住了。偏好稳定性和易调试,优先考虑PPO;偏好样本效率、训练步数少,可以考虑SAC。
PPO的核心是截断重要性采样,策略更新不能一步迈太大,所以训练过程比DDPG稳定得多。路径规划场景里,机器人观测是激光雷达和自身状态,这些信息本身有噪声且部分可观测,PPO在这种环境下仍然能稳定收敛,而DDPG经常会出现评价网络发散。SAC比PPO多了熵正则,探索更充分,在困难迷宫、多障碍物环境中往往用更少样本就能达到相同成功率,但它的温度参数α对奖励尺度很敏感,改奖励函数后经常要重新调。
| 算法 | 动作空间 | 样本效率 | 稳定性 | 适合场景 |
|---|---|---|---|---|
| DQN | 离散 | 低 | 中 | 栅格路径规划、泊车路径规划离散版 |
| PPO | 离散/连续 | 中 | 高 | 动态避障小车、无人机、移动机器人导航 |
| SAC | 连续 | 高 | 中 | 样本稀缺、复杂障碍环境 |
3.3 训练闭环的五个步骤与一组基线超参
不管选哪个算法,训练闭环都要走通五步:定义环境、定义策略网络、采样、学习、评估。下面给出一组能用于多数路径规划任务的PPO基线超参,抄作业的时候先按这套跑通,再往自己的场景靠。
| 超参数 | 推荐值 | 说明 |
|---|---|---|
| 学习率 | 3e-4 | 太高会发散,太低训练太慢 |
| γ(折扣因子) | 0.99 | 长期目标影响权重,离目标远时调0.995 |
| GAE λ | 0.95 | 平衡偏差和方差 |
| clip范围 | 0.2 | PPO截断系数,不用动 |
| batch size | 2048 | 每轮采样的步数,环境简单可降到1024 |
| 训练总步数 | 50万到200万 | 路径规划任务一般在这个区间出结果 |
定义观测和动作空间的代码不需要花哨。下面这段是我常用的写法,先把环境接口定下来,后面接任何算法库都顺滑。
import gymnasium as gym from gymnasium import spaces # 观测:激光雷达降采样30维 + 目标方位角 + 目标距离 + 当前线速度 + 当前角速度 # 动作:连续两维 [线速度, 角速度],都归一化到[-1, 1] class NavEnv(gym.Env): def __init__(self): self.observation_space = spaces.Box( low=-1.0, high=1.0, shape=(34,), dtype=float) self.action_space = spaces.Box( low=-1.0, high=1.0, shape=(2,), dtype=float) def step(self, action): # 将[-1,1]映射到实际速度范围 linear_vel = (action[0] + 1.0) * 0.25 # 0 ~ 0.5 m/s angular_vel = action[1] * 0.5 # -0.5 ~ 0.5 rad/s # 执行控制、读取新观测、判定碰撞与到达…… return obs, reward, terminated, truncated, info动作映射这段是把网络输出还原成物理速度。PPO输出的是[-1,1]区间,直接当速度用会让小车运动幅度过大,所以映射到0到0.5 m/s比较安全。观测维度里激光雷达占了30维,其余4维是导航关键信息。实现时把归一化写进环境,训练稳定很多。
框架层面,用成熟库能省掉大量排错时间。Stable-Baselines3写起来最快,适合快速验证;要自定义算法和分布式采样时用Tianshou,自由度大。没必要从零手写PPO,除非你是为了学习算法本身。
4. 在仿真里跑通最小闭环:环境搭建、训练流程与三个收敛指标
很多人在这一阶段卡住,不是算法不懂,而是“训练很久没结果”也不知道该看什么。先把仿真环境选对,再按固定流程跑,最后用三个指标判断模型到底行不行。
4.1 仿真环境选哪个:Gymnasium、Gazebo、AirSim三选一
做路径规划算法验证,环境选择直接决定研发效率。如果是纯算法验证,不涉及具体硬件,用Gymnasium配合自建栅格环境,5分钟能跑起来,训练速度快,适合调奖励和超参。如果做移动机器人室内自主导航,Gazebo配合TurtleBot3是主流方案,可以叠加ROS和导航栈,和实车的对应关系好,但训练速度慢,采样一个step可能要几十毫秒。无人机用AirSim更合适,它的视觉渲染和动力学仿真成熟,但安装体积大,环境配置比较繁琐。
| 环境 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| Gymnasium | 轻量、训练快、易定制 | 物理仿真弱 | 算法验证、奖励函数调试 |
| Gazebo + ROS | 贴近实车、生态成熟 | 训练慢、配置复杂 | 移动机器人室内自主导航 |
| AirSim | 视觉逼真、无人机支持好 | 依赖重、CPU占用高 | 无人机路径规划 |
4.2 最小训练流程:从安装到跑出第一个checkpoint
我一般按下面这套流程走,每条都对应明确的产出物。
第一步,创建自定义Gym环境,实现reset和step两个接口。reset要随机化起点、终点和障碍物布置,fixed布局会让策略背下来路线,换个环境就废。第二步,写奖励计算,先跑稀疏奖励版本。第三步,接入Stable-Baselines3或Tianshou,选PPO。第四步,启动训练并保存checkpoint。第五步,用固定场景集评估。
安装依赖这一步很简单,一条命令就能解决:
pip install gymnasium stable-baselines3需要提醒的是,自建环境时step函数里一定要区分terminated和truncated:撞了和到達都是终止,但一个是任务失败一个是任务完成,超时终止不能跟碰撞终止混在一起。很多人把这两个标志位合一,导致算法以为超时也是“撞了”,奖励曲线看着正常,评估时小车永远在终点附近打转。
训练过程建议每隔10轮评估一次,保存当前最优模型。别等到训练全部跑完再评估,那时候如果想换奖励函数,前面几天时间就全浪费了。
4.3 先看这三个指标:平均回报、成功率、碰撞率
训练日志里平均回报是黑匣子,单独看没有任何说服力。我用三个指标评估模型:成功率、碰撞率、路径长度比。成功率是固定50个测试场景中到达目标的次数除以50,碰撞率也是同样口径。路径长度比是实际轨迹长度除以最优路径长度,反映规划质量。下面是评估记录表,照着列就行。
| 指标 | 计算方式 | 常见问题 |
|---|---|---|
| 成功率 | 到达目标的测试场景占比 | 场景集要固定,否则无法横向比较 |
| 碰撞率 | 碰撞终止的测试场景占比 | 碰撞判定阈值不同,结果差别很大 |
| 路径长度比 | 实际路径长度 / 参考路径长度 | 连续动作下一般1.0到1.3,超过1.5说明绕路严重 |
训练过程中如果平均回报在涨但成功率不动,先检查是不是又出了reward hacking,这一项在避坑章会专门讲。评估用的场景集必须固定种子,否则每次评估的难度都不一样,模型明明进步了,成功率却忽高忽低,白费功夫。
提示:评估时关闭探索噪声,直接用确定性策略或者把概率分布取均值,否则评估结果会被随机性污染。
5. 深度强化学习路径规划避坑指南:五个翻车现场的现象、原因与解决
这一章是把路径规划训练里最常见的五个翻车现场拆开讲,每条都按现象、原因、解决三个层次写。这些并不是“可能遇到的问题”,而是我见过或踩过、几乎每个团队都会中一两条的真实情况。
5.1 仿真里收敛良好,上真机就撞
现象:模型在Gazebo或Gym环境里成功率90%以上,部署到真实小车后前三步就撞墙或者原地弹跳,完全不可用。
原因:仿真和真机之间存在感知噪声、控制延迟、动力学差异三重叠加。仿真里激光雷达是理想数据,真机有噪点;仿真里速度指令下发立即生效,真机上电机和底盘有延时;仿真里碰撞判定是几何相交,真机上碰撞还受摩擦、惯性影响。
解决:一套有效的组合是随机化加降级。训练时把激光雷达穿上高斯噪声,标准差设为测量值的1%到2%,同时把控制延迟建模进action执行队列,让仿真更逼近真机。部署时不要直接拿策略输出去驱动电机,加一个底层安全速度过滤器:检测到最近障碍物距离小于0.2米时,策略输出角速度保留但线速度强制降为0.1 m/s以内。这层保护能救回大部分突发情况。
5.2 平均回报一路走高,评估成功率纹丝不动
现象:训练曲线漂亮,平均回报从-20涨到80,但每50次评估的成功率始终是30%上下,甚至下降。
原因:典型的reward hacking。机器人在环境中找到了一个能稳定获得高回报但没完成任务的“漏洞路径”,常见的是在目标点附近震荡。震荡时频繁触发距离势场增量奖励,回报虚高,但终端判定一直没到达目标。
解决:先检查奖励曲线和成功率的拐点是否对齐。然后把距离势场奖励改成只在“完成任务的episode”里保留,即稀疏主奖励加成功时额外引导;或者限制步数惩罚,让震荡策略拿到的每步负回报抵消势场收益。另一个简单验证方法是把训练好的模型用可视化工具跑一遍,渲染出轨迹,肉眼看清楚它到底在干嘛,比盯曲线管用得多。
5.3 机器人原地转圈刷分
现象:小车在一个狭窄区域不断绕圈,轨迹画出一堆同心圆,碰撞率为零,但也没有走向目标。这种情况在稀疏奖励任务里出现概率尤其高。
原因:奖励设计里缺少对“无效动作”的惩罚,或者转向能力过强。如果每步只有很小的负惩罚,原地绕圈每一圈都能看到新障碍物、新视野,或者利用势场奖励波动刷分,就会成为局部最优。
解决:在奖励里加上转向惩罚,按角速度平方乘以系数-0.05到-0.2。同时加一条“里程计位置变化量”奖励:如果每步相对起点位移小于阈值,给额外负分。这个阈值可以设为每步理论最小移动距离的一半,能有效抑制刷圈。
5.4 稀疏奖励下迟迟不收敛
现象:跑了50万步,成功率还是接近零,训练曲线上根本看不到正奖励。想用稀疏奖励追求“干净策略”,直接放弃到不了目标。
原因:稀疏奖励是延迟奖励,奖励信号只在成功或碰撞时出现。在20×20的栅格或较大室内环境中,随机探索要碰巧到达目标、碰到目标被判定成功的概率极低,梯度很难回传。
解决:不要硬刚稀疏奖励,用课程学习过渡。第一轮把起点和终点放在同一条直线上,距离5米以内,给一个极小的距离势场引导;第二轮随机化终点位置,距离拉到10米;第三轮再加入动态障碍物。逐轮放宽,成功率是能爬上去的。如果任务本身有明确的目标离散集合,也可以试试HER,把失败样本里的目标替换成实际到达的终点,让失败样本也能学到“接近目标”的信号。
5.5 高维激光雷达输入把训练拖垮
现象:激光雷达360维加图像特征一起进网络,训练速度掉到每1千步要几分钟,显存也不够,GPU利用率上不去。
原因:输入维度高导致网络第一层参数爆炸,样本效率下降。路径规划任务里,360维的scan有大量重复信息,相邻角度的距离值高度相关,直接喂给MLP是浪费。
解决:先降采样,把360维scan按角度步长3度取一个点,降到120维;再按距离范围截断,只保留2.0米内的障碍物信息,超出部分统一设置成最大值。最终输入控制在30到60维加其他状态量。还有一个习惯值得养成:先做特征可视化,把scan分布打印出来看看,别闭眼就塞进网络。降维后如果信息不足,再用侧向编码器压缩,不要一上来就全量输入。
6. 仿真转真机前,先改掉这四个习惯
从仿真走向真机,技术方案反而不是最大瓶颈,习惯才是。第一个习惯是把“碰撞允许度”调严。仿真里你可能会宽容到“接近但没碰到”也算安全,真机上这等于把噪声和误差的预算全耗完了。我会在评估指标里加一个危险距离占比:整段轨迹中离障碍物小于0.15米的时间占比不超过10%,比偶尔一次碰撞判得更细。
第二个习惯是让奖励函数的每一项都可以从配置文件读取。权重、阈值、惩罚系数全部提出来,不要在环境代码里硬编码。真机采集到的数据和仿真分布不同,你几乎一定会重新调一遍奖励权重,到时候改一行参数要重启整个训练,非常耽误事。
第三个习惯是固定评估场景集。我每次训练前会预先定义30个起点终点对和10种障碍物布局,训练完只在这300个组合里跑测试,记录成功率、平均路径长度、平均耗时。这样版本之间的对比才有意义,模型好坏用数据说话。
第四个习惯是保留一个紧急停止通道。无论模型输出什么速度,始终在控制层保留一个安全优先级更高的逻辑,检测到碰撞趋势就制动。这不是对强化学习的妥协,而是工程系统的基本底线。
我现在的习惯是,拿到一个深度强化学习路径规划需求,先问清楚三个问题:动作空间能不能简化为离散,奖励函数有没有物理约束可参考,以及有没有必须绕过的不规则障碍物。如果三个问题都清晰,我才会开始选算法建环境。比起纠结模型结构,把前三个问题想明白,项目进度至少快一倍。希望帮到你。
本文还有配套的精品资源,点击获取