深度强化学习 | 基于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) πθkmin(πθ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!")



🔥 更多精彩专栏

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

相关推荐
KaMeidebaby21 分钟前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
Cloud_Shy61822 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
YueTann24 分钟前
OpenRLHF设计
人工智能
云烟成雨TD26 分钟前
Spring AI 1.x 系列【52】可观测集成 SkyWalking
人工智能·spring·skywalking
云烟成雨TD27 分钟前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
AndrewHZ27 分钟前
【LLM技术全景】规模定律与模型演进:为什么模型越大越强?
人工智能·gpt·深度学习·语言模型·llm·openai·规模定律
galaxylove27 分钟前
Gartner发布创新洞察:AI SOC智能体加速通信运营商安全运营转型
大数据·人工智能·安全
甩手网软件37 分钟前
Shopee2026新规:费率重构与履约收紧下,卖家如何破局?
大数据·人工智能
数据库小学妹39 分钟前
AI时代数据库怎么选?多模融合、数据统一存储与选型实战指南
数据库·人工智能·经验分享·ai
lizhihai_991 小时前
股市学习心得-AI 产业链核心标的梳理清单
大数据·服务器·人工智能·科技·学习