网络知识 娱乐 Isaac“家族”揭秘 | 知乎大咖深度解读系列(3)

Isaac“家族”揭秘 | 知乎大咖深度解读系列(3)

在即将蓬勃发展的机器人行业中,仿真器会是核心的生产力工具和极大提升用户体验的产品。


“Isaac Sim 的这些特性让它在目前成为市面上性能最好的机器人仿真器。相信随着用户的增多、版本的继续迭代,Isaac Sim 可以成为彻底改变机器人行业的核心生产力工具。” 这是知乎大咖 YY硕(知乎粉丝 9.7 万+,机器人工程师)对于 Isaac Sim 特性的评价和展望。本期文章我们将分享 YY硕的深度文章《机器人仿真技术浅淡和 NVIDIA Omniverse Isaac Sim 介绍》。

【机器人仿真技术浅淡和NVIDIA Omniverse Isaac Sim介绍】知乎原文指引:https://zhuanlan.zhihu.com/p/545418917


去年 6 月到今年 5 月我都在 NVIDIA 总部的机器人仿真团队参与开发 Omniverse 中的机器人仿真工具 Isaac Sim。在 5 月底的时候 Isaac Sim 发布了 2022 年的最新一个版本,作为参与了这个版本全开发过程的工程师我来给大家介绍一下这个产品。


机器人行业的核心生产力工具——仿真器


很早以前在开发多轴飞行器的时候,我们就在大疆花了很大的功夫做仿真器,一共做了两套,一套自用,另一套半自用半对外。自用的仿真器用来帮助内部研发团队开发,除了基本的飞行器动力学以外还进行了 GPS 和 IMU 的仿真、自动逻辑和模块故障注入、支持硬件在环仿真等等,依托仿真器我足不出户地重构优化了 DJI 飞行器所有的基于 GPS 的航迹规划功能。另一套半对外的仿真器我们用了 unreal engine 实现精细的场景图形仿真和相机图像生成,内部可以用来测试视觉系统,对外则让用户更好地练习飞行。


后来微软 Redmond 研究院的几位朋友也利用 unreal engine 开发了飞行器的仿真软件 AirSim,适配几款 DJI 的飞机,也适配一些开源飞控,一时间受到很多关注。


Air Sim 仿真飞行


近年来随着自动驾驶的蓬勃发展,仿真器在机器人系统开发过程中的地位越来越重要。在仿真中验证机器人的程序逻辑是否准确是一个历久弥新的需求,此外近年来基于深度学习技术的控制器设计需要大量的训练数据来支持,这些训练数据在真实世界中并不好获得,使用能够渲染精细场景的仿真器来模拟真实驾驶场景来收集数据逐渐成为了业界的主流技术。除了一些能够自研仿真器的大厂以外,其他从业者多半会采用已有的游戏引擎和仿真引擎来制作自己的开发平台,也有一些专用的商业自动驾驶仿真器成为了兵家必争之军火。比如说老牌仿真器 CarSim 就在近期被收购了。


除了自动驾驶以外,部署在家庭环境的机器人需要先在仿真的家居场景里测试、工厂产线和工业机械臂可以用仿真来调度、实验室自动化也需要仿真验证来避免机器人在部署后破坏重要设备……任何一个商业化的机器人要在某个场景中工作,不管是开发人员和用户都有在实际接触机器人之前先通过仿真了解机器人的行为和性能的必要。因此,在即将蓬勃发展的机器人行业中,仿真器会是核心的生产力工具和极大提升用户体验的产品。


但是在今日包含自动驾驶的更广泛的机器人行业中,成熟的商业仿真器产品并不存在,已有的仿真解决方案大多数都有这样那样的不足。一个完善的仿真器产品应该具有哪些特性呢?我们可以从当代已有的一些成熟机器人应用出发来思考一下。


首先,机器人仿真器必须能够比较真实地仿真机器人本身的动力学物理定律,此外还能够高效地解算机器人和环境交互时产生的碰撞。相同的需求在游戏行业中也存在,但游戏引擎通常会简化被仿真的物体的物理模型和碰撞模型以追求实时性,而机器人仿真器的使用者可以接受仿真器解算得比真实时间慢,但是不能接受仿真器错误计算机器人本身的物理性质。一个典型的例子是 Dzhanibekov 效应,能够正确仿真这个物理过程的游戏引擎少之又少。


其次,机器人仿真器需要能够仿真 IMU、相机、GPS、激光雷达等传感器,这些传感器普遍应用于成熟的无人机、扫地机器人、工业机器人系统当中。其中最复杂的是相机,因为仿真看起来真实的相机场景是游戏行业三十年来不懈追求的主要功能。比游戏更难的地方在于,通常游戏中我们只用仿真一个相机镜头(就是用户操作的视角),而一台机器人(比如一辆无人驾驶汽车)可能会安装有十个以上的相机作为传感器,仿真器需要能够同时给这十个相机进行图像渲染。我们允许机器人仿真引擎可以运行的比游戏引擎慢,但是也不希望它慢到不可接受的地步。显然地相机渲染需要使用 GPU,于是机器人仿真器必须能够整合 GPU 资源,在快速解算真实物理模型之外同步渲染相机图像和其他传感器信息。


另外,机器人仿真器要能够和 ROS 的生态系统进行对接。ROS 作为当今最完善的机器人软件系统,已经成为了标准的开发机器人应用的主流工具。在 ROS 生态中成长起来的仿真器 Gazebo 可以非常流畅地接收和发送ROS的消息包,让用户使用自己的程序控制 Gazebo 当中的机器人,因此成为大部分当代的机器人公司在开发项目时的首选。但是 Gazebo 的图形渲染能力非常羸弱,只能够用 CPU 资源仿真简单的相机,一旦场景变复杂,仿真运行速度会急剧降低。


Gazebo 使用界面


最后,机器人仿真器需要提供一种通用的机器人和场景描述文件,方便用户构建不同的环境、导入不同的机器人进行测试。ROS 的开发团队提出的 urdf(Unified Robot Description Format)是一种非常有效的机器人表示方法,但是这种格式不能表示除了刚体系统之外的复杂场景。Gazebo 的开发团队提出了 SDF(Simulation Description Format)来表示机器人之外的环境,但是这种格式的表现力非常有限。另外由于 ROS 和 Gazebo 始终由开源社区开发运营,缺乏良好的项目组织管理机制,sdf和urdf逐渐出现了多个版本并存、语法互相冲突等问题,限制了它们的进一步发展。


机器人行业的科研和开发人员面对这些问题,目前只能各显神通拼凑仿真技术,比如说无人机通常不需要和环境进行交互,动力学仿真不精确影响不大,因此直接使用游戏引擎也可以;自动驾驶则把汽车动力学仿真和复杂传感器仿真解耦开,用 Simulink 专门分析汽车本身,用游戏引擎只收集传感器数据;多足和人形机器人研究者则通常会自研物理仿真引擎,如 MuJoCo、RaiSim 和 DART 等,然后想办法把自己的物理引擎与 Unity 或者 Unreal 整合,很多这方面的工作都处在非常早期的阶段,所以大家的仿真场景都看起来和玩具似的,仿真出来的图像也远远达不到实际的相机传感器的质量。


Bullet 仿真引擎中的相机图像仿真


Isaac Sim


在连续赌对 GPU 的通用科学计算能力和 AI 的价值之后,2021 年的英伟达已经是公认的世界一流科技公司,时代把英伟达推到了一个非常好的位置来开发一款优秀的机器人仿真器:主流游戏引擎 unreal 和 unity 以及其他不少游戏公司自研的引擎通常都基于英伟达的 PhysX 作为物理引擎,虽然前代的 PhysX 采用了简化物理模型,但是正在开发的 PhysX 5 提升了物理仿真的性能。除了调集公司内的工程师提升 PhysX 以外,英伟达还挖来了著名物理仿真引擎 Bullet 的作者 Erwin Coumans 参与物理仿真的开发。前面说相机传感器的仿真是个难点,但这个技术正是英伟达的强项—— RTX 实时光线追踪技术已经成熟地应用在了游戏和电影特效工业中。深耕游戏和电影特效多年,英伟达能够从这些领域找到各种对仿真有帮助的技术方案。


在机器人领域,英伟达也进行了大手笔的布局,除了深度参与大大小小的自动驾驶公司的各层级业务以外,英伟达聘请了世界上最好的一些机器人学家到公司兼职工作,比如 Dieter Fox 和 Marco Hutter 等人,这些科学家利用英伟达的生态进行科研,同时也给机器人仿真器的开发提供思路和方向。在物理仿真、图形渲染、自动驾驶和机器人研究的积累之上,Isaac Sim 应运而生。


针对上述的机器人仿真器的问题,Isaac Sim 整合了最新的 PhysX 和 RTX 引擎进行物理仿真和图像仿真,其次引入了 Pixar 公司开发的 USD(Universal Scene Description)描述格式作为机器人和复杂场景的描述方式。这种格式被 Pixar 应用于动画电影场景的描述已经有很多年时间,现在拿来处理机器人仿真场景的表示可以说是降维打击,效果非常好,许多机器人运转于极其复杂的场景中,这些场景都是通过 USD 表示和载入的。另外 Isaac Sim 还投入了巨大的资源与 ROS 生态进行整合,Isaac Sim 能够与 ROS1 和 ROS2 系统进行自由通信。由于英伟达的业界地位,Pixar 和 ROS 生态圈对于 Isaac Sim 提供了很大的支持。


接下来我想用四足机器人仿真谈谈 Isaac Sim 如何解决上面说到的几个仿真器的问题。


Isaac Sim 四足机器人仿真


四足机器人是当代有商业应用的机器人中最复杂的一种,和一般的移动机器人相比,它会较快地移动和旋转,还会与环境发生频繁的碰撞和交互。四足机器人基本的控制需要用到 IMU、关节传感器和足端力传感器;如果想让机器人具有更智能的行为,还需要安装相机、激光雷达等传感器进行定位和地图重建。由于直接调试实际机器人比较危险,仿真器能够极大加速四足机器人的程序开发过程。



在最新的 Isaac Sim 官方文档中有一个和四足机器人相关的页面,其中包括了若干个和四足机器人相关的示例,有三种机器人可以选择:Unitree A1,Unitree Go1 和 Anybotics Anymal。可以在例程中找到 standalone_examples/api/omni.isaac.quadruped 路径下的几个例子,每个例子的详细介绍都在下面的文档中:

https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/ext_omni_isaac_quadruped.html


2.1 - 在例程 standalone_examples/api/omni.isaac.quadruped/go1_ros1_standalone.py 中,我们演示如何把 Isaac Sim 中的机器人传感器数据发布到 ROS 中。这个例程初始化一个 Unitree Go1 机器人,然后对它进行基本的运动控制,此外还会把机器人的 IMU 和足端力传感器发布成 ROS topic,然后我们就可以使用 ROS 中的可视化工具如 rqt_plot 或 plotjuggler 查看这些数据。力传感器的仿真得益于 PhysX 改进的物理计算能力和借助显卡实现的碰撞检测功能。


2.2 - 例程 standalone_examples/api/omni.isaac.quadruped/anymal_standalone.py 包含的是由苏黎世联邦理工学院开发的 Anymal 机器人的仿真和它备受关注的神经网络控制器,相关工作曾经发表在 Science Robotics 上。和 A1 / Go1 上基于模型的控制器相比,Anymal 的控制器程序异常地简单,只有两个神经网络的输入和输出。当然它的缺点也非常明显,用户可以自行调整 A1 / Go1 上基于模型的控制器的参数来改变机器人运动速度、动腿频率等参数,但是没法直接去修改 Anymal 的神经网络来产生新的行为(必须重新训练网络)。


2.3 - 例程 standalone_examples/api/omni.isaac.quadruped/a1_direct_ros1_standalone.py 提供了直接从 ROS1 系统内获取力控指令的程序框架,这个框架可以配合我前段时间开源的四足机器人 C++ 控制器来使用:

https://link.zhihu.com/?target=https%3A//github.com/ShuoYangRobotics/A1-QP-MPC-Controller


2.4 - 例程 standalone_examples/api/omni.isaac.quadruped/a1_vision_ros1_standalone.py 是我最喜欢的一个工作,在这个例子中我们演示如何在四足机器人上安装额外的相机传感器来进行基于视觉的定位。我们使用的是 VINS-Fusion,由香港科技大学沈劭劼教授的团队开发的机器人定位算法。例程的详细指南在下面的文档中:

https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_ros_quadruped_vio.html


在这个例程中我们仿真了三个相机,一个是用户查看仿真的主视角(右下),另外两个是机器人上安装的相机所看到的图像(右上)。相机图像以及机器人上的 IMU 的数据在 Isaac Sim 中打包成 ROS 消息发布到 ROS 当中,ROS 中运行的视觉惯导里程计 VINS-Fusion 接收到图像后进行特征点检测和匹配(左下),然后把通过图像和 IMU 信息计算出的机器人位姿和点云地图发布到 Rviz 当中可视化(左上)。



由于 Isaac Sim 仿真出来的图像非常真实,VINS-Fusion 的特征点提取和匹配算法工作得非常稳定,定位效果极佳。这个同时渲染三个相机的例程在仅有一块 RTX2070 显卡的情况下即可流畅地运行。值得一提的是,例程具有很好的扩展性,我们不难基于这个例程加入更多的相机和激光雷达传感器,因为 Isaac Sim 底层能够动态调用系统的显存资源,把相机的渲染任务分配给所有可用的显卡,增加相机不会太多降低仿真运行的速度。


Isaac Sim的其他特性


Isaac Sim 提供了足够多的功能支持进行四足机器人的仿真,这些功能也可以被用于仿真其他的机器人,比如机械臂和移动机器人等等,在如下文档中可以找到其他机器人的例程:

https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/manual_omni_isaac_demos.html


除此以外,Isaac Sim 还有非常多其他激动人心的新特性是一般模拟器不具备的。


3.1 - 便利的调试方式

Isaac Sim 提供了 VSCode 的环境配置文件,使得用户可以直接对任何 Python 脚本例程进行调试运行:

https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_advanced_python_debugging.html


很多其他的仿真器是独立运行的,没有办法把仿真器每一帧的运行都暂停下来然后查看仿真的输出。然而 Isaac Sim 的调试运行可以让用户精细地查看仿真器的每一个运行的 step 的所有细节:



3.2 - Isaac Gym 并行强化学习训练

Isaac Sim 中有一个功能叫做 Isaac Gym,它早期是一个独立的实验性程序,后来在 Isaac Sim 最新发布的版本中合并进入 Isaac Sim 成为一个插件,这个插件可以让用户同时仿真大量相同的机器人,同时获得这些机器人的运行数据来进行强化学习控制器的训练,例程的介绍在这里:

https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_gym_external_rl_examples.html


前面所说的 Anymal 神经网络控制器有一部分也是通过 Isaac Gym来训练的。



3.3 - 丰富的相机信息输出

Isaac Sim 中的相机除了能输出基本的 RGB 图像和深度图像以外,还可以输出图像的语义分割表示、特征轮廓等等其他信息,这些都来自于各种英伟达开发的 GPU 图像识别工具包。更丰富的图像信息能够帮助用户整合 AI 技术进入机器人的控制器,帮助开发更多的智能机器人应用。


总结


Isaac Sim 的这些特性让它在目前成为市面上性能最好的机器人仿真器。相信随着用户的增多、版本的继续迭代,Isaac Sim 可以成为彻底改变机器人行业的核心生产力工具。