主要内容

火车囊剂球平衡控制

这个例子展示了如何训练软actor-critic (SAC)强化学习代理来控制机器人手臂ball-balancing任务。

介绍

机器人手臂在这个例子中是一个Kinova Gen3机器人,这是一种七自由度机械手(景深)。手臂的任务是平衡一个乒乓球的中心平面(板)连接到机器人抓手。只有最后两个关节驱动和贡献在俯仰和滚运动轴如下列图所示。剩下的关节是固定的,不会导致运动。

打开模型®模型查看金宝app系统。模型包含一个Kinova球平衡子系统连接RL代理。代理一个动作适用于机器人子系统和接收结果的观察,奖励,完成信号。

open_system (“rlKinovaBallBalance”)

Kinova球平衡子系统。

open_system (“rlKinovaBallBalance / Kinova球平衡”)

在这个模型中:

  • 系统的物理组件(机械手、球和板)的建模使用Simscape™多体™组件。

  • 板是限制终端执行器的操纵者。

  • 球有6个自由度,可以在太空中自由移动。

  • 球和板之间的接触力建模使用空间接触力的块。

  • 机械手的控制输入的转矩信号驱动关节。

如果你有机器人系统工具箱机器人库数据金宝app支持包,您可以查看在力学浏览器机械手的三维动画。为此,打开7自由度机械手子系统和设置它可视化参数三维网格。如果你安装了支持包,设置金宝app可视化参数没有一个。下载并安装包的支持,使用附加的探险家。金宝app更多信息见获取和管理插件

创建示例通过运行参数kinova_params脚本包含在这个例子。当你有机器人系统工具箱机器人库数据支持包安装,这个脚本还增加了必要的网格文件到MATLAB®路径。金宝app

kinova_params

定义环境

训练强化学习代理,您必须定义的环境进行交互。球的平衡环境:

  • 22元素所代表的观测向量包含位置信息(关节角的正弦和余弦)和速度(关节角衍生产品)的两个驱动关节,位置(x和y距离板中心)和速度(x和y衍生产品)的球,取向(四元数)和速度(四元数衍生产品)的板、关节力矩从最后一次一步,球的半径和质量。

  • 操作的规范化的关节转矩值。

  • 样品时间是 T 年代 = 0 01 年代 和仿真时间 T f = 10 年代

  • 仿真终止当球脱落。

  • 奖励 r t 在时间步 t 是由:

r t = r + r + r 行动 r = e - - - - - - 0 001年 ( x 2 + y 2 ) r = - - - - - - 0 1 ( ϕ 2 + θ 2 + ψ 2 ) r 行动 = - - - - - - 0 05年 ( τ 1 2 + τ 2 2 )

在这里, r 是一个奖励球靠近板的中心, r 是惩罚板取向, r 行动 是一个点球为控制的努力。 ϕ , θ , ψ 是各自滚、音高和偏航角板的弧度。 τ 1 τ 2 是关节力矩。

创建环境的观察和操作规范使用连续观察和行动空间。

numObs = 22;%观测空间的维数numAct = 2;%的行动空间的维数obsInfo = rlNumericSpec ([numObs 1]);actInfo = rlNumericSpec ([numAct 1]);actInfo。LowerLimit = 1;actInfo。UpperLimit = 1;

创建接口使用仿真软件环金宝app境的观察和操作规范。创造仿真软件环境的更多信息,请参阅金宝apprl金宝appSimulinkEnv

mdl =“rlKinovaBallBalance”;黑色= mdl +“/ RL代理”;env = rl金宝appSimulinkEnv (mdl,黑色,obsInfo actInfo);

指定一个重置功能对环境使用ResetFcn参数。

env。ResetFcn = @kinovaResetFcn;

这个重置函数(在本例中提供)随机初始化初始球的x和y位置对板的中心。更健壮的培训,还可以随机内其他参数重置功能,如球的质量和半径。

指定样品时间Ts和仿真时间特遣部队

t = 0.01;Tf = 10;

创建代理

代理在本例中是一个软actor-critic (SAC)代理。囊剂使用一个或两个参数化核反应能量函数近似者估计价值的政策。核反应能量函数批评家接受当前的观察和行动作为输入并返回一个标量输出(估计折扣累积长期奖励的接收状态对应于当前的行动观察,和后政策之后)。囊剂的更多信息,请参阅软Actor-Critic (SAC)代理

囊代理在此示例中使用两个批评。模型中的参数化核反应能量函数批评,使用神经网络和两个输入层(一个用于观测通道,所指定的obsInfo,行动的其他渠道,指定的actInfo)和一个输出层(返回标量值)。

定义每个网络路径层对象数组。将名称分配给每条路径的输入和输出层。这些名字让你连接路径,然后明确关联网络的输入和输出通道层与适当的环境。

更多信息为强化学习创造深层神经网络代理,看看创建政策和价值功能

%设置随机种子再现性。rng (0)%定义网络层。cnet = [featureInputLayer numObs Name =“观察”)fullyConnectedLayer (128) concatenationLayer(1、2名=“concat”)reluLayer fullyConnectedLayer (64) reluLayer fullyConnectedLayer (32) reluLayer fullyConnectedLayer (Name =“CriticOutput”));actionPath = [featureInputLayer numAct Name =“行动”)fullyConnectedLayer(128年,Name =“取得”));%连接层。criticNetwork = layerGraph (cnet);criticNetwork = addLayers (criticNetwork actionPath);criticNetwork = connectLayers (criticNetwork,“取得”,“concat / in2”);

查看评论家神经网络。

情节(criticNetwork)

图包含一个坐标轴对象。坐标轴graphplot类型的对象包含一个对象。

当使用两个评论家,囊代理要求他们有不同的初始参数。创建和初始化两个dlnetwork对象。

criticdlnet = dlnetwork (criticNetwork,“初始化”、假);criticdlnet1 =初始化(criticdlnet);criticdlnet2 =初始化(criticdlnet);

创建一个评论家功能使用rlQValueFunction

摘要= rlQValueFunction (criticdlnet1 obsInfo actInfo,ObservationInputNames =“观察”);critic2 = rlQValueFunction (criticdlnet2 obsInfo actInfo,ObservationInputNames =“观察”);

软Actor-critic代理使用参数化随机策略在一个连续的操作空间,这是由一个连续实现高斯的演员。

这演员需要一个观察作为输入并返回输出随机行动从高斯概率分布采样。

近似高斯分布的平均值和标准偏差,您必须使用神经网络和两个输出层,每一个拥有尽可能多的元素行为空间的维数。一个输出层必须返回一个向量包含每个行动维度的平均值。另一个必须返回向量包含每个行动维度的标准差。

由于标准差必须负的,使用softplus或执行nonnegativity ReLU层。囊剂自动读取的行动范围UpperLimitLowerLimit的属性actInfo(这是用于创建演员),然后在内部尺度分布和边界。因此,不添加一个tanhLayer作为最后一个非线性层平均输出路径。

定义每个网络路径层对象数组,并将名称分配给每条路径的输入和输出层。

%创建演员网络层。commonPath = [featureInputLayer numObs Name =“观察”)fullyConnectedLayer (128) reluLayer fullyConnectedLayer (64) reluLayer (Name =“anet_out”));meanPath = = [fullyConnectedLayer(32岁的名字“meanFC”)reluLayer (Name =“relu3”)fullyConnectedLayer (numAct Name =“的意思是”));stdPath = [fullyConnectedLayer numAct Name =“stdFC”)reluLayer (Name =“relu4”)softplusLayer (Name =“性病”));%连接层。actorNetwork = layerGraph (commonPath);actorNetwork = addLayers (actorNetwork meanPath);actorNetwork = addLayers (actorNetwork stdPath);actorNetwork = connectLayers (actorNetwork,“anet_out”,“meanFC /”);actorNetwork = connectLayers (actorNetwork,“anet_out”,“stdFC /”);

查看演员神经网络。

情节(actorNetwork)

图包含一个坐标轴对象。坐标轴graphplot类型的对象包含一个对象。

创建一个演员函数使用rlContinuousGaussianActor

actordlnet = dlnetwork (actorNetwork);演员= rlContinuousGaussianActor (actordlnet obsInfo actInfo,ObservationInputNames =“观察”,ActionMeanOutputNames =“的意思是”,ActionStandardDeviationOutputNames =“性病”);

囊代理在这个例子中列车从一种体验缓冲区的最大容量128随机选择mini-batches e6的大小。0.99的折现系数接近1,因此倾向于长期奖励一个较小的值。囊hyperparameters及其描述的完整列表,看看rlSACAgentOptions

指定代理hyperparameters培训。

agentOpts = rlSACAgentOptions (SampleTime = Ts,TargetSmoothFactor = 1 e - 3,ExperienceBufferLength = 1 e6,MiniBatchSize = 128,NumWarmStartSteps = 1000,DiscountFactor = 0.99);

对于这个示例演员和评论家神经网络更新使用亚当算法的学习速率1军医和梯度阈值为1。指定优化参数。

agentOpts.ActorOptimizerOptions。算法=“亚当”;agentOpts.ActorOptimizerOptions。LearnRate = 1的军医;agentOpts.ActorOptimizerOptions。GradientThreshold = 1;ct = 1:2 agentOpts.CriticOptimizerOptions (ct)。算法=“亚当”;agentOpts.CriticOptimizerOptions (ct)。LearnRate = 1的军医;agentOpts.CriticOptimizerOptions (ct)。GradientThreshold = 1;结束

创建囊剂。

代理= rlSACAgent(演员,[摘要,critic2], agentOpts);

火车代理

培训代理商,首先使用指定培训选项rlTrainingOptions。对于这个示例,使用以下选项:

  • 运行每个培训最多5000集,每集持久的最多地板(Tf / Ts)时间的步骤。

  • 停止训练当代理接收到平均累积奖励大于675连续超过100集。

  • 加快训练集UseParallel选项真正的,这就需要并行计算工具箱™软件。如果你没有软件安装设置的选项

trainOpts = rlTrainingOptions (MaxEpisodes = 6000,MaxStepsPerEpisode =地板(Tf / Ts),ScoreAveragingWindowLength = 100,情节=“训练进步”,StopTrainingCriteria =“AverageReward”,StopTrainingValue = 675,UseParallel = false);

指定一个可视化的旗帜doViz显示动画的球在MATLAB图。并行训练,禁用所有可视化。

如果trainOpts.UseParallel% Simscape力学中禁用可视化浏览器set_param (mdl SimMechanicsOpenEditorOnUpdate =“关闭”);set_param (mdl +“Kinova球平衡/ 7自由度操纵国”,“VChoice”,“没有”);%在MATLAB中禁用动画图doViz = false;save_system (mdl);其他的% Simscape力学中启用可视化浏览器set_param (mdl SimMechanicsOpenEditorOnUpdate =“上”);%在MATLAB中启用动画人物doViz = true;结束

你可以使用的日志训练数据到磁盘rlDataLogger函数。对于这个示例,日志事件的经验和演员和评论家功能损失。的函数logAgentLearnDatalogEpisodeData定义在脚本的生活。更多信息见日志训练数据到磁盘

记录器= rlDataLogger ();记录器。AgentLearnFinishedFcn = @logAgentLearnData;记录器。EpisodeFinishedFcn = @(数据)logEpisodeData(数据,doViz);

火车代理使用火车函数。培训这个代理是一个计算密集型的过程需要几分钟才能完成。节省时间在运行这个例子中,加载一个pretrained代理设置doTraining。训练自己代理,集doTraining真正的

doTraining = false;如果doTraining trainResult =火车(代理,env、trainOpts记录器=记录器);其他的负载(“kinovaBallBalanceAgent.mat”)结束

快照的培训进展如下图所示。你可以期待不同的结果由于随机性的培训过程。

模拟训练的代理

指定一个初始位置的球盘中心。在模拟随机初始球的位置,设置userSpecifiedConditions旗帜

userSpecifiedConditions = true;如果userSpecifiedConditions球。x0 = 0.10;球。y0=- - - - - -0。10;env。ResetFcn = [];其他的env。ResetFcn = @kinovaResetFcn;结束

创建一个模拟选项配置仿真的对象。该代理将模拟为最多地板(Tf / Ts)步骤/模拟集。

simOpts = rlSimulationOptions (MaxSteps =地板(Tf / Ts));

期间启用可视化模拟。

set_param (mdl SimMechanicsOpenEditorOnUpdate =“上”);doViz = true;

模拟代理。

经验= sim(代理,env, simOpts);

视图使用球球的轨迹位置块范围。

查看动画的球在MATLAB中的板图。

无花果= animatedPath(经验);

图球平衡动画包含一个坐标轴对象。坐标轴对象与标题球位置板,包含X (m), ylabel Y (m)包含3矩形,类型的对象。一个或多个行显示的值只使用标记

环境重置功能

函数= kinovaResetFcn(中)% KinovaResetFcn用于随机初始关节角R6_q0,% R7_q0和最初的手腕和手扭矩值。%球参数球。radius = 0.02;% m球。质量= 0.0027;%公斤球。年代hell = 0.0002;% m%计算球转动惯量。球。莫伊= calcMOI (ball.radius ball.shell ball.mass);%初始条件。+ z是垂直向上。%随机板内的x和y的距离。球。x0=- - - - - -0。125 + 0.25*rand;x % m,初始距离板中心球。y0=- - - - - -0。125 + 0.25*rand;% m,初始y板中心的距离球。z0 = ball.radius;% m,初始z高度从板表面球。dx0 = 0;x % m / s,球的初始速度球。dy0 = 0;y % m / s,球的初始速度球。dz0 = 0;z % m / s,球的初始速度%的接触摩擦参数球。年代taticfriction = 0.5; ball.dynamicfriction = 0.3; ball.criticalvelocity = 1e-3;%恢复系数转化为弹簧阻尼参数。coeff_restitution = 0.89;[k c w] = cor2SpringDamperParams (coeff_restitution ball.mass);球。年代t如果fness = k; ball.damping = c; ball.transitionwidth = w; in = setVariable(in,“球”球);%随机关节角范围内的+ / - 5度%的起始位置的关节。函数函数R6_q0 =(-65) +(5 + 10 *兰德);函数函数R7_q0 =(-90) +(5 + 10 *兰德);= setVariable (,“R6_q0”,R6_q0);= setVariable (,“R7_q0”,R7_q0);%计算近似初始关节力矩,控球,%板和手臂在初始配置g = 9.80665;wrist_torque_0 =(-1.882 +球。x0 *球。质量* g) * cos(函数(-65)- R6_q0);hand_torque_0 =(0.0002349 -球。y0 *球。质量* g) * cos(函数(-90)- R7_q0);情况= [wrist_torque_0 hand_torque_0];= setVariable (,“情况”,情况);结束

数据记录功能

函数dataToLog = logAgentLearnData(数据)%这个函数执行完成后%的代理学习子例程dataToLog。ActorLoss = data.ActorLoss;dataToLog。CriticLoss = data.CriticLoss;结束函数doViz dataToLog = logEpisodeData(数据)%这个函数执行完成后一集dataToLog。经验= data.Experience;%集完成后显示一个动画如果doViz animatedPath (data.Experience);结束结束

另请参阅

功能

对象

相关的例子

更多关于