影子手控制器
我们使用深度学习和深入的增强学习为在Mujoco环境中的阴影手模型构建了一个控制器。控制器允许手执行标志性手势。这只手的支撑手势是:
- 休息
- 降低
- 中指
- 是的
- 不
- 岩石
- 圆圈
影子手演示:https://youtu.be/vt_booel3fu
阴影手描述

ShadowHand是由Mujoco_menagerie存储库提供的3D机器人手,用于学术和研究目的。可以在这里找到:https://github.com/deepmind/mujoco_menagerie/tree/main/main/shadow_hand
它如何工作
Shadow Hand使用20个位置电动机作为执行器,可以在其手指和手腕上移动。它的执行器的控制范围有限,由制造商定义。可以通过将Mujoco模拟器下载并通过Drag&Drop将Shadow Hand XML文件(位于OBJecs/Showe_hand/castic_left.xml)导入Shadow Hand XML文件(位于objecs/shower_hand/castic_left.xml )来找到每个执行器的位置。要查看每个执行器的位置和方向,必须在模拟窗口内启用关节选项,这可以在渲染/模型元素面板中找到。算法,它们在XML文件中进行了分析描述。
下面提供了每个手动执行器的位置以及控制范围:
ID | ctrl_limit_left | ctrl_limit_right |
---|
0 | -0.523599 | 0.174533 |
1 | -0.698132 | 0.488692 |
2 | -1.0472 | 1.0472 |
3 | 0 | 1.22173 |
4 | -0.20944 | 0.20944 |
5 | -0.698132 | 0.698132 |
6 | -0.261799 | 1.5708 |
7 | -0.349066 | 0.349066 |
8 | -0.261799 | 1.5708 |
9 | 0 | 3.1415 |
10 | -0.349066 | 0.349066 |
11 | -0.261799 | 1.5708 |
12 | 0 | 3.1415 |
13 | -0.349066 | 0.349066 |
14 | -0.261799 | 1.5708 |
15 | 0 | 3.1415 |
16 | 0 | 0.785398 |
17 | -0.349066 | 0.349066 |
18 | -0.261799 | 1.5708 |
19 | 0 | 3.1415 |

行为克隆
行为克隆(BC)是一种通过观察和模仿人类专家来执行任务的教学者的方法。在机器人技术中,这是特别常见的技术,模型学会通过模仿人类来执行任务。此方法涉及:
- 数据收集:人类专家应构建一个数据集,该数据集由成对组成:(观察,动作) 。
- 学习算法:然后设计学习算法(例如神经网络),以将观测值(输入)映射到预期动作(输出)。
- 部署:然后在物理模型上评估和部署控制器。
深厚的增强学习
深度强化学习(DRL)是教学机器以最佳方式执行任务的另一种流行技术,但与行为克隆不同。虽然行为克隆直接从所需行为的示例(演示)中学习,但DRL通过与环境的互动并以奖励或惩罚的形式获得反馈来学习。在DRL环境中,代理商接收其状态 $ s_ {t} $从环境中选择一个动作 $ a_ {t} $使用其政策 $ pi _ { theta} $ ,然后转到下一个状态 $ s_ {t+1} $并终于获得奖励 $ r_ {t+1} $根据动作的良好方式。代理的目的是最大化累积返回$ r = r_ {t + 1} + r_ {t + 2} + r_ {t + 3} + ... $。
有两个流行的算法系列用于DRL问题:
- 基于价值的方法:这些方法旨在找到一个价值函数,这是代理可以从任何给定状态(或州行动对)获得的预期累积奖励的度量。最常见的价值函数是Q功能Q(S,A),它可以测量采取行动的预期回报 $ a_ {t} $在一个状态 $ s_ {t} $ 。测量预期回报的另一种方法是通过使用 $ v(s)$ ,衡量状态有多好 $ s_ {t} $ 。有时,将这两个功能组合在一起,以加快代理商的训练过程和学习表现。通过正确估计值函数,代理可以在连续状态之间进行最佳过渡,从而学习最佳行为。 Q功能和值函数都可以使用神经网络估算,如下所示。
- 政策颁布方法:政策梯度方法无需计算估计的回报,而是直接优化了策略功能,而无需将价值函数作为中介。该策略通常通过一组权重(例如神经网络)进行参数化,学习涉及调整这些权重以最大程度地提高预期奖励。这个想法是,通过更改神经网络的权重,从而改变所选动作,它还改变了代理商通过环境获得的奖励。代理的目的是在Directin中更改其策略(权重),以最大化其奖励,如下所示。策略级方法比基于价值的方法的一个主要优点是,它们允许使用连续动作(例如float值),而不是离散的操作(例如1,2,3)。这在Mujoco环境(例如我们的)中特别有用,该环境的目标是预测每个执行器的控制(浮点值)。
观察(输入)
行为克隆和DRL技术都需要数据集或模拟环境来检索数据。为了培训这两个代理,我们构建了一个由成对组成的数据集 $(标志,订单) - > (控制)$ 。
- 符号:符号是一组顺序控件,为了执行符号手势,手部控制器必须执行该控件。例如,要执行“是”手势,手必须首先制作拳头(1),然后向下移动(2),然后再向上移动(3)。
- 顺序:顺序是序列内部所需控制的索引。这是必要的,因为代理应按照指定的顺序顺序执行所有控件。例如,在“是”示例中,必须连续执行控件(1),(2),(3)。
- 控制:控制是20个值的向量(数组),每个执行器一个。每个值都是一个控制执行器位置的浮点数,并且不超过上面表的控制限制。
标志/订单表示
神经网络接收输入向量并输出控制向量。虽然预计输入向量将是浮点值的向量,但我们的数据集包含符号,这些符号是字符串(单词)和订单,即整数数字。由于数据集很小,因此我们将每个单词和顺序转换为唯一向量,如下所示:
符号 | 向量 |
---|
休息 | [0,0,0,0,0,0,1] |
降低 | [0,0,0,0,0,1,0] |
中指 | [0,0,0,0,1,0,0] |
是的 | [0,0,0,1,0,0,0] |
不 | [0,0,1,0,0,0,0] |
岩石 | [0,1,0,0,0,0,0] |
圆圈 | [1,0,0,0,0,0,0] |
命令 | 向量 |
---|
1 | [0,0,1] |
2 | [0,1,0] |
3 | [1,0,0] |
现在,可以将这些功能连接并插入神经网络/DRL代理控制器中。
神经网络(BC)
神经网络的目的是预测20个执行器的控制值: $ hat {y_ {0}}, hat {y_ {1}}, hat {y_ {2}}, hat {y_ {3}},... ,通过使用符号,订购对作为输入。为此,网络输出控制预测,并使用平均绝对误差(MAE)函数来评估其预测误差。然后,网络使用ADAM Optimizer,这是梯度下降算法的改进,以更新其权重并减少MAE。如果 $ y $和 $ hat {y} $分别是目标(实际)和预测的控制,然后将MAE定义为:
$ frac {1} {n} * sum_ {i = 1}^{n} | y_i - hat {y_i} | $

近端策略优化(DRL)
近端策略优化(PPO)是一种流行的政策梯度义务,它解决了信托区域政策优化(TRPO)面临的培训稳定性和效率方面的一些挑战。 PPO介绍了一种剪裁机制,以防止任何单个步骤都过于彻底更新(防止权重进行大型更新并急剧变化),从而确保新政策与旧策略不会太大偏离旧策略。 PPO旨在最大程度地提高目标函数的剪辑版本,而不是直接最大程度地提高预期奖励。该剪辑的客观限制了新政策和旧政策的概率之比。具体而言,如果与旧政策相比,新政策将大大提高该动作的可能性,则此更改被删除为指定范围内(例如,0.8至1.2之间)。这样可以防止过度侵略性的更新,从而迅速将其融合为次优政策。此范围由剪辑参数定义 $ e $ ,通常是在 $ [0.1,0.3] $ 。
就像BC神经网络一样,PPO作为输入并输出手的目标控制对(符号,顺序)对。然后,它不使用损失(错误)函数来评估其错误,而是使用奖励功能接收奖励,该奖励试图在每次迭代中最大化。奖励功能 $ r $被定义为 $ r_ {t} = frac {1} {euclidean(y_ {t} - hat {y_ {t}})} $ ,其中欧几里得是预测和目标对照之间的欧几里得距离。

Python版本和图书馆
- python == 3.9 https://www.python.org/downloads/release/python-390/
- mujoco = 2.3.7 https://github.com/deepmind/mujoco
- tensorflow == 2.9.1 https://www.tensorflow.org/install
- ray [rllib] == 2.3.1 https://docs.ray.io/en/latest/rllib/index.html
- 体育馆== 0.26.1 https://gymnasium.farama.org/
- matplotlib == 3.7.2 https://matplotlib.org/
如何运行
- python generate_expert_dataset.py构建数据集。手可以使用钥匙按钮(1-7)切换手势。鼠标可用于浏览模拟世界
- python train_nn.py训练和评估神经网络
- python train_ppo.py训练和评估PPO代理
- python simulate_neural_network_controller.py部署和评估基于神经网络的控制器
- python simulate_neural_network_controller.py部署和评估基于PPO的控制器
参数说明
- Traigntory_Steps :在两个连续控件之间执行的互化控件的数量(例如,如果
start_ctrl = [1,1,1], end_ctrl = [2,2,2] and trajectory_steps=5
,则手部执行2 + 3个控件[ 1,1,1]和[2,2,2]。 - cam_verbose :在终端中打印相机位置(这有助于最初调整相机位置和方向)。
- SIM_VERBOSE :在每个时间步上打印每个执行器的控件。
- One_hot_signs :是否要进行单次符号和订单。如果是错误的,则标志和订单将分别作为字符串和整数返回。但是,必须修改神经网络和DRL代理,以便将字符串用作输入。一种方法是添加一个嵌入层(https://www.tensorflow.org/text/guide/word_embeddings)。在手势的数量以及符号的序列大小非常大的情况下,这可能很有用,因此无法使用单次编码方法。
- Learning_rate :神经网络的亮度率。这样可以减少网络更新,从而确保网络将缓慢收敛到本地最小值。 0.001是一个良好的典型价值
- 时期:训练网络的时期数(数据集将被馈送到网络的次数)。默认为1000。
- LOSS_FN :神经网络的损失函数。默认为“ Mae”。
- Train_itrations :将训练代理商的迭代次数。默认为1000。
- 种子:随机种子,用于生成随机数。这使实验可以复制。默认为0。
自定义控制器
可以在glfwsimulator类中提供自定义模型控制器,以便o控制手的执行器(检查simulate_neural_network_controller.py和simutate_neural_network_controller.py示例)。可以修改以下行
hand_controller = Controller(
model=agent,
ctrl_limits=ctrl_limits
)
以便将代理替换为自定义代理。代理(或模型)应继承控制器/controller.py文件中的Controller class
,并定义以下方法:
-
def _set_sign(self, sign: str)
:将控制器的行为设置为指定的符号 def _get_next_control(self, sign: str, order: int)
:获取指定符号的下一个控件(例如,如果符号定义为10个顺序控件,则get_next_control
应返回该顺序的下一个预测控件(check modec.py.py.py.py.py.py文件)。
模拟环境
模拟环境是使用Mujoco提供的GLFW库来编写的。可以通过修改simulaton/pyopengl.py文件的while
循环轻松修改它。
自定义神经网络
神经网络使用TensorFlow库构建在型号/TF/NN.PY中。可以通过扩展NeuralNetwork class
的构建方法来构建自定义神经网络。当前的体系结构为每个输入向量使用2层128个单位(符号向量为128,订单向量为128个)和每一层中的Relu激活函数。然后,将两层串联成256个单位的向量,然后是另一层128个神经元,最后20个输出单元。最后20个单元用于设置执行器控件。
定制代理
该存储库使用RLLIB的PPO代理。但是,可以添加几件事:
- 微调(搜索PPO的更好参数)。当前,算法使用John Schulman等人所述,使用PPO的默认参数。 Al在原始论文中https://arxiv.org/abs/1707.06347
- 添加更强的学习算法:例如,众所周知,又名SAC在Mujoco环境中具有很强的性能:https://arxiv.org/pdf/1801.01290.pdf
- 增加训练迭代:在该库中提供的预训练模型中,对神经网络和PPO代理进行了1000次迭代培训。尽管神经网络趋于一个小错误,但PPO需要更多的训练迭代才能收敛。这就是PPO控制器似乎具有怪异行为的原因。
- 添加自定义神经网络作为参与者批评模型。但是,这是一个非常困难的任务,但是,我们也为此目的创建了一个存储库:https://github.com/kochlisgit/deep-rl-frameworks