ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

基于PPO强化学习的六轴机械臂轨迹规划与避障控制仿真实践

基于PPO强化学习的六轴机械臂轨迹规划与避障控制仿真实践 简介本资源是一套面向机器人控制与强化学习研究者的六轴机械臂智能轨迹规划仿真系统聚焦工业自动化场景下的PPO算法落地实践解决CR5机械臂在动态环境中自主避障、末端精确定位与夹爪协同控制等核心问题。压缩包共102个文件含25个Python主控与训练脚本、15个配置与日志文本、10个PyTorch模型权重.pt、10个JSON参数配置、6个SDF/URDF模型文件及STL视觉组件总大小仅1.02MB结构紧凑、模块分明便于快速部署与二次开发。已有38人学习下载适用于具备Python、PyTorch及ROS基础的中级以上开发者。资源提供完整可运行的PPO策略网络MLP架构、定制化奖励函数设计、CR5模型初始化关节角度设定、视觉障碍物识别接口封装及末端执行器状态闭环控制逻辑附赠说明文档与多层级配置模板显著降低DRL在真实机械臂仿真中的入门门槛与调试成本。1. 项目概述当强化学习遇上六轴机械臂最近在机器人控制领域强化学习RL的应用热度持续攀升尤其是像PPO近端策略优化这类稳定高效的算法。我手头这个项目就是一次将前沿算法与经典工业场景结合的深度实践基于PPO强化学习算法的六轴机械臂轨迹规划与避障控制仿真系统。简单来说就是让一个虚拟的六轴机械臂这里用的是CR5模型学会在复杂环境中自己规划出一条从起点到终点的最优路径同时还要能灵巧地避开各种障碍物最终精准地完成抓取任务。这听起来像是科幻电影里的场景但背后的逻辑其实非常清晰。传统的机械臂轨迹规划比如基于示教编程或者运动学逆解配合路径搜索算法如A*、RRT往往需要工程师预设大量规则对环境变化的适应性较差。一旦场景里出现了没预料到的障碍物或者目标位置发生了微小变动整个系统可能就需要重新调整。而强化学习的核心思想是“试错学习”让智能体在这里就是机械臂的控制策略在与环境的不断交互中通过奖励信号的引导自主发现完成任务的最佳行为模式。PPO算法因其在采样效率、训练稳定性和超参数鲁棒性方面的优异表现成为了解决这类连续控制问题的首选。这个项目的核心价值在于它构建了一个完整的、可复现的仿真训练闭环。从机械臂模型导入、关节初始化到末端执行器位姿控制、夹爪动作设计再到障碍物的视觉识别与状态编码最后通过多层感知机构建策略网络并设计合理的奖励函数驱动PPO进行训练。整个过程完全在仿真环境中进行成本低、效率高、无风险是验证算法、调试策略的绝佳沙盒。无论你是机器人方向的研究者还是对AI机器人感兴趣的工程师这个项目都能为你提供一个从理论到实践的清晰路线图。接下来我就把这个项目的完整实现思路、关键技术细节以及我踩过的坑毫无保留地分享出来。2. 系统整体架构与核心模块拆解要理解这个系统我们得先把它拆开看看各个部分是如何协同工作的。整个系统可以看作一个标准的“感知-决策-执行”强化学习闭环但在机器人领域每个环节都有其特殊之处。2.1 仿真环境搭建CR5机械臂与虚拟世界一切始于仿真环境。我们选择了CR5这款六轴协作机械臂作为我们的智能体载体。在仿真中我们需要精确地复现它的物理属性。这不仅仅是加载一个3D模型那么简单。首先是模型初始化与关节角度控制。在仿真引擎如PyBullet、MuJoCo或ROS Gazebo中导入URDF统一机器人描述格式文件后机械臂的每个关节从基座J1到末端J6都需要被正确初始化到一个“归零”或安全的起始位置。关节角度的控制是底层执行的关键。我们通常采用位置控制或力矩控制模式。在这个项目中为了简化问题并聚焦于高层策略学习我采用了位置控制。这意味着策略网络输出的动作直接是每个关节的目标角度。仿真器内部的PD比例-微分控制器会负责计算出所需的力矩驱动关节平滑地运动到目标位置。这里的一个关键参数是控制频率通常设置在20-100Hz之间。频率太低会导致运动不平滑像机器人得了关节炎频率太高则会急剧增加计算负担且对策略网络的输出精度要求过高。我经过测试将控制频率设定在50Hz在运动平滑度和计算效率之间取得了不错的平衡。其次是末端执行器位置状态设计。对于抓取任务我们更关心机械臂“手”末端执行器的位置和姿态而不是每个关节具体转了多少度。因此在状态空间的设计中末端执行器的位姿Position Orientation是核心信息。通常我们用三维坐标 (x, y, z) 表示位置用四元数 (qx, qy, qz, qw) 或欧拉角 (roll, pitch, yaw) 表示姿态。我强烈推荐使用四元数因为它能避免欧拉角著名的“万向节死锁”问题更利于神经网络学习和数值稳定性。所以末端执行器的状态是一个7维向量。最后是夹爪与障碍物建模。夹爪通常被建模为两个可以开合的执行器。它的状态很简单就是开合程度一个0到1之间的标量值。障碍物则是这个仿真世界的“考题”。为了模拟真实世界的复杂性我设计了两种障碍物静态障碍物如桌子、墙壁、固定箱子和动态障碍物如一个缓慢摆动的钟摆、一个沿固定路径移动的小球。它们的形状、大小、位置信息都需要被准确地提供给智能体。2.2 感知模块从像素到状态向量智能体如何“看到”这个世界这就是感知模块的任务。标题中提到了“视觉识别”但在强化学习仿真中我们通常有两条路特权信息Perfect State Information和视觉输入Visual Input。在这个项目中为了降低训练难度、加快收敛速度我首先采用了特权信息方案。也就是说仿真器直接告诉智能体所有它需要知道的信息机械臂所有关节的当前角度、角速度末端执行器的精确位姿夹爪的开合状态以及所有障碍物的精确位置、形状和大小对于动态障碍物还包括速度。这些信息被拼接成一个高维的状态向量直接输入给策略网络。这种方式避开了计算机视觉中图像特征提取的难题让智能体专注于学习“控制”本身。当然更贴近现实的方案是使用视觉输入即从安装在机械臂基座或场景中的虚拟摄像头渲染出RGB或RGB-D图像然后使用卷积神经网络CNN来提取特征。这属于“从像素到动作”的端到端学习难度极大训练数据需求和计算成本呈指数级增长。作为进阶方向可以在特权信息策略训练稳定后尝试用训练好的策略网络作为“老师”通过模仿学习或域随机化技术来训练一个视觉策略网络。为了给未来视觉方案铺路我在仿真环境中依然设置了摄像头并渲染图像但在当前PPO训练中并未使用。感知模块的输出就是那个精心设计的状态向量它是智能体决策的唯一依据。2.3 决策核心PPO算法与策略网络设计决策的核心是PPO算法和它的载体——策略网络。PPO为什么适合这里因为它通过重要性采样和裁剪机制在保证策略迭代更新的同时有效避免了传统策略梯度方法中步长过大导致的性能崩溃问题。对于机械臂这种连续动作空间每个关节的角度都是连续值的控制问题PPO的表现非常稳健。策略网络Actor我使用了一个简单的多层感知机MLP来构建策略网络。网络输入就是前面提到的状态向量。经过2-3个全连接层每层256或512个神经元使用ReLU激活函数的非线性变换后网络输出两个东西1)动作均值向量维度等于机械臂的动作维度6个关节角 1个夹爪开合 7维2)动作对数标准差向量同样是7维。这意味着策略网络并不是输出一个确定的动作而是输出一个高斯分布。智能体在每一步从这个分布中采样得到具体的动作值。这种随机性对于探索环境至关重要。价值网络CriticPPO是Actor-Critic架构所以还需要一个价值网络来评估当前状态的好坏。价值网络的结构与策略网络类似也是一个MLP但它只输出一个标量值——状态价值函数V(s)表示在当前状态下智能体未来能获得奖励总和的期望。网络训练细节策略网络和价值网络通常共享前面的几层特征提取层以提升学习效率。优化器我选择Adam其自适应学习率特性很省心。学习率是超参数调试的重中之重策略网络的学习率通常设得比价值网络小一个数量级例如3e-4 vs 1e-3以确保策略更新更平稳。2.4 奖励函数设计教会智能体“好与坏”奖励函数是强化学习中的“指挥棒”直接决定了智能体会学成什么样。设计一个好的奖励函数是项目成功的一半也是最体现经验的地方。一个糟糕的奖励函数会导致智能体学会一些意想不到的“作弊”行为比如疯狂抖动来获得某种奖励。我为这个抓取避障任务设计了一个稀疏奖励与稠密奖励结合的混合奖励函数任务完成奖励稀疏但巨大当夹爪成功抓住目标物体并维持超过一定时间如0.5秒给予一个大的正奖励如1000。这是最终目标。接近目标奖励稠密每一步根据末端执行器与目标物体之间距离的缩小程度给予一个小的正奖励。公式可以设计为R_distance k * (old_distance - new_distance)其中k是一个缩放系数。这引导机械臂向目标移动。避障惩罚稠密每一步检测末端执行器或机械臂连杆是否与任何障碍物发生碰撞或进入一个设定的危险距离阈值。一旦发生给予一个负奖励如-10。同时可以设计一个基于最近障碍物距离的连续惩罚项距离越近惩罚越大鼓励保持安全距离。动作平滑性惩罚稠密对相邻两步之间动作的变化量即关节角度变化量施加一个很小的负奖励如 -0.01 * ||a_t - a_{t-1}||^2。这能有效抑制机械臂产生高频抖动让运动看起来更自然、平滑。时间惩罚稠密每一步给予一个微小的负奖励如-0.1。鼓励智能体尽快完成任务避免它“磨洋工”。最终的每一步奖励是上述各项的加权和。权重的调整是调参的艺术。我的经验是初期可以加大“接近目标奖励”的权重让智能体先学会靠近目标中期逐步提高“避障惩罚”的权重让它学会绕开障碍最后微调“平滑性惩罚”和“时间惩罚”优化运动质量。3. 仿真系统实现与PPO训练全流程有了清晰的架构接下来就是具体的实现。我选择PyBullet作为仿真引擎因为它开源免费、物理仿真精度足够、且Python接口友好。3.1 环境构建步骤详解首先我们需要用Python创建一个标准的Gymnasium原OpenAI Gym风格的环境。这是与PPO算法库如Stable-Baselines3对接的标准接口。import pybullet as p import pybullet_data import numpy as np import gymnasium as gym class CR5ReachEnv(gym.Env): def __init__(self, render_modeNone): super().__init__() # 定义动作空间和状态空间 # 动作空间7个连续值 [j1, j2, j3, j4, j5, j6, gripper] self.action_space gym.spaces.Box(low-1.0, high1.0, shape(7,), dtypenp.float32) # 状态空间包括关节信息、末端位姿、目标位姿、障碍物信息等 obs_dim 6*2 7 7 num_obstacles * obstacle_state_dim self.observation_space gym.spaces.Box(low-np.inf, highnp.inf, shape(obs_dim,), dtypenp.float32) # 连接物理引擎 if render_mode human: self.physicsClient p.connect(p.GUI) else: self.physicsClient p.connect(p.DIRECT) # 无头模式更快 p.setAdditionalSearchPath(pybullet_data.getDataPath()) p.setGravity(0, 0, -9.81) # 加载场景 self.planeId p.loadURDF(plane.urdf) self.robotId p.loadURDF(cr5_robot.urdf, basePosition[0, 0, 0.5]) self.targetId p.loadURDF(cube_small.urdf, basePosition[0.5, 0.3, 0.8]) # 目标物体 # 加载障碍物URDF self.obstacle_ids [] for obs_pos in obstacle_positions: obs_id p.loadURDF(obstacle_cube.urdf, basePositionobs_pos) self.obstacle_ids.append(obs_id) # 初始化关节信息、目标位置等 self._init_joint_indices() self.target_pos, self.target_orn self._get_target_pose() self.max_steps 500 self.current_step 0 def reset(self, seedNone, optionsNone): # 重置环境到初始状态 p.resetBasePositionAndOrientation(self.targetId, self.target_pos, self.target_orn) # 重置机械臂到初始关节角度 for i, idx in enumerate(self.joint_indices): p.resetJointState(self.robotId, idx, self.init_joint_angles[i]) # 重置动态障碍物如果有 # ... self.current_step 0 obs self._get_observation() return obs, {} def step(self, action): # 执行动作将归一化的action映射到实际关节角度范围并应用控制 scaled_action self._scale_action(action) self._apply_action(scaled_action) p.stepSimulation() # 获取新的状态 obs self._get_observation() # 计算奖励 reward, done self._compute_reward() # 检查是否终止成功、碰撞、超时 terminated done or (self.current_step self.max_steps) self.current_step 1 return obs, reward, terminated, False, {} # truncated, info def _get_observation(self): # 组装状态向量关节角、关节速度、末端位姿、目标位姿、障碍物信息 joint_states p.getJointStates(self.robotId, self.joint_indices) joint_angles [state[0] for state in joint_states] joint_velocities [state[1] for state in joint_states] # 通过正向运动学计算末端位姿或直接读取末端连杆状态 end_effector_state p.getLinkState(self.robotId, self.end_effector_index) end_pos end_effector_state[0] end_orn end_effector_state[1] # 四元数形式 # 获取目标位姿 target_pos, target_orn self._get_target_pose() # 获取障碍物信息位置、大小等 obstacle_info [] for obs_id in self.obstacle_ids: pos, orn p.getBasePositionAndOrientation(obs_id) obstacle_info.extend(pos) # 简单示例只用了位置 # 拼接所有信息 obs np.concatenate([ joint_angles, joint_velocities, end_pos, end_orn, target_pos, target_orn, obstacle_info ]) return obs.astype(np.float32) def _compute_reward(self): # 实现前面所述的混合奖励函数 reward 0.0 done False # 1. 计算距离奖励 current_end_pos self._get_end_effector_pos() distance np.linalg.norm(np.array(current_end_pos) - np.array(self.target_pos)) reward -0.1 * distance # 负距离作为惩罚鼓励减小距离 # 2. 检查碰撞惩罚 if self._check_collision(): reward - 10.0 done True # 碰撞即终止 # 3. 检查是否抓取成功 if self._check_grasp_success(): reward 1000.0 done True # 4. 时间惩罚 reward - 0.05 # 5. 动作平滑惩罚需要在step函数中记录上一个动作 # reward - 0.01 * np.linalg.norm(self.last_action - current_action) return reward, done # ... 其他辅助函数_scale_action, _apply_action, _check_collision, _check_grasp_success等这个CR5ReachEnv类封装了所有环境交互逻辑。reset方法初始化环境step方法执行动作并返回结果_get_observation组装状态_compute_reward计算奖励。这是整个仿真系统的基石。3.2 PPO训练流程与参数调优环境准备好后就可以用Stable-Baselines3这样的库来训练PPO了。from stable_baselines3 import PPO from stable_baselines3.common.env_util import make_vec_env from stable_baselines3.common.callbacks import EvalCallback, CheckpointCallback # 1. 创建并行化环境加速训练 env make_vec_env(CR5ReachEnv, n_envs8) # 使用8个并行环境 # 2. 定义PPO模型 model PPO( MlpPolicy, # 使用MLP策略 env, verbose1, learning_rate3e-4, # 学习率 n_steps2048, # 每次收集多少步数据后更新 batch_size64, # 每次更新时的小批量大小 n_epochs10, # 每次更新时对数据进行几轮优化 gamma0.99, # 折扣因子看重未来奖励的程度 gae_lambda0.95, # GAE参数平衡偏差和方差 clip_range0.2, # PPO裁剪参数核心超参 vf_coef0.5, # 价值函数损失权重 ent_coef0.01, # 熵奖励系数鼓励探索 max_grad_norm0.5, # 梯度裁剪阈值 tensorboard_log./ppo_cr5_tensorboard/ # 日志目录 ) # 3. 设置回调函数 eval_callback EvalCallback( CR5ReachEnv(), # 单独的评价环境 best_model_save_path./logs/best_model, log_path./logs/results/, eval_freq10000, # 每10000步评估一次 deterministicTrue, renderFalse ) checkpoint_callback CheckpointCallback(save_freq50000, save_path./logs/) # 4. 开始训练 total_timesteps 2_000_000 # 总训练步数 model.learn( total_timestepstotal_timesteps, callback[eval_callback, checkpoint_callback] ) # 5. 保存最终模型 model.save(ppo_cr5_reach_final)训练过程通常需要数百万到上千万步在8个并行环境下使用一块中高端GPU可能也需要数小时到一天的时间。关键是要监控训练曲线通过TensorBoard主要看两个指标平均每回合奖励episode_reward和回合长度episode_length。理想情况下平均奖励应稳步上升并最终稳定在一个较高值回合长度应下降并稳定意味着智能体能更快完成任务。超参数调优心得clip_range这是PPO的灵魂。通常设置在0.1到0.3之间。太小会导致更新太保守学习慢太大会使更新不稳定。我从0.2开始如果训练不稳定奖励曲线剧烈震荡会尝试调小到0.1。learning_rate策略网络学习率从3e-4开始是安全的。如果学习一直很慢可以尝试增大到1e-3如果训练后期奖励曲线出现崩塌突然下降往往是学习率太大策略更新“步子迈大了”需要减小到1e-4或更低或者使用学习率衰减。ent_coef熵系数鼓励探索。在训练初期可以设得稍大如0.05帮助智能体尝试更多动作。随着训练进行可以逐渐衰减到0.001甚至0让策略变得更确定。Stable-Baselines3支持线性衰减。n_steps和batch_sizen_steps是每次从每个并行环境收集的数据量batch_size是每次参数更新时从这n_steps * n_envs的总数据中采样的小批量大小。确保batch_size不要太小至少32并且n_epochs优化轮数足够通常5-10。一个经验法则是batch_size * n_epochs应该大致等于n_steps * n_envs这样可以确保每次收集的数据被充分学习。4. 关键问题排查与性能优化实战在实际训练和部署中你会遇到各种各样的问题。下面是我总结的几个最常见的问题及其解决方法。4.1 训练不收敛或收敛缓慢这是最令人头疼的问题。可能的原因和排查思路如下奖励函数设计不合理这是首要怀疑对象。检查你的奖励函数是否包含了太多相互冲突的项。例如同时鼓励快速到达和精确抓取但快速移动的惩罚又太重导致智能体无所适从。解决方法简化奖励函数。初期可以只保留最核心的“任务完成奖励”和“接近目标奖励”甚至只使用稀疏奖励只有成功/失败看看智能体能否学到一点东西。如果能再逐步加入其他奖励项。状态空间设计有缺陷智能体是否获得了做出正确决策所需的全部信息例如如果没有提供关节速度信息智能体就无法感知到自身运动的速度很难做出平滑的动作。解决方法仔细审视任务确保状态向量包含了所有相关信息。对于机械臂关节角度、角速度、末端位姿、目标位姿、障碍物信息是基本要素。动作空间范围不当如果动作输出关节目标角度的范围设置得过大智能体一个微小的动作输出可能导致机械臂剧烈运动不利于精细控制。解决方法对动作进行归一化处理如映射到[-1, 1]区间并在环境内部将其缩放回实际物理范围。同时可以在仿真器的关节控制中设置力/速度限制防止过度运动。超参数设置不佳特别是学习率。学习率太大训练会震荡甚至发散太小学习速度慢如蜗牛。解决方法使用网格搜索或随机搜索进行超参数优化。可以借助Ray Tune、Optuna等自动化调参工具。一个实用的手动方法是先设置一个你认为“安全”的小学习率如1e-4观察几百个回合如果奖励有缓慢上升趋势可以逐步增大如果毫无动静检查其他方面。探索不足PPO的策略网络初始输出是随机的但如果熵系数太小或者动作标准差初始化得太小可能导致探索不足智能体困在局部最优。解决方法适当增大初始的熵系数ent_coef或者检查代码中策略网络输出的动作对数标准差是否被正确初始化通常设为0或一个很小的负数。4.2 策略表现不稳定或“遗忘”有时训练过程中奖励曲线已经上升到不错的高度但突然又掉下来或者保存的模型在不同次测试中表现差异很大。过拟合智能体可能只是记住了训练环境中障碍物的特定位置一旦目标或障碍物位置稍有变化就完全不会了。解决方法使用域随机化。在每次环境重置reset时随机化目标物体的位置、障碍物的位置和大小、甚至机械臂的初始关节角度、仿真环境的物理参数如摩擦力、重力。这能极大地提升策略的泛化能力。数据相关性PPO虽然使用了经验回放缓冲区但同一次迭代中收集的数据仍然具有高度相关性。解决方法确保batch_size足够大并且使用多个并行环境n_envs收集数据这能有效打破数据相关性。我通常使用8-16个并行环境。价值函数估计不准价值网络Critic如果训练得不好会给策略网络Actor提供错误的梯度信号。解决方法可以尝试增大价值函数损失的权重vf_coef或者单独给价值网络使用更大的学习率。同时确保价值网络有足够的容量层数、神经元数。4.3 仿真到现实的鸿沟Sim2Real虽然在仿真中训练得很完美但将策略部署到真实机械臂上时往往效果大打折扣。这是因为仿真环境和真实世界存在建模误差、传感器噪声、执行器延迟等差异。动力学随机化在仿真训练时不仅随机化视觉外观更要随机化动力学参数。比如随机改变机械臂每个关节的质量、摩擦力、阻尼系数随机改变负载夹爪抓取的物体的质量和转动惯量。这能让策略学会适应一系列不同的物理特性而不仅仅是仿真器里那个“理想”的模型。动作延迟与滤波真实机械臂执行命令有延迟且运动不可能是瞬间完成的。在仿真中可以人为地给动作加入延迟或者对策略输出的动作序列进行低通滤波模拟真实控制器的平滑效果。观测噪声注入在给策略网络输入的状态向量中加入高斯噪声模拟真实传感器如编码器、视觉系统的测量误差。这能提高策略对噪声的鲁棒性。渐进式训练先从最简单的任务如无障碍物点对点运动在仿真中训练然后将策略部署到真实机器人进行微调使用真实数据继续训练或者将在真实机器人上收集的数据与仿真数据混合训练。4.4 性能优化技巧并行化如前所述使用make_vec_env创建多个环境实例并行运行是加速训练最有效的手段。这几乎能带来线性的速度提升。仿真引擎选择PyBullet的DIRECT模式比GUI模式快得多。在训练时务必使用DIRECT模式只在评估和调试时开启GUI。状态计算优化_get_observation函数会被调用数百万次其效率至关重要。避免在循环中调用PyBullet的API如getJointState尽量批量获取数据。使用NumPy进行向量化运算。早期终止在step函数中一旦检测到任务失败如碰撞立即返回terminatedTrue并给予惩罚。这可以避免智能体在无效的状态下浪费时间加速学习。5. 项目总结与未来展望完成这个项目相当于走通了一条“仿真训练强化学习策略用于机器人控制”的标准技术路径。从环境建模、状态动作设计、奖励函数工程到PPO算法实现、超参数调试、问题排查每一个环节都充满了挑战和乐趣。最大的体会是强化学习应用的成功三分靠算法七分靠工程。一个精心设计的奖励函数和状态空间其作用往往比换一个更复杂的网络结构或调整超参数要大得多。这个系统目前还只是一个起点有很多可以深化和扩展的方向从特权信息到视觉输入这是最直接的进阶。可以尝试用RGB-D图像作为输入训练一个CNNMLP的混合网络。初期可以使用在ImageNet上预训练的CNN backbone固定其参数只训练后面的MLP部分进行迁移学习。引入层次化强化学习将复杂的抓取避障任务分解。高层策略负责规划粗略的路径点Waypoints低层策略负责跟踪这些路径点控制关节运动。这可以降低学习难度并提高策略的可解释性。结合运动学规划不必完全依赖强化学习“黑箱”。可以将强化学习与传统的运动学逆解、RRT等规划算法结合。例如用RRT生成一条粗略的无碰撞路径然后用强化学习策略来跟踪这条路径并处理动态障碍物和细微调整。这种“白黑”的混合方法往往更可靠。多任务与元学习训练一个策略使其不仅能完成“从A点抓取物体放到B点”还能适应不同的初始位置、目标位置、障碍物布局。这需要更复杂的网络结构和训练范式比如元强化学习。最后分享一个我调试奖励函数时的小技巧可视化奖励分量。在训练时不仅记录总奖励还把奖励函数中每一项距离奖励、碰撞惩罚、成功奖励等单独记录下来。当策略出现奇怪行为时通过分析各项奖励的变化可以快速定位是哪个奖励项的设计出了问题。例如如果智能体总是远远地绕着障碍物走导致永远无法接近目标那很可能是碰撞惩罚的权重设得太高了吓坏了智能体。调参的过程就像是在和智能体进行一场微妙的对话你需要通过奖励这个“语言”清晰地告诉它什么是你真正想要的。这个过程本身就是强化学习最具魅力的地方。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

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