利用机械手进行球平衡的强化学习
探索如何使用强化学习来解决复杂动态系统中的控制任务,如冗余机器人机械手。该任务的目标是设计一个控制器,它可以在附着于机械手末端执行器的平面上平衡乒乓球。基于模型的控制理论,如模型预测控制(MPC)或其他方法,可以通过创建工厂的数学模型来解决这类任务。然而,当设备模型变得复杂时,设计这样的控制器可能会变得困难。在这种情况下,无模型强化学习是一种选择。请参阅使用强化学习工具箱™创建和训练代理的教程,这些代理可以执行球平衡任务,同时对环境中的变量具有健壮性。在本教程的最后,您将了解如何创建环境,如何通过神经网络表示代理,以及如何训练网络以达到令人满意的性能。
在这个动手环节,你将学习如何控制一个机器人机械手,使用强化学习平衡一个球在盘子上。您将逐步从在Simulink中建立机器人模型开始,创建和训练强化学习代理的过程。最后,我们将通过选择不同的算法和训练选项来探索定制RL代理的几种方法。
首先,让我们看看我们的机器人操作系统的不同组成部分。这个例子中的机器人是Kinova机械臂,它是一个7自由度的机械手,有一个夹持器。此图显示了整个系统的建模。该设计是在Simulink中使用Simscape多体块创建的,Simscape多体块专门用于建模和模拟高保真机械系统。该系统的主要结构部件是Kinova机器人,附着在机器人末端执行器上的平面或平板,以及可以在平板上弹跳或滚动的乒乓球。球的运动模型使用六止关节,但运动也受到板的限制,只要有接触。球和板之间的接触力是用一个特殊的接触力块建模的,它基本上表现为一个弹簧和质量回火系统。
现在我们可以深入了解每个子系统以更好地理解它们。在项目文件夹中,您可以在models文件夹下找到一个Simulink模型。您可以打开模型,一旦打开了模型,您就可以在这些子系统下导航,并更详细地查看它们。
在机器人子系统中,我们可以看到机器人手臂的不同部分,但连杆和关节是由一些跳跃式多体块表示的。这些组件是通过使用SM import命令导入CAD几何图形或步骤文件来创建的。我们不会详细介绍导入工作流,但是您将在本教程的末尾找到更多关于这方面的信息。
转动关节——旋转关节块负责连杆之间的运动,在向旋转关节注入扭矩信号后计算运动。对于这个例子,我们让它变得简单,只驱动最后两个关节,也就是这里的R6和R7关节。其他的关节在一些预定的关节角度保持静止。这些角度是在初始化脚本中指定的,你可以在这里找到。可以打开脚本查看系统的不同参数,并在这里随意更改任何您喜欢的内容。
在熟悉了模型之后,让我们来看看控制问题。在这个例子中,任务是平衡盘子上的一个乒乓球。在我们的模拟开始时,球可以从板内的任何位置开始,控制算法应该计算必要的顶部信号来驱动球到中心并在那里保持平衡。
这一任务可以使用流行的控制算法如MPC或其他最优控制方法来解决。然而,由于我们需要这种算法的数学模型,当系统很复杂时,设计控制器可能会变得困难。例如,如果你要为整个系统设计一个MPC控制器,通过执行所有的关节,你将需要计算雅可比矩阵或编写动力学的过渡函数,这可能是一个繁琐的过程。这就是强化学习可以为设计控制器提供另一种方法的地方。
下面是一些关键概念和强化学习的快速概述。我们将专注于强化学习的部分,被称为无模型强化学习。顾名思义,该算法不需要植物的模型,而是通过与植物的重复交互来学习所需的行为。此图显示了强化学习设置中的标准数据流。设置中的控制器是RL代理。系统的其余部分包括机器人板,球,以及它们的驱动和传感组件,被称为环境。
代理通过提供一组用a表示的动作信号与环境进行交互。环境使用这些信号进入下一个状态S,这个状态S被呈现给代理。代理还从环境中收到另一个信号R,称为奖励,这是一个关于行为选择是否适合对照测试的反馈。
学习算法的目标是通过代理和环境的重复交互使这种奖励随着时间的推移最大化。在本教程中,我们将使用深度神经网络表示代理。你可以在MATLAB文档中找到更多关于设计神经网络的信息。但现在,让我们看看如何使用强化学习工具箱来解决这个问题。
当您回到MATLAB窗口时,从这里的项目文件夹中打开实时脚本。该脚本包含用于强化学习的标准命令行工作流。我们首先运行一个启动脚本,该脚本将必要的文件添加到MATLAB文件中,并在基本工作区中创建所需的变量。要运行脚本,您可以单击这里的run部分按钮,这也会打开Simulink模型。
在这个模型的顶层,您将看到我们之前讨论过的与环境交换数据的代理的强化学习设置。让我们进入环境,打开观察子系统来查看信号。观察结果是22个信号的集合,表示系统在任何给定时间的状态。这包括被驱动关节的位置和速度,球的位置和速度,平板四元数和导数的信息,以及之前时间步长的顶部输入,然后是球的一些物理参数,如质量和半径。代理将使用这些观察结果来计算每个时间步的动作。因为这些信号具有不同的单位,其中一些信号与这些比例因子相乘,以便它们与其他信号保持或多或少相同的范围。这很重要,因为这些信号将被输入到神经网络中,而高量级的信号可能会导致网络的一部分主导并破坏其他信号的效果。如果你以某种方式将观察结果规范化或规模化,这个网络会训练得更好。
我们也取方向的正弦和余弦,而不是直接使用它们,以避免正负5的不连续角。这是因为观察空间的不连续可能导致学习算法收敛性差。
来自环境的另一个信号是奖励信号。让我们花点时间来更好地理解奖励信号。任何时间步的奖励都由这里所示的关系给出。因为我们希望代理将球移动到板的中心,所以我们应该在球移动到中心时提供积极的奖励。这个奖励可以是任何特定状态下最远的值,但我们可以通过提供非线性函数形式的形状来改进奖励。
在本例中,当球的x和y距离趋于0时,我们使用高斯函数来奖励代理。在训练代理几次之后,您会发现一个形状良好的奖励有助于提高训练收敛性。
除了把球移动到中心,我们还想避免太多的平板朝向,这将违反平衡球的直觉。由于这个原因,我们提供了一个惩罚高板朝向角度。当代理使用过多的控制努力时,我们还为它提供另一种惩罚。
最后将奖惩相加,得到每个时间步上的标量奖励。这里还需要注意的是,每个终止的奖励函数都乘以了一个比例因子,以指定在整体奖励中的相对重要性。
来自环境的最后一组信号是down信号,并决定何时应该终止模拟。终止可能意味着系统已经达到一个糟糕的状态,进一步模拟没有意义。在这种情况下,我们终止模拟,通过比较xy坐标与平板边界,球从平板上掉下来。
让我们回到现场脚本,从Simulink模型创建一个强化学习环境。首先,您需要为输入和输出创建规范。因为在我们的例子中,观察和操作空间是连续的,所以您可以使用RL数值规格函数来创建如下所示的规格。
一旦创建了规范,就可以使用RL Simulink env函数创建一个环境对象,如下所示。您将需要指定Simulink模型名称、通过RL代理块的块路径,以及我们之前创建的观察和操作规范。
训练RL代理的一个重要方面是域随机化。您可以在每个训练集的开始随机化Simulink环境,方法是提供一个函数来重置环境,就像这里所做的那样。这种随机化可以帮助代理学习对环境中的变化具有鲁棒性的策略。
向下滚动到脚本的末尾,查看reset函数。在这里,有些参数对随机化很重要比如球的物理参数初始关节角和初始力矩。您可以根据自己的喜好在这些参数中引入随机性。但现在,让我们专注于随机球的初始版本然后保持其他参数不变。
在创建环境之后,下一步是在MATLAB中创建一个强化学习代理。在强化学习工具箱中有许多算法可供选择。这些算法可以在离散或连续的动作空间上工作,或者两者都工作。在本教程中,您将使用支持连续动作空间的Soft actor -批评家代理。
下面是软演员-评论家算法的高级解释。蓝色的引线代表药剂的主要成分。经验缓冲区用于存储来自代理环境交互的经验,代理通过使用来自该缓冲区的示例数据进行学习。该智能体的学习算法采用一个行动者和两个批评家的主动批评家方法,每个行动者和两个批评家都由神经网络表示。
参与者查看环境状态,并根据来自网络的平均值和方差输出选择操作,如图所示。这种均值不变性定义了行为人的随机策略,并用于计算代理的动作。在训练过程中,通过在期望奖励和策略熵之间的权衡来更新行动者网络的权重。
评论家就坐在演员后面,批评演员的行为,不管他们是好是坏。他们的利率也会定期更新。该算法采用多批评家来减少Q函数的过高估计。您可以在本教程末尾找到关于Soft actor -批评家算法的更多信息。但现在,你需要做的就是在MATLAB中创建这个神经网络。其他的一切都将由工具箱处理。
现在我们再次回到行脚本。您可以通过运行本节中的代码来创建神经网络。如图所示,批评家网络由几个完全连接层(fullconnectedlayers)和中继层(relulayer)组成。这个网络的输入是代理的观察和操作。输出是Q函数值。您可以使用相同的评论家网络来创建两个评论家。
演员也以类似的方式建模。它以观测值作为策略分布的输入和输出的均值和方差。在创建演员和评论家之后,您可以使用rlSACAgent函数创建代理,如下所示。代理的大多数类型的参数保持默认值,如下所示。因此,在本教程中,您不必太担心更改它们。要获得参数类型的完整列表,您可以单击此链接,它将带您进入MATLAB文档。
创建代理之后,最后一步是使用train命令训练算法。您可以指定一些培训选项,例如代理将培训多长时间,培训的股票价值是多少。例如,您可以设置训练集的最大数量,如图所示,然后设置训练集的最大步骤。
另一个重要参数是停止训练标准。在这种情况下,当过去100集的平均奖励达到675或更多时,我们便会停止训练。这个值是在分析代理的几个训练迭代的性能之后得到的。
要开始训练,您可以将这个蓝色训练标志设置为true并执行该部分中的代码。软件将花费几秒钟来设置训练,我们将启动一个插曲管理图来跟踪训练进度。
一旦图启动,你可以从图中查看训练进度,也可以在机制资源管理器窗口中看到动画。你可以在这里看到,代理人试图平衡球,但大多数时间失败。这是意料之中的,因为这是培训的开始,代理还没有学到很多东西。
我们还会从剧情中看到,特工每集并没有获得太多奖励。蓝线代表每集的奖励,红线代表100集的平均奖励。黄线代表预期的长期回报。
当代理从经验中学习时,您将看到奖励将增加并收敛到某个值。此时,您可以停止训练并查看代理的性能。要停止训练,只需点击这里的停止训练按钮。为了节省时间,让我们停止训练,继续现场脚本。
图中显示了一个已完成的培训课程的快照。这将让您了解我们在培训过程中期待什么。在这一特定训练中,代理在大约3300集之后达到了675的平均奖励。它花了大约20个小时才完成。
根据您的系统规格,培训可能需要更少的时间,也可能需要更多的时间。此外,由于过程中存在随机性,您的实际结果可能与这里所示的稍有不同。现在让我们加载一个训练有素的代理来查看这个性能。您可以将doTraining标志设置回false以加载保存在MAT文件中的代理。您可以再次运行该节来加载文件。
加载代理之后,向下滚动到模拟部分。在这里,您可以根据自己的喜好设置球的初始位置,并与训练有素的代理模拟这个模型。在这里,初始的x和y位置被设置为一些非零的值。让我们运行这部分。现在您可以在动画中看到代理能够成功地将球置于中心位置。你可以试着用不同的初始条件模拟一些不同的时间。
回到Simulink模型,您可以通过这些代码块查看球的轨迹和控制输入。正如这里所看到的,x和y轨迹收敛于零或接近零的值。我们可以认为这对于本教程来说是令人满意的。另一方面,动作看起来非常嘈杂。出于实际目的,我们可能需要考虑驱动器是否能够处理这些信号。我们可以认为它是未来分析代理性能的增强。这和我们的奖励函数是一致的。
下面是微调代理性能的几个选项。你可以随机化环境中的其他参数比如球的质量和初始速度进行训练。您还可以更改参数和奖励函数,或者更改代理超参数。另一种选择是为该测试使用不同的代理算法。我们不会在这个视频中讨论这些,但你可以自己尝试,了解更多关于强化学习的知识。
本期视频到此结束。我们涵盖了很多概念,希望这能让您了解RL以及如何使用强化学习工具箱来解决控制问题。最后,这里有一些你可以用于进一步阅读的参考资料。
相关产品2022世界杯八强谁会赢?
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。