999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

利用國產建模平臺自動創建FAST 索網數字化模型

2019-11-22 08:22:48趙正旭趙士偉王威張慶海姜鵬郭峰
現代計算機 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 索網腳本構建,是一項不錯的選擇。

猜你喜歡
信息模型
一半模型
重要模型『一線三等角』
重尾非線性自回歸模型自加權M-估計的漸近分布
訂閱信息
中華手工(2017年2期)2017-06-06 23:00:31
3D打印中的模型分割與打包
FLUKA幾何模型到CAD幾何模型轉換方法初步研究
展會信息
中外會展(2014年4期)2014-11-27 07:46:46
一個相似模型的應用
信息
建筑創作(2001年3期)2001-08-22 18:48:14
健康信息
祝您健康(1987年3期)1987-12-30 09:52:32
主站蜘蛛池模板: 国产精品久久自在自2021| 久久久亚洲色| 五月婷婷激情四射| 91视频99| 国产精品专区第1页| 国产亚洲欧美日韩在线观看一区二区| 国产精品无码AV片在线观看播放| 不卡色老大久久综合网| 亚洲一区无码在线| 久久精品中文字幕免费| 国产精品手机在线播放| 美女内射视频WWW网站午夜| 国产精品成人观看视频国产 | 亚洲成人播放| 天天综合天天综合| 欧美日韩在线观看一区二区三区| 91免费国产高清观看| 99精品福利视频| 人妻21p大胆| 久久人搡人人玩人妻精品| 国产永久无码观看在线| 久青草网站| 国产男女免费视频| 91成人免费观看| 三上悠亚一区二区| 国产www网站| 自慰网址在线观看| 亚洲人成网站观看在线观看| 国产专区综合另类日韩一区| 99视频精品在线观看| 精品国产成人三级在线观看| 成年女人18毛片毛片免费| 亚洲第一视频免费在线| 久久99精品久久久久久不卡| 亚洲av无码片一区二区三区| 国产手机在线小视频免费观看| 国产区免费精品视频| 欧美国产中文| 91精品aⅴ无码中文字字幕蜜桃| AV无码一区二区三区四区| 国产精品亚欧美一区二区三区| 欧美视频在线观看第一页| 国产精品毛片一区| 亚洲天天更新| 色呦呦手机在线精品| 日韩视频免费| 日日拍夜夜嗷嗷叫国产| 欧美激情伊人| 久久久久国产精品嫩草影院| 久久性妇女精品免费| 精品一区二区三区自慰喷水| 亚国产欧美在线人成| a在线观看免费| 黄色网站不卡无码| 亚洲第一天堂无码专区| 国产主播一区二区三区| 成人日韩精品| 国产系列在线| 免费毛片视频| 乱人伦中文视频在线观看免费| 宅男噜噜噜66国产在线观看| 亚洲一区第一页| 欧美不卡视频一区发布| 国产69精品久久久久孕妇大杂乱| 国产网站免费看| 亚洲无码日韩一区| 人妻丝袜无码视频| 精品少妇三级亚洲| 狠狠色丁香婷婷综合| 久久婷婷五月综合97色| 91精品国产麻豆国产自产在线| 高清大学生毛片一级| 久久精品波多野结衣| 国产成人免费观看在线视频| 国产高潮视频在线观看| 国产拍在线| 国产特级毛片aaaaaa| 欧美人人干| 国产在线精品网址你懂的| 免费人成黄页在线观看国产| 亚洲精品爱草草视频在线| www.狠狠|