趙正旭,趙士偉,王威,張慶海,姜鵬,郭峰
(1.青島理工大學(xué),青島266520;2.石家莊鐵道大學(xué)復(fù)雜網(wǎng)絡(luò)與可視化研究所,石家莊050043;3.中國科學(xué)院國家天文臺,北京100012)
位于貴州的500 米口徑球面射電望遠(yuǎn)鏡(Fivehundred- meter Aperture Spherical Telescope),簡 稱FAST,是人類發(fā)現(xiàn)脈沖星的“眼睛”。FAST 結(jié)構(gòu)復(fù)雜多樣,其中索網(wǎng)結(jié)構(gòu)信息量十分巨大,如此巨大的FAST 索網(wǎng)模型若使用手工實施索網(wǎng)建模工作,不僅工作量巨大,且建模精度會由于人為原因而有所欠缺,且對后續(xù)模型修改和編輯帶來極大的不便,同時在與圈梁等其他部分拼接的時候也會帶來不便。本文在國產(chǎn)操作系統(tǒng)中標(biāo)麒麟7.0 上基于開源的建模軟件Blender-2.79b,使用Blender 的內(nèi)置Python API 進行腳本數(shù)據(jù)建模,既可以大大簡化建模的工作量,同時提高了建模精準(zhǔn)度,為模型后續(xù)修改也提供了極大的便利。
我國大部分用戶對操作系統(tǒng)的選擇是Windows 操作系統(tǒng),Windows 操作系統(tǒng)對隱私信息的保護存在一定的弊端,為了實現(xiàn)我國信息安全自主可控,很有必要
發(fā)展國產(chǎn)操作系統(tǒng),在國產(chǎn)操作系統(tǒng)上進行國家重大科研項目和相關(guān)項目的開發(fā),能夠?qū)ξ覈男畔踩兴U蟍6]。FAST 索網(wǎng)模型的建立基于國產(chǎn)操作系統(tǒng)中標(biāo)麒麟7.0 桌面平臺,其操作系統(tǒng)平臺完全實現(xiàn)了我國信息的安全自主可控。中標(biāo)麒麟操作系統(tǒng)使用Linux 內(nèi)核,中標(biāo)麒麟桌面操作系統(tǒng)是一款面向桌面應(yīng)用的圖形化桌面操作系統(tǒng),針對x86 及龍芯、申威、眾志、飛騰等國產(chǎn)CPU 平臺進行自主開發(fā),率先實現(xiàn)了對x86 及國產(chǎn)CPU 平臺的支持,提供性能最優(yōu)的操作系統(tǒng)產(chǎn)品。通過進一步對硬件外設(shè)的適配支持、對桌面應(yīng)用的移植優(yōu)化和對應(yīng)用場景解決方案的構(gòu)建,完全滿足項目支撐,應(yīng)用開發(fā)和系統(tǒng)定制的需求。
3D Max 建模軟件適用于Windows 操作系統(tǒng),而基于中標(biāo)麒麟操作系統(tǒng)的建模,Blender 是一個很好的選擇。Blender 的開源性、免費性受到廣大用戶的支持,其功能的強大更是受到商業(yè)、企業(yè)的青睞。Blender 的開源性就意味著用戶可以參與開發(fā),其版本更新迭代相對較快,對于有特殊需求的公司完全可以根據(jù)自己的需求進行二次開發(fā)。同時Blender 可以完美地進行跨平臺使用,無論實在Windows、Mac 還是基于Linux內(nèi)核的開源系統(tǒng),都可以完美的使用。
Blender 的各項功能堪比3D Max,它具有建模、渲染、制作動畫、后期處理、跨平臺交互制作等功能。Blender 具有API 支持,其中Python API 的使用最為廣泛,也最為成熟??梢酝ㄟ^Python 代碼的編寫來實現(xiàn)模型的創(chuàng)建、模型的貼圖、渲染等,還能仿真粒子、碰撞、力等較為抽象的效果??梢哉fBlender 完全滿足在索網(wǎng)建模在中標(biāo)麒麟7.0 操作系統(tǒng)上建模需求。
當(dāng)需要對一個系統(tǒng)進行仿真研究時,首先需要對其進行數(shù)學(xué)模型的建立,采用相應(yīng)的算法并編寫仿真程序來把數(shù)學(xué)模型轉(zhuǎn)化為仿真模型。程序是人與計算機進行交流的媒介,通過程序的編寫來對計算機軟件中的功能進行控制與管理,從而達到設(shè)定的目標(biāo)。對索網(wǎng)進行模型的創(chuàng)建,就是用編程來實現(xiàn)模型的創(chuàng)建、模型位置與大小的確定,管理簡便,易于修改,采用的編程語言為Python 語言。
首先,Python 是一種面向?qū)ο?、解釋性的計算機程序設(shè)計語言,也是一種功能強大且完善的編程語言。Python 簡潔而清晰的語法,使其受到廣泛的應(yīng)用,Python 可用簡短的編程語句來實現(xiàn)復(fù)雜的任務(wù),其適用于眾多操作系統(tǒng)[7]。Python 易于實現(xiàn)模型的創(chuàng)建、動畫的制作、系統(tǒng)的模擬等,能很好地與C/C++等語言互相兼容,它幾乎囊括了所有語言的高級特性,而且可以被自動生成。
最為主要的是,Blender 是一款開源軟件,其內(nèi)部提供的API 為Python 編程的運行提供了支持,可利用Python 編程語言來實現(xiàn)各項功能。此外,Python 內(nèi)部包含著諸多已完成的軟件包、Python 庫,在使用的時候可以直接調(diào)用,為使用者提供了很大的便利。本文應(yīng)用到了bpy、math、xlrd、xlwt 等包就是平Python 針對各個不同的方向所開發(fā)的軟件包,它們能夠在Blender 中兼容運行。
三維模型作為點和其他信息數(shù)據(jù)的集合,可以由手工進行建立:利用一些基本的集合元素(如立方體、球體、圓柱等),通過一些列集合運算(平移、旋轉(zhuǎn)、拉伸以及布爾運算)來構(gòu)建復(fù)雜的幾何場景。然而Blender支持Python 腳本建模,秉承“模型即是數(shù)據(jù),數(shù)據(jù)即是模型”的宗旨,可以分析FAST 索網(wǎng)結(jié)構(gòu)、提取FAST 索網(wǎng)節(jié)點數(shù)據(jù)進項腳本三維建模,從而提高效率,加快進度,使得建模和數(shù)據(jù)有效地結(jié)合起來。
索網(wǎng)結(jié)構(gòu)包括主索網(wǎng)結(jié)構(gòu)和下拉索結(jié)構(gòu),主索網(wǎng)結(jié)構(gòu)為三角形網(wǎng)格形狀,除邊界節(jié)點外,每個主索網(wǎng)節(jié)點連接著6 根主索以及1 根下拉索,其中一共有2225個主索節(jié)點、6670 根主索和2225 根下拉索。主索網(wǎng)結(jié)構(gòu)固定在周圈環(huán)梁結(jié)構(gòu)上,2225 下拉索的下端與促動器相連接[8]。主索滿足五分之一旋轉(zhuǎn)對稱,下拉索根據(jù)地勢調(diào)整其拉索長度[9]。平面圖如圖1 所示,側(cè)面圖如圖2 所示,索網(wǎng)節(jié)點關(guān)系圖如圖3 所示。A 到E 區(qū)的主索節(jié)點采用“各區(qū)域字母+幾點位置標(biāo)號”的方式編制,如:A001:表示A 區(qū)1 號節(jié)點。
圖1 索網(wǎng)平面圖
圖2 主索網(wǎng)側(cè)面圖
圖3 索網(wǎng)節(jié)點關(guān)系圖
FAST 索網(wǎng)主索節(jié)點位置關(guān)于原點五分之一對稱,下拉索根據(jù)主索和地勢確定其相應(yīng)的長度,每個下拉索由主索和一個地錨點所確定。所以數(shù)據(jù)有主索節(jié)點信息和下拉索節(jié)點信息。使用OCR 工具將索網(wǎng)節(jié)點的PDF 信息轉(zhuǎn)化成Excel 表格,然后使用Blender 讀取表格中的索網(wǎng)數(shù)據(jù)信息進行模型的建立。
FAST 索網(wǎng)節(jié)點信息是由PDF 格式存儲的,由于數(shù)據(jù)信息十分巨大,手工輸入不僅效率低下,還容易出現(xiàn)差錯??赏ㄟ^OCR 軟件提取索網(wǎng)節(jié)點信息。OCR識別PDF 會有所誤差,可以通過編寫相對應(yīng)的Python腳本進行數(shù)據(jù)的校準(zhǔn)檢驗:將OCR 軟件提取出來的String 類型數(shù)據(jù)在Excel 中使用VALUE()函數(shù)進行String 與Float 的轉(zhuǎn)化,再使用Blender 中的Python API將這些點具現(xiàn)化。具體方法就是在這些三維坐標(biāo)點上繪制相應(yīng)大小經(jīng)緯球,以位置編號對小球名稱進行編號。若某個編號的小球沒有在相應(yīng)的位置上,則人工進行修改,直至所有經(jīng)緯球能按照預(yù)期的主索結(jié)構(gòu)排列,即大致成半球形排列。
Blender 自帶Python 環(huán)境,但是自帶的Python 環(huán)境不能滿足我們的需求,需要對Blender 自帶的Python進行一定的修改。
索網(wǎng)各個點的坐標(biāo)經(jīng)過讀取和修正之后將數(shù)據(jù)放到Excel 表格之中,使用xls 實現(xiàn)數(shù)據(jù)的存儲與讀取。然而Blender 自帶的Python 是沒有讀取xls 文件的工具包的,需要自行搭建。中標(biāo)麒麟下使用的是版本Blender 2.79b,首先查看當(dāng)前版本的Blender 使用Python 的版本信息,如圖4 所示,當(dāng)前版本信息是Python 3.5.3。
打開Blender 的Python 控制臺,輸入import xlrd 會顯示錯誤,所以需要對庫進行安裝。本文用到的庫主要是xlrd,即對xls 文件讀取的Python 標(biāo)準(zhǔn)庫。Blender下的Python 標(biāo)準(zhǔn)庫的安裝不同于普通Python 的安裝,需要將安裝好的xlrd 庫進行移植的Blender 下的Python 下。
首先需要打開中標(biāo)麒麟7.0 命令提示符界面,使用“python3——version”來查看當(dāng)前使用的Python3 的版本號,因為Python3 的向下兼容性,盡量使當(dāng)前Python3的版本低于等于Blender 中Python3 中的版本號。在命令提示符中使用pip3 install xlrd 命令安裝xlrd 工具包,需要找到xlrd 工具包的安裝路徑,其默認(rèn)安裝位置是“/lib/python3.4/site-package”中,找到xlrd 與xlrd-1.00-dist-info 文件夾,直接移動到Blender 下的Python文件夾中對應(yīng)的site-package 文件夾中。本文中所使用的site-package 文件夾所在的位置是/home/username/blender- 2.79b- linux- glibc219x86_64/python/lib/python3.5/sitepackages。然后重啟Blender,再在Blender 的Python 控制臺下輸入import xlrd 即可,沒有返回信息即表示移植成功能夠使用。
圖4 查看Python版本和導(dǎo)入xlrd包
完成以上配置后,接下來將整理好的數(shù)據(jù)存取到xls 文件中,并調(diào)好相應(yīng)的格式,以便將來數(shù)據(jù)的修改與讀取。
xlrd 是Python3 的一個工具包,用來讀取表格信息,我們所用到的索網(wǎng)主節(jié)點信息以表格形式存儲在表格中,所以需要使用Python 工具包來讀取出來。
url="../data/R131.xls"
#讀取xls 表的數(shù)據(jù)
#讀取A 區(qū)的數(shù)據(jù)
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)
#獲取去表格對象的第三列
由于各個列的數(shù)據(jù)個數(shù)可能不盡相同,而xlrd 包讀取表格整列的時候是按照整個表格數(shù)據(jù)的最長列數(shù)讀取的,若其他的列沒有達到最大列數(shù),多余的空值會填空值,所以需要對讀取到的數(shù)據(jù)進行去空操作。
Acol1=[i for i in Acol1 if i !='']
#對list 類型的Acol1 去空操作。
由兩個節(jié)點位置可以確定索網(wǎng)之間的鋼索,所以是否確定索網(wǎng)節(jié)點之間的關(guān)系尤為重要,索網(wǎng)節(jié)點關(guān)系如圖5 所示。在確定好節(jié)點關(guān)系后,可以使用Blender 中Python 中vector_module_angleLR 函數(shù)確定鋼索位置、旋轉(zhuǎn)角度、長度等信息。再使用getCS_Square 函數(shù)確定鋼索的公稱截面面積,至此為止鋼索的所有信息都已確定完畢,可以使用Blender 中Python 腳本bpy.ops.mesh.primitive_cylinder_add()來創(chuàng)建鋼索。
難點在與鋼索節(jié)點關(guān)系之間的對應(yīng)關(guān)系,如圖5所示,1→2,3;2→4,5;4→7,8,等等。本文采用的是Python 的動態(tài)變量命名方法來創(chuàng)建多個list 類型的數(shù)組來存儲節(jié)點關(guān)系。由alist 表示1,3,6,10,15,21……這條初始序列(由1 從左下到右上的序列),list1表示由1 為list1[0]的1,2,4,7,11……這條序列,list2表示由3 為list1[0]的……這條序列,依次下去進行節(jié)點的表示。節(jié)點連接關(guān)系就是list[i]與list[i+1]和list[i+1]+1 兩個節(jié)點有連接關(guān)系。以上是呈V 字型聯(lián)系的索網(wǎng)。橫向相連的索網(wǎng)建立一個新list 列表。關(guān)系為list[i]與list[i+1]有關(guān)系,當(dāng)?shù)竭_最右端是即節(jié)點編號等于alist[j],跳過這層最終節(jié)點的建立即可。
圖5 索網(wǎng)節(jié)點對應(yīng)關(guān)系圖
以下為動態(tài)為變量命名建立節(jié)點:
names=locals()
#動態(tài)為變量命名
for i in range(1,nd):
#為list 動態(tài)命名變量
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):
#為由右下到左上的鋼索節(jié)點names.get("list"+str(i)).append(names.get("list"+str(i))[j-1]+i+j-1)
在FAST 索網(wǎng)結(jié)構(gòu)中,每個鋼索類型的具體粗細(xì)是不確定的,由規(guī)格名稱來確定公稱截面面積(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
參數(shù)cType:string 類型,用來傳入需要判斷的拉索規(guī)格。
參數(shù)listType:list 類型拉索規(guī)格名稱。
參數(shù)listCS_Square:list 類型,根據(jù)listType 來對應(yīng)判斷拉索的公稱截面面積。
在Blender 中寫較長代碼時可以使用Blender 的文本編輯器進行編寫,由于Blender 下的Python 調(diào)試器無法顯示具體的錯誤,所以調(diào)試的時候需要使用中標(biāo)麒麟下的Python3 進行調(diào)試,從而修改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()函數(shù)中有許多函數(shù)參數(shù)location 可以控制立方體的三維坐標(biāo)位置,參數(shù)rotation可以控制立方體的旋轉(zhuǎn)角度,參數(shù)radius 可以控制立方體的大小,其他參數(shù)可以進行具體查看。此為簡單的創(chuàng)建一個立方體??捎益I點擊Blender 左上角中創(chuàng)建中的立方體→在線Python 參考來進行具體的查看,創(chuàng)建其他物體也可進行相似的操作。
索網(wǎng)的節(jié)點信息在Blender 中是三維空間的坐標(biāo)點,已知兩個三維空間坐標(biāo)點的信息來建立索網(wǎng)的鋼索,使得柱體的兩端在正好坐落在兩個坐標(biāo)點上。需要計算的就是兩點間的距離,以及柱體關(guān)于坐標(biāo)軸的旋轉(zhuǎn)角度。具體代碼如下所示:
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:函數(shù)名稱;vec1:三維空間坐標(biāo)點1,vec2:三維空間坐標(biāo)點2,根據(jù)兩個三維空間坐標(biāo)點來計算兩點間的距離并作為module 返回,rx,ry,rz 作為柱體的旋轉(zhuǎn)角度成為返回值。px,py,pz 是兩點間的中點坐標(biāo),即是柱體的中心位置坐標(biāo),根據(jù)這些信息可以建立一個位于兩個三維坐標(biāo)點的柱體。
調(diào)用函數(shù)后根據(jù)函數(shù)的返回信息進行索網(wǎng)鋼結(jié)構(gòu)的建立:
(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)、旋轉(zhuǎn)角度為(-rx,ry,-rz)的圓柱,并同時根據(jù)需要給創(chuàng)建的柱體進行重命名,以objName 命名。
下拉索上端與主索節(jié)點相互連接,下端與地面促動器相連以控制整個索網(wǎng)的形變。下拉索節(jié)點以vector 三維向量形式存儲在xls 表格內(nèi),一個主索節(jié)點只與一個下拉索節(jié)點相對應(yīng)。只需使用Python 的xlrd 工具包讀取數(shù)據(jù)后與主索網(wǎng)節(jié)點的位置能夠相互對應(yīng)即可。A_MainCablePointX、A_MainCablePointY、A_Main-CablePointZ、分別表示主索網(wǎng)的(x,y,z)三維坐標(biāo)位置,各自以Python 的list 列表形式存儲。A_BoomVang-PointX、A_BoomVangPointY、A_BoomVangPointZ 也以同樣的方式存儲下拉索節(jié)點的三維坐標(biāo)位置。核心代碼如下:
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)、旋轉(zhuǎn)角度為(-rx,ry,-rz)的柱體,并同時根據(jù)需要給創(chuàng)建的物體進行重命名,名字為objName。
無論是主索鋼結(jié)構(gòu)模型的命名,還是下拉索鋼結(jié)構(gòu)模型的命名,都十分重要,一定要命名規(guī)范,而且能夠使人容易明白。
微軟出于對自身專利的保護拒絕向我國公布源碼進行審核,而不審核源碼就不能夠知道微軟是否留有后門等操作,特別是“棱鏡”事件之后,我國需要大力發(fā)展國產(chǎn)操作系統(tǒng),從而保障我國信息安全。通過在國產(chǎn)操作系統(tǒng)上進行環(huán)境搭建,可有效的保證我國信息安全自主可控。
FAST 索網(wǎng)結(jié)構(gòu)復(fù)雜,手工建模已經(jīng)不能滿足需求。通過這次使用Python-API 進行構(gòu)建FAST 模型,極大提高了建模的效率與精準(zhǔn)度,實現(xiàn)數(shù)據(jù)到模型的轉(zhuǎn)化,為后來模型的修改與改進也做好的鋪墊,大大加快了FAST 整體模型構(gòu)建的進度,同時有利于索網(wǎng)與其他模型的整合。
綜合以上因素,在國產(chǎn)建模平臺下進行FAST 索網(wǎng)腳本構(gòu)建,是一項不錯的選擇。