APP下载

利用国产建模平台自动创建FAST 索网数字化模型

2019-11-22赵正旭赵士伟王威张庆海姜鹏郭峰

现代计算机 2019年29期
关键词:钢索拉索表格

赵正旭,赵士伟,王威,张庆海,姜鹏,郭峰

(1.青岛理工大学,青岛266520;2.石家庄铁道大学复杂网络与可视化研究所,石家庄050043;3.中国科学院国家天文台,北京100012)

0 引言

位于贵州的500 米口径球面射电望远镜(Fivehundred- meter Aperture Spherical Telescope),简 称FAST,是人类发现脉冲星的“眼睛”。FAST 结构复杂多样,其中索网结构信息量十分巨大,如此巨大的FAST 索网模型若使用手工实施索网建模工作,不仅工作量巨大,且建模精度会由于人为原因而有所欠缺,且对后续模型修改和编辑带来极大的不便,同时在与圈梁等其他部分拼接的时候也会带来不便。本文在国产操作系统中标麒麟7.0 上基于开源的建模软件Blender-2.79b,使用Blender 的内置Python API 进行脚本数据建模,既可以大大简化建模的工作量,同时提高了建模精准度,为模型后续修改也提供了极大的便利。

1 系统环境与建模工具

1.1 系统环境

我国大部分用户对操作系统的选择是Windows 操作系统,Windows 操作系统对隐私信息的保护存在一定的弊端,为了实现我国信息安全自主可控,很有必要

发展国产操作系统,在国产操作系统上进行国家重大科研项目和相关项目的开发,能够对我国的信息安全有所保障[6]。FAST 索网模型的建立基于国产操作系统中标麒麟7.0 桌面平台,其操作系统平台完全实现了我国信息的安全自主可控。中标麒麟操作系统使用Linux 内核,中标麒麟桌面操作系统是一款面向桌面应用的图形化桌面操作系统,针对x86 及龙芯、申威、众志、飞腾等国产CPU 平台进行自主开发,率先实现了对x86 及国产CPU 平台的支持,提供性能最优的操作系统产品。通过进一步对硬件外设的适配支持、对桌面应用的移植优化和对应用场景解决方案的构建,完全满足项目支撑,应用开发和系统定制的需求。

1.2 Blender开源三维软件

3D Max 建模软件适用于Windows 操作系统,而基于中标麒麟操作系统的建模,Blender 是一个很好的选择。Blender 的开源性、免费性受到广大用户的支持,其功能的强大更是受到商业、企业的青睐。Blender 的开源性就意味着用户可以参与开发,其版本更新迭代相对较快,对于有特殊需求的公司完全可以根据自己的需求进行二次开发。同时Blender 可以完美地进行跨平台使用,无论实在Windows、Mac 还是基于Linux内核的开源系统,都可以完美的使用。

Blender 的各项功能堪比3D Max,它具有建模、渲染、制作动画、后期处理、跨平台交互制作等功能。Blender 具有API 支持,其中Python API 的使用最为广泛,也最为成熟。可以通过Python 代码的编写来实现模型的创建、模型的贴图、渲染等,还能仿真粒子、碰撞、力等较为抽象的效果。可以说Blender 完全满足在索网建模在中标麒麟7.0 操作系统上建模需求。

1.3 Python编程语言

当需要对一个系统进行仿真研究时,首先需要对其进行数学模型的建立,采用相应的算法并编写仿真程序来把数学模型转化为仿真模型。程序是人与计算机进行交流的媒介,通过程序的编写来对计算机软件中的功能进行控制与管理,从而达到设定的目标。对索网进行模型的创建,就是用编程来实现模型的创建、模型位置与大小的确定,管理简便,易于修改,采用的编程语言为Python 语言。

首先,Python 是一种面向对象、解释性的计算机程序设计语言,也是一种功能强大且完善的编程语言。Python 简洁而清晰的语法,使其受到广泛的应用,Python 可用简短的编程语句来实现复杂的任务,其适用于众多操作系统[7]。Python 易于实现模型的创建、动画的制作、系统的模拟等,能很好地与C/C++等语言互相兼容,它几乎囊括了所有语言的高级特性,而且可以被自动生成。

最为主要的是,Blender 是一款开源软件,其内部提供的API 为Python 编程的运行提供了支持,可利用Python 编程语言来实现各项功能。此外,Python 内部包含着诸多已完成的软件包、Python 库,在使用的时候可以直接调用,为使用者提供了很大的便利。本文应用到了bpy、math、xlrd、xlwt 等包就是平Python 针对各个不同的方向所开发的软件包,它们能够在Blender 中兼容运行。

2 索网结构分析与数据提取

2.1 索网结构分析

三维模型作为点和其他信息数据的集合,可以由手工进行建立:利用一些基本的集合元素(如立方体、球体、圆柱等),通过一些列集合运算(平移、旋转、拉伸以及布尔运算)来构建复杂的几何场景。然而Blender支持Python 脚本建模,秉承“模型即是数据,数据即是模型”的宗旨,可以分析FAST 索网结构、提取FAST 索网节点数据进项脚本三维建模,从而提高效率,加快进度,使得建模和数据有效地结合起来。

2.2 FAST索网结构

索网结构包括主索网结构和下拉索结构,主索网结构为三角形网格形状,除边界节点外,每个主索网节点连接着6 根主索以及1 根下拉索,其中一共有2225个主索节点、6670 根主索和2225 根下拉索。主索网结构固定在周圈环梁结构上,2225 下拉索的下端与促动器相连接[8]。主索满足五分之一旋转对称,下拉索根据地势调整其拉索长度[9]。平面图如图1 所示,侧面图如图2 所示,索网节点关系图如图3 所示。A 到E 区的主索节点采用“各区域字母+几点位置标号”的方式编制,如:A001:表示A 区1 号节点。

图1 索网平面图

图2 主索网侧面图

图3 索网节点关系图

2.3 FAST索网节点坐标的提取与校准

FAST 索网主索节点位置关于原点五分之一对称,下拉索根据主索和地势确定其相应的长度,每个下拉索由主索和一个地锚点所确定。所以数据有主索节点信息和下拉索节点信息。使用OCR 工具将索网节点的PDF 信息转化成Excel 表格,然后使用Blender 读取表格中的索网数据信息进行模型的建立。

FAST 索网节点信息是由PDF 格式存储的,由于数据信息十分巨大,手工输入不仅效率低下,还容易出现差错。可通过OCR 软件提取索网节点信息。OCR识别PDF 会有所误差,可以通过编写相对应的Python脚本进行数据的校准检验:将OCR 软件提取出来的String 类型数据在Excel 中使用VALUE()函数进行String 与Float 的转化,再使用Blender 中的Python API将这些点具现化。具体方法就是在这些三维坐标点上绘制相应大小经纬球,以位置编号对小球名称进行编号。若某个编号的小球没有在相应的位置上,则人工进行修改,直至所有经纬球能按照预期的主索结构排列,即大致成半球形排列。

3 Python标准库安装与数据读取

Blender 自带Python 环境,但是自带的Python 环境不能满足我们的需求,需要对Blender 自带的Python进行一定的修改。

3.1 xlrd标准库的安装

索网各个点的坐标经过读取和修正之后将数据放到Excel 表格之中,使用xls 实现数据的存储与读取。然而Blender 自带的Python 是没有读取xls 文件的工具包的,需要自行搭建。中标麒麟下使用的是版本Blender 2.79b,首先查看当前版本的Blender 使用Python 的版本信息,如图4 所示,当前版本信息是Python 3.5.3。

打开Blender 的Python 控制台,输入import xlrd 会显示错误,所以需要对库进行安装。本文用到的库主要是xlrd,即对xls 文件读取的Python 标准库。Blender下的Python 标准库的安装不同于普通Python 的安装,需要将安装好的xlrd 库进行移植的Blender 下的Python 下。

首先需要打开中标麒麟7.0 命令提示符界面,使用“python3——version”来查看当前使用的Python3 的版本号,因为Python3 的向下兼容性,尽量使当前Python3的版本低于等于Blender 中Python3 中的版本号。在命令提示符中使用pip3 install xlrd 命令安装xlrd 工具包,需要找到xlrd 工具包的安装路径,其默认安装位置是“/lib/python3.4/site-package”中,找到xlrd 与xlrd-1.00-dist-info 文件夹,直接移动到Blender 下的Python文件夹中对应的site-package 文件夹中。本文中所使用的site-package 文件夹所在的位置是/home/username/blender- 2.79b- linux- glibc219x86_64/python/lib/python3.5/sitepackages。然后重启Blender,再在Blender 的Python 控制台下输入import xlrd 即可,没有返回信息即表示移植成功能够使用。

图4 查看Python版本和导入xlrd包

完成以上配置后,接下来将整理好的数据存取到xls 文件中,并调好相应的格式,以便将来数据的修改与读取。

3.2 使用xlrd读取索网表格信息

xlrd 是Python3 的一个工具包,用来读取表格信息,我们所用到的索网主节点信息以表格形式存储在表格中,所以需要使用Python 工具包来读取出来。

url="../data/R131.xls"

#读取xls 表的数据

#读取A 区的数据

xl=xlrd.open_workbook(url)

#定义表格对象名称

sheet1=xl.sheet_by_name("Sheet1")

Acol1=sheet1.col_values(1)

#获取去表格对象的第一列

Acol2=sheet1.col_values(2)

#获取去表格对象的第二列

Acol3=sheet1.col_values(3)

#获取去表格对象的第三列

由于各个列的数据个数可能不尽相同,而xlrd 包读取表格整列的时候是按照整个表格数据的最长列数读取的,若其他的列没有达到最大列数,多余的空值会填空值,所以需要对读取到的数据进行去空操作。

Acol1=[i for i in Acol1 if i !='']

#对list 类型的Acol1 去空操作。

4 逻辑信息建立索网节点关系

4.1 建立主索网节点关系

由两个节点位置可以确定索网之间的钢索,所以是否确定索网节点之间的关系尤为重要,索网节点关系如图5 所示。在确定好节点关系后,可以使用Blender 中Python 中vector_module_angleLR 函数确定钢索位置、旋转角度、长度等信息。再使用getCS_Square 函数确定钢索的公称截面面积,至此为止钢索的所有信息都已确定完毕,可以使用Blender 中Python 脚本bpy.ops.mesh.primitive_cylinder_add()来创建钢索。

难点在与钢索节点关系之间的对应关系,如图5所示,1→2,3;2→4,5;4→7,8,等等。本文采用的是Python 的动态变量命名方法来创建多个list 类型的数组来存储节点关系。由alist 表示1,3,6,10,15,21……这条初始序列(由1 从左下到右上的序列),list1表示由1 为list1[0]的1,2,4,7,11……这条序列,list2表示由3 为list1[0]的……这条序列,依次下去进行节点的表示。节点连接关系就是list[i]与list[i+1]和list[i+1]+1 两个节点有连接关系。以上是呈V 字型联系的索网。横向相连的索网建立一个新list 列表。关系为list[i]与list[i+1]有关系,当到达最右端是即节点编号等于alist[j],跳过这层最终节点的建立即可。

图5 索网节点对应关系图

以下为动态为变量命名建立节点:

names=locals()

#动态为变量命名

for i in range(1,nd):

#为list 动态命名变量

names['list'+str(i)]=[]

for i in range(1,nd):

#为首元素赋值

names.get("list"+str(i)).append(alist[i-1])

for i in range(1,nd):

for j in range(1,listlen-i):

#为由右下到左上的钢索节点names.get("list"+str(i)).append(names.get("list"+str(i))[j-1]+i+j-1)

4.2 索网规格获取公称截面面积

在FAST 索网结构中,每个钢索类型的具体粗细是不确定的,由规格名称来确定公称截面面积(cm2),代码如下:

def getCS_Square

(cType,listType,listCS_Square):

for i in range(0,len(listType)):

if cType==listType[i]:

Square=listCS_Square[i]

Rudius=math.sqrt(((Square*100)/math.pi))

return Rudius

参数cType:string 类型,用来传入需要判断的拉索规格。

参数listType:list 类型拉索规格名称。

参数listCS_Square:list 类型,根据listType 来对应判断拉索的公称截面面积。

在Blender 中写较长代码时可以使用Blender 的文本编辑器进行编写,由于Blender 下的Python 调试器无法显示具体的错误,所以调试的时候需要使用中标麒麟下的Python3 进行调试,从而修改Blender 中的Python 代码。

5 Blender三维建模

5.1 Blender下Python控制台建模

使用Blender 下的Python API 进行建模。主要用的有bpy、math、os、xlrd 工具包进行主要建模和辅助建模。

Python 脚本建模:即可以在Blender 中使用Python脚本进行脚本的建立和控制,在Blender 中的Python控制台中输入bpy.ops.mesh.primitive_cube_add(),可在Blender 中的3D 视图中间看到一个立方体。在bpy.ops.mesh.primitive_cube_add()函数中有许多函数参数location 可以控制立方体的三维坐标位置,参数rotation可以控制立方体的旋转角度,参数radius 可以控制立方体的大小,其他参数可以进行具体查看。此为简单的创建一个立方体。可右键点击Blender 左上角中创建中的立方体→在线Python 参考来进行具体的查看,创建其他物体也可进行相似的操作。

5.2 FAST主索三维建模

索网的节点信息在Blender 中是三维空间的坐标点,已知两个三维空间坐标点的信息来建立索网的钢索,使得柱体的两端在正好坐落在两个坐标点上。需要计算的就是两点间的距离,以及柱体关于坐标轴的旋转角度。具体代码如下所示:

def vector_module_angleLR(vec1,vec2):

dx=(vec1[0]-vec2[0])

dy=(vec1[1]-vec2[1])

dz=(vec1[2]-vec2[2])

px=(vec1[0]+vec2[0])/2

py=(vec1[1]+vec2[1])/2

pz=(vec1[2]+vec2[2])/2

module=math.sqrt(dx*dx+dy*dy+dz*dz)

rx = 90/(180/ math.pi)+ math.atan(dz/ math.sqrt(dx *dx+dy*dy))

ry=0

if(dy!=0):

rz=math.atan(dx/dy)

else:

rz=math.pi/2

return module,px,py,pz,rx,ry,rz

vector_module_angleLR:函数名称;vec1:三维空间坐标点1,vec2:三维空间坐标点2,根据两个三维空间坐标点来计算两点间的距离并作为module 返回,rx,ry,rz 作为柱体的旋转角度成为返回值。px,py,pz 是两点间的中点坐标,即是柱体的中心位置坐标,根据这些信息可以建立一个位于两个三维坐标点的柱体。

调用函数后根据函数的返回信息进行索网钢结构的建立:

(module,px,py,pz,rx,ry,rz)= vector_module_angleLR(vec1,vec2)

bpy.ops.mesh.primitive_cylinder_add (vertices=Cylinder-Vertices,radius=clRadius,depth=module,location=(px,py,pz),rotation=(-rx,ry,-rz))

objName=AreaName+"SWLR-"+str(index1)+"->"+str(index2)

bpy.context.object.name=objName

建立长度为module、位置在(px,py,pz)、旋转角度为(-rx,ry,-rz)的圆柱,并同时根据需要给创建的柱体进行重命名,以objName 命名。

5.3 下拉索三维建模

下拉索上端与主索节点相互连接,下端与地面促动器相连以控制整个索网的形变。下拉索节点以vector 三维向量形式存储在xls 表格内,一个主索节点只与一个下拉索节点相对应。只需使用Python 的xlrd 工具包读取数据后与主索网节点的位置能够相互对应即可。A_MainCablePointX、A_MainCablePointY、A_Main-CablePointZ、分别表示主索网的(x,y,z)三维坐标位置,各自以Python 的list 列表形式存储。A_BoomVang-PointX、A_BoomVangPointY、A_BoomVangPointZ 也以同样的方式存储下拉索节点的三维坐标位置。核心代码如下:

vec1=[A_MainCablePointX[i], A_MainCablePointY[i],A_MainCablePointZ[i]]

vec3 = [A_BoomVangPointX[i],A_BoomVangPointY[i],A_BoomVangPointZ[i]]

(module,px,py,pz,rx,ry,rz)= vector_module_angleLR(vec1,vec3)

bpy.ops.mesh.primitive_cylinder_add (vertices=Cylinder-Vertices,radius=CylinderRadius,depth=module,location=(px,py,pz),rotation=(-rx,ry,-rz))

objName=AreaName+"SWBV-"+str(i)+str(j)

bpy.context.object.name=objName

建立长度为module、位置在(px,py,pz)、旋转角度为(-rx,ry,-rz)的柱体,并同时根据需要给创建的物体进行重命名,名字为objName。

无论是主索钢结构模型的命名,还是下拉索钢结构模型的命名,都十分重要,一定要命名规范,而且能够使人容易明白。

6 结语

微软出于对自身专利的保护拒绝向我国公布源码进行审核,而不审核源码就不能够知道微软是否留有后门等操作,特别是“棱镜”事件之后,我国需要大力发展国产操作系统,从而保障我国信息安全。通过在国产操作系统上进行环境搭建,可有效的保证我国信息安全自主可控。

FAST 索网结构复杂,手工建模已经不能满足需求。通过这次使用Python-API 进行构建FAST 模型,极大提高了建模的效率与精准度,实现数据到模型的转化,为后来模型的修改与改进也做好的铺垫,大大加快了FAST 整体模型构建的进度,同时有利于索网与其他模型的整合。

综合以上因素,在国产建模平台下进行FAST 索网脚本构建,是一项不错的选择。

猜你喜欢

钢索拉索表格
斜拉索磁致负刚度阻尼器与黏滞阻尼器减振对比研究
中小跨径斜拉桥拉索监测方案研究
驻车拉索固定支架断裂的故障改进研究
《现代临床医学》来稿表格要求
组成语
命运在你自己的手中
走钢索
履历表格这样填
表格图的妙用
“拉索”——丽江的声音