资讯详情

资讯详情

基于SAC的激光雷达避障路径规划:从PyTorch实现到仿真训练实践

简介SAC-Auto路径规划项目基于PyTorch实现Soft Actor-Critic算法定位为面向高校学生与强化学习初学者的完整仿真项目可用于毕业设计、期末大作业等场景解决激光雷达Lidar避障与路径规划的实际问题。资源内置混合观测训练、静态/动态环境仿真、Lidar点云模拟等代码模块并配有中文注释可帮助新手轻松理解SAC智能体设计、环境交互与策略更新完整流程。压缩包共22个文件包括10个Python源文件、2个ONNX策略模型、若干训练结果图、演示GIF及1份说明文档整体约9.99MB目录结构清晰且易于部署。已有270人学习下载。项目内不仅提供可直接运行的训练与仿真Demo还附带了可视化结果和模型导出示例能直观展示避障效果方便读者对照修改与二次开发作为导师认可的高分项目参考价值较高。 搞强化学习路径规划这个方向我一直觉得有个门槛挺有意思理论算法一大堆但真把SACSoft Actor-Critic跑起来并让小车在激光雷达仿真环境里学会避障中间全是坑。前阵子我基于PyTorch从头搭了一套SAC-Auto路径规划仿真流程用2D激光雷达Lidar作为感知输入在自建的模拟环境里训练智能体完成动态避障和局部路径规划。这篇就记录一下完整思路和实操过程中踩过的雷给想做强化学习避障、又不想一上来就用CARLA这种重框架的朋友一个参考。这套方案不追求通用自动驾驶级的效果更偏向于把SAC、Lidar仿真、路径规划三者打通。环境用Python自己写传感器用射线模拟Lidar控制量是线速度和角速度智能体通过SAC策略网络输出动作在未知障碍物环境下学习从起点移动到目标点。实测下来训练一万步左右就能出现明显的避障倾向两万步后基本稳定碰撞率降到很低。整个过程不依赖昂贵的物理引擎普通笔记本CPU也能跑得动。1. 项目背景与整体思路拆解1.1 为什么选择SAC做避障路径规划传统路径规划算法比如A*、Dijkstra、混合A*在已知静态地图里表现很好一旦环境动态变化或者传感器噪声变大就显得僵硬。强化学习的思路是把路径规划当成一个序贯决策问题智能体根据当前观测激光雷达距离值输出动作转向、油门环境返回下一个状态和奖励通过不断试错学习一个策略。在众多强化学习算法里我最终选了SAC。核心原因是SAC属于最大熵强化学习它在最大化累积奖励的同时还要最大化策略的熵。通俗讲就是让策略保持一定的随机性不至于一学到某个行为就变得极其确定。这个特性对避障特别重要因为真实环境中障碍物分布千变万化过度自信的确定性策略很容易在未见过的场景里撞墙。SAC的随机策略天然带有探索性遇到新障碍时更容易绕过去。另一个原因在于SAC的稳定性。相比PPOSAC的Q函数学习和策略更新是分离的用两个Q网络取最小值来抑制高估clipped double-Q trick再配合自动调节的温度系数让熵权重自适应变化。我在实际训练中对比过PPO在奖励函数设计不精细的情况下非常容易陷入局部最优而SAC就算奖励给得粗糙一点也能学出像样的避障行为。这一点的工程价值极高因为奖励工程本身就是玄学算法能多容忍一点“玄学”项目成功率就高一分。1.2 整体技术栈与模块划分整个项目分四个模块仿真环境、算法核心、训练调度、评估可视化。仿真环境负责生成小车运动学模型、激光雷达射线、随机障碍物地图和目标点算法核心是SAC的PyTorch实现包含Actor网络、两个Critic网络、Replay Buffer、温度系数自动调整训练调度负责环境交互、存储经验、更新网络评估可视化则记录每轮的奖励、碰撞次数、到达目标次数方便观察策略变化。技术栈上我用了PyTorch 2.x做神经网络Python 3.10跑训练脚本仿真部分只用NumPy。环境接口完全参照Gymnasium的写法定义reset、step、render三个方法这样以后想接标准强化学习库也很方便。整体代码量不大核心SAC实现加环境模拟大概不到800行适合在普通配置的机器上跑。选择这种轻量级方案而不是直接用Gazebo或者CoppeliaSim主要考虑到调试效率。重物理引擎虽然真实但每一步交互都要消耗大量计算训练一次动辄几天。而用射线模拟Lidar再加上简单的自行车运动模型单步仿真开销极低十万步训练在CPU上也就十几分钟能让我更快迭代奖励函数和网络结构。真实Lidar的噪声和物理特性可以在仿真训练出基础策略后再通过迁移学习或域随机化补充。2. 仿真环境搭建与Lidar传感器建模2.1 环境配置与基础场景构建环境是一个二维平面边界设为有界矩形内部随机生成若干个圆形障碍物。小车简化为一个质点加朝向角状态表示为(x, y, theta)其中x和y是坐标theta是航向角。控制量为线速度v和角速度omega这里用离散化或者连续值都可以SAC天然支持连续动作所以直接输出连续值即可。为了更贴近真实小车我给线速度和角速度都加了范围限制比如v在[0, 2.0] m/somega在[-1.5, 1.5] rad/s。每次reset时随机生成一组障碍物小车起点固定在左下角目标点固定在右上角或者随机位置。随机地图的好处是防止智能体过拟合某个固定场景。我试过固定地图训练收敛非常快但换到新地图效果立刻崩掉改成每轮全新随机的障碍物分布后泛化能力明显增强。基础场景里我还加了一个“边界惩罚”逻辑小车一旦越过边界就结束回合不给中间惩罚。避障的负反馈主要来自离障碍物太近而不是限制它自由探索。早期版本里我加了很多条条框框比如“必须距离障碍物1米以上”“不许走回头路”结果训练完全卡住。后来把约束减少到最低限度只保留碰撞终止、到达目标终止策略反而学得更快更自然。2.2 激光雷达数据如何转化为状态Lidar仿真我用射线投射实现。假设Lidar扫描范围为180度共N根射线每根射线发出后检测与障碍物的交点记录距离值。为了模拟真实雷达的有限探测范围距离值截断到最大值5米。这样每一时刻的状态向量就是N维的距离值加上目标的相对距离和相对角度以及当前线速度和角速度拼成一个一维向量作为网络输入。选N的时候有个平衡问题。射线数量太少感知盲区大障碍物边缘信息丢失严重射线数量太多输入维度高网络参数多训练变慢。我最终用36根射线覆盖180度相当于每5度一根射线。对二维平面避障来说足够用36维输入也不会让网络太大。实测84根和36根最终收敛效果差不多但36根单步交互开销明显更低。这里有一个容易被忽略的细节Lidar距离值必须做归一化。原始距离范围0到5米直接喂给神经网络会导致数值不稳定。我把距离值除以最大量程压缩到[0, 1]区间目标距离和角度也做相应归一化。归一化之后同一套超参数在不同地图尺寸下都能稳定训练算是一个通用经验。2.3 动作空间与运动学模型动作空间设计成两维连续量前进速度v和转向角速度omega。实际工程里可以考虑只用一维动作比如固定速度只输入角速度这样能加速收敛但策略会显得呆板。我建议动态避障还是保留两个自由度否则遇到正面障碍物需要减速绕行时固定速度策略非常吃亏。小车运动模型我采用离散时间更新x_{t1} x_t v * cos(theta_t) * dty_{t1} y_t v * sin(theta_t) * dttheta_{t1} theta_t omega * dtdt取0.1秒仿真频率10Hz。控制量在每一步会被限制在动作边界内。这里需要注意SAC策略网络输出的通常是tanh激活后的值范围在[-1,1]需要线性映射到实际动作范围。我在代码里专门写了一个scale_action函数把网络输出从[-1,1]映射到[v_min,v_max]和[omega_min,omega_max]初始阶段如果不做这个映射小车动起来会非常诡异要么原地打转要么猛冲。3. SAC算法原理与PyTorch实现要点3.1 最大熵目标到底改变什么SAC和普通Actor-Critic算法最大的区别在于目标函数里多了熵项。普通RL的目标是最大化累积回报求和SAC变成了最大化累积回报和策略熵的加权和。熵是策略分布的随机性度量熵越大策略越不确定。SAC在优化时希望奖励高的地方策略确定性高一点奖励不明朗的地方策略保持更大随机性避免过早锁死。这就会有一个温度系数alpha用来平衡奖励和熵。alpha大更鼓励探索alpha小更鼓励利用现有经验。SAC的优雅之处在于alpha不是固定值而是自动调节的当策略表现不佳、收益期望低时alpha自动增大促进探索当策略已经不错时alpha自动减小让动作更稳定。我在实现中通过一个带约束的优化目标来更新alpha配合target_entropy参数通常设置为-2因为动作空间是二维。实际体验下来自动温度调节非常关键。早期我手动固定alpha为一个大的常数结果策略收敛后还一直在随机乱逛明明看到目标却故意绕开手动把alpha调小呢训练初期探索不足永远发现不了绕开障碍物后能到达目标点这个“新大陆”。自动调节规避了这个痛苦工程上省心很多。3.2 网络结构与关键超参数我的SAC实现包含三个网络一个Actor网络两个Critic网络。Actor输入状态维度S36根Lidar目标信息速度约41维输出动作均值mu和log标准差动作通过tanh压缩。Critic输入状态加动作输出Q值。网络结构都不深用两层全连接每层256个神经元激活函数用ReLU。三个网络用同一个底层特征提取结构这在训练时能共享部分表征但我建议先把三个网络独立开结构相同但参数不共享实现简单且稳定。共享权重在强化学习里很容易出现梯度冲突反而拉低表现。超参数方面我踩过不少坑最终稳定使用的配置如下超参数取值备注优化器Adam学习率统一学习率3e-4Critic和Actor均为3e-4折扣因子gamma0.99强调长期收益温度系数alpha自动调节target_entropy-2软更新系数tau0.005目标网络平滑更新Replay Buffer容量100000太大占内存太小不稳定批量大小batch_size256一次采样数量每次更新步数1交互一步更新一组参数tau取0.005是经验值太大目标网络跟随过快训练震荡太小目标更新太慢收敛速度下降。ReplayBuffer容量100000对简单仿真足够因为每回合最多几百步存十万条经验覆盖上千回合多样性有保障。3.3 训练循环与代码实现细节SAC训练循环分两大块环境交互和网络更新。环境交互时策略网络根据当前状态采样动作加入少量探索噪声SAC本身随机策略自带探索不需要额外epsilon-greedy。采样出的动作执行到环境里得到下一个状态和奖励存到Replay Buffer。网络更新时从Buffer里随机采样一批经验按SAC的更新公式计算损失反向传播更新参数。PyTorch实现中需要注意几个关键点第一两个Critic网络都有对应的目标网络目标网络参数通过多伦软更新从当前网络复制不能直接参与梯度计算。第二Actor的loss里要包含熵项也就是alpha乘log_prob的相反数这个log_prob是对tanh正态分布求对数概率PyTorch的TanhTransform可以用来计算。第三目标Q值用min(Q1_target, Q2_target)再减去alpha * log_prob_next这里log_prob_next用新状态输入目标Actor得到。我贴一段核心的Critic更新代码片段供参考# 从buffer采样 states, actions, rewards, next_states, dones replay_buffer.sample(batch_size) with torch.no_grad(): next_actions, next_log_probs actor_target(next_states) target_q1 critic_target_1(next_states, next_actions) target_q2 critic_target_2(next_states, next_actions) target_q torch.min(target_q1, target_q2) - alpha * next_log_probs target_q rewards gamma * (1 - dones) * target_q current_q1 critic_1(states, actions) current_q2 critic_2(states, actions) critic_loss F.mse_loss(current_q1, target_q) F.mse_loss(current_q2, target_q)这段逻辑里有一个隐蔽但关键的点dones要转成浮点数而且终端状态的目标Q值应该是0也就是不再考虑后续收益。如果不处理dones训练时Q值会高估策略会倾向不停冲撞然后重启。我在早期实现里漏了这一步导致收敛后的策略撞墙前不减速因为“撞墙”在新回合里居然被当成高价值事件一个过渡。4. 奖励函数设计与训练调参实录4.1 奖励函数的设计思路奖励函数是强化学习中最主观也最影响效果的部分。我这里把奖励拆成四个部分到达目标的稀疏正奖励、碰撞的稀疏负奖励、与目标距离变化的稠密指导奖励、以及每步小幅时间惩罚。事件奖励值到达目标距离0.5m10回合结束碰撞障碍物或边界-1回合结束离目标更近0.1 * (距离变化量)离目标更远-0.1 * (距离变化量)每步执行-0.01稀疏奖励部分给智能体明确的最终目标稠密部分加速学习。时间惩罚的目的是防止智能体为了刷奖励原地磨蹭或者走特别长的绕路轨迹。最开始我时间惩罚设成了-0.1结果小车追求速度到疯狂撞墙改成-0.01后避障和到达目标的权衡才正常。距离变化量奖励需要小心使用。如果只看当前步与上一步的距离差小车可能会通过“横向漂移”也能减少直线距离但实际上没有真正朝目标走。我的做法是计算当前时刻到目标的欧氏距离与上一时刻到目标的欧氏距离之差用这个差值乘系数作为奖励增量。这个量很直接学习效率非常高。4.2 训练稳定性问题和调整过程我第一次完整训练时奖励曲线堪称过山车前两千步升到几百然后突然暴跌之后一直起不来。排查下来有两个原因一个是ReplayBuffer里初始随机策略产生的“垃圾经验”太多Q值被污染另一个是Critic的学习率偏大更新步长太激进。解决办法是前500步先纯随机探索不更新网络只填Buffer之后再把学习率从默认的3e-4降到3e-4其实没问题问题在于我用了同一个学习率同时更新三个网络Critic更新步数多了之后会把Actor梯度带偏。后来我让Critic每步更新2次Actor更新1次比例2:1稳定性提升非常明显。还有一个经验是关于批量大小的。我在CPU上跑初始batch_size设64训练速度很快但波动极大改成256之后单次更新更稳虽然慢了一点点但总训练步数反而减少了因为不需要反复回滚调整超参数。强化学习是方差很大的优化问题batch尽量往大了取得不偿失的情况很少。另外我对奖励曲线做了滑动平均来看不要看原始单步奖励否则任何算法都会显得在抽风。我的评估方式是每100回合记录一次累计奖励均值、碰撞率和到达率这三个指标放在一起看才有意义。单纯看奖励数值可能很高但可能是靠时间惩罚慢慢磨到目标到达率和路径长度也需要关注。4.3 收敛效果与评估指标最终训练到约3万步时策略开始稳定。在随机地图上评估每100回合的到达率从最初的不到5%提升到75%以上碰撞率从70%降低到15%以内平均路径长度也明显缩短。一个有趣的观察是智能体逐渐学会了“贴着障碍物边缘绕行”的策略。它会先朝目标方向前进发现障碍物后不是大幅转向而是微调角度、减速、顺着障碍物边缘滑过去。这种规律不是人为设计的完全是奖励函数驱动涌现出来的行为也是强化学习的魅力所在。为了验证泛化性我用训练时从未见过的障碍物密度和布局做了测试。比如原来每张图4个障碍测试时改成6个或8个目标点从固定位置改成随机位置。得益于域随机化和SAC的熵正则策略在未见场景下仍能保持较高的到达率只是偶尔会在密集障碍区卡住。这也说明仿真环境里的随机化程度直接决定了策略迁移能力。5. 常见问题与避坑指南5.1 训练不收敛怎么办这是被问得最多的问题。我梳理过一个排查顺序先看奖励能不能持续上升。如果Reward完全不动大概率是奖励信号太稀疏或环境bug比如目标点生成后小车根本到不了。可以先跑一个最简单的无障碍地图只训练“朝目标走”这一件事验证基础学习能力。再看Q值是否爆炸。如果Q值不断增大到离谱一般是dones处理错误或者目标网络没冻结。检查目标网络更新方式和dones的掩码。检查动作分布。可以用一段固定策略打印出动作均值和标准差确认动作不是全0或者全1。SAC的tanh输出很容易饱和如果动作均值长期卡在边界说明奖励设计有问题策略在玩“文字游戏”。最后考虑调超参数。优先调batch_size和软更新tau这两个比调学习率更容易见效。学习率低于1e-4通常太慢高于1e-3必然震荡。还有一个比较隐蔽的问题环境交互频率和更新频率不匹配。我早期写代码时每交互一步就更新5次网络导致策略还没探索几步就反复复习同一批经验过拟合Buffer里的旧数据表现就是训练曲线涨到某一点后不再进步。改成每步更新1次之后整个训练过程顺滑许多。5.2 Lidar仿真与真实环境的差异仿真里用射线检测障碍物和真实Lidar的数据差异主要集中在几个地方真实雷达有最大量程和最小量程近距离会有盲区真实数据有噪声、多路径反射和丢帧真实障碍物表面反射率不同有时候会被“穿透”。做仿真训练的时候我建议在距离观测上额外加一些随机噪声模拟真实传感器的不完美。比如给距离值乘一个服从[0.9,1.1]均匀分布的系数偶尔把某几根射线的值直接置为最大量程模拟丢帧。这个域随机化的操作简单但效果很好。加了传感器噪声之后训练出的策略对观测更鲁棒不会因为某个方向的距离值稍微波动就猛打方向盘。另外真实部署时还要考虑Lidar的安装高度和俯仰角实际信息量可能比仿真里的2D切片要少建议部署前先做一轮“真实数据对抗测试”把策略在仿真里的泛化能力当作起点而不是终点。5.3 工程化经验从仿真往部署走如果要把这套SAC策略部署到真实小车有几个工程细节值得提前规划。一是推理频率仿真里用10Hz没问题但真实小车主控板可能只能跑5Hz。我的做法是将策略网络导出为ONNX然后量化为FP16或INT8推理时间能压缩到几毫秒。二是安全保护强化学习策略不能没有兜底逻辑我在实际部署时会在策略输出后面接一个“安全过滤器”当Lidar最小距离小于阈值时优先给刹车信号策略输出只能作为转向参考。这个硬编码的保护区不参与训练但能保证物理设备不出大事。三是状态对齐问题。仿真里状态向量可能是Lidar距离加目标信息真机上目标位置可能来自GPS或者视觉噪声和延迟完全不同。我的经验是先固定目标信息在仿真里的分布范围再让真实系统做同样的归一化。如果目标信息噪声太大策略很容易出现“到了又没到”的抖动感。结尾的几句实在话我前前后后改过三轮奖励函数每一轮都以为想到了完美方案结果训练出来总有一些意想不到的“聪明的笨办法”。比如有一版智能体学会了绕开所有动态障碍物但同时也绕开了目标点在场地里画圈。后来我在到达目标之外的任何情况下都加上轻微的“接近目标”正向引导才把它拉回正轨。要说心得就是别把强化学习当成一个算法问题它更像一个系统调试工程环境、奖励、算法、参数互相咬合任何一个环节出问题都会体现在训练曲线里。如果你也想复现这个项目建议从最简单的无障碍版本开始让小车先学会“直奔目标”再加入静态障碍物最后再上动态障碍物。一步到位直接跑完整环境出了问题很难定位。我的这套SAC-Auto仿真代码量不大扩展性也还可以后续我打算加入动态障碍物的预测模块让避障更主动一些。等你跑通了自己的版本大概率也会忍不住开始折腾更复杂的传感器配置到时候这个弯路就算没白走。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →