姓名:韩宜真
学号:17020120095
转载自:https://mp.weixin.qq.com/s/BM-Ckb04v1hbdOpoI0C9tg
【嵌牛导读】机器人开发工作流程依赖于仿真进行测试和训练,我们想向您展示机器人专家如何使用Unity进行机器人仿真。
【嵌牛鼻子】Unity模拟
【嵌牛提问】如何利用Unity加速机器人仿真?
【嵌牛正文】机器人开发工作流程依赖于仿真进行测试和训练,我们想向您展示机器人专家如何使用Unity进行机器人仿真。在新系列的第一篇博客文章中,我们描述了通用的机器人开发工作流程。此外,我们引入了一组新工具,这些工具使Unity中的机器人仿真变得比以往更快,更有效和更容易。
如何利用Unity开发机器人技术
由于使用真实的机器人开发和测试应用程序既昂贵又费时,因此仿真已成为机器人应用程序开发中越来越重要的部分。在部署到机器人之前在仿真中验证应用程序可以通过尽早发现潜在问题来缩短迭代时间。通过模拟,还可以更轻松地测试在现实世界中可能过于危险的极端情况或场景。
有效的机器人仿真的关键元素包括机器人的物理属性,机器人操作的场景或环境以及在现实世界中运行的软件。确保仿真中的这三个元素尽可能接近真实世界,对于有效的测试和训练至关重要。
机器人软件开发最常见的框架之一是机器人操作系统(ROS)。它为全球成千上万的机器人专家使用的机器人描述,消息和数据类型提供了标准格式,适用于各种情况,例如工业装配,自动驾驶汽车甚至娱乐。充满活力的用户社区提供了许多用于通用功能的开源软件包,这些软件包可以引导新系统的开发。
机器人专家通常将机器人应用程序设计为ROS节点的模块化集合,可以将其部署到实际的机器人以及与模拟器接口的计算机上。在模拟中,开发人员构建了一个虚拟世界,该虚拟世界反映了真实机器人的目标用例。通过在这个模拟的生态系统中进行测试,用户可以在进行实际测试并最终部署到生产之前快速迭代设计。
通用的机器人开发工作流程,其中模拟测试在实际测试之前进行这篇博客文章使用一个简单的放置操作任务的示例来说明用户如何利用Unity进行此模拟工作流。
1:定义机器人的任务
遵循上面的工作流程,可以说我们的机器人的任务是拾取一个物体并将其放置在给定的位置。六轴Niryo One教学机器人充当机器人手臂。环境是最小的:一个空房间,一个供机器人放置的桌子和一个立方体(即目标对象)。为了完成任务的运动计划部分,我们使用了一套流行的运动计划ROS软件包,统称为MoveIt。准备好开始任务时,我们将计划请求从模拟器发送到MoveIt。该请求包含所有机器人关节的姿势,立方体的姿势以及立方体的目标位置。然后,MoveIt计算运动计划,并将该计划发送回模拟器以执行。
现在我们已经解决了问题,让我们逐步介绍如何在此模拟工作流程中使用Unity。
2:将机器人带入仿真
机器人模拟包括建立一个虚拟环境(如本例中的基本房间或更复杂的东西,例如带有传送带,料箱,工具和零件的工厂车间),并向该环境添加虚拟环境。Unity编辑器可用于创建虚拟环境的无穷排列。但是我们如何才能将机器人带入这些环境呢?
在仿真中对机器人建模时,我们需要表示其视觉网格,碰撞网格和物理属性。需要视觉网格来仿真机器人。需要碰撞网格来计算机器人“链接”,连接关节的刚性构件以及环境中其他对象以及自身之间的碰撞。这些网格通常不如可视网格复杂,因此可以更快地进行碰撞检查,这可能需要大量计算。最后,精确的物理仿真需要惯性、接触系数和关节动力学之类的物理属性,即计算链接上的力如何导致机器人状态(例如姿势、速度或加速度)变化的物理属性。
幸运的是,使用ROS开发工作流程时,有一种描述所有这些属性的标准化方法:通用机器人描述格式(URDF)。URDF文件是XML文件,允许我们以人类可读的标记语言指定这些视觉、碰撞和物理属性。URDF文件还可以包括用于指定复杂几何形状的网格文件。以下示例显示了Niryo One机械手的URDF文件的摘录。
Niryo One机器人的URDF为了使机器人专家更轻松地将机器人导入Unity,我们发布了URDF Importer,这是一个开放源代码的Unity包,用于使用其URDF文件将机器人导入Unity场景。该软件包利用了我们对Unity中“关节”的新支持,这是通过PhysX 4.1的改进而实现的。此更新使我们能够准确地对机器人的物理特征建模,以实现更逼真的运动学模拟。
当安装到Unity Editor中时,该软件包允许用户选择要导入的URDF文件。它在后台解析XML文件,并将链接和关节数据存储在适当的C#类中。然后,它创建GameObjects的层次结构,其中每个GameObject是一个Articulation Body组件,表示机器人中的特定链接。它将URDF中的属性分配给Articulation Body中的相应字段。当用户将机器人添加到Unity时,URDF导入器会自动创建一个基本的键盘关节控制器。用户可以使用ArticulationBody API用自定义控制器替换该控制器。
例如,这是Niryo One Unity文档,是在导入上面的URDF文件后创建的。
通过URDF Importer导入的Unity中的虚拟Niryo One机器人3:将模拟连接到ROS
现在,该机器人已在Unity编辑器中,我们应该测试在一组ROS节点中运行的运动计划算法。为此,我们需要在Unity和ROS之间建立一个通信接口。Unity需要将包含状态信息(即,机器人,目标对象和目标位置的姿态)以及对运动服务的计划请求消息传递到ROS。相应地,ROS需要向Unity返回与运动计划相对应的轨迹消息(即,完成拾取和放置任务所需的关节位置顺序)。
现在有了两个新的ROS-Unity Integration软件包,可以轻松连接Unity和ROS。这些软件包允许ROS消息以低延迟在ROS节点和Unity之间传递。在单台机器上进行测试时,一条简单的基于文本的消息在几毫秒内就完成了从Unity到ROS,并在几百毫秒内完成了1036 x 1698图像。
由于ROS中的通信使用发布/订阅模型,因此ROS–Unity通信的首要要求是Unity中与ROS消息类型相对应的类。当用户将ROS-TCP-Connector Unity软件包添加到Unity Editor时,用户可以使用Message Generation插件从ROS .msg和.srv文件生成C#类,包括序列化和反序列化功能。ROS-TCP-Connector包还包括脚本,用户可以对其进行扩展以将消息从Unity发布到ROS主题,在Unity中订阅关于ROS主题的消息,并创建ROS服务请求和响应。在ROS方面,称为ROS-TCP-Endpoint的ROS包可以创建一个端点,以使用这些ROS-TCP-Connector脚本在ROS节点与Unity场景之间进行通信。
现在,让我们看一下如何使用这些ROS-Unity Integration程序包执行当前任务。首先,我们使用ROS–Unity Integration包在Unity中创建发布者,以通过TCP将位姿数据发送到ROS。在ROS端,我们需要设置一个ROS-TCP-Endpoint来订阅这些位姿消息。
接下来,我们将在Unity Scene中创建一个“发布”按钮以及一个OnClick回调。该回调函数向MoveIt运动计划器发出服务请求。服务请求包括机器人的当前姿态,目标对象的姿态和目标位置。当MoveIt收到计划请求时,它将尝试计算运动计划。如果成功,该服务将返回计划,即一系列关节位置,并且Unity脚本使用Articulation Body API执行运动轨迹。否则,它将返回失败消息。
以下gif显示了Niryo One手臂成功执行拾取和放置任务的Unity模拟。
使用ROS和MoveIt进行运动计划,在Unity中的Niryo One机器人上模拟拾放任务这个例子仅仅是开始。开发人员可以将此演示用作创建更复杂的Unity场景,添加不同的机器人以及集成其他ROS软件包的基础。
结论
这些工具为新一代的模拟测试和训练奠定了基础,并使使用Unity进行机器人模拟变得前所未有的轻松。我们的团队正在努力实现这些下一代用例,包括机器人技术的机器学习培训,传感器建模,大规模测试等。
网友评论