matlab2020b例程
这个例子展示了如何训练四足机器人使用深度确定性策略梯度(DDPG)智能体行走。本例中的机器人使用 SimscapeTM MultibodyTM 进行建模。有关 DDPG 智能体的更多信息,请参见双延迟的深度确定性策略梯度智能体。
在 MATLAB 中将必要的参数加载到基本工作空间中。
initializeRobotParameters
四足机器人模型
这个例子的环境是一个四足机器人,训练的目标是使机器人使用最小的控制力在一条直线上行走。
机器人使用 Simscape 多体和 Simscape 多体接触力库建模。主要的结构构件是四条腿和一个躯干。腿通过外展关节与躯干连接。对 RL 智能体块提供的动作值进行缩放并转换成关节扭矩值。这些关节扭矩值被转动关节用来计算运动。
打开模型。
mdl = 'rlQuadrupedRobot';
open_system(mdl)
Observations
机器人环境向智能体提供了44个观察值,每个观察值的归一化范围在 -1和1之间。这些观察值是:
- 身体重心的 y (垂直)和 y (侧面)位置
- 四元数表示躯干的方向
- 躯干在质量中心的 x (向前) ,y (垂直)和 z (侧向)速度
- 躯干的滚转、倾斜和偏航速度
- 每条腿髋关节和膝关节的角位置和速度
- 每条腿由于地面接触而产生的法向力和摩擦力
- 动作值(每个关节的扭矩)来自上一个时间步骤
对于所有四条腿,髋关节和膝关节角度的初始值分别设置为 -0.8234和1.6468 rad。关节的中立位置在0 rad。当腿被拉伸到最大并且垂直于地面时,它们处于中立位置。
Actions
智能体生成8个在 -1和1之间规范化的动作。经过乘以比例因子,这些相当于八个转动关节的关节扭矩信号。每个关节的总扭矩界限为 +/-10n-m。
Reward
在训练期间的每一个时间步骤中,智能体都会得到以下奖励。这个奖励函数通过为积极的前进速度提供积极的奖励来鼓励智能体前进。它还通过在每个时间步提供一个恒定的奖励(25T s/tf)来鼓励代理避免提前终止。奖励函数中的其余项目是阻止不必要状态的惩罚,例如与所需高度和方向的大偏差或过度使用关节扭矩。
其中
-
V x 是躯干重心在 x 方向的速度。
-
Ts 和 tf 分别是环境的采样时间和最终模拟时间。
-
Y 是躯干重心与理想高度0.75米的比例高度误差。
-
θ 是躯干的倾斜角度。
-
U t − 1 i U^i_{t-1} Ut−1i是上一个时间步长中关节 i 的动作值。
Episode Termination
在训练或模拟过程中,如果出现以下任何情况,该事件将终止。
-
躯干中心距离地面的高度低于0.5米(落差)。
-
躯干的头部或尾部在地面以下。
-
任何膝关节都在地下。
-
滚转角、俯仰角或偏航角分别为外界(+/-0.1745、 +/-0.1745和 +/-0.3491 rad)。
创建环境接口
指定观察值集的参数。
numObs = 44;
obsInfo = rlNumericSpec([numObs 1]);
obsInfo.Name = 'observations';
指定动作集的参数。
numAct = 8;
actInfo = rlNumericSpec([numAct 1],'LowerLimit',-1,'UpperLimit', 1);
actInfo.Name = 'torque';
使用强化学习模型创建环境。
blk = [mdl, '/RL Agent'];
env = rlSimulinkEnv(mdl,blk,obsInfo,actInfo);
在训练过程中,复位函数将随机偏差引入初始关节角度和角速度。
env.ResetFcn = @quadrupedResetFcn;
创建 DDPG 智能体
DDPG 智能体通过使用批评价值函数表示来近似给予观察和行动的长期奖励。智能体还使用行动者表示决定在给定观察值的情况下采取哪个动作。这个例子的行动者和评论者网络的灵感来自于[2]。
有关创建深层神经网络值函数表示的详细信息,请参阅创建策略和值函数表示。有关为 DDPG 智能体创建神经网络的示例,请参阅 trainddpg 智能体控制双积分器系统。
使用 createNetworks 帮助函数在 MATLAB 工作区中创建网络。
createNetworks
您还可以使用 Deep Network Designer 应用程序交互地创建您的行动者和评论者网络。
查看评论家网络配置。
plot(criticNetwork)
使用 rddpgagentoptions 指定智能体选项。
agentOptions = rlDDPGAgentOptions;
agentOptions.SampleTime = Ts;
agentOptions.DiscountFactor = 0.99;
agentOptions.MiniBatchSize = 250;
agentOptions.ExperienceBufferLength = 1e6;
agentOptions.TargetSmoothFactor = 1e-3;
agentOptions.NoiseOptions.MeanAttractionConstant = 0.15;
agentOptions.NoiseOptions.Variance = 0.1;
为智能体创建 rlDDPGAgent 对象。
agent = rlDDPGAgent(actor,critic,agentOptions);
指定训练选项
要训练智能体,首先指定以下训练选项:
-
每次训练最多10000 episode ,每次最多个 maxSteps 时间步长。
-
在“Episode Manager”对话框中显示训练进度(设置“Plots ”选项) ,并禁用命令行显示(设置“Verbose ”选项)。
-
当智能体在连续250次的训练中平均累积奖励超过190时,停止训练。
-
为累积奖励大于200的每个episode 保存一个智能体副本。
maxEpisodes = 10000;
maxSteps = floor(Tf/Ts);
trainOpts = rlTrainingOptions(...
'MaxEpisodes',maxEpisodes,...
'MaxStepsPerEpisode',maxSteps,...
'ScoreAveragingWindowLength',250,...
'Verbose',true,...
'Plots','training-progress',...
'StopTrainingCriteria','AverageReward',...
'StopTrainingValue',190,...
'SaveAgentCriteria','EpisodeReward',...
'SaveAgentValue',200);
若要并行训练智能体,请指定以下训练选项。并行训练需要并行计算 ToolboxTM 软件。如果没有安装并行计算 ToolboxTM 软件,请将 Parallel 设置为 false。
-
将 useballow 选项设置为 true。
-
异步并行地训练代理。
-
每32个步骤之后,每个worker向主机发送经验。
-
DDPG 智能体要求员工向主机发送“经验”。
trainOpts.UseParallel = true;
trainOpts.ParallelizationOptions.Mode = 'async';
trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 32;
trainOpts.ParallelizationOptions.DataToSendFromWorkers = 'Experiences';
训练智能体
使用 Train 函数训练智能体。由于机器人模型的复杂性,这个过程需要大量的计算,需要几个小时才能完成。若要在运行此示例时节省时间,请通过将 doTraining 设置为 false 来加载预训练的智能体。要自己训练智能体,请将 doTraining 设置为 true。由于平行训练的随机性,您可以预期下面的图形会得到不同的训练结果。
doTraining = false;
if doTraining
% Train the agent.
trainingStats = train(agent,env,trainOpts);
else
% Load a pretrained agent for the example.
load('rlQuadrupedAgent.mat','agent')
end
智能体仿真
固定随机生成器种子的再现性。
rng(0)
为了验证训练过的智能体的性能,在机器人环境中进行仿真。有关智能体模拟的更多信息,请参见 rlSimulationOptions 和 sim。
simOptions = rlSimulationOptions('MaxSteps',maxSteps);
experience = sim(env,agent,simOptions);
关于如何训练一个 DDPG 智能体来行走一个双足机器人和一个仿人步行机器人的例子,请分别参考《模拟强化学习多体训练双足机器人行走》和《模拟步行机器人训练》。
参考
[1] Heess, Nicolas, Dhruva TB, Srinivasan Sriram, Jay Lemmon, Josh Merel, Greg Wayne, Yuval Tassa, et al. ‘Emergence of Locomotion Behaviours in Rich Environments’. ArXiv:1707.02286 [Cs], 10 July 2017. https://arxiv.org/abs/1707.02286.
[2] Lillicrap, Timothy P., Jonathan J. Hunt, Alexander Pritzel, Nicolas Heess, Tom Erez, Yuval Tassa, David Silver, and Daan Wierstra. ‘Continuous Control with Deep Reinforcement Learning’. ArXiv:1509.02971 [Cs, Stat], 5 July 2019. https://arxiv.org/abs/1509.02971.