機(jī)器人可視化仿真系統(tǒng)的建立PPT學(xué)習(xí)教案_第1頁
機(jī)器人可視化仿真系統(tǒng)的建立PPT學(xué)習(xí)教案_第2頁
機(jī)器人可視化仿真系統(tǒng)的建立PPT學(xué)習(xí)教案_第3頁
機(jī)器人可視化仿真系統(tǒng)的建立PPT學(xué)習(xí)教案_第4頁
機(jī)器人可視化仿真系統(tǒng)的建立PPT學(xué)習(xí)教案_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、會(huì)計(jì)學(xué)1 機(jī)器人可視化仿真系統(tǒng)的建立機(jī)器人可視化仿真系統(tǒng)的建立 第1頁/共79頁 隨著機(jī)器人研究的不斷深入和機(jī)器人領(lǐng)域的不斷 發(fā)展,機(jī)器人仿真系統(tǒng)作為機(jī)器人設(shè)計(jì)和研究的工具, 發(fā)揮著越來越重要的作用,而機(jī)器人形態(tài)建模技術(shù)正是 機(jī)器人仿真系統(tǒng)的核心技術(shù)之一。 機(jī)器人的運(yùn)動(dòng)是由關(guān)節(jié)的運(yùn)動(dòng)引起的,而關(guān)節(jié)的 位置是由連桿的長度和排列方式?jīng)Q定的,與連桿的具體 形狀并無關(guān)系。因此,我們?cè)谘芯繖C(jī)器人的運(yùn)動(dòng)機(jī)理時(shí) ,可以對(duì)機(jī)器人進(jìn)行某種抽象,將連桿抽象為一條直線 ,而將關(guān)節(jié)抽象為一點(diǎn)。但是,為了真實(shí)地仿真機(jī)器人 的動(dòng)作,在進(jìn)行三維圖形顯示時(shí)又必須使每個(gè)桿件盡可 能與實(shí)物完全一致,這樣才能達(dá)到仿真的目的,這一過

2、 程稱為機(jī)器人的形態(tài)建模。 第2頁/共79頁 現(xiàn)在比較常用的機(jī)器人形態(tài)建模技術(shù)有以下三種: 商用圖形軟件包,如AutoCAD、UGII、Solidwork等。 VRML(Virtual Reality Modeling Language)語言。 OpenGL、DirectX等圖形開發(fā)接口。 OpenGL是Silicon Graphics公司在工作站上三維圖形 規(guī)范的微機(jī)板,是一個(gè)與硬件無關(guān)的圖形軟件接口。 OpenGL提供了基本的三維圖形功能:由點(diǎn)線和多邊形產(chǎn)生 復(fù)雜三維實(shí)體;三維圖形變換;著色,材質(zhì),紋理,光照, 陰影等真實(shí)感處理手段等,完全滿足可視化仿真形態(tài)模型的 要求。 第3頁/共79頁

3、 仿真是利用數(shù)學(xué)模型在計(jì)算機(jī)上對(duì)系統(tǒng)進(jìn)行實(shí)驗(yàn)研究的過程???視化仿真則是數(shù)學(xué)模擬和科學(xué)計(jì)算可視化技術(shù)相結(jié)合的產(chǎn)物,它 一般包括兩方面內(nèi)容:一是將傳統(tǒng)數(shù)字仿真計(jì)算的結(jié)果轉(zhuǎn)換為圖 形和圖像形式;二是仿真交互界面可視化,即具有可視交互和動(dòng) 畫展示能力,要求能夠?qū)崟r(shí)跟蹤顯示仿真計(jì)算結(jié)果。 如圖1所示為可視化仿真系統(tǒng)結(jié)構(gòu)。其中數(shù)學(xué)模型著重反映系 統(tǒng)的特征規(guī)律,而形態(tài)模型著重反映系統(tǒng)的物理構(gòu)成,它們構(gòu)成 了可視化仿真的基礎(chǔ)。 圖1 可視化仿真系統(tǒng)的結(jié)構(gòu) 第4頁/共79頁 可視化仿真軟件的核心是數(shù)字模擬,同時(shí)又要具備可視化交互和可視化過程展現(xiàn)的特征,還須有實(shí)時(shí)性的特點(diǎn)。據(jù)此,規(guī)劃如圖2所示軟件功能結(jié)構(gòu)。 圖

4、2 可視化仿真軟件結(jié)構(gòu)框圖 圖中各模塊具有較強(qiáng)的獨(dú)立性,相互之間又以數(shù)據(jù)信息進(jìn)行連接。對(duì)于一個(gè)確定的系統(tǒng)而言,形態(tài)模型中除屬性部分不確定外,是相對(duì)穩(wěn)定的;而數(shù)學(xué)模型的變化也僅僅是激勵(lì)參數(shù)的改變,因此在模型交互部分將支持參數(shù)的交互編輯;數(shù)字模擬是針對(duì)系統(tǒng)數(shù)學(xué)模型的數(shù)值求解過程,應(yīng)盡量使用現(xiàn)有的成熟算法或成熟軟件,確保結(jié)果的可靠性;圖形仿真部分一般包括以三維圖形表現(xiàn)的系統(tǒng)過程和以二維曲線形式表現(xiàn)的系統(tǒng)性能,它們是可視化仿真的重要特征。 第5頁/共79頁 一機(jī)器人的位置與姿態(tài)的描述一機(jī)器人的位置與姿態(tài)的描述 用固聯(lián)在機(jī)器人末端執(zhí)行器上的坐標(biāo)系原點(diǎn)在基礎(chǔ)坐標(biāo)中的位置來代表機(jī)器人末端的位置,用這個(gè)坐標(biāo)系

5、在基礎(chǔ)坐標(biāo)系下的投影(即方向余弦)來表示機(jī)器人末端的姿態(tài)?;A(chǔ)坐標(biāo)系通常固聯(lián)在機(jī)器人的基礎(chǔ)上。 通常,采用一個(gè)矩陣T來表示機(jī)器人末端的位置與姿態(tài)。 xyz ppp p 0001 xxxx yyyy e zzzz noap noap T noap 其中 是機(jī)器人末端的三個(gè)互相垂直的單位矢量,它們描述了機(jī)器人末端的姿態(tài)。 是機(jī)器人末端的位置矢量。 第6頁/共79頁 二、機(jī)器人坐標(biāo)系的建立二、機(jī)器人坐標(biāo)系的建立 1)劃分機(jī)器人模塊,建立機(jī)器人各關(guān)節(jié)的坐標(biāo)系 創(chuàng)建的坐標(biāo)系為正交的笛卡爾系,創(chuàng)建的基本過程是 先給機(jī)器人各關(guān)節(jié)、桿件(基座為桿件0)編號(hào),一般以關(guān) 節(jié)轉(zhuǎn)軸為Z軸,基座關(guān)節(jié)處的X軸方向可以任取

6、,其他關(guān)節(jié) 則以相鄰兩關(guān)節(jié)轉(zhuǎn)軸的公垂線方向(離開前一關(guān)節(jié))為X軸 ,Y軸與Z軸和X軸構(gòu)成右手系。建立了坐標(biāo)系即可以清晰 的描述各桿件之間的關(guān)系,從而可以進(jìn)一步求解關(guān)節(jié)變量 。 第7頁/共79頁 2)計(jì)算出各關(guān)節(jié)的)計(jì)算出各關(guān)節(jié)的DH參數(shù),確定關(guān)節(jié)變量參數(shù),確定關(guān)節(jié)變量 所謂D-H(Denevie-Hartenberg)參數(shù)最初是在解決由關(guān)節(jié)變 量定手部位姿的機(jī)器人運(yùn)動(dòng)學(xué)正問題提出來的,它包括4個(gè) 基本參數(shù),如下圖所示。 1iiii aZZX 從 到沿測量的距離(桿件長度) 1iiii ZZX 從 到沿旋轉(zhuǎn)的角度(扭轉(zhuǎn)角) 1iiii dXXZ 從到沿 測量的距離(橫距) (移動(dòng)關(guān)節(jié)的關(guān)節(jié)變量)

7、 1iiii XXZ 從到沿 旋轉(zhuǎn)的角度(關(guān)節(jié)角) (旋轉(zhuǎn)關(guān)節(jié)的關(guān)節(jié)變量) 11 1 2 4. ii i ii ii X X Z Zd i-1 i i-1 坐標(biāo)系i相對(duì)于坐標(biāo)系i-1的變換T 1) 繞軸轉(zhuǎn)角; )沿軸移動(dòng)a ; 3) 繞 軸轉(zhuǎn) 角; )沿 軸移動(dòng) 圖8 連桿坐標(biāo)系 第8頁/共79頁 3)求解各關(guān)節(jié)坐標(biāo)系之間的齊次變換矩陣 前面的變換是相對(duì)于動(dòng)坐標(biāo)系描述的,按照“從左 到右”的原則,我們得到: 1 11 (,)(,)( ,)( ,) i iiiii TRot XTrans X aRot ZTrans Z d 相鄰連桿變換矩陣的一般表達(dá)式為: 1 11111 1111 cos( )

8、sin( )0 sin( )cos()cos( )cos()sin()sin() sin( )sin()cos( )sin()cos()cos() 0001 iii iiiiiiii i iiiiiii d T d (根據(jù)熊有倫的機(jī)器人學(xué)) 第9頁/共79頁 9自由度機(jī)器人的運(yùn)動(dòng)學(xué)建模與DH參數(shù)建立 9自由度機(jī)器人DH參數(shù)表 X0X1 Z2 X3 Z7 Z9 Z4 X4 Z5 Z6 X2 X5 X7 X8 165 220 200 180 135 160 140 185 2 3 4 5 6 7 8 9 Z0Z1 X6 Z8 X9 1 d Z3 圖10 9自由度機(jī)器人DH坐標(biāo)系 第10頁/共79頁

9、 現(xiàn)實(shí)世界的三維物體需要在計(jì)算機(jī)中以二維平面的形 式來表現(xiàn)。這在OpenGL中是通過一系列的變換來完成的 。這些變換包括取景變換、幾何變換、投影變換、剪切變 換、視口變換等。在算法上,它們是通過矩陣操作來實(shí)現(xiàn) 的。OpenGL的變換關(guān)系在機(jī)器人的仿真系統(tǒng)中是非常重 要的,其中的幾何變換正是我們用來建立機(jī)器人關(guān)節(jié)運(yùn)動(dòng) 坐標(biāo)系的基礎(chǔ)。用OpenGL中的幾何變換命令可以方便的 按D-H法建立起機(jī)器人的坐標(biāo)系。 第11頁/共79頁 4.1 幾何變換 幾何變換是建立模型的基礎(chǔ),通過它我們才能把模型的 各個(gè)部分畫在正確的位置并對(duì)模型進(jìn)行位置與姿態(tài)的控制 ?;镜膸缀巫儞Q有平移、旋轉(zhuǎn)和縮放。 1.平移變換

10、OpenGL中的平移變換命令為glTranslatef(x,y,z), 其對(duì)應(yīng) 的變換矩陣為 1000 100 010 001 z y x T 1000 100 010 001 1 z y x T 相應(yīng)的逆陣可以由glTranslatef(-x,-y,-z) 得出。 三維空間中物體的平移通過平移物體的各個(gè)點(diǎn) 來實(shí)現(xiàn)。對(duì)于由一組多邊形 面表示的物體,可將各表面 的頂點(diǎn)作平移,然后繪制更新后的位置。 第12頁/共79頁 2. 旋轉(zhuǎn)變換 OpenGL中的旋轉(zhuǎn)變換命令為glRotatef(,x,y,z), 它有4個(gè)參數(shù),第一個(gè)參數(shù)指定旋轉(zhuǎn)的度數(shù),后三個(gè)參數(shù)構(gòu)成一個(gè)向量,依次代表該向量的x、y、z分量。

11、物體繞該向量旋轉(zhuǎn)時(shí),遵循右手規(guī)則。其中比較簡單的情況是分別繞三個(gè)坐標(biāo)軸的旋轉(zhuǎn)。例如:繞x軸的旋轉(zhuǎn)表示為:glRotatef(,1,0,0), 其對(duì)應(yīng)的變換矩陣為: 1000 0 cos( )sin( ) 0 ( ) 0 sin( )cos( )0 0001 xR 1 1000 0cos( )sin( ) 0 ( ) 0sin( ) cos( ) 0 0001 xR 相應(yīng)的逆陣可以由glRotatef(-,1,0,0)得出。 第13頁/共79頁 繞y軸的旋轉(zhuǎn)表示為:glRotatef(,0,1,0)。 1000 0)cos(0)sin( 0010 0)sin(0)cos( )( Ry 1000

12、0)cos(0)sin( 0010 0)sin(0)cos( )( 1 Ry 相應(yīng)的逆陣可以由glRotatef(-,0,1,0)得出。 繞z軸的旋轉(zhuǎn)表示為:glRotatef(,0,0,1)。 1000 0100 00)cos()sin( 00)sin()cos( )( Rz 1000 0100 00)cos()sin( 00)sin()cos( )( 1 Rz 相應(yīng)的逆陣可以由glRotatef(-,0,0,1)得出。 第14頁/共79頁 3. 縮放變換 OpenGL中的縮放變換命令為glScalef(x,y,z), 其對(duì)應(yīng)的變換矩陣為 1000 000 000 000 z y x S 1

13、000 0 1 00 00 1 0 000 1 1 z y x S 相應(yīng)的逆陣可以由glScalef(1/x,1/y,1/z)得出。 縮放變換使得物體大小和相對(duì)于坐標(biāo)原點(diǎn)的位置發(fā)生變化,如果變換參數(shù)不同,則物體的相關(guān)尺寸也發(fā)生變化。我們可以用相同的縮放(x=y=z) 來保持物體的原有形狀。 第15頁/共79頁 4.2 取景變換 取景變換改變觀察點(diǎn)的位置和方向,包括平移和旋轉(zhuǎn)兩個(gè)操作。作取景變換有兩種方法: 第一種方法是用glTranslatef()和glRotatef()函數(shù)。缺省情況下,觀察點(diǎn)位于原點(diǎn),方向指向負(fù)z軸,這時(shí)如果將物體畫在原點(diǎn),在屏幕上是顯示不出物體的。因此需要經(jīng)過平移變換將觀

14、察點(diǎn)與物體分離開來,可以用glTranslatef()來實(shí)現(xiàn)。如果想觀察物體的不同側(cè)面,可以用glRotatef()來實(shí)現(xiàn)。 第二種方法是用gluLookAt()函數(shù)。通常,我們會(huì)在原點(diǎn)或其它一些方便的位置建立模型,然后從一個(gè)任意點(diǎn)觀察此模型,gluLookAt()正好能實(shí)現(xiàn)這個(gè)目的, 它的函數(shù)原形為: void gluLookAt(Gldouble eyex, GLdouble eyey, GLdouble eyez, Gldouble centerx, GLdoubleentery, Gldouble centerz, GLdouble upx, GLdouble upy, GLdoubl

15、e upz); 它有三組參數(shù)集合,分別定義視點(diǎn)的位置、瞄準(zhǔn)的參考點(diǎn)并標(biāo)識(shí)向上的方向。改變這三組參數(shù),我們就可以從不同的位置來觀察物體了。 第16頁/共79頁 4.3 投影變換 投影變換就是將三維物體變換為二維圖形,以便在平面上顯示。OpenGL提供了兩種投影方式:平行投影和透視投影。 透視投影沿匯聚路徑將點(diǎn)投影到顯示平面上。對(duì)同樣大小的物體來說,它會(huì)引起“近大遠(yuǎn)小” 的現(xiàn)象,也就是離視點(diǎn)近的物體顯示起來比離視點(diǎn)遠(yuǎn)的物體要大。在透視投影中,景物中的平行線投影后不再平行而是成了匯聚線。OpenGL中中的透視投影變換函數(shù)為: void gluPerspective(GLdouble fovy, GL

16、double aspect, GLdouble zNear, GLdouble zFar); 其中fovy為y方向上的視角,aspect為高度與寬度的比率,near和far分別為近剪切面和遠(yuǎn)剪切面離視點(diǎn)的距離,投影體積如圖4所示。 圖4 gluPerspective()投影示意圖 第17頁/共79頁 4.4 視窗變換 經(jīng)過投影變換,三維物體轉(zhuǎn)化為二維圖形。要把它顯示在顯示屏上,還需要進(jìn)行視窗變換。視窗就是一個(gè)用來繪制場景的矩形區(qū)域。視窗變換決定把場景中的點(diǎn)怎樣映射到繪圖區(qū)。OpenGL提供了一個(gè)定義視窗大小的函數(shù): void glViewport(GLint x, GLint y, GLsiz

17、ei width, GLsizei height ); 其中,x和y定義視窗左下角在窗口中的位置;width和height分別是視窗的寬度和高度,它們都以像素為單位。視窗的一個(gè)重要作用是當(dāng)應(yīng)用程序窗口大小變化時(shí),視窗能跟著作相應(yīng)變化,它還可以用來實(shí)現(xiàn)多窗口視圖。 這些變換過程對(duì)機(jī)器人形態(tài)模型的建立至關(guān)重要,只有徹底理解了這些變換過程,才能為機(jī)器人正確建立起形態(tài)模型。 第18頁/共79頁 5.1 基于基于OpenGL的形態(tài)模型建立的一般過程的形態(tài)模型建立的一般過程 三維圖形及動(dòng)畫場景的顯示,就是把所建立的三維空間模型,經(jīng)過計(jì)算機(jī)的復(fù)雜處理,最終在計(jì)算機(jī)二維屏幕上顯示的過程。設(shè)計(jì)三維圖形軟件要經(jīng)過

18、以下步驟: A圖元建立三維模型。 B設(shè)置觀看物體的窗口和觀看點(diǎn)(視點(diǎn))。 C設(shè)定各物體的屬性(如色彩、光照、紋理映射等) D如果要物體動(dòng)起來,還要進(jìn)行圖形變換(如幾何變換、取景變換等)。 E三維圖形的二維化(投影變換和視窗變換)。 建 立 三 維 模 型 設(shè) 置 窗 口 設(shè) 置 光 照 幾 何 變 換 二 維 化 屏 幕 顯 示 利用OpernGL的庫函數(shù), 我們按步驟實(shí)現(xiàn)三維圖形軟件的設(shè)計(jì)。 流程如下: 第19頁/共79頁 一、 建立三維模型建立三維模型 三維模型的生成是OpenGL形態(tài)建模的核心工作,在5.2節(jié)中有專門論述。 二設(shè)置窗口和視點(diǎn)二設(shè)置窗口和視點(diǎn) 1設(shè)置窗口 圖形顯示的區(qū)域稱為

19、窗口。在繪制新的圖形前,窗口可能已 經(jīng)存在 一些圖形 OpenGL存儲(chǔ)了這些圖形繪圖狀態(tài)的信息,所以必須清除當(dāng)前窗口的內(nèi)容,以免影 響繪圖的效果。流程順序?yàn)椋?定 義 窗 口 清 理 窗 口 繪 制 場 景 結(jié) 束 關(guān)鍵程序代碼為: 第20頁/共79頁 BOOL CPowerCubeView:PreCreateWindow(CREATESTRUCT return Cview:PreCreateWindow(cs); /定義窗口及設(shè)置風(fēng)格,此兩風(fēng)格是OpenGL作圖窗口必須具備的。 WS_CLIPCHILDREN僅對(duì)父窗體,在父窗體重繪時(shí)不對(duì)子窗體占有的區(qū)域進(jìn)行繪制。WS_CLIPSIBLING

20、S 僅對(duì)子窗體。在重繪時(shí)不對(duì)兄弟窗體占有的區(qū)域進(jìn)行繪制(在相互重疊時(shí))。 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); /設(shè)置窗口背景色。 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /清除窗口的顏色緩存和深度緩存。 第21頁/共79頁 2定義視點(diǎn) 為了能夠從各個(gè)角度觀察機(jī)器人的形態(tài),并實(shí)現(xiàn)縮放功能,我們需要綜合利用前面介紹的取景變換的兩種方法。 OpenGL中參考坐標(biāo)系的定義如圖5a所示, 機(jī)器人基礎(chǔ)坐標(biāo)系定義如圖5b 所示。這時(shí),需要將視點(diǎn)定義在正x軸進(jìn)行觀察,參考點(diǎn)定義在原點(diǎn),向上矢量方向?yàn)閦軸方向

21、,這樣就將圖2-5a的坐標(biāo)系變?yōu)閳D5b所示坐標(biāo)系。用 gluLookAt(m_zoom,0,0,0,0,0,0,0,1.0); 來實(shí)現(xiàn)。參數(shù)m_zoom實(shí)現(xiàn)模型的縮放功能,視點(diǎn)離模型越近,顯示的模型越大。 為了從不同角度觀察模型,需要將視點(diǎn)繞z軸或y軸旋轉(zhuǎn),用如下方式實(shí)現(xiàn): glRotated(m_yRotate, 0.0, 1.0, 0.0); glRotated(m_zRotate, 0.0, 0.0, 1.0); 其中m_yRotate和m_zRotate兩個(gè)參數(shù)分別控制視點(diǎn)繞y軸和z軸旋轉(zhuǎn)的角度。 圖5 坐標(biāo)系 第22頁/共79頁 m_zoom, m_yRotate, m_zRotat

22、e三個(gè)參數(shù)大小的改變是通過鼠標(biāo)器 來驅(qū)動(dòng)的。用鼠標(biāo)器的左鍵控制模型的觀察角度,右鍵控制模型的縮放 。當(dāng)鼠標(biāo)器左鍵按下時(shí),記錄當(dāng)時(shí)鼠標(biāo)器在屏幕上的位置,當(dāng)鼠標(biāo)器按 下并移動(dòng)時(shí),計(jì)算前面記錄點(diǎn)的坐標(biāo)與鼠標(biāo)器當(dāng)前點(diǎn)坐標(biāo)之差。以x坐標(biāo) 值的變化作為視點(diǎn)繞z軸轉(zhuǎn)動(dòng)的角度變化量,y坐標(biāo)值的變化作為視點(diǎn)繞y 軸轉(zhuǎn)動(dòng)的角度變化量, 從而達(dá)到對(duì)模型觀察角度的控制。用同樣的原理, 實(shí)現(xiàn)對(duì)模型縮放的控制。這些對(duì)視點(diǎn)的控制方法在模型運(yùn)動(dòng)時(shí)同樣起作 用。 為使模型總是處于窗口中心,需要將視點(diǎn)沿y軸或z軸移動(dòng),用如 下方式實(shí)現(xiàn): glTranslated(0.0,m_yMove,m_zMove); 其中m_yMove和m

23、_zMove兩個(gè)參數(shù)分別控制視點(diǎn)沿y軸和z軸移 動(dòng)的步長。 m_yMove和m_zMove兩個(gè)參數(shù)大小的改變是通過“坐標(biāo)顯隱”對(duì)話 框中的“步長” 編輯鍵輸入的。而它們對(duì)視點(diǎn)的控制是通過鍵盤( Left,Right,Up,Down鍵)實(shí)現(xiàn)的。 第23頁/共79頁 三動(dòng)畫三動(dòng)畫 三維動(dòng)畫,就是把空間物體通過各種三維圖形變換,把它投影到視口中。一般動(dòng)畫采用“畫-擦除-再畫”的方式,這樣會(huì)出現(xiàn)圖形間斷,產(chǎn)生閃爍現(xiàn)象。可以采用雙緩存技術(shù)來解決這個(gè)問題。正在顯示的圖形存在前緩存中,而將下一幅要顯示的圖形繪制在后緩存中,當(dāng)后緩存中的內(nèi)容被要求顯示時(shí),就會(huì)被拷貝到前緩存,顯示硬件不斷讀前緩存中的內(nèi)容,并把結(jié)

24、果顯示在屏幕上。這樣就提高了圖形顯示的交替速度,減少圖形間斷時(shí)間,從而減少圖形閃爍。 OpenGL支持雙緩存技術(shù),可以調(diào)用glDrawBuffer(GL_BACK) 將繪制的圖形畫在后緩存,當(dāng)完整的畫面在后臺(tái)視頻緩存中畫出后,調(diào)用SwapBuffers()函數(shù),與前視頻緩存交換,顯示畫面。在交換前臺(tái)和后臺(tái)緩存的內(nèi)容之前,必須進(jìn)行同步工作,以免在前一幅畫面還沒有顯示完畢,就被交換出視頻緩存。OpenGL提供了兩個(gè)同步操作函數(shù):glFlush()和glFinish()。 動(dòng)畫中前后兩幅圖形的交換是時(shí)間驅(qū)動(dòng)的,我們通過Windows的計(jì)時(shí)器來實(shí)現(xiàn)。 調(diào)用SetTimer(t)函數(shù),它每隔時(shí)間t生一個(gè)

25、WM_TIMER消息,然后為這個(gè)消息提供一個(gè)控制函數(shù),在控制函數(shù)中取關(guān)節(jié)角的數(shù)值,輸入給模型繪制函數(shù),調(diào)用InvalidateRect(NULL, FALSE) 重畫窗口,這樣就形成了動(dòng)畫效果。調(diào)用KillTimer()函數(shù)可以停止始終消息的發(fā)送,用它可以控制運(yùn)動(dòng)的停止。 第24頁/共79頁 四三維圖形的二維化四三維圖形的二維化 三維圖形是通過二維視口(屏幕)來觀看的,因此,對(duì)三維圖形要進(jìn)行透視變換和視窗變換。 仿真軟件采用透視投影方式,用透視投影來顯示景物會(huì)更真實(shí),這是因?yàn)檠矍虻某上穹绞秸峭敢曂队暗脑?。用如下方法?shí)現(xiàn): gluPerspective(45, aspect, 0.01, 1

26、00.0); /aspect = width/height; 經(jīng)過投影變換后,模型失去了深度信息,因此必須進(jìn)行消隱處理。在OpenGL中用如下方法實(shí)現(xiàn): glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); 視窗是一個(gè)用來繪制場景的矩形區(qū)域,視窗變換決定把場景中的點(diǎn)怎樣映射到繪圖區(qū),用如下方法實(shí)現(xiàn): glViewport(0, 0, width, height); width和height為生成的窗口的寬與高。視窗的高寬比與視景體的高寬比一致才使得圖形看起來協(xié)調(diào),這一點(diǎn)在編程很重要的。 第25頁/共79頁 5.2 PowerCube模塊化機(jī)器人三維模型的建立

27、模塊化機(jī)器人三維模型的建立 圖 6 PowerCube模塊化機(jī)器人三維模型 第26頁/共79頁 這里所研究的是德國Amtec公司生產(chǎn)的9自由度PowerCube模塊化機(jī)器人。這種機(jī)器人主要用于科學(xué)研究和工業(yè)化生產(chǎn),它的最大優(yōu)點(diǎn)就是可以根據(jù)需要自己隨意組裝,所有的關(guān)節(jié)都實(shí)現(xiàn)了零件式的標(biāo)準(zhǔn)化生產(chǎn)。它的關(guān)節(jié)模塊分為兩種,一種是最常用的轉(zhuǎn)動(dòng)關(guān)節(jié),有三種規(guī)格,分別是110,90和70;另一種是線性關(guān)節(jié),所有的關(guān)節(jié)通過都CAN總線與控制計(jì)算機(jī)相連。本文中的9自由度機(jī)器人由移動(dòng)導(dǎo)軌、兩個(gè)110轉(zhuǎn)動(dòng)關(guān)節(jié)、三個(gè)90轉(zhuǎn)動(dòng)關(guān)節(jié)、一個(gè)70轉(zhuǎn)動(dòng)關(guān)節(jié)、一個(gè)兩自由度腕部關(guān)節(jié)及一個(gè)線性抓手組成,如圖6所示。 要對(duì)機(jī)器人進(jìn)行遠(yuǎn)

28、程仿真及控制,第一步要做的工作就是建立機(jī)器人的三維模型。建立機(jī)器人的三維模型不僅涉及到機(jī)器人的具體型態(tài)、尺寸,而且與機(jī)器人關(guān)節(jié)運(yùn)動(dòng)的情況息息相關(guān),這對(duì)于日后機(jī)器人的運(yùn)動(dòng)學(xué)、動(dòng)力學(xué)分析異常重要。 第27頁/共79頁 機(jī)器人三維模型建立的步驟為: 機(jī)器人關(guān)節(jié)尺寸的確定 對(duì)機(jī)器人各個(gè)關(guān)節(jié)進(jìn)行具體的測量或計(jì)算,取得機(jī)器人各個(gè)關(guān)節(jié)的具體尺寸大小?;蛘哂靡恍┤S制圖軟件由機(jī)器人的機(jī)械圖中導(dǎo)出。 機(jī)器人的基本結(jié)構(gòu)參數(shù) 列出機(jī)器人的結(jié)構(gòu)參數(shù),為下一步的建模工作做準(zhǔn)備。 機(jī)器人坐標(biāo)系的建立 為機(jī)器人各個(gè)關(guān)節(jié)建立運(yùn)動(dòng)坐標(biāo)系,使得各個(gè)坐標(biāo)系的Z軸與運(yùn)動(dòng)副的軸線重合。 實(shí)現(xiàn)各個(gè)坐標(biāo)系之間的變換 相鄰兩個(gè)關(guān)節(jié)之間的相對(duì)

29、位姿關(guān)系可以一個(gè)變換矩陣來表示,通過對(duì)一個(gè)坐標(biāo)進(jìn)行坐標(biāo)旋轉(zhuǎn)和坐標(biāo)平移,即可建立兩坐標(biāo)之間的變換矩陣。 構(gòu)架OpenGL的標(biāo)準(zhǔn)程序框架 利用Visual C+開發(fā)環(huán)境,構(gòu)建仿真系統(tǒng)的基本程序構(gòu)架。 下面將就上述步驟中的難點(diǎn)及重點(diǎn)分別做出論述。 第28頁/共79頁 一、9自由度PowerCube模塊化機(jī)器人的基本結(jié)構(gòu)參數(shù) PowerCube模塊化機(jī)器人都是由標(biāo)準(zhǔn)化生產(chǎn)的模塊組成的,它的各個(gè)模塊大小都是有統(tǒng)一的參數(shù)的。前面已經(jīng)提到,本文中討論的9自由度機(jī)器人由兩個(gè)110轉(zhuǎn)動(dòng)關(guān)節(jié)、三個(gè)90轉(zhuǎn)動(dòng)關(guān)節(jié)、一個(gè)70轉(zhuǎn)動(dòng)關(guān)節(jié)、一個(gè)兩自由度腕部關(guān)節(jié)及一個(gè)線性抓手組成,它的基本結(jié)構(gòu)參數(shù)如下表所示: 第29頁/共79

30、頁 二、機(jī)器人坐標(biāo)系的建立 為了研究機(jī)器人的運(yùn)動(dòng),需要在機(jī)器人的各個(gè)關(guān)節(jié)構(gòu)件上建立相應(yīng)的坐標(biāo)系,如圖7所示。坐標(biāo)系0是慣性參考系,它與視點(diǎn)變換前后的坐標(biāo)系一致。坐標(biāo)系i建立在關(guān)節(jié)i上,坐標(biāo)系10建立在機(jī)器人末端抓手上,各個(gè)坐標(biāo)系的Z軸與運(yùn)動(dòng)副的軸線重合。 由上面的機(jī)器人圖形可以看出,機(jī)器人的每一個(gè)關(guān)節(jié)都是由兩個(gè)同軸、能夠旋轉(zhuǎn)的方塊組成的,而關(guān)節(jié)與關(guān)節(jié)之間通過法蘭狀的級(jí)聯(lián)器連接起來,除了腕部模塊之外,每個(gè)模塊只有一個(gè)運(yùn)動(dòng)關(guān)節(jié)。只有抓手是線性運(yùn)動(dòng)關(guān)節(jié),其它關(guān)節(jié)全都是旋轉(zhuǎn)運(yùn)動(dòng)關(guān)節(jié),這就為我們建立坐標(biāo)系提供了很大的方便。 第30頁/共79頁 X0X1 Z2 X3 Z7 Z9 Z4 X4 Z5 Z6 X

31、2 X5 X7 X8 165 220 200 180 135 160 140 185 2 3 4 5 6 7 8 9 Z0Z1 X6 Z8 X9 1 d Z3 第31頁/共79頁 相鄰兩桿之間的相對(duì)位置關(guān)系可以通過坐標(biāo)旋轉(zhuǎn)和坐標(biāo)平移來建立,例如任意兩個(gè)坐標(biāo)系i與坐標(biāo)系j之間可以通過下列變換來建立起兩坐標(biāo)系之間的變換矩陣: 沿x軸旋轉(zhuǎn) 沿x軸平移 沿z軸旋轉(zhuǎn) 沿z軸平移 沿y軸旋轉(zhuǎn) 沿y軸平移 利用前面介紹的OpenGL幾何變換方法,可以方便地建立起兩坐標(biāo)之間的變換矩陣。 其核心代碼為: for(int i=1;i10;i+) glRotated(m_Modulei.rot.x, 1.0f, 0

32、.0f, 0.0f); /沿x軸旋轉(zhuǎn) glTranslated(m_Modulei.trans.x,0.0,0.0); /沿x軸平移 glRotated(m_Modulei.rot.z, 0.0f, 0.0f, 1.0f); /沿z軸旋轉(zhuǎn) glTranslated(0.0f,0.0f,m_Modulei.trans.z); /沿z軸平移 glRotated(m_Modulei.rot.y, 0.0f, 1.0f, 0.0f); /沿y軸旋轉(zhuǎn) glTranslated(0.0f,m_Modulei.trans.y,0.0f); /沿y軸平移 glPushMatrix(); DrawModule(

33、i); /繪制第i個(gè)桿件 glPopMatrix(); DrawGripper(m_GripperWidth); /繪制抓手 經(jīng)過9次變換,繪制出9個(gè)動(dòng)坐標(biāo)系。在繞z軸旋轉(zhuǎn)的參量中,m_Modulei.rotz是繞第i個(gè)坐標(biāo)系z(mì)軸轉(zhuǎn)動(dòng)的變量。其它幾個(gè)參數(shù)則由機(jī)器人的結(jié)構(gòu)參數(shù)來決定的。 第32頁/共79頁 在繪制各個(gè)桿件的過程中,要以當(dāng)前坐標(biāo)系為基礎(chǔ)進(jìn)行繪制,繪制完成之后要恢復(fù)當(dāng)前坐標(biāo)系的位置,如DrawModule(i)中的一段核心代碼: glPushMatrix(); /保存當(dāng)前坐標(biāo)位置,下面開如繪制 glColor3f(0.0f,0.0f,1.0f); /設(shè)置模塊顏色為藍(lán)色 auxSoli

34、dBox(2*0.055,2*0.055,2*0.055); /繪制一個(gè)110的方塊(上) glTranslated(0.0,0.0,-0.165); /沿z軸平移-165mm auxSolidBox(2*0.055,2*0.055,2*0.055); /繪制一個(gè)110的方塊(下) glColor3f(1.0f,0.5f,0.0f); /設(shè)置連接法蘭顏色為棕黃色 glTranslated(0.0,0.0,0.0575); /沿z軸平移57.5mm auxSolidBox(2*0.055,2*0.055,0.005); /模塊聯(lián)結(jié)下底板 glTranslated(0.0,0.0,0.05); /

35、沿z軸平移50mm auxSolidBox(2*0.055,2*0.055,0.005); /模塊的聯(lián)接上底板 glTranslated(0.0,0.0,-0.0475); / 沿z軸平移50mm gluCylinder(obj,0.05,0.05,0.045,20,1); /模塊的聯(lián)結(jié)圓柱體 glPopMatrix();/恢復(fù)原始坐標(biāo)位置 按照機(jī)器人理論,用D-H參數(shù)法建立坐標(biāo)系只需z軸與x軸的變換,這里加上了y軸的變換只是為了使代碼更具有通用性。因此,在實(shí)際的機(jī)器人坐標(biāo)變換中,y軸的移動(dòng)和旋轉(zhuǎn)變換參數(shù)都為0。 第33頁/共79頁 二、Visual C+環(huán)境下基于OpenGL程序框架的 構(gòu)造

36、 Visual C+ 從4.2 版本以后已完全支持OpenGL API 。 具有Windows 編程經(jīng)驗(yàn)的人都知道,在Windows下用GDI 作圖必須通過設(shè)備上下文(Device Context 簡 寫DC)調(diào)用相應(yīng)的函數(shù);用OpenGL作圖也是類似,OpenGL函數(shù)是通過“渲染上下文”(Rendering Context 簡寫RC) 完成三維圖形的繪制。Windows下的窗口和設(shè)備上下文支持位圖格式( PIXELFORMAT)屬性,和RC有著位圖結(jié)構(gòu)上的一致。只要在創(chuàng)建RC時(shí)與一個(gè)DC建立聯(lián)系(RC也只能通過已經(jīng)建立了位圖格式的DC來創(chuàng)建),OpenGL的函數(shù)就可以通過RC對(duì)應(yīng)的DC畫到相

37、應(yīng)的顯示設(shè)備上。 經(jīng)過上面的分析,用VC進(jìn)行OpenGL的編程就很顯然了,步驟如下: 第34頁/共79頁 (1)創(chuàng)建項(xiàng)目文件PowerCube,將所必須的OpenGL頭文件和庫文件包含進(jìn)該工程。即: 選擇ProjectSettings 菜單,在Link 欄的Object/Library Modules 輸入域中添加openg132.lib,glu32.lib,glaux.lib。打開“CPowerCubeView.h”文件。將下幾行插入到文件中: #include #include #include (2)OpenGL只對(duì)WS_CLIPCHILDREN|WS_CLIPSIBLINGS類型窗口有

38、效,將以下代碼添加到View類的PreCreateWindows()函數(shù)中: cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS); 第35頁/共79頁 (3) 設(shè)置點(diǎn)格式(Pixel Format) 在建立翻譯描述表(RC)以前,必須設(shè)置設(shè)備的點(diǎn)格式。點(diǎn)格式指定了設(shè)備的繪制性質(zhì)。例如,點(diǎn)是用RGBA模式表示或是使用顏色索引表模式表示,顯示是采用單緩存或是使用雙緩存等。 Win32提供了四個(gè)函數(shù)管理點(diǎn)格式,這些函數(shù)包括: ChoosePixelFormat() 返回和需求的點(diǎn)格式的最相近的點(diǎn)格式 DescribePixelFormat() 獲得給定點(diǎn)格

39、式的信息 GetPixelFormat() 獲得給定設(shè)備的點(diǎn)格式 SetPixelFormat() 設(shè)置給定設(shè)備的點(diǎn)格式 1) int ChoosePixelFormat(HDC hdc, CONST PIXELFORMATDESCRIPTOR *pdf) 參數(shù):hdc: 指定一個(gè)設(shè)備描述表(DC) pfd: 指定具體的點(diǎn)格式。結(jié)構(gòu)PIXELFORMATDESCRIPTOR在后面會(huì)具體講述,如果該函數(shù)調(diào)用成功,點(diǎn)格式的索引值被返回,否則,返回零。 第36頁/共79頁 2) int DescribePixelFormat(HDC hdc, int pixelformat, UINT nbytes

40、, CONST PIXELFORMATDESCRIPTOR *pfd) 功能:這個(gè)函數(shù)獲得被pixelformat指定的點(diǎn)格式的信息,pixelformat是和設(shè)備描述表hdc聯(lián)系的。 參數(shù):hdc: 指定一個(gè)設(shè)備描述表(DC) pixelformat: 指定點(diǎn)格式的索引 nbytes: 結(jié)構(gòu)pfd所使用內(nèi)存空間的大小 pfd: 是一個(gè)PIXELFORMATDESCRIPTOR結(jié)構(gòu),在這個(gè)結(jié)構(gòu)體中存放表示 點(diǎn)格式的相關(guān)數(shù)據(jù)。 如果該函數(shù)調(diào)用成功,返回值是設(shè)備描述表的點(diǎn)格式的最大索引,否則,返回零。 3) int GetPixelFormat(HDC hdc) 功能:這個(gè)函數(shù)獲得指定的被選擇的當(dāng)

41、前點(diǎn)格式的索引。 參數(shù):hdc: 指定一個(gè)設(shè)備描述表。 如果這個(gè)函數(shù)調(diào)用成功,返回值是當(dāng)前點(diǎn)格式的索引,否則,返回零。 第37頁/共79頁 4) BOOL SetPixelFormat(HDC hdc, int pixelformat, CONST PIXELFORMATDESCRIPTOR *pfd) 功能:這個(gè)函數(shù)設(shè)置點(diǎn)格式 參數(shù):hdc: 指定設(shè)備描述表(DC) pixelformat: 指定被設(shè)置點(diǎn)格式的索引 nbytes: 結(jié)構(gòu)pfd所使用內(nèi)存空間的大小 pfd: 是一個(gè)PIXELFORMATDESCRIPTOR結(jié)構(gòu)的指針 如果該函數(shù)調(diào)用成功,返回值是TRUE,否則,返回FALSE。

42、 第38頁/共79頁 static PIXELFORMATDESCRIPTOR pixelDesc= sizeof(PIXELFORMATDESCRIPTOR), / size of this pfd 1, / version number PFD_DRAW_TO_WINDOW | / support window PFD_SUPPORT_OPENGL| / support OpenGL PFD_DOUBLEBUFFER; /support doublebuffer PFD_TYPE_RGBA, / RGBA type 24, / 24-bit color depth 0, 0, 0, 0,

43、0, 0, / color bits ignored 0, / no alpha buffer 0, / shift bit ignored 0, / no accumulation buffer 0, 0, 0, 0, / accum bits ignored 32, / 32-bit z-buffer 0, / no stencil buffer 0, / no auxiliary buffer PFD_MAIN_PLANE, / main layer 0, / reserved 0, 0, 0 / layer masks ignored ; PIXELFORMATDESCRIPTOR:

44、點(diǎn)格式結(jié)構(gòu)體 第39頁/共79頁 在View類中的OnCreate函數(shù)中調(diào)用自定義的SetWindowPixelFormat()函數(shù)設(shè)置像素格式。 BOOL CPowerCubeView:SetWindowPixelFormat(HDC hDC) static PIXELFORMATDESCRIPTOR pixelDesc= sizeof(PIXELFORMATDESCRIPTOR), / size of this pfd /初始化點(diǎn)格式初始化點(diǎn)格式 1, / version number PFD_DRAW_TO_WINDOW | / support window PFD_SUPPORT_OP

45、ENGL| / support OpenGL PFD_DOUBLEBUFFER; /support doublebuffer PFD_TYPE_RGBA, / RGBA type 24, / 24-bit color depth 0, 0, 0, 0, 0, 0, / color bits ignored 0, / no alpha buffer 0, / shift bit ignored 0, / no accumulation buffer 0, 0, 0, 0, / accum bits ignored 32, / 32-bit z-buffer 0, / no stencil buf

46、fer 0, / no auxiliary buffer PFD_MAIN_PLANE, / main layer 0, / reserved 0, 0, 0 / layer masks ignored ; m_GLPixelIndex = ChoosePixelFormat(hDC, 第40頁/共79頁 if (m_GLPixelIndex=0) / Lets choose a default index. m_GLPixelIndex = 1; if (DescribePixelFormat(hDC, m_GLPixelIndex, sizeof(PIXELFORMATDESCRIPTOR

47、), if (SetPixelFormat( hDC, m_GLPixelIndex, return TRUE; 第41頁/共79頁 (3) 翻譯描述表(Rendering Context ) 每一個(gè)windows程序都必須有一個(gè)設(shè)備描述表(device context). 這個(gè)設(shè)備描述表中包含了圖形怎樣顯示在窗口的信息。例如,屏幕的繪制模式、圖形的映射模式以及一些圖形顯示在窗口必需的信息。 使用MFC調(diào)用OpenGL函數(shù)庫編寫程序也必須使用設(shè)備描述表,同時(shí),還要處理翻譯描述表。翻譯描述表是一種設(shè)備描述表的形式,在翻譯描述表中存放著OpenGL和操作系統(tǒng)聯(lián)系的信息。 Win32提供了五個(gè)函數(shù)管

48、理翻譯描述表,這五個(gè)函數(shù)以wgl為前綴,包括: wglCreateContext() 建立一個(gè)翻譯描述表 wglDeleteContext() 刪除一個(gè)翻譯描述表 wglGetCurrentContext() 獲得當(dāng)前的翻譯描述表 wglGetCurrentDC() 獲得和當(dāng)前翻譯描述表聯(lián)系的設(shè)備描述表 wglMakeCurrent() 使指定的翻譯描述表為當(dāng)前的 第42頁/共79頁 1) HGLRC wglCreateContext(HDC hdc) 功能:建立一個(gè)新的翻譯描述表。這個(gè)翻譯描述表和設(shè)備描述表所指定的設(shè)備是相符的。 參數(shù):hdc: 指定一個(gè)設(shè)備描述表(DC) 如果該函數(shù)調(diào)用成功

49、,返回值是翻譯描述表,否則,返回NULL。 2) BOOL wglDeleteContext(HGLRC hglrc) 功能:刪除一個(gè)翻譯描述表。 如果該函數(shù)調(diào)用成功,返回值TRUE,否則,返回FALSE。 3) HGLRC wglGetCurrentContext(void) 功能:獲得當(dāng)前的翻譯描述表。 如果這個(gè)函數(shù)調(diào)用成功,返回當(dāng)前的翻譯描述表,否則,返回NULL。 第43頁/共79頁 4) HDC wglGetCurrentDC(void) 功能:獲得和當(dāng)前翻譯描述表相聯(lián)系的設(shè)備描述表 如果該函數(shù)調(diào)用成功,返回和當(dāng)前的翻譯描述表相聯(lián)系的設(shè)備描述表,否則,返回NULL。 5) BOOL

50、wglMakeCurrent(HDC hdc, HGLRC hglrc) 功能:使所指定的翻譯描述表是當(dāng)前的。這個(gè)函數(shù)調(diào)用以后,所有的OpenGL繪制操作是在被hdc指定的設(shè)備上進(jìn)行的。 參數(shù):hdc: 指定一個(gè)設(shè)備描述表 hglrc: 指定一個(gè)翻譯描述表 如果該函數(shù)調(diào)用成功,返回值TRUE,否則,返回FALSE。 在使用翻譯描述表以前,必須建立一個(gè)翻譯描述表。在使用翻譯描述表時(shí),要使用函數(shù)wglMakeCurrent(), 使所使用的翻譯描述表成為當(dāng)前的,不用的翻譯描述表要調(diào)用函數(shù)wglDeleteContext()來刪除。 第44頁/共79頁 (4)在View類中的OnCreate函數(shù)中調(diào)

51、用自定義的CreateViewGLContext()函數(shù)生成當(dāng)前RC。 BOOL CPowerCubeView:CreateViewGLContext(HDC hDC) m_hGLContext = wglCreateContext(hDC); if (m_hGLContext = NULL) return FALSE; if (wglMakeCurrent(hDC, m_hGLContext)=FALSE) return FALSE; return TRUE; 第45頁/共79頁 程序執(zhí)行完畢后,要清除這個(gè)RC,這個(gè)任務(wù)在View類中OnDestroy函數(shù)中完成: void CPowerCu

52、beView:OnDestroy() if(wglGetCurrentContext()!=NULL) / make the rendering context not current wglMakeCurrent(NULL, NULL) ; if (m_hGLContext!=NULL) wglDeleteContext(m_hGLContext); m_hGLContext = NULL; / Now the associated DC can be released. CView:OnDestroy(); 第46頁/共79頁 (5)在View類中的OnDraw函數(shù)中調(diào)用自定義的繪制模型函數(shù)RenderScene來完成模型繪繪制的工作。用SwapBuffers函數(shù)交換兩個(gè)緩存中的內(nèi)容顯示模型。 這樣,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論