主要内容

火车囊剂球平衡控制

这个例子展示了如何训练软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代理

囊代理在此示例中使用两个评论家学习最优核反应能量函数。使用两个学习Q-function时批评有助于避免过度拟合。创建批评,首先创建一个深层神经网络和两个输入(观察和行动)和一个输出。更多信息为强化学习创造深层神经网络代理,看看创建政策和价值功能

%设置随机种子再现性。rng (0)%定义网络层。cnet = [featureInputLayer numObs,“归一化”,“没有”,“名称”,“观察”)fullyConnectedLayer (128,“名称”,“fc1”)concatenationLayer (1、2、“名称”,“concat”)reluLayer (“名称”,“relu1”)fullyConnectedLayer (64,“名称”,“一个fc3”文件)reluLayer (“名称”,“relu2”)fullyConnectedLayer (32,“名称”,“fc4”)reluLayer (“名称”,“relu3”)fullyConnectedLayer (1,“名称”,“CriticOutput”));actionPath = [featureInputLayer numAct,“归一化”,“没有”,“名称”,“行动”)fullyConnectedLayer (128,“名称”,“取得”));%连接层。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”,“观察”);

演员在囊剂是随机的演员一个持续的行动空间,你作为一个定义rlContinuousGaussianActor对象。创建一个深层神经网络模型演员政策。

%创建演员网络层。anet = [featureInputLayer numObs,“归一化”,“没有”,“名称”,“观察”)fullyConnectedLayer (128,“名称”,“fc1”)reluLayer (“名称”,“relu1”)fullyConnectedLayer (64,“名称”,“取得”)reluLayer (“名称”,“relu2”));meanPath = [fullyConnectedLayer(32岁“名称”,“meanFC”)reluLayer (“名称”,“relu3”)fullyConnectedLayer (numAct“名称”,“的意思是”));stdPath = [fullyConnectedLayer numAct,“名称”,“stdFC”)reluLayer (“名称”,“relu4”)softplusLayer (“名称”,“性病”));%连接层。actorNetwork = layerGraph (anet);actorNetwork = addLayers (actorNetwork meanPath);actorNetwork = addLayers (actorNetwork stdPath);actorNetwork = connectLayers (actorNetwork,“relu2”,“meanFC /”);actorNetwork = connectLayers (actorNetwork,“relu2”,“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”,5000,“MaxStepsPerEpisode”,地板(Tf / Ts),“ScoreAveragingWindowLength”,100,“阴谋”,“训练进步”,“StopTrainingCriteria”,“AverageReward”,“StopTrainingValue”,675,“UseParallel”、假);

对于并行训练,指定一个支持文件列表。金宝app这些文件需要模型Kinova机器人在并行工人当CAD几何渲染选项被选中。

如果trainOpts。UseParallel trainOpts.ParallelizationOptions。AttachedFiles = [pwd, filesep] +(“bracelet_with_vision_link.STL”;“half_arm_2_link.STL”;“end_effector_link.STL”;“shoulder_link.STL”;“base_link.STL”;“forearm_link.STL”;“spherical_wrist_1_link.STL”;“bracelet_no_vision_link.STL”;“half_arm_1_link.STL”;“spherical_wrist_2_link.STL”];结束

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

doTraining = false;如果doTraining统计=火车(代理,env, trainOpts);其他的负载(“kinovaBallBalanceAgent.mat”)结束

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

模拟训练的代理

验证培训代理,运行仿真软件模型。金宝app

为球定义任意初始位置对板中心。查看代理性能在不同的情况下,改变这个板上的其他位置。

球。x0=0。10;球。y0=- - - - - -0.10;

创建一个金宝appSimulink.SimulationInput对象并设置初始球的位置。

在= Si金宝appmulink.SimulationInput (mdl);= setVariable (,“球”球);

可选地,您可以附加一个动画功能。

在= setPostSimFcn @animatedPath);

模拟模型。

= sim(中);

图球平衡动画包含一个坐标轴对象。坐标轴对象与标题球位置板包含3矩形,类型的对象。

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

环境重置功能

函数= kinovaResetFcn(中)%球参数球。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 (,“情况”,情况);%的动画在= setPostSimFcn @animatedPath);结束