来源:机器之心本文约2000字,建议阅读5分钟 身残志坚,斯坦福大学的这位人工智能 + 机器人博士生想用技术克服身体缺陷。

有一位研究者,他身患残疾,出生时便患有退行性神经疾病,该疾病一直攻击着他的外周运动神经元(进行性神经性腓骨肌萎缩症, 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 即可运行:

pip install nimblephysics

将世界建模为一组骨骼

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

图源:free3d.com

输入以下代码:

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」的地方,用户可以插入以下代码:

print(arm.getPositions())

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

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

arm.setPositions([0, 0, -90*(3.1415/180), 0, 0, 0])

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

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

arm.setVelocities([0, 0, 1, 0, 0, 0])

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

可微人体模型

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

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

# Create a Rajagopal skeleton and add it to the worldhuman: nimble.dynamics.Skeleton = nimble.RajagopalHumanBodyModel()world.addSkeleton(human

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

编辑:于腾凯

校对:林亦霖

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

  1. AI「抄」代码无罪?GitHub Copilot拿用户的开源代码改一改就去挣钱!

    抄袭可耻,但AI可以?刚发布的Copilot就被推上了「侵权」的风口浪尖!网友表示:你再训练都是基于我们的开源代码,这改一改就想用来赚钱真的好么? >>>> Github和Op ...

  2. bullet物理引擎与OpenGL结合 导入3D模型进行碰撞检测 以及画三角网格的坑

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11681069.html 一.初始化世界以及模型 /// 冲突配置包含内存的默认设置,冲突设置. ...

  3. MuJoCo要开源!DeepMind收购物理引擎MuJoCo,将推动全球机器人研发

    物理模拟为机器人打开了一扇进击的大门. 作者 | 吴彤.杏花 编辑 | 青暮 喜大普奔!MuJoCo要开源! 昨天,DeepMind发帖,称已经收购了用于机器人研发的MuJoCo物理引擎,目前正致力于 ...

  4. Farseer:一个用于Silverlight和XNA的开源物理引擎

    当前在演示和越来越多交互界面的推动下,实时动画在很多情况下已经成为不可或缺的要求.当动画涉及到物体在屏幕上互相反弹或者被重力影响的时候,一个物理引擎就是必要的了. Farseer Physics En ...

  5. Zeebe:用于微服务编排的开源工作流引擎--Camunda出品

    Zeebe是一个用于微服务编排的开源工作流引擎 Zeebe使用可视化工作流满足工作人员对微服务进行编排.Zeebe是水平可伸缩和容错的,因此您可以可靠地处理发生的所有事务. 详细介绍:  What i ...

  6. 微服务最佳实践:MSE 微服务引擎

    简介:微服务引擎 MSE(Microservice Engine)是一个面向业界主流开源微服务框架 Spring Cloud 和 Dubbo 的一站式微服务平台.其由四个主要部分组成:微服务治理中心. ...

  7. 游戏引擎开发和物理引擎_视频游戏开发的最佳游戏引擎

    游戏引擎开发和物理引擎 In this article, we'll look at some of the most popular game engines for video game deve ...

  8. Egret中使用P2物理引擎

    游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎.  来自瑞典斯德哥尔 ...

  9. C++ 3D物理引擎库BulletPhysics基本使用

    前言:最近在接触OpenGl和DX11的时候,顺便学习了Bullet这个3D物理引擎的基本使用,记录一下. |BulletPhysics介绍 BulletPhysics是一个跨平台的开源物理引擎,也是 ...

最新文章

  1. 【原创】Linux环境下的图形系统和AMD R600显卡编程(11)——R600指令集
  2. 使用Xpand XAF创建项目产生Quartz错误的解决方法
  3. NVIDIA团队:利用神经网络生成极慢视频
  4. 14周课堂测试---找水王
  5. 由于更换了java版本,Eclipse启动时报错:JRE or JDK must be available in order to run Eclipse
  6. 消息队列技术介绍 : ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ
  7. Sql Server 内存相关计数器以及内存压力诊断
  8. Transactional ejb 事务陷阱
  9. SpringBoot、mybatis、Druid结合使用存储emoji图标
  10. 2021年9月全国计算机考试准考证下载详细流程~
  11. 【UML】UML基础教程之顺序图、协作图、状态图、活动图、构件图、部署图
  12. Navicat Premium 12.0.29中文版64位+破解补丁
  13. Excel中28个基本图
  14. 华为充电协议_华为推出超级快充多协议充电器,支持65W USB PD快充输出
  15. UE4反射机制的通俗理解【代码生成】
  16. 计算机电缆参数,计算机电缆的几个参数要求
  17. 钉钉在线课程开启屏幕共享时电脑蓝屏问题解决办法
  18. Python:利用高德API获取公交路线并可视化
  19. android 自定义popupwindow,自定义通过PopupWindow实现通用菜单
  20. 概率论与数理统计笔记 - 古典概型;条件概率;独立性

热门文章

  1. 【c语言】蓝桥杯算法训练 整数平均值
  2. wasserstein距离_EMD(earth mover#x27;s distances)距离
  3. html android canvas兼容_快来!这里有5分钟看完马上学会的HTML基础大全
  4. 《jQuery EasyUI开发指南》——10.4 迭代开发
  5. 《R语言数据挖掘》----1.12 数据集成
  6. 今天整理了下所有博文
  7. Codeforces Round #369 (Div. 2)
  8. 圣何塞与 Microsoft 宣布该市为超过 5,000 名市府公务员选择 Office 365、Windows Azure 和 StorSimple...
  9. Rails插件:CanCan权限验证插件学习总结
  10. Java中对HashMap的深度分析