在 Unity 中模拟机器人就像 1、2、3 一样简单

机器人开发工作流程依赖仿真进行测试和训练,我们想向您展示机器人专家如何使用 Unity 进行机器人仿真。在新系列的第一篇博文中,我们将介绍常见的机器人开发工作流程。此外,我们还引入了一套新工具,使 Unity 中的机器人仿真比以往更快、更有效、更简单。
由于使用真实机器人开发和测试应用既费钱又费时,因此仿真正日益成为机器人应用开发的重要组成部分。在部署到机器人之前,先在仿真中验证应用程序,可以及早发现潜在问题,从而缩短迭代时间。模拟还能更容易地测试边缘情况或在现实世界中测试可能过于危险的情况。
有效机器人仿真的关键要素包括机器人的物理属性、机器人运行的场景或环境,以及机器人在真实世界中运行的软件。确保模拟中的这三个要素尽可能接近真实世界,对于有效的测试和培训至关重要。
机器人操作系统(ROS)是最常见的机器人软件开发框架之一。它为机器人描述、信息和数据类型提供了标准格式,供全球成千上万的机器人专家在工业装配、自动驾驶汽车甚至娱乐等各种使用场景中使用。一个充满活力的用户社区为通用功能提供了许多开放源码软件包,这些软件包可以引导新系统的开发。
机器人专家通常将机器人应用程序设计为一组模块化的 ROS 节点,既可部署到真实机器人上,也可部署到与模拟器连接的计算机上。在模拟过程中,开发人员建立一个虚拟世界,反映真实机器人的目标用例。通过在这个模拟生态系统中进行测试,用户可以在真实世界中进行测试并最终部署到生产中之前,快速迭代设计。

常见的机器人开发工作流程,即先进行模拟测试,再进行实际测试
本博文以一个简单的拾取和放置操作任务为例,说明用户如何利用 Unity 实现这一仿真工作流程。
机器人仿真包括设置一个虚拟环境--如本示例中的一个基本房间,或更复杂的环境,如一个配有传送带、料箱、工具和零件的工厂车间--并在此环境中添加一个待训练或测试机器人的虚拟表示。Unity 编辑器可用于创建无穷无尽的虚拟环境。但是,我们如何才能将机器人带入这些环境中呢?
在模拟机器人建模时,我们需要表示机器人的视觉网格、碰撞网格和物理属性。为了逼真地渲染机器人,需要视觉网格。需要使用碰撞网格来计算机器人的 "链接"(连接关节的刚性部件)与环境中其他物体以及机器人自身之间的碰撞。这些网格的复杂程度通常低于可视化网格,以便更快地进行碰撞检查,而碰撞检查可能是计算密集型的。最后,物理特性(如惯性、接触系数和关节动力学)是进行精确物理仿真所必需的,即计算链接上的力如何导致机器人状态(如姿势、速度或加速度)发生变化。
幸运的是,在使用 ROS 开发工作流程时,有一种标准化的方法来描述所有这些属性:通用机器人描述格式(URDF)。URDF 文件是一种 XML 文件,它允许我们用一种人类可读的标记语言来指定这些视觉、碰撞和物理属性。URDF 文件还可以包括网格文件,用于指定复杂的几何形状。下面的示例节选了 Niryo One 机器人的 URDF 文件。

尼罗河一号机器人 URDF
为了方便机器人专家将机器人导入 Unity,我们发布了URDF Importer,这是一个开源的 Unity 软件包,用于使用机器人的 URDF 文件将机器人导入 Unity 场景。该软件包利用了我们在 Unity 中对 "衔接 "的新支持,PhysX 4.1 中的改进使其成为可能。这种更新使我们能够准确模拟机器人的物理特性,从而实现更逼真的运动学模拟。
在 Unity 编辑器中安装后,用户可通过该软件包选择要导入的 URDF 文件。它在幕后解析 XML 文件,并将链接和关节点存储在相应的 C# 类中。然后,它会创建一个 GameObject 的层次结构,其中每个 GameObject 都是一个ArticulationBody组件,代表机器人的一个特定链接。它将 URDF 中的属性分配给 ArticulationBody 中的相应字段。当用户向 Unity 添加机器人时,URDF 导入器会自动创建一个基本的键盘关节控制器。用户可以使用 ArticulationBody API 将此控制器替换为自定义控制器。
例如,这是导入上述 URDF 文件后创建的 Niryo One Unity 资产。

通过 URDF Importer 在 Unity 中导入的虚拟 Niryo One 机器人
现在,机器人已经进入 Unity 编辑器,我们应该测试在一组 ROS 节点中运行的运动规划算法。为此,我们需要在 Unity 和 ROS 之间建立一个通信接口。Unity 需要向 ROS 传递包含状态信息(即机器人的姿势、目标物体和目标位置)的消息,同时向移动服务发出规划请求。反过来,ROS 需要向 Unity 返回与运动计划(即完成拾放任务所需的关节位置序列)相对应的轨迹信息。
现在,两个新的 ROS-Unity 集成包可轻松连接 Unity 和 ROS。这些软件包允许 ROS 消息在 ROS 节点和 Unity 之间以较低的延迟进行传递;在一台机器上进行测试时,一条简单的文本消息从 Unity 传到 ROS 订阅者只需几毫秒,而一张 1036 x 1698 的图片只需几百毫秒。
由于 ROS 中的通信使用的是发布/子模型,因此 ROS 与 Unity 通信的首要条件是 Unity 中的类与 ROS 消息类型相对应。用户将ROS-TCP-ConnectorUnity 软件包添加到 Unity 编辑器后,就可以使用 MessageGeneration 插件从 ROS .msg 和 .srv 文件生成 C# 类,包括序列化和反序列化函数。ROS-TCP-Connector 软件包还包括用户可以扩展的脚本,以便从 Unity 向 ROS 主题发布消息,在 Unity 中订阅 ROS 主题上的消息,以及创建 ROS 服务请求和响应。在 ROS 方面,一个名为ROS-TCP-Endpoint的 ROS 软件包可以创建一个端点,以便使用这些 ROS-TCP-Connector 脚本在 ROS 节点和 Unity 场景之间进行通信。
现在让我们来看看如何使用这些 ROS-Unity 集成包来完成手头的任务。首先,我们使用 ROS-Unity 集成包在 Unity 中创建一个发布器,通过 TCP 向 ROS 发送姿势数据。在 ROS 端,我们需要设置一个 ROS-TCP 端点来订阅这些 pose 消息。
接下来,我们将在 Unity 场景中创建一个 "发布 "按钮和一个 OnClick 回调。该回调函数向 MoveIt 运动规划器发出服务请求。服务请求包括机器人的当前姿态、目标物体的姿态和目标位置。MoveIt 收到规划请求后,会尝试计算运动计划。如果成功,服务将返回计划,即关节位置序列,Unity 脚本将使用ArticulationBody API 执行轨迹。否则会返回一条失败信息。
下图显示了 Niryo One 机械臂成功执行拾放任务的 Unity 仿真。

利用 ROS 和 MoveIt 进行运动规划,在 Unity 中模拟 Niryo One 机器人的拾放任务
这个例子仅仅是个开始。开发人员可将此演示作为创建更复杂 Unity 场景、添加不同机器人和集成其他 ROS 软件包的基础。请继续关注我们今后的文章,这些文章将介绍如何把计算机视觉和面向机器学习的任务集成到机器人仿真框架中。
这些工具为新一代仿真测试和培训奠定了基础,使使用 Unity 进行机器人仿真变得前所未有的简单。我们的团队正在努力实现这些下一代用例,包括机器人的机器学习训练、传感器建模、大规模测试等。敬请关注本系列的下一篇博文,它将向您展示如何训练基于视觉的机器学习模型,以估计拾放任务中目标物体的姿态。
免费开始使用我们的机器人仿真工具。查看我们在 GitHub 上的拾取和放置教程。
如需了解更多机器人项目,请访问GitHub 上的 Unity Robotics Hub。要了解我们的团队如何利用 Unity 更轻松地训练计算机视觉系统,请阅读我们的计算机视觉博客系列。
有关如何利用 Unity 满足机器人仿真需求的更多信息,请访问我们的机器人官方网页。
如果您有问题、反馈或建议要直接联系我们的团队,请发送电子邮件至unity-robotics@unity3d.com。
