深度强化学习 | 基于PPO算法的移动机器人路径跟踪(附Pytorch实现)

目录

  • [0 专栏介绍](#0 专栏介绍)
  • [1 近端策略优化](#1 近端策略优化)
  • [2 基于PPO算法的路径跟踪](#2 基于PPO算法的路径跟踪)
    • [2.1 PPO网络设计](#2.1 PPO网络设计)
    • [2.2 动作空间设计](#2.2 动作空间设计)
    • [2.3 奖励函数设计](#2.3 奖励函数设计)
  • [3 算法仿真](#3 算法仿真)

0 专栏介绍

本专栏以贝尔曼最优方程等数学原理为根基,结合PyTorch框架逐层拆解DRL的核心算法(如DQN、PPO、SAC)逻辑。针对机器人运动规划场景,深入探讨如何将DRL与路径规划、动态避障等任务结合,包含仿真环境搭建、状态空间设计、奖励函数工程化调优等技术细节,旨在帮助读者掌握深度强化学习技术在机器人运动规划中的实战应用

🚀详情:《运动规划实战精讲:深度强化学习篇》


1 近端策略优化

深度强化学习 | 详解从信赖域策略优化(TRPO)到近端策略优化(PPO)算法原理中,我们介绍了**近端策略优化(Proximal Policy Optimization, PPO)**算法,它是OpenAI推荐的首选深度强化学习算法之一。PPO算法的目标函数为

θ k + 1 = a r g max ⁡ θ k + 1 J ( θ k + 1 ) \boldsymbol{\theta }{k+1}=\mathrm{arg}\max {\boldsymbol{\theta }{k+1}}J\left( \boldsymbol{\theta }{k+1} \right) θk+1=argθk+1maxJ(θk+1)

其中

J ( θ k + 1 ) = E ( s , a ) π θ k [ min ⁡ ( π θ k + 1 ( s , a ) π θ k ( s , a ) A π θ k ( s , a ) , c l i p ( π θ k + 1 ( s , a ) π θ k ( s , a ) , 1 − ϵ , 1 + ϵ ) A π θ k ( s , a ) ) ] J\left( \boldsymbol{\theta }_{k+1} \right) =\mathbb{E} _{\left( \boldsymbol{s},\boldsymbol{a} \right) ~\pi _{\boldsymbol{\theta }_k}}\left[ \min \left( \frac{\pi {\boldsymbol{\theta }{k+1}}\left( \boldsymbol{s},\boldsymbol{a} \right)}{\pi _{\boldsymbol{\theta }_k}\left( \boldsymbol{s},\boldsymbol{a} \right)}A^{\pi _{\boldsymbol{\theta }_k}}\left( \boldsymbol{s},\boldsymbol{a} \right) , \mathrm{clip}\left( \frac{\pi {\boldsymbol{\theta }{k+1}}\left( \boldsymbol{s},\boldsymbol{a} \right)}{\pi _{\boldsymbol{\theta }_k}\left( \boldsymbol{s},\boldsymbol{a} \right)},1-\epsilon ,1+\epsilon \right) A^{\pi _{\boldsymbol{\theta }_k}}\left( \boldsymbol{s},\boldsymbol{a} \right) \right) \right] J(θk+1)=E(s,a) πθk[min(πθk(s,a)πθk+1(s,a)Aπθk(s,a),clip(πθk(s,a)πθk+1(s,a),1−ϵ,1+ϵ)Aπθk(s,a))]

PPO截断函数(PPO-Clip)

c l i p ( x , l , r ) \mathrm{clip}\left( x,l,r \right) clip(x,l,r)

将 x x x限制在 [ l , r ] [l, r] [l,r]区间内。如图所示

  • 若 A π θ k > 0 A^{\pi _{\boldsymbol{\theta }k}}>0 Aπθk>0说明该动作的价值高于平均,最大化 J ( θ k + 1 ) J\left( \boldsymbol{\theta }{k+1} \right) J(θk+1)需要增大 π θ k + 1 / π θ k {{\pi {\boldsymbol{\theta }{k+1}}}/{\pi _{\boldsymbol{\theta }_k}}} πθk+1/πθk,但不会让其超过 1 + ϵ 1+\epsilon 1+ϵ;
  • 若 A π θ k < 0 A^{\pi _{\boldsymbol{\theta }k}}<0 Aπθk<0则最大化 J ( θ k + 1 ) J\left( \boldsymbol{\theta }{k+1} \right) J(θk+1)需要减小 π θ k + 1 / π θ k {{\pi {\boldsymbol{\theta }{k+1}}}/{\pi _{\boldsymbol{\theta }_k}}} πθk+1/πθk,但不会让其超过 1 − ϵ 1-\epsilon 1−ϵ

如下所示为PPO算法流程。

2 基于PPO算法的路径跟踪

2.1 PPO网络设计

PPO网络采用分层特征提取架构,其中共享特征提取器通过两层全连接网络(64→128单元)将原始观测映射为128维特征向量,为策略决策提供统一的潜在空间表示。策略网络在此特征基础上通过独立的双层MLP结构(64→32单元)输出动作分布,其对数标准差初始化为0.5以平衡探索与利用;价值评估网络则采用对称的双层MLP(64→32单元)结构,与策略网络共享特征提取器但保持独立的决策头,通过差异化网络参数实现特征表达的多样性,虽未显式配置双Q网络架构,但通过特征共享与独立处理的方式在PPO框架下实现了策略与价值函数的协同优化。下面为网络配置:

yaml 复制代码
policy:
  log_std_init: 0.5
  feature_extractor:
    mlp_dims: !!python/list [64, 128]
    feature_dim: 128
  actor_critic:
    actor_dims: !!python/list [64, 32]
    critic_dims: !!python/list [64, 32]

2.2 动作空间设计

针对连续动作空间的特性设计了基于高斯分布采样的策略优化框架,以线速度 v v v和角速度 ω \omega ω为控制维度,构建了对称的二维连续动作空间 [ v , ω ] ∈ [ − v max ⁡ , v max ⁡ ] × [ − ω max ⁡ , ω max ⁡ ] \left[ v,\omega \right] \in \left[ -v_{\max},v_{\max} \right] \times \left[ -\omega _{\max},\omega _{\max} \right] [v,ω]∈[−vmax,vmax]×[−ωmax,ωmax]该设计通过上下界约束限定了动作输出的物理可行域,既避免因动作幅值过大导致运动失稳,又为策略网络的探索提供了明确的边界条件。进一步,通过高斯分布 N ( μ , σ ) \mathcal{N} \left( \mu ,\sigma \right) N(μ,σ)采样生成随机动作,再经tanh函数压缩至[-1,1]后线性映射到实际动作范围,既保证梯度可导性又满足动作边界约束。下面为动作配置

yaml 复制代码
min_v: 0.0
max_v: 1.0
min_w: -2.0
max_w: 2.0
min_v_inc: -1.0
max_v_inc: 1.0
min_w_inc: -1.0
max_w_inc: 1.0

2.3 奖励函数设计

奖励函数设计采用多目标联合优化的混合奖励机制,通过时间惩罚、距离引导、目标达成奖励与碰撞惩罚的线性组合,构建了兼具探索激励与安全约束的强化学习回报,核心公式为:

R = r t i m e + α ( d t − 1 − d t ) + r r e a c h I w i n + r c o l l i s i o n I d e a d R=r_{\mathrm{time}}+\alpha \left( d_{t-1}-d_t \right) +r_{\mathrm{reach}}\mathbb{I} {\mathrm{win}}+r{\mathrm{collision}}\mathbb{I} _{\mathrm{dead}} R=rtime+α(dt−1−dt)+rreachIwin+rcollisionIdead

其中 d t d_t dt表示时刻 t t t智能体与目标的欧氏距离, I \mathbb{I} I为事件指示函数。时间惩罚项 r t i m e r_{\mathrm{time}} rtime作为基底奖励,通过固定负值施加步长成本压力,抑制智能体在环境中无效徘徊,驱动策略向高效路径收敛。距离引导项 α ( d t − 1 − d t ) \alpha \left( d_{t-1}-d_t \right) α(dt−1−dt)引入相对运动奖励机制,其中 α \alpha α为距离奖励系数,当智能体向目标靠近时 d t − 1 > d t d_{t-1}>d_t dt−1>dt产生正向激励,远离时 d t − 1 < d t d_{t-1}<d_t dt−1<dt施加负向惩罚,形成连续梯度信号引导策略优化方向。该设计相比绝对距离奖励更能话应动态环境,避免目标移动导致的奖励稀疏问题。目标达成奖励 r r e a c h r_{\mathrm{reach}} rreach作为稀疏奖励信号,仅在智能体进入目标区域时触发,通过显著的正向激励建立策略优化的全局目标导向。碰撞惩罚项 r c o l l i s i o n r_{\mathrm{collision}} rcollision则作为安全约束机制,当检测到与环境障碍物发生碰撞时施加高额负奖励,迫使策略学习规避高风险区域。

3 算法仿真

算法核心控制逻辑如下所示:

py 复制代码
def plan(self, path: list):
	lookahead_pts, lidar_frames_vis = [], []
	self.start, self.goal = path[0], path[-1]
	self.robot = DiffRobot(self.start.x(), self.start.y(), self.start.theta(), 0, 0)
	dt = self.params["time_step"]
	for _ in range(self.params["max_iteration"]):
	   # break until goal reached
	   robot_pose = Point3d(self.robot.px, self.robot.py, self.robot.theta)
	   if self.shouldRotateToGoal(robot_pose, self.goal):
	       real_path = np.array(self.robot.history_pose)[:, 0:2]
	       cost = np.sum(np.sqrt(np.sum(np.diff(real_path, axis=0) ** 2, axis=1, keepdims=True)))
	       LOG.INFO(f"{str(self)} Controller Controlling Successfully!") 
	
	   # get the particular point on the path at the lookahead distance
	   lookahead_pt, _ = self.getLookaheadPoint(path)
	   lookahead_pts.append(lookahead_pt)
	
	   # update simulated lidar
	   states = np.array([[self.robot.px, self.robot.py, self.robot.theta]])
	   self.lidar.updateScans(states, self.obstacle_indices, self.map2index_func
	
	   # calculate velocity command
	   e_theta = self.regularizeAngle(self.robot.theta - self.goal[2]) / 10
	   if self.shouldRotateToGoal(robot_pose, self.goal):
	       if not self.shouldRotateToPath(abs(e_theta)):
	           u = DiffCmd(0, 0)
	       else:
	           u = DiffCmd(0, self.angularRegularization(e_theta / dt))
	   else:
	       e_theta = self.regularizeAngle(self.angle(robot_pose, lookahead_pt) - self.robot.theta)
	       if self.shouldRotateToPath(abs(e_theta), np.pi / 4):
	           u = DiffCmd(0, self.angularRegularization(e_theta / dt / 10))
	       else:
	           u = self.DDPGControl(robot_pose, lookahead_pt)
	
	   # feed into robotic kinematic
	   self.robot.kinematic(u, dt)
	
	LOG.WARN(f"{str(self)} Controller Controlling Failed!")



🔥 更多精彩专栏

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

相关推荐
说私域1 小时前
基于开源AI智能名片链动2+1模式S2B2C商城系统的生态微商运营研究
人工智能·开源
智元视界1 小时前
从深度学习到自主学习:AI的下一个技术跃迁
大数据·人工智能·深度学习·学习·架构·数字化转型·产业升级
腾飞开源1 小时前
10_Spring AI 干货笔记之 Spring AI API
人工智能·工具调用·spring ai·多模态ai·流式api·ai模型api·etl框架
磊磊落落1 小时前
编写提示词需要遵循的五个原则(附实践案例)
人工智能
Aloudata1 小时前
周卫林|大数据通往大模型的钥匙:NoETL to Trusted AI
大数据·人工智能·数据分析·chatbi·data agent
Hcoco_me1 小时前
大模型面试题11:余弦相似度 & 牛顿迭代法
人工智能·python·决策树·机器学习·计算机视觉
月疯1 小时前
unet网络的理解
网络·人工智能·深度学习
程序员小范1 小时前
8年NLP算法工程师郭志才:Ai正在模糊内容的产权边界。
人工智能·算法·自然语言处理
大写-凌祁1 小时前
大模型强化学习(LLM-RL)最前沿综述:从 DPO 到 System 2 推理与后训练扩展
人工智能·深度学习·机器学习·计算机视觉·agi