Linux 16.04.7 LTS : 代码开发平台
Visual Studio Code 1.78.2: IDE代码撰写调试工具
Meshlab v2022.02: 工件模型编辑工具,用于模型的重建和后处理
Blender 3.3.1 物理仿真和渲染引擎
BlenderProc 2.5.0 基于blender的python接口开发的仿真渲染工具箱,用于与blender实现指令交互
虚拟数据的生成依赖于工件的三维模型,其获取方式一般有以下两种方法:
1.手工建模:使用3D建模软件(SolidWorks、blender、3dsMax等)手工创建目标物体的网格模型。
2.三维扫描:利用三维扫描设备(RGBD相机、激光扫描仪、结构光扫描仪)对目标物体进行扫描,获取其表面点云数据。然后,通过点云数据处理算法,如点云配准、表面重建等,生成目标物体的网格模型。
同时工件的摆放类型也主要分为杂乱堆叠摆放和阵列有序摆放,本课题选取的三个场景类别详情如表1所示:
表1 实验场景详情
场景名称 |
模型类型 |
场景类型 |
连杆场景 |
完整模型 |
杂乱堆叠 |
薄片场景 |
手工重建单面点云 |
杂乱堆叠 |
转子场景 |
手工重建单面点云 |
阵列 |
本课题研究过程中将根据实际的场景类型生成对应的虚拟数据。
对于连杆场景,我们已有手工制作的CAD模型,因此可以直接使用。而薄片场景和转子场景我们需要基于单帧点云进行重建,以薄片为例,在Meshlab中的制作流程如图1所示:
图1 从场景点云重建工件表面模型
主要步骤包括:
(1)使用裁剪工具从场景中采取一个完整的工件点云。
(2)拟合点云法相,用于表面重建。
(3)使用Ball Pivoting算法对点云进行表面重建
(4)通过Laplacian平滑对工件表面进行平滑处理得到重建的工件模型
最终我们得到的三种模型示例(图2):
图2 工件网格模型示例
得到工件模型后,我们就可以结合使用BlenderProc实现场景的渲染,其流程如图3:
图3 虚拟数据渲染流程
(1) 为工件模型添加随机的金属材质,用于泛化现实场景图像和虚拟图像的工件表面差异。
(2) 如果是有序摆放的阵列场景,我们按照其阵列布局的一般规律(例如n行m列)进行摆放并固定其位姿,如果是杂乱堆叠场景我们会初始化其位姿为一定空间范围并通过物理仿真引擎施加重力加速度模拟随机调用后的摆放位姿。
(3) 初始化相机、灯光、背景等环境内容,渲染相机视角下的图像。
工件仿真场景示例(图4):
图4 工件仿真场景示例
生成图像示例(图5):
图5 虚拟仿真数据与现实场景数据对比
为了模拟现实场景中的抓取过程,我们在每一帧渲染后都会减少场景中的工件数目。考虑到阵列场景中的抓取策略的差异,我们对阵列场景采用随机减少和有序减少两种方案,而杂乱堆叠场景则直接使用随机减少的方法(图6)。
图6 模拟抓取过程的工件减少方案示例