搜索 Unity

更为逼真的机器人模拟:Unity 2021.2 Beta版物理模拟更新

2021年8月20日 类别 技术 | 9 分 阅读
Simulation of a blue robotics machine on a green graph background
Simulation of a blue robotics machine on a green graph background

Unity 2021.2 beta版提高了物理模拟功能的实用性,功能现在有了更多的用法,并且能让机器人的开发与调试更为轻松高效。

ArticulationBody(关节体)改进

ArticulationBody组件是Unity机器人模拟的核心功能,它可以精确地模拟出运动链,解决机器人手臂、机械手、移动机器人等模拟的关键问题。为了改善组件的性能与实用程度,我们一直在听取用户的反馈意见,并根据反馈进行改进。

ArticulationBody重新排列后的属性列表阅读起来会更加方便,而所有质量参数都被归纳到了一块,其下方则为归纳好的锚点参数,及驱动力参数。这些改动已应用至Unity 2021.1和2020.3。

Image showing the articulation body dialog box with a grey background and white text.

ArticulationBody编辑器现在使用与普通编辑器一样的可迭代关节,确保其有一致的使用体验。除此之外,新编辑器还支持直观地编辑关节范围及锚点。

Gif of the Prismatic Joint movement shown with a silver and blue robotic arm simulation

而拓展后的关节工具现在支持编辑Prismatic Joint,以及所有ArticulationBody关节类型。想要了解更多详情或向我们反馈,请访问该论坛主题贴

Gif of collision detection mode demonstrated with a blue and silver robotic arm simulation

ArticulationBody新增collision detection mode(碰撞检测模式)选项,支持所有刚体所用的持续性碰撞检测。更新将同步至2021.1和2020.3以支持某些特殊用例:比如,在训练机器学习模型控制人形角色行走时,便需要在脚部持续地检测碰撞,否则模型将学会利用脚部与地面重叠时产生的反冲力(即引擎为避免两个平面重叠产生冲突而对运动物体施加的反向矢量)来加快自己的移动速度,甚至跳跃到空中飞行。

ArticulationBody.AddForce现在有了更为多样的力,以对标Rigidbody.AddForce,譬如作用力、加速力或脉冲力。如此一来,现有的Rigidbody代码可以更轻松地切换到ArticulationBody代码。 

我们还详细说明了组件的边界条件和特殊用法,使得文档内容更加清晰,ArticulationBody组件现在有了专门的文档页面。 

我们还根据用户的反馈为ArticulationBody组件的所有C#脚本属性加入了测量单位,请在此处查看mass(质量)属性的实例。

编辑器改进

我们将继续提高普通物理模拟管线的易用性,提升其灵活性,以适配更多的用法。我们认为Physics是复杂物理模拟的基石,创作者现在能够使用额外的功能来更好地了解自己的工作领域,让配置出的模拟结果更为准确。

除了以上内容外,Physics Debugger现在能正确地在单独编辑模式(Isolation Mode)和场景编辑模式(Context Mode)中支持预制件,用户可以独立出预制件进行编辑,隐藏无关的场景,做到“各个击破”。

Gif of the collision detection system with an objects simulation

物理模拟图层是碰撞检测系统性能优化的一个重要工具,通常在包含多个图层的大场景中,我们需要先禁用所有碰撞层,然后再启用必要的碰撞层。为此,Physics设置新添了各图层的碰撞检测启用选项。在包含大量图层的大型项目中,我们便能将所有的碰撞精简到一个较小的图层集合来提高性能

Matrix of the collision layers that have been added to the physics profiler with a grey background and white text

Physics Profiler(物理模拟分析器)现在新增了几项指标及图表种类,而文本窗口现在可更为详细地展示当前模拟的数据。新增指标包括调用物理模拟的总次数、连接体的数量以及上一帧的变换次量,

Profiler Modules dialog box that includes metrics of a particular project

用户现在还可以为项目启用/禁用指标来自定义分析窗口,

Image of Physics detailed dialog box that shows the memory usage metric

并且内存占用量也能作为指标显示。

主线程外的连续物理模拟调用

物理模拟调用的批处理作为一种提高性能的手段(一如Raycasts),可在所有空闲的CPU核心上执行物理模拟,而非只在主线程上执行。

理想情况下,批量调用的结果会输出到一个C# job中来最大化性能,但这里的主要问题在于,碰撞体的碰撞将被返回成Unity组件(RaycastHit.collider),所有Unity组件必须在主线程上运行,因此在子线程上运行的物理模拟无法自由地处理碰撞。

为了解决该问题,引擎现在会公开碰撞体的实例ID,实例ID可以在主线程之外自由使用,让连续性批量调用成为可能。

触面摩擦改进

触面摩擦是Unity默认的摩擦模拟模式,它更强调性能而非模拟精度,但仍可通过大量的运算来生成较为精确的结果。

Physics设置现在新增了一个新的增强版触面摩擦模拟,如果双方的接触面上包含一个以上的摩擦锚点,则其生成的摩擦力可比普通模型准确两倍以上。

在下图实例中,带有不同摩擦力的方块在一个平面上滑动。红色方块表示根据理论预测的最终位置,蓝色方块使用了常规的触面摩擦,它最终达到了预测位置的一半;绿色方块使用了改进后的触面摩擦,其结果更加贴近理论模型。

Gif showing the improved patch friction mode with red green and blue cubes

接触面修改

新的接触面修改API现在已经可用,我们正在相关论坛贴中收集反馈意见。该API允许制定物理引擎对接触点的处理方式,包括修改任意一对接触面的接触点属性、限制解算程序施加的推力、调整目标矢量等等。它还有其它用法,像是在任意碰撞体上打洞、生成粘黏性接触面和各种物理驱动的传送带。在下方例子中,球体无视了与平面的接触(可设置区域性忽视)并穿过了平面,而右侧的方块在两个斜面上弹跳时并不会旋转(因为物体接触后的反应被设为不旋转)。

Gif showing the contact modification API with a circle and cube

真实的模拟

所有这些改进都能让Unity中的模拟更为逼真,许多改进都响应了用户们的建议或反馈,我们也邀请在看的你前来与我们交流。若想在Unity中开发机器人,请在Unity Robotics Hub上了解我们的几个实例与演示

2021年8月20日 类别 技术 | 9 分 阅读