火车囊剂球平衡控制
这个例子展示了如何训练软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衍生产品)的球,取向(四元数)和速度(四元数衍生产品)的板、关节力矩从最后一次一步,球的半径和质量。
操作的规范化的关节转矩值。
样品时间是 和仿真时间 。
仿真终止当球脱落。
奖励 在时间步 是由:
在这里, 是一个奖励球靠近板的中心, 是惩罚板取向, 是一个点球为控制的努力。 , , 是各自滚、音高和偏航角板的弧度。 和 是关节力矩。
创建环境的观察和操作规范使用连续观察和行动空间。
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)
当使用两个评论家,囊代理要求他们有不同的初始参数。创建和初始化两个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)
创建一个演员函数使用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(中);
视图使用球球的轨迹位置块范围。
环境重置功能
函数= 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);结束