创建可微物理引擎Nimble,开源SOTA人体骨骼模型,斯坦福腿疾博士生用AI「助跑」人生

2021-09-06 10:23:16 浏览数 (1)

机器之心报道

编辑:杜伟、陈萍

身残志坚,斯坦福大学的这位人工智能 机器人博士生想用技术克服身体缺陷。

有一位研究者,他身患残疾,出生时便患有退行性神经疾病,该疾病一直攻击着他的外周运动神经元(进行性神经性腓骨肌萎缩症, 2A 型)。他就是来自斯坦福大学的博士生 Keenon Werling。

为了走路,Werling 不得不带上腿支架,可能随着病情的恶化,还会坐上轮椅。

不能像正常人一样行走,但可以通过技术来帮助自己。因此,Werling 对设计、构造和控制外骨骼以帮助恢复行动不便的人正常行走产生了浓厚 兴趣。为了实现这一目标,Werling 还对可微物理引擎、人体建模和机器人技术感兴趣。此外,他还是可微物理引擎 Nimble 的创建者。

Nimble 地址:http://nimblephysics.org/

Werling 希望更多的人从事触觉、动作捕捉、人机交互等的研究。

在相关论文《 Fast and Feature-Complete Differentiable Physics for Articulated Rigid Bodies with Contact 》中, Keenon Werling 作为一作系统地介绍了关于 Nimble 的相关工作。

论文地址:https://arxiv.org/pdf/2103.16021.pdf

该研究提出了一个快速和功能完备的可微分物理引擎 Nimble,它支持拉格朗日动力学和关节刚体模拟的硬接触约束。Nimble 提供了一套完整的功能,这些功能通常只能在机器人应用程序经常使用的不可微分物理模拟器中可用。他们使用线性互补问题(LCP),可以精确地求解接触约束。该研究利用 LCP 解的稀疏性,通过非弹性接触的 LCP 公式,提出了有效和新颖的解析梯度。

该研究支持复杂的接触几何和近似连续时间弹性碰撞的梯度。此外,该研究还介绍了一种计算互补感知梯度的新方法,可避免下游优化任务在鞍点失速。

该研究表明,在现有物理引擎 (DART)的分支中实现这种组合,在计算单个时间步(single timestep)分析雅可比矩阵时,能够在有限差分方法的基础上实现 87 倍的单核加速,同时保留原始 DART 的所有表现力。

Nimble 技术原理

此前已经在许多不同领域对可微物理模拟进行了研究,包括机械工程、机器人、物理学和计算机图形学。借助自动微分方法和库的最新进展,研究人员已经提出了许多可微物理引擎来解决刚体和非刚体的控制和参数估计问题。虽然这些物理引擎都旨在解决类似的「逆问题」,但它们提供的特性和功能差异很大,包括接触处理、状态空间参数化和碰撞几何支持等方面的差异。

下表 I 展示了几个可微物理引擎的差异,这些引擎已经展示了「模拟有接触铰接刚体」的能力。基于每个引擎各自支持的功能,计算梯度的方法可以分为这几类,分别是有限差分、自动微分、符号微分以及利用神经网络来近似物理。

研究者提出的 Nimble 与 MuJoCo、DiffTaichi 等其他物理引擎的比较。

研究者提出的 Nimber 物理引擎通过手动调整的 C 代码,使用符号微分来计算引擎每个部分的梯度。从技术来讲,他们提出了一种新的方法来解析微分 LCP,该方法利用了解的稀疏性,并与求解 LCP 的直接方法兼容。

此外,研究者的引擎支持比以前可用更丰富的碰撞和接触处理几何集合,包括网格和网格原始碰撞,以便为机器人应用程序实现全功能可微的 DART 物理引擎版本。

Nimble 物理引擎的效果怎么样呢?下图 1 是利用 Nimble 引擎模拟的学习瑜伽的波士顿动力 Atlas 机器人。Atlas 机器人有 34 个网格碰撞器和 32 个自由度,整个冻结帧(freeze frame)有 24 个接触点。即便 Atlas 构造如此复杂,研究者在使用他们提出的方法在单个 CPU 上计算机器人动力学雅克比矩阵时,速度是有限差分方法的 87 倍(8.5ms VS 749ms)。

Nimble 具体实现

目前,Nimble 正在测试阶段,支持 Linux 和 Mac OS X 系统,不支持 Windows 系统,Windows 用户可以使用 Windows Subsystem for Linux。

所需 Python 版本为 3.5、3.6、3.7 或 3.8,安装以下 pip 即可运行:

代码语言:javascript复制
pip install nimblephysics

将世界建模为一组骨骼

Nimble 将世界建模为一组骨骼,每个骨架由一组关节组成,它们将刚体连接在一起。研究者以 KR5 机器人为例展示了整个过程。

图源:free3d.com

输入以下代码:

代码语言:javascript复制
import nimblephysics as nimble
import osworld: nimble.simulation.
World = nimble.simulation.World()
arm: nimble.dynamics.Skeleton = world.loadSkeleton(
    os.path.join(os.path.dirname(__file__), "./KR5.urdf"))
    
# Your code here
gui = nimble.NimbleGUI(world)
gui.serve(8080)
gui.blockWhileServing()

用户运行以上代码时应该会在浏览器中看到 KR5 机器人。研究者通过这个运行示例来解释 Nimble 的基本概念。

在出现「Your code here」的地方,用户可以插入以下代码:

代码语言:javascript复制
print(arm.getPositions())

当用户运行该文件时,将看到一个长度为 6 的 numpy 向量被打印到控制台。Nimble 在广义坐标(generalized coordinate)中工作,这意味着位置向量(有时称为「自由度」)的每个元素都指代一个关节位置。具体如下图所示:

用户可以更改骨架的关节值并重新运行代码以更改手臂的位置:

代码语言:javascript复制
arm.setPositions([0, 0, -90*(3.1415/180), 0, 0, 0])

通过告知肘部(向量中的索引 2)向后旋转 90 度,手臂将直接指向天空,如下图所示:

研究者还在相同的广义坐标空间中表达速度。例如,如果用户希望肘关节以每秒 1 弧度的速度向前旋转,则可以将手臂的速度设置如下

代码语言:javascript复制
arm.setVelocities([0, 0, 1, 0, 0, 0])

Nimble 还为很多不同的关节类型提供了内置支持,下图展示了一些常见的关节类型:

可微人体模型

该研究创建 Nimble 的主要动机之一是支持生物力学和 AI 交叉领域的研究。为了支持这一目标,Nimble 包含了许多用于处理可微分人体的工具。

有许多不同的骨骼可以用来代表人体。骨骼形式通常被设计成对计算机图形学应用足够好的形式。对于需要物理精度的应用,该研究参考了生物力学文献,生物力学的黄金标准人体模型是 Rajagopal 2015 模型,从 OpenSim 移植而来。该模型与 Nimble 捆绑在一起,并且是完全可微的!用户可以使用以下方法创建它:

代码语言:javascript复制
# Create a Rajagopal skeleton and add it to the worldhuman: nimble.dynamics.Skeleton = nimble.RajagopalHumanBodyModel()world.addSkeleton(human)

这将创建一个如下图所示的骨架:

© THE END

转载请联系本公众号获得授权

投稿或寻求报道:content@jiqizhixin.com

0 人点赞