利用强化学习控制机械臂

机械臂的组成

三个关节和两个链接组成
利用强化学习控制机械臂

Robotics environments

在这篇文章中,我们将抽象化在现实世界中构建机械臂的复杂性。我们将使用一个模拟机器人环境的程序代替实际的硬件。

无论您是在OpenAI还是在Boston Dynamics工作,您都将在模拟机器人环境中开始所有机器人实验。一方面,机器人的制造成本确实很高;另一方面,挥动的机器人手臂可能会伤害您。使用软件开始机器人实验更加安全有效。

我们可以找到各种各样的开放源代码和封闭源代码机器人仿真环境。 Mujoco是您经常在论文中看到的一种流行的模拟环境,3D物理模拟器。不幸的是,Mujoco的非商业许可证。其他选项包括Gazabo或任何游戏引擎(例如Unity或Unreal)。特别是Unity,最近发布了Unity ML代理。

最后,另一个使我们摆脱大型依赖关系的好选择是在Python图形引擎(例如Pyglet)中构建我们自己的简单物理模拟器。如果您的目标是发布强化学习论文或与用户一起构建多平台游戏,那么我不建议您使用此选项。但是,出于我们的目的,构建简单的物理引擎是可行的首选,因为它具有令人难以置信的透明性的优势。这将帮助我们更好地了解机器人引擎的构建方式,从而为我们转向更复杂的事物做好更好的准备。

Learning in robotics environments

Inverse Kinematics

学习解决机器人环境中的目标的典型方法是逆运动学。 这是我的简单定义:
给定执行器的最终位置,我们需要施加在关节上的力最终才能使执行器到达目标位置
利用强化学习控制机械臂
似乎合理。 但是,找到必要的力将需要利用代数和三角函数。 这很快就会变得很残酷,尤其是在我们试图弄清诸如此类的情况时:臀部的运动如何影响手指的位置?
如果还希望机器人也能在环境中移动,那么我们还需要对微分方程进行分层,非常复杂。
值得庆幸的是,最近有一种更简单的方法开始流行。

Reinforcement Learning approach to IK

我们假设大多数观众熟悉基本的机器学习技术,而我们将提出一种通用的方法来解决机器人技术中到达目标的问题。
本质上,所需要做的只是在代码中指定期望的目标作为奖励函数,我们的基础结构将负责其余工作。
在Python中开发示例,希望机器人的手指(手臂第二条连接的端点)达到某个目标。
请注意,我们不在乎指定手臂的确切位置,我们所关心的只是手指放在正确的位置。 因此,我们将以一种非常直接的方式将其转换为以下内容。
利用强化学习控制机械臂
我们的目标是最大程度地减少手指与目标之间的距离,因此,在彼此靠近时输出接近0的奖励,而在彼此相距较远时输出负的奖励。
这个简单的框架使Google的研究人员可以教授机器人手臂的精细动作,例如打开一扇门。

Reinforcement Learning

强化学习是机器学习的一个领域,该领域着眼于Agents,他们通过采取一系列行动,尝试根据给定的状态最大化其累积奖励。
该框架足够通用,已成功应用在棋类游戏(如国际象棋)和视频游戏(如Dota)中。
下面是概述强化学习算法工作原理的一个很好的图像,您可以让代理通过执行操作与环境进行交互,而环境又会返回奖励并让代理发现自己的新状态。
利用强化学习控制机械臂
在2D机械手臂的情况下:

  1. 环境——由两个手臂关节所在的空间组成
  2. 奖励——手指与目标之间的距离的负数
  3. 动作——包括两个关节中每个关节的真实值的向上或向下运动
    不幸的是,大多数强化学习算法在采用真正有价值的动作时无法很好地发挥作用。 强化学习算法的收敛与状态空间和动作空间成正比,如果动作空间像在现实世界中那样无限大,这意味着我们要等很长时间才能完全掌握所有东西。
    因此,我们将使用“深度确定性策略梯度”(DDPG)来完成这项工作。

Deep Deterministic Policy Gradients

策略梯度是一系列强化学习算法,它们试图找到最佳策略以实现特定目标。
深度确定性策略梯度具有一些关键思想,这些特征使其可以很好地解决机器人控制问题:

  1. 免模型:算法不需要任何有关机器人工作原理的内部细节,也不需要计算微分方程。它所需要的只是低水平的观察,例如关节的位置。
  2. 确定性:算法将始终在相同的测试示例上以相同的方式运行,从而在情况不佳时易于调试。
    此外,它还采用了一些技巧,这些技巧已成为现实世界中大多数强化学习应用程序的标准。它们是:
  3. 重播缓冲区:存储过去的观察结果并从发生训练时获得的奖励样本
  4. 目标网络:冻结训练目标以使学习更稳定的一种方法
  5. 批量归一化:为防止神经网络各层的输出发散

How to program a 2D robot arm