一种3D打印模型轻量化结构自动生成方案
2022-12-21黄至柔郭帅傅琳孙永国闫旭于广滨
黄至柔,郭帅,傅琳,孙永国,闫旭,于广滨,
(1.长春理工大学 机电工程学院,长春 130000;2.中国船舶重工集团 第七○三研究所,哈尔滨 150078;3.哈尔滨理工大学 机械动力工程学院,哈尔滨 150080)
0 引言
3D打印技术的出现使得一些复杂结构的制造成为了可能,然而高昂的材料成本制约了3D打印技术的发展。为了节省打印耗材,降低打印成本,人们对3D打印模型的轻量化做了不少研究。
Chen等[1]提出一种将设计的不同种类晶格单元结构在模型内部阵列的轻量化方法,并且目前已经广泛应用到Magics等专业3D打印软件中,然而这种方法需要进行大量的布尔运算,对于复杂模型的处理能力不足。北京工业大学的毛羽忻[2]针对3D打印切片的特点,提出一种基于骨骼肌仿真的3D打印模型支撑结构,首先使用图像处理的方法提取骨骼肌纹路,然后将模型分成无数切片。令每一层切片与提取的骨骼肌纹路做布尔运行,然后再将运算后的切片进行三维重建。同样是把三维问题转换到二维,浙江大学的赵斌涛[3]提出一种基于LDNIs的桁架结构生成算法,提高了桁架结构的生成效率。同样是基于桁架结构的轻量化方法,武汉理工大小的石丹[4]基于STL文件的数据结构,利于Matlab计算桁架的节点,并将节点导入Grasshopper中生成桁架结构。不同于使用桁架结构,大连理工大学的冯紫鑫[5]使用三周期极小曲面结构在模型内部阵列,并根据模型力学仿真结果改变极小曲面的参数以实现结构力学性能的改变。本文结合武汉理工大学石丹与大连理工大学冯紫鑫等的研究,提出一种基于桁架结构的模型轻量化方案,并根据力学仿真结果,通过对受力较大部位填充的方式实现结构强度的优化。
1 基础结构生成
为了生成轻量化模型的基础结构,首先借助专业3D打印软件Magics的外壳和内核功能,将初始模型分为外壳、内壳与内核3个部分,接着读取获得的内壳与内核两部分的模型文件数据作为桁架结构的节点,再将节点导入Grasshopper并连接各个节点,分别获得内壳桁架与内核桁架,将内壳桁架与内核桁架相连即为轻量化模型的内部桁架,最终将内部桁架与模型外壳做布尔运算即生成了轻量化模型的基础结构。
1.1 模型的外壳、内壳与内核
为了使模型原来的外表得以保留,需要对待轻量化的模型进行抽壳。本文使用Materialize公司旗下专业3D打印软件Magics将模型分为外壳和内核(壳厚为a),其中将获得的外壳作为模型外表,内核作为计算轻量化模型内部第一层桁架的基础。然后,为了提高轻量化模型的强度,避免模型内部孔隙过大,将前一次分离的模型内核再进行一次分离,成为新的模型内壳与模型内核(壳厚为b),内核作为计算轻量化模型第二层桁架的基础。
至此,使用Magics将原本的模型分离成了外壳、内壳与内核3个部分,如图1所示,方便后续的一系列处理。
图1 模型抽壳示意
图2 示例模型三部分
1.2 内部桁架结构的生成
内部桁架结构是对模型镂空部位起支撑的作用,在3D打印领域中,桁架结构也是常见结构之一。目前,国内外对于桁架结构的研究主要集中于其设计,而对于其生成方面的研究则相对较少。在本文所提出的轻量化方案之中,内部桁架结构分为内壳桁架与内核桁架两部分,这两部分桁架的生成根据1.1节中所获得的内壳模型与内核模型计算而出。具体步骤如下:
1)分别读取内壳和内核两部分的STL模型文件数据;
2)将1)中读取的数据作为节点导入Grasshopper并连接生成内壳初始层桁架与内核初始层桁架;
3)根据1)中读取的数据计算新的节点并导入Grasshopper,连接生成内壳偏置层桁架与内核偏置层桁架;
4)将内壳桁架与内核桁架相连最终形成轻量化模型的内部桁架结构。
1.2.1 STL模型文件的读取
STL文件格式[6]是由美国3Dsystem公司推出的3D打印领域通用的模型文件格式,STL格式的模型是用一系列三角形来描述模型的表面,每一个三角面片都包括3个顶点的坐标数据和法向量信息,通常用户需要先将设计好的三维模型转换成STL模型,再导入切片软件进行切片以获取每一层切片的轮廓。STL文件又分为二进制格式与ASCII码格式,本文所使用的STL文件格式为二进制,其数据存储格式如表1所示。
表1 二进制STL文件数据存储格式
由于STL文件是用三角形来描述模型表面,故以一个三角面片为单位存储模型文件数据。首先定义一个三角面片的类Facet,用来存储每一个三角面片,其成员包括3个顶点vertex子类成员以及一个法向量成员,每一个vertex子类则包括3个double类型的成员变量x、y、z。即:
再使用fopen_s函数打开文件后将数据存入分配的内存,接着根据二进制格式对所有的Facet对象进行初始化,最后将初始化后的所有对象即所有三角面片存入vector
1.2.2 初始层桁架
完成存储内壳模型与内核模型的三角面片之后,将每个面片的3个顶点的坐标数据以.txt文本文件输出:定义输出文件名与格式,使用迭代器以访问存储容器中的每一个元素,再用文件流操作将数据写入指定文本文件。即:
然后在Grasshopper中分别读取写入节点坐标X、Y、Z数据的文本文件,建立好节点并用line电池将节点按设定好的规则相连(如图3),至此获得内部桁架结构的初始层桁架(如图4)。
图3 Grasshopper桁架生成程序设计
图4 初始层桁架结构
1.2.3 偏置层桁架
为了进一步提高桁架结构的强度,武汉理工大学的石丹等将每一个三角面片的形心向法矢方向偏置,使偏置后的形心作为下一层桁架的节点,然后根据原有三角面片的拓扑关系将偏置后的形心划分为新的三角面片,然后重复偏置新的三角面片的形心,以此迭代的方式不断生成新的偏置层桁架。这种方法的问题在于:
1)在将形心朝法矢方向偏置的过程中会出现偏置点跑到模型外面的情况,形成干涉点导致建模错误,如图5所示。
图5 偏置点偏置错误
2)在将形心朝法矢方向偏置完成,将偏置点相连形成桁架结构的过程中,会出现杆与杆之间交叉干涉的情况。
3)一般的3D打印模型的面片数在几千甚至几百万不等,在将偏置形心划分为新的三角面片后,新的三角面片数量会远大于上一层三角面片,而该方法必须计算每一层的所有三角面片的偏置形心、法向量,与定义新的拓扑关系,故迭代两次之后产生的新的三角面片会极大降低算法的时间、空间效率。
针对问题1),本文提供的轻量化方案的内部桁架结构是在1.1节中所获得模型内壳与模型内核基础上直接计算而得,避免了从最外层桁架一层层向内偏置迭代,故不会产生偏置点跑到模型外部的情况。
针对问题2),杆与杆交叉干涉一般出现在模型曲率较大的部位,该部位附近的三角面片距离相对较短,法向量夹角相对较小,当两个距离较短且法向量夹角较小的三角面片的形心的偏置距离大于两个面片的相对距离时,就会出现交叉干涉。由于内壳与内核处于初始模型内部,对其外表形貌不做要求,且这两部分模型表面的精细程度不需要太高,通过对内核与内壳进行三角面片简化的操作,降低内壳、内核的模型精度及模型表面的曲率,从而使后续桁架的结构更加简洁,避免了交叉干涉的情况。
图6 偏置轮廓相交
针对问题3),如同问题1)解决方案中提到的一样,本文所提供的轻量化方案不使用层层迭代的方式,故避免了庞大的三角面片计算量,且通过内壳与内核并行计算生成结构的方法相比于串行迭代的方式更具有时间效率。
综上3点,本文使用内壳向内偏置一次,内核向外偏置一次的方式:计算内壳上所有三角面片的形心,朝法向量偏置一定距离D(D应小于在1.1节中对模型进行内壳与内核分离时设置的两者之间的距离b的1/2),得到内壳偏置形心,将每一个内壳偏置形心与其对应的三角面片的3个顶点相连,形成内壳偏置层桁架(图7中白色部分);同理,对内核上所有三角面片进行同样的计算与操作之后,将形成的内核偏置层桁架与内壳偏置层桁架以最近距离的方式匹配相连,最终形成了轻量化模型的内部桁架结构。
图7 轻量化模型内部桁架生成流程
2 轻量化模型结构强度优化
由于模型在不同受力条件下各个部位的应力分布不同,通常情况下只用一种结构无法满足所有情况下结构的强度要求。为了使模型在不同受力条件下都具有足够的强度,本文提出一种对模型应力集中部位填充的方法:首先对模型进行有限元分析,将分析结果以单元节点为单位输出,接着对其进行筛选,并以筛选后满足条件的目标节点的坐标为基础,使用OpenSCAD建立实体,最后将实体与初始模型做布尔运算以实现对模型的填充。
图8 轻量化模型结构强度优化流程
2.1 模型的有限元分析
有限元分析的目的是为了模拟模型在实际工况下整体结构所受到的影响。有限元分析的结果为后续本文所提供的优化方案提供了目标与依据。本文使用ANSYS Workbench 19.0平台对1.1节中的示例模型进行压缩实验模拟:材料使用默认的结构钢,材料密度为7850 kg/m3, 抗压屈服强度为250 MPa,在模型底面施加约束,并在顶端施加一个80 MPa的垂直方向载荷,计算得到模型的等效应力结果如图9所示。
图9 示例模型的应力云图
通过分析结果可知,该示例模型的应力较大部位分别在模型尾巴根部、尾巴与头部连接处,以及脚底受约束部位。在Workbench中将分析结果以单元节点为单位输出到文本文件中,即可获得每个单元节点的x、y、z坐标与其对应的应力值大小,再对记录这些节点的文本文件进行读取,以大于给定阈值(例如抗压屈服强度)为条件筛选并导入到Grasshopper中进行观察,得到满足条件的节点如图10所示。
图10 目标节点集
2.2 目标节点的填充实体建模
在获得了模型应力较大部位的节点坐标数据之后,本文使用OpenSCAD在每一个目标节点的位置建立一个小的实体,再与初始模型进行布尔运算以满足模型的几何约束,从而获得轻量化模型的填充实体模型。
OpenSCAD[7]是一款开源免费的建模软件,并且能实现对STL文件的输入与输出。OpenSCAD使用的是编程脚本进行建模,通过其自带的库函数实现常见3D几何模型的建立与基本建模操作。本文所使用的OpenSCAD 中编程语言函数如表2所示。
表2 OpenSCAD语言函数
在2.1 节中经过筛选后满足条件的目标节点共有144个,如果要在每一个目标节点的位置上建立一个实体(根据示例模型的几何尺寸,本文选用3 mm球形实体:sphere(3)),则需要调用144次sphere函数,这种情况下通常采用循环结构来实现函数的复数次使用,但是OpenSCAD本身不具备分支、循环等常用编程逻辑功能。故需先使用C++中的for循环功能实现OpenSCAD脚本的生成(图11右上),然后将脚本导入OpenSCAD中,过程如图11所示。
图11 目标节点位置实体建模流程
在OpenSCAD中完成建模之后,为避免部分实体超出初始模型的表面,需要将这些实体与初始模型进行布尔交运算,如图12所示。
图12 布尔运算获得填充结构
3 轻量化模型的生成
将本文在第1节获得的轻量化模型的基础结构与第2节获得的用以提高结构强度的填充结构相结合,即为本文所设计的3D打印模型轻量化方案的最终结构,如图13所示。
图13 最终轻量化模型生成
模型轻量化前体积为6970 mm3,轻量化后模型体积为3144 mm3。
图14及表3所示是本文轻量化方案生成一些其他案例,为了方便展示桁架结果隐藏了模型外壳。
图14 本轻量化方案其他算例
表3 算例结果
4 结论
本文提出一种3D打印模型轻量化的方案,方案基于3D打印模型专用STL文件,使用部分商业以及开源软件的功能,再结合所设计的算法实现降低打印模型的质量以及体积,并且根据力学仿真结果优化轻量化模型的结构强度。