NVIDIA Omniverse和Isaac Sim笔记3:搭建简易机器人并在仿真场景中采集数据

Dec 3,2022   7054 words   26 min

Tags: SLAM

本篇笔记我们继续探讨Isaac Sim的基本用法,重点关注一些与场景有关的设置以及使用Isaac的基本流程。最终以一个简单实际的例子和流程(搭建场景、组装机器人、录制数据)作为结束。本篇笔记GIF动图较多(大约有100MB),如果出现动图很卡的情况,可以让他缓冲一会,先去喝口奶茶。

1.仿真场景相关知识

本部分我们主要介绍和场景相关的操作。

1.1 检查场景的默认属性

Isaac Sim中的仿真场景有很多属性可以修改。如果需要查看,在菜单栏中点击Edit->Preferences,在主界面下方就会弹出Perferences面板,我们在左侧找到Stage,点击,一些场景相关的属性和对应值就展示出来了,如下。 根据自己的实际情况可以修改。有些默认的参数简单列举如下:

  • 默认情况下,Isaac Sim以Z轴作为竖直轴。

  • 默认情况下,场景的尺度单位是米。

  • 默认情况下,Isaac Sim的旋转顺序是X-Y-Z。

1.2 配置物理引擎

一个真实的仿真场景,我们自然希望能够有一个逼真的物理引擎。好在这件事NVIDIA提供了PhysX引擎、Isaac Sim为我们提供了非常方便的工具,可以轻松做到这一点。 我们依次在菜单栏中点击Create->Physics->Physics Scene即可创建带有物理引擎的环境,如下图所示。 可以看到,在Stage面板中,多了PhysicsScene这个对象,物理引擎就添加好了,十分简单。我们选中它就可以进一步查看它的属性了,比如重力的大小、方向等等。这里有一个来自官方文档的提示,一般情况下,物理仿真使用CPU解算就够了,除非你有大量的(成百上千)个机器人或物体你可以选择GPU。所以我们可以在属性面板里把Enable GPU Dynamics给勾掉,然后在Broadphase Type里选择MBP即可。

1.3 增加地平面

一个真实的场景自然是要有地平面的,这样可以阻止一些具有物理属性的物体掉到地平面下面。在菜单栏中点击Create->Physics->Ground Plane即可创建地平面,在右边的如下图所示。 可以看到,白色的就是地平面(默认可视化面积是25m×25m)。需要注意的是,尽管可视化只是一小块,但其实这个面是无限的。而不是说物体只要超出了可视化的白色区域就会掉到地下去,这一点需要注意。之后我们可以验证。

1.4 增加光源

作为一个场景,自然还要有光照,不然什么都看不见。在每个场景新建出来的时候,都会有一个默认光源defaultLight,我们可以开关这个默认光源感受一下。 当我们选中这个defaultLight以后,黄色的线就表示光源照射的方向。当然,一个场景可以添加多个、多种光源。这里我们可以再添加一个光源。在菜单栏中点击Create->Light,选择想要添加的光源即可。比如这里我们选择球型光源(Sphere Light),选中球型光源,根据自己的喜好设置一些属性即可,如下。 这里为了展示新添加的光源效果,把默认光源关闭了。

2.物体相关知识

2.1 增加物理属性

在前面,我们向场景中添加了各种物体。但到目前为止,这些物体都是缺乏物理和碰撞属性的,无法做物理仿真。比如一个浮空的立方体,运行仿真环境以后,并不会因为重力而落到地面上,即使在1.2部分我们对场景添加了物理引擎。因为它们没有物理属性,并不受场景的物理引擎影响。添加物理属性也非常简单。在Stage面板中,选中我们要添加物理属性的物体,在其属性面板中点击“+Add”,然后找到Physics->Rigid Body with Colliders Preset。这样,基本的物理属性就添加好了,如下图所示。 在控制面板中可以看到我们刚刚添加的Physics属性。如果要删除这个属性的话,在右边有个红色的叉号,点击就可以删除了。比如,我们可以测试一下物理属性对于物理仿真的影响。 可以看到,在物体有了物理属性以后,其在场景的重力影响下会落到地面上。而如果我们把物体的物理属性删除,再次运行环境,物体就还是悬浮在半空中了。

最后简单解释一下“Rigid Body with Colliders Preset”。事实上这个预置好的配置会给物体同时添加Rigid Body和Collision两个物理属性,所以在属性面板的Physics下面可以看到这两个子属性。这两个属性当然是可以分别被添加的。如果一个物体没有碰撞属性,那么结果就是这个物体可以光明正大的“穿模”。所以有时我们也需要查看物体的碰撞格网(Collision Mesh),操作也非常简单。点击Viewport中的眼睛按钮,依次选择Show By Type->Physics->Colliders->All,即可显示格网,如下图所示。 这里粉色的线就表示碰撞格网,地面是用同心圆表示的。

2.2 增加物理参数

对物体增加各种物理参数(如摩擦力)的步骤是先创建一个物理材质(Physics Material),然后再把这个材质赋给指定对象。首先在菜单栏点击Create->Physics->Physics Material,在弹出的对话框中选择“Rigid Body Material”即可,如下图所示。 然后在Stage面板中就能看到刚刚添加的物理材质了。选中它,然后在它的属性面板中进行相应修改即可,如下。 做好材质以后,下一步就是把材质赋给某个物体,也非常简单。选中要赋值的物体,然后在它的属性面板中找到Physics Materials属性,在下拉列表中选择我们刚刚新建的物理材质即可。

2.3 增加物体材质

关于如何改变物体材质,其实在上篇笔记中已经介绍过了,这里不再赘述。核心思路和增加物理参数是一样的,也是先创建好想要的材质,然后把材质赋给对应的物体。改变物体颜色的简单示意图如下。

3.Isaac工作流

Isaac Sim主要有三种工作流(工作方式):GUI、Extensions、Standalone Python。简单描述如下:

  • GUI:一般可用于场景构建、机器人组装、传感器组装等应用
  • Extensions:构建交互式GUI、需要实时反馈的应用场景
  • Standalone Python:大尺度的强化学习训练、系统的世界生成与修改

所以可以看出,其实,对于我们一般而言,利用GUI就已经足够了,后两者更多面向开发场景。毕竟我们不打算用Isaac Sim做二次开发,而是只把它当作一个数据仿真、采集工具。事实上,目前,我们介绍的所有关于Isaac Sim的知识,都是基于GUI的。关于这三种方式更详细的介绍,感兴趣可以参考官方文档

4.实际组装一个机器人

在这一部分,我们在Isaac Sim里尝试实际组装一个简易的机器人。

4.1 新建各个部分

我们以两个圆柱+一个立方体作为机器人的身体,利用之前笔记的知识,可以很快添加好(包括它们的物理属性),然后添加了物理引擎、地面,如下图所示。 可以看到,这个机器人有两个红色的轮子和蓝色的身体。此时,尽管看起来“机器人”是一个整体,但其实是“散装”的。如何验证呢?我们不妨运行一下仿真环境,如下。 可以看到,看起来是一个整体的机器人,落地以后就是分开的了。

4.2 连接各个部分

为了解决这个问题,我们需要将机器人的各个模块连接起来,才能真正成为一个整体。连接的这个工作是通过关节(Joint)完成的。一个关节自然是要连接两个部分,所以我们首先要在Stage面板中选择被连接的物体,然后再同时选择要连接的物体,右键Create->Physics->Joint->Revolute Joint即可,最后,根据需要调整旋转轴,如下所示。 当我们再次尝试运行仿真环境的时候可以看到,左边的轮子已经和机器人身体一同下落了。类似的,我们再将右轮也连接到身体上。这样所有部件就都构成了一个整体,即使下落也是一体的,如下。 以上我们就机械地将机器人拼接好了。补充一句:在运行时,按住Shift,鼠标就可以任意拖动物体,松开鼠标就可以释放物体。当然为了最终能够运行,应该还要增加两个关节的关联关系。我们在Stage面板中同时选中刚刚添加的两个关节,然后在属性面板中点击“+Add”->Physics->Angular Drive,即可,如下。 添加好以后,选中任意一个Joint,在它的属性面板里应该就能找到Drive标签,如下。 我们可以直接设置Target Velocity,这样,当再次运行仿真环境的时候,机器人就会按照设定的速度一直往前走了。在Isaac Sim中,支持Position和Velocity两种控制方式。如果说使用Position方式,应该设置一个较大的stiffness和较小(或为0)的damping,相反,如果Velocity方式,应该设置较大的damping和为0的stiffness。对于我们这里的车轮,以Velocity方式比较合适,所以可以设置damping为10000,target velocity比如为700,运行效果如下。

4.3 增加Articulation

Articulation本身也是关节的意思,所以这里我也不知道该怎么翻译成中文。但它和上面提到的Joint不同之处在于,它可以由一系列的Joint组成,可以看作是比Joint更高层次的关节组。新建一个Articulation也很简单。在我们的这个例子里,在Stage面板中选中Body,在其属性面板中点击“+Add”->Physics->Articulation Root即可,如下。 然后,你就会在其属性面板中找到Articulation Root这个标签了,如下。 关于Articulation的更多内容可以参考官方文档

4.4 增加相机传感器

作为仿真环境,在机器人上添加相机是再基本不过的操作了。在Isaac Sim中添加相机也十分简单。在菜单栏中点击Create->Camera即可,如下。 相机在Isaac Sim中以视锥体表示的。添加完成后,像调整其他常规物体一样,调整视锥体的位姿即可。 当然,如果你查看相机的属性面板,就会看到有很多可以配置的参数,如焦距等等。不仅如此,还可以实时预览相机拍摄到的视角。按照之前这篇笔记说的,我们可以新建一个视角,然后在它的Perspective里选择我们新建的Camera就可以了。到此为止,相机的添加是OK的。但是如果你运行一下就会发现问题,如下图所示。 我们添加的相机并没有和机器人绑定,机器人走了很远了,相机还原地没动。所以,添加相机的第二步就是要将添加的相机和机器人绑定在一起。这样才能一起运动。

绑定相机也很简单,只有一步操作:将刚刚添加的相机拖拽到机器人本体上,让其成为Body的一个子对象即可,如下。 再次运行仿真环境,就可以发现相机随着机器人运动了。 至此,我们就基本完成了自己搭建一个简易机器人并且给其添加传感器的任务了。事实上,其它类型的传感器添加步骤和相机是类似的。我们只需要点击Create->Isaac->Sensors然后选择想要的传感器添加即可,如下。 并且Isaac Sim还贴心地为我们提供了LiDAR、IMU等传感器的示例DEMO,可以让我们快速上手,菜单栏Isaac Examples->Sensors就可以找到,如下。 下面是IMU示例的演示。 下面是LiDAR示例的演示。 关于Camera的更多资料可参考这个文档、LiDAR参考这个,IMU参考这个

至此,我们便在Isaac Sim中完成了一个带有相机传感器的简易机器人的搭建。

5.实际运行并初步采集数据

最后,我们在这个场景中增加一些内容,然后,让机器人在这个场景中跑起来,并看看它拍摄的影像,以此作为我们这篇笔记的结尾。

5.1 丰富仿真环境

在Isaac Sim中向场景中简单添加了一些植物和摆件,如下。 经过实际使用发现,在Omniverse Launcher里下载的一些素材,并不是所有在Isaac Sim里都能找到,但在Omniverse Create里都可以找到,所以如果真的想认真编辑场景的话,可以考虑在Omniverse Create里进行,然后再在Isaac Sim里打开添加机器人。

5.2 运行仿真环境

在编辑好的环境中运行机器人,效果如下。 可以看到,随着机器人的运动,相机拍摄到的画面也随之变化。而且在右边的Body的属性面板中,可以看到Body的位姿也是实时更新的。对于我们SLAM而言,这其实就是相机的位姿真值了。

5.3 仿真数据保存

Isaac Sim提供了非常方便的合成数据录制工具,我们可以将仿真环境里的一些信息直接输出。我们首先把相机的视角通过一个新的Viewport展示出来,如下所示。 然后,主界面下方就会出现Synthetic Data Recorder。 它的构成也比较简单。当前有几个Viewport就会有几个Viewport标签,比如这里我们的Viewport2是相机的View,那么我们就点开Viewport2。可以看到,Isaac Sim支持多种数据的录制。从简单的RGB到深度图再到语义分割或者实例分割等都可以(不过经过测试,后四种需要单独操作才能顺利录制,直接录是空的)。而每种数据又包含Status、Colorize、Save array三种选项。以深度图为例,Colorize就是表示用于可视化的深度图,包含灰度信息而不是深度数值,而Save array则是保存的npy格式的原始数据,里面是深度值。看完Viewport标签以后,再看Recorder Settings标签,如下。 这个也比较好理解了。是录制数据输出的一些设置,包括输出文件夹、渲染模式等。配置好参数之后,点击主界面左边工具栏中的播放键,再点击Synthetic Data Recorder中的“Start Recording”即可开始录制。录制好的文件如下。 以RGB影像为例,录制的影像名称是顺序逐次增加的,影像大小为1280×720。 当然你可能会好奇,我们没有手动设置过这个影像大小,这是在哪里设置的。因为通过Synthetic Data Recorder这种方式保存的数据其实可以看做保存的是Viewport的渲染结果。所以说,这个大小其实就是Viewport的分辨率。我们可以点击Viewport2左上角的齿轮,在下面找到“Render Resolution”,我们可以根据需要修改,如下。 至此,我们便初步实现了自己搭建环境与机器人,并在机器人上绑定相机传感器,最后利用Synthetic Data Recorder进行仿真数据保存。当然,这些只是基本的操作,还有很多没有解决的问题,比如相机/机器人本体的位姿真值如何同步保存下来等等。这些留在之后的笔记再继续探讨。

6.参考资料

  • [1] https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_intro_environment_setup.html
  • [2] https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_intro_simple_objects.html
  • [3] https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_intro_workflows.html
  • [4] https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_gui_simple_robot.html
  • [5] https://docs.omniverse.nvidia.com/app_create/prod_extensions/ext_physics/articulations.html
  • [6] https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_gui_camera_sensors.html
  • [7] https://docs.omniverse.nvidia.com/app_isaacsim/prod_materials-and-rendering/cameras.html
  • [8] https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_advanced_range_sensor_lidar.html#using-sensors-lidar
  • [9] https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/ext_omni_isaac_isaac_sensor.html#imu-example

本文作者原创,未经许可不得转载,谢谢配合

返回顶部