fira5v5項(xiàng)目說(shuō)明_第1頁(yè)
fira5v5項(xiàng)目說(shuō)明_第2頁(yè)
fira5v5項(xiàng)目說(shuō)明_第3頁(yè)
fira5v5項(xiàng)目說(shuō)明_第4頁(yè)
fira5v5項(xiàng)目說(shuō)明_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Fira5V5仿真組介紹北京工業(yè)大學(xué)機(jī)器人協(xié)會(huì)2015年10月1、 Fira5v5項(xiàng)目介紹(一)Fira5v5仿真平臺(tái)簡(jiǎn)介1.1 仿真型機(jī)器人足球介紹仿真型機(jī)器人足球(SimuroSot)SimuroSot 是一種仿真的軟件系統(tǒng),在該項(xiàng)比賽中,參賽的每個(gè)機(jī)器人不是 實(shí)際的機(jī)器人,而是用計(jì)算機(jī)模擬的虛擬機(jī)器人,它主要研究比賽策略,以軟件為主,忽略機(jī)器人的硬件相關(guān)的需求。比賽中,我們僅關(guān)注的好似軟件部分,主要研究用軟件來(lái)實(shí)現(xiàn)既定的策略,完成給定的程序邏輯,主體的程序?qū)φZ(yǔ)言要求很低,主要是要求擁有清晰的邏輯和編程思想。換言之,SimuroSot 類(lèi)型的比賽是智力與智力的碰撞。1.2 仿真系統(tǒng)基本結(jié)構(gòu)

2、 仿真系統(tǒng)是有FIRA 提供的仿真程序,這個(gè)程序通過(guò)DLL(動(dòng)態(tài)連接庫(kù))接收雙方策略,決策系統(tǒng)由各隊(duì)提供自己的DLL程序。場(chǎng)上的數(shù)據(jù)由仿真程序計(jì)算給出,DLL接收處理并將要發(fā)給機(jī)器人的命令傳給仿真程序。1.3 仿真平臺(tái)及系統(tǒng)特點(diǎn) 開(kāi)發(fā)者:澳大利亞的Dr.Jun Jo 領(lǐng)導(dǎo)的Griffith大學(xué)信息技術(shù)學(xué)院RSS開(kāi)發(fā)小組 系統(tǒng)特點(diǎn):1 機(jī)器人模型:Yujin機(jī)器人的物理模型2 模擬精確:碰撞檢測(cè)完全,碰撞處理精確(采用商業(yè)游戲引擎公司Havok的碰撞處理引擎)3 界面:3維(采用Direct設(shè)計(jì)界面,3D Max模型)1.4 運(yùn)行環(huán)境和開(kāi)發(fā)工具仿真系統(tǒng):3D Robot Soccer Simul

3、ator 1.5a編程語(yǔ)言:C/C+開(kāi)發(fā)環(huán)境:MS Visual C+ 6.0 / MS VS2003模 板:使用仿真系統(tǒng)提供的源程序模板程序模板說(shuō)明:程序使用動(dòng)態(tài)連接庫(kù)(DLL)方式硬件需求:Pentiun III 600 MHz或其以上級(jí)別的顯示卡256M系統(tǒng)內(nèi)存具有32M以上顯存的TNT2或其以上級(jí)別的顯示卡能夠支持800×600以上分辨率的顯示器軟件需求:Windows98或以上版本的操作系統(tǒng)DirectX 8.0或以上的版本1.5 仿真平臺(tái)的使用介紹1.5.1 運(yùn)行程序的方法1 先將自己編寫(xiě)好的代碼編譯成dll文件,黃隊(duì)程序拷到C:strategyyellow,藍(lán)隊(duì)程序拷到

4、C:strategyblue。2 在仿真平臺(tái)中點(diǎn)擊STRATEGIES按鈕,選擇C+,然后輸入策略文件名,點(diǎn)擊send。3 選擇相應(yīng)的比賽模式,按照規(guī)則擺放好球和球員后,點(diǎn)擊start,開(kāi)始比賽。1.5.2 主菜單A-各隊(duì)載入策略B-選擇以何種方式開(kāi)球,依次為(自由球,開(kāi)球,點(diǎn)球,任意球,球門(mén)球)C-選擇開(kāi)球方 黃隊(duì) 藍(lán)隊(duì)D-開(kāi)始比賽 E-比賽時(shí)間和比分F-修改時(shí)間和比分 G-開(kāi)始一場(chǎng)新的比賽 H 平臺(tái)幫助以及規(guī)則1.5.3 策略載入菜單 選擇使用何種開(kāi)發(fā)語(yǔ)言(Lingo/C+) 輸入藍(lán)隊(duì)程序的文件名 輸入黃隊(duì)程序的文件名將各隊(duì)程序載入平臺(tái)打開(kāi)狀態(tài)查看窗口(相識(shí)了球和機(jī)器人的一些基本信息)1.

5、5.4 比賽控制菜單 A-立即回放 B-暫停 C-結(jié)束比賽1.5.5 回放控制菜單A- 從頭開(kāi)始回放B- 從前300個(gè)周期開(kāi)始回放C- 一般速度回放D- 慢速度回放E- 逐幀回放F- 推出回放模式G- 當(dāng)前進(jìn)球無(wú)效 1.5.6 機(jī)器人的編號(hào) Home代表己方機(jī)器人 Opp代表對(duì)方機(jī)器人 箭頭所指的方向?yàn)闄C(jī)器人當(dāng)前的正方向1.5.7 鼠標(biāo)和鍵盤(pán)操作鼠標(biāo):在比賽開(kāi)始前或比賽暫停時(shí),可以用鼠標(biāo)拖動(dòng)球機(jī)器人到場(chǎng)地的任何位置鍵盤(pán):在比賽開(kāi)始前或比賽暫停時(shí),當(dāng)鼠標(biāo)點(diǎn)擊某一個(gè)機(jī)器人后可以用<-或->鍵來(lái)調(diào)整該機(jī)器人的角度。(二)仿真平臺(tái)與策略關(guān)系及其運(yùn)動(dòng)策略開(kāi)發(fā)指南2.1 什么是策略程序定義:策

6、略程序就是自己編寫(xiě)的能夠使仿真平臺(tái)中機(jī)器人按照預(yù)定方式運(yùn)動(dòng)的程序。通俗的來(lái)說(shuō),就是能夠打比賽的程序。2.2 仿真平臺(tái)與策略的運(yùn)行關(guān)系2.2.1 仿真平臺(tái)與策略程序的通信方式2.2.2 策略程序每個(gè)周期接受的數(shù)據(jù)仿真平臺(tái)傳遞給策略程序的數(shù)據(jù):4 己方、對(duì)方機(jī)器人坐標(biāo)、角度(當(dāng)前周期,上一周期)5 球的坐標(biāo)(當(dāng)前周期,上一周期) 2.2.3 策略程序每個(gè)周期發(fā)送的數(shù)據(jù)策略程序發(fā)送給仿真平臺(tái)的數(shù)據(jù):己方(homei)每個(gè)機(jī)器人的左輪速(pwm1)和右輪速(pwm2)2.3 仿真平臺(tái)場(chǎng)地?cái)?shù)據(jù)2.3.1 場(chǎng)地頂點(diǎn)坐標(biāo) 2.3.2 場(chǎng)地的各種標(biāo)志及尺寸 單位(厘米)機(jī)器人小車(chē)為理想模型。速度限制在-125

7、125。提供比賽狀態(tài)(GameState)和控球方(WhosBall)兩個(gè)參數(shù)。度量單位:英寸(如轉(zhuǎn)換成厘米,需乘2.54)。球員方位角單位為角度。每方隊(duì)員有五名,分別用不同的顏色來(lái)標(biāo)示,右上角是黑色來(lái)區(qū)分前后,中間是代表隊(duì)伍的顏色,在左下角是區(qū)分不同隊(duì)員的標(biāo)識(shí): 0號(hào)一般是守門(mén)員,用大紅色表示; 1號(hào)用紫色表示,2號(hào)用紫紅色表示,這兩個(gè)一般用作防守; 3號(hào)用綠色表示,4號(hào)用藍(lán)綠色表示,這兩個(gè)一般用作進(jìn)攻;2.4 接口代碼解析程序的接口API函數(shù): 函數(shù)接口Create主要是程序的初始化,在程序開(kāi)始時(shí)由系統(tǒng)調(diào)用,主要作用是定義所有的數(shù)據(jù),如創(chuàng)建對(duì)應(yīng)于:Environment->userD

8、ata的函數(shù),其中可以用來(lái)存儲(chǔ)我們的策略執(zhí)行狀態(tài)等 Extern “C” STRATEGY_API void Create (Enviroment *env); 函數(shù)接口Destroy主要是程序的銷(xiāo)毀,在程序結(jié)束時(shí)由系統(tǒng)調(diào)用,主要作用是釋放自定義的數(shù)據(jù),如刪除對(duì)應(yīng)于:Environment->userData的數(shù)據(jù) Extern “C” STARTGY_API void Destroy (Enviroment *env); 函數(shù)接口Strategy是程序的主要執(zhí)行邏輯,由系統(tǒng)反復(fù)調(diào)用,每次調(diào)用相當(dāng)于真實(shí)系統(tǒng)下計(jì)算出新的機(jī)器人左右輪的速率,并發(fā)送給小車(chē),在這里,我們必須處理針對(duì)賽場(chǎng)上每一時(shí)

9、刻的對(duì)策,每秒調(diào)用60次,即仿真周期為1/60秒。Extern “C” STARTGY_API void Strategy (Enviroment *env); 實(shí)際上程序只需要這三個(gè)接口,而我們的工作就是完成這幾個(gè)接口的處理。程序的基本數(shù)據(jù)定義Vector3D /位置向量定義typedef structdouble x, y, z;Vector3D;Bounds /區(qū)域范圍定義typedef struct long left, right, top, bottom; Bounds;Robot /我方機(jī)器人的信息定義typedef struct Vector3D pos; /機(jī)器人的坐標(biāo)位置

10、double rotation; /機(jī)器人當(dāng)前的角度 double velocityLeft, velocityRight; /機(jī)器人的左右輪速 Robot;OpponentRobot /對(duì)方機(jī)器人信息的定義typedef struct Vector3D pos; /機(jī)器人的坐標(biāo)位置 double rotation; /機(jī)器人當(dāng)前的角度 OpponentRobot;Ball /小球信息的定義typedef struct Vector3D pos; /小球的坐標(biāo)位置Ball;Environment /最重要的數(shù)據(jù)定義,包含所有運(yùn)行時(shí)的信息,由系統(tǒng)刷新typedef struct Robot ho

11、mePLAYERS_PER_SIDE; /我方機(jī)器人數(shù)組 OpponentRobot opponentPLAYERS_PER_SIDE; /敵方機(jī)器人數(shù)組 Ball currentBall, /當(dāng)前小球的位置 lastBall, /上一次小球的位置 predictedBall; /調(diào)用PredictBall()函數(shù)后可獲得數(shù)據(jù)Bounds fieldBounds, /場(chǎng)地范圍 goalBounds; /球門(mén)的位置與范圍 long gameState; /當(dāng)前比賽狀態(tài)(各種定位球的標(biāo)志變量)long whosBall; /由誰(shuí)控制球void * userData; /用戶(hù)自定義信息Environ

12、ment; 仿真系統(tǒng)每秒會(huì)調(diào)用dll中的接口函數(shù)Straegy接口60次,也就是我們的每個(gè)處理周期是16.67毫秒,在每次調(diào)用時(shí),系統(tǒng)通過(guò)Environment * env這個(gè)指針向我們傳遞當(dāng)前的系統(tǒng)的運(yùn)行信息,然后我們運(yùn)算后設(shè)置我方所有機(jī)器人的左右輪速,依此來(lái)控制機(jī)器人進(jìn)行足球比賽。 需要注意的是:程序?qū)τ谧笥野雸?chǎng),應(yīng)該分別處理。2.5 程序開(kāi)發(fā)流程1 在C:Programe FilesRobot Soccer v1.5a目錄下找到Stragegy Source文件。2 將此文件夾的代碼拷出,并在VC6.0或.NET2003下打開(kāi),可以看到系統(tǒng)提供的接口代碼,同時(shí)也有一些系統(tǒng)提供的策略,這些

13、策略只是提供參考,如果想要寫(xiě)出好的程序,必須改進(jìn),或重新編寫(xiě)。3 在我們看到的程序中像下面這樣一類(lèi)函數(shù)都是開(kāi)發(fā)者留給我們參考的,這些以后都需要自己改進(jìn),自己編寫(xiě)。void PredictBall(Environment *env); /預(yù)測(cè)球的位置void Goaliel(Robot *robot, Envirnment *env); /守門(mén)員策略void NearBound2(Robot *robot, double vl, double vr, Envirnment *env);void Attack2(Robot *robot, Environment *env); /機(jī)器人向小球移動(dòng)方

14、法void Defend(Robot *robot, Environment *env, double low, double high); /防守(后衛(wèi))void MoonAttack(Robot *robot, Environment *env); /移動(dòng)攻擊void MoonFollowOpponent(Robot *robot , OpponentRobot *opponent); /跟隨對(duì)方球員void Velocity(Robot *robot, int vl, int vr); /給機(jī)器人發(fā)送左右輪速void Angle(Robot *robot , int desired_an

15、gle); /機(jī)器人轉(zhuǎn)到指定角度void Positon (Robot *robot, double x, double y); /機(jī)器人移動(dòng)到指定的坐標(biāo)2.6 動(dòng)作函數(shù)介紹 為了完成各種策略,基本的做法是用分而治之,逐步求精的方法,將主要的策略分為若干個(gè)基礎(chǔ)策略,每個(gè)完整的策略分別由這些基本的策略組成,而這些策略又由一些基本的行為動(dòng)作方式組成,我們的機(jī)器人控制程序最后就是由這些方法和行為動(dòng)作方式來(lái)構(gòu)成。 下面是一些基本的動(dòng)作函數(shù): void Angle (Robot *robot ,int desired_angle) /該動(dòng)作可以讓機(jī)器人轉(zhuǎn)到任意指定的角度 int theta_e, vl,

16、 vr; theta_e = desired_angle (int) robot -> rotation; while( theta_e >180) theta_e -= 360; while(theta_e <-180) theta_e +=360; if (theta_e < -90) theta_e +=180; else if (theta_e>90) theta_e -= 180;if (abs(theta_e) > 50) vl = ( int ) (-9.0/90.0 * (double) theta_e); vr= (int ) (9.0/9

17、0.0 * (double) theta_e);else if(abs(theta_e) > 20) vl = (int ) (-11.0/90.0*(double)theta_e); vr=(int ) (11.0/90.0 *(double) theta_e);Velocity (robot, vl, vr);void Attack (Robot * robot, Environment *env)/ 機(jī)器人向小球的位置移動(dòng)的方法 PredictBall (env); /估計(jì)小球的位置 Position( robot , env-> predictedBall.pos.x, e

18、nv->predictedBall.pos.y); /移動(dòng)機(jī)器人到小球的位置void PredictBall( Environment *env) /預(yù)估小球的位置 double dx = env ->currentBall.pos.x env->lastBall.pos.x; double dy = env ->currentBall.pos.y env ->lastBall.pos.y; env->predictedBall.pos.x = env->currentBall.pos.x + dx; env->predictedBall.pos

19、.y = env->currentBall.pos.y + dy;void Position( Robot *robot, double x, double y )/該動(dòng)作使移動(dòng)小車(chē)到指定位置int desired_angle = 0, theta_e = 0, d_angle = 0, vl, vr, vc = 70;double dx, dy, d_e, Ka = 10.0/90.0;dx = x - robot->pos.x; /計(jì)算當(dāng)前位置與目標(biāo)的相對(duì)位移dy = y - robot->pos.y;d_e = sqrt(dx * dx + dy * dy); /計(jì)算機(jī)

20、器人到目標(biāo)位置的直線(xiàn)距離if (dx = 0 && dy = 0) /計(jì)算當(dāng)前位置到目標(biāo)點(diǎn)的角度desired_angle = 90;elsedesired_angle = (int)(180. / PI * atan2(double)(dy), (double)(dx);theta_e = desired_angle - (int)robot->rotation;/ 當(dāng)前機(jī)器人的角度與機(jī)器人到目標(biāo)連線(xiàn)角度的夾角while (theta_e > 180) theta_e -= 360;while (theta_e < -180) theta_e += 360;

21、if (d_e > 100.) Ka = 17. / 90.;else if (d_e > 50)Ka = 19. / 90.;else if (d_e > 30)Ka = 21. / 90.;else if (d_e > 20)Ka = 23. / 90.;else Ka = 25. / 90.;if (theta_e > 95 | theta_e < -95)theta_e += 180;if (theta_e > 180) theta_e -= 360;if (theta_e > 80)theta_e = 80;if (theta_e &l

22、t; -80)theta_e = -80;if (d_e < 5.0 && abs(theta_e) < 40)Ka = 0.1;vr = (int)(-vc * (1.0 / (1.0 + exp(-3.0 * d_e) - 0.3) + Ka * theta_e);vl = (int)(-vc * (1.0 / (1.0 + exp(-3.0 * d_e) - 0.3) - Ka * theta_e);else if (theta_e < 85 && theta_e > -85)if (d_e < 5.0 &&

23、abs(theta_e) < 40)Ka = 0.1;vr = (int)( vc * (1.0 / (1.0 + exp(-3.0 * d_e) - 0.3) + Ka * theta_e);vl = (int)( vc * (1.0 / (1.0 + exp(-3.0 * d_e) - 0.3) - Ka * theta_e);elsevr = (int)(+.17 * theta_e);vl = (int)(-.17 * theta_e);Velocity(robot, vl, vr);2.7 在策略中調(diào)用動(dòng)作的基本方法1 讓小車(chē)沿直線(xiàn)跑到指定的點(diǎn)switch ( env->

24、gameState) case 0: Position (&env->home1,env->Home1.pos.x, 60); /讓小車(chē)1沿著直線(xiàn)跑到X軸與機(jī)器人位置相等Y軸為60這個(gè)點(diǎn)去 Position (&env->home2,env->Home2.pos.y, 60); /讓小車(chē)2沿著直線(xiàn)跑到Y(jié)軸與機(jī)器人位置相等X軸為60這個(gè)點(diǎn)去 break; case FREE_BALL: break; case PLACE_KICK: break; case PENALTY_KICK: break;case FREE_KICK: break; case GO

25、AL_KICK: break;讓小車(chē)跑到指定的點(diǎn)對(duì)球員之間的配合有很大的關(guān)系,對(duì)于策略的配合極其重要。2 讓小車(chē)轉(zhuǎn)彎跑 switch (env->gameState) case 0: Position( &env->home1, 50, 60); /讓小車(chē)跑到指定的坐標(biāo)(50 ,60) break; case FREE_BALL: break; case PLACE_KICK: break; case PENALTY_KICK: break; case FREE_KICK: break; case GOAL_KICK: break;3 讓小車(chē)跟著球跑switch (env-

26、>gameState) case 0: Position(&env->home1, env-> currentBall.pos.x, env-> currentBall.pos.y); /讓小車(chē)1跟著球跑 break; case FREE_BALL: break; case PLACE_KICK: break; case PENALTY_KICK: break; case FREE_KICK: break; case GOAL_KICK: break;讓小車(chē)跟著球跑也是一種進(jìn)攻方法,這適合初學(xué)開(kāi)發(fā)者。但這有一個(gè)毛病,容易犯規(guī)或造成烏龍球。4 讓守門(mén)員根據(jù)球的Y軸

27、的移動(dòng)而移動(dòng)switch (env->gameState) case 0: Position(&env->home1, 91.0000, env->currentBall.pos.y); /讓小車(chē)1守門(mén),并且根據(jù)球的位置的移動(dòng)而移動(dòng) break; case FREE_BALL: break; case PLACE_KICK: break; case PENALTY_KICK: break; case FREE_KICK: break; case GOAL_KICK: break;讓守門(mén)員跟隨著球的Y軸和移動(dòng)是一種很有效的守門(mén)辦法,但守門(mén)員又不能離球門(mén)太遠(yuǎn),所以守門(mén)員的

28、移動(dòng)還得在一定范圍之內(nèi)。5讓小車(chē)以最快的速度到達(dá)指定的點(diǎn) switch (env->gameState) case 0: Position(&env->home1, 60, env->currentBall.pos.x); /讓小車(chē)1沿直線(xiàn)跑到X軸與機(jī)器人位置相等Y軸為60這個(gè)點(diǎn)去 break; Position(&env->home2, 60, env->currentBall.pos.y); /讓小車(chē)2沿直線(xiàn)跑到Y(jié)軸與機(jī)器人位置相等X軸為60這個(gè)點(diǎn)去 Velocity(& env->home1,125,125); /讓小車(chē)1以最快

29、的速度移動(dòng),125為左右輪最大的速度 Velocity(& env->home2,125,125); /讓小車(chē)2以最快的速度移動(dòng),125為左右輪最大的速度 break; case FREE_BALL: break; case PLACE_KICK: break; case PENALTY_KICK: break; case FREE_KICK: break; case GOAL_KICK: break;2.8簡(jiǎn)單策略開(kāi)發(fā) 程序主要是在接口Strategy中按照當(dāng)前的狀態(tài)處理比賽時(shí)的信息,通過(guò)分支-選擇結(jié)構(gòu)來(lái)分別處理各種不同的狀況 switch(env->gameState)

30、 case 0: /default 卻省情況下的策略(即沒(méi)有選擇任何比賽模式) /三個(gè)機(jī)器人進(jìn)行追逐對(duì)方的策略 MoonFollowOpponent(&env->home1, &env->opponent2); MoonFollowOpponent(&env->home2, &env->opponent3); MoonFollowOpponent(&env->home3, &env->opponent4); /第四個(gè)搶球 MoonAttack( &env->home 4,env); Goaliel

31、 (&env->home 0, env); /守門(mén)員守門(mén) break; case FREE_BALL: /發(fā)球墜球(自由球)時(shí)的策略 /跟隨對(duì)方 MoonFollowOpponent(&env->home1, &env->opponent2); MoonFollowOpponent(&env->home2, &env->opponent3); MoonFollowOpponent(&env->home3, &env->opponent4); MoonAttack( &env->hom

32、e 4,env); /第四個(gè)搶球 Goaliel (&env->home 0, env); /守門(mén)員守門(mén) break; case PLACE_KICK: /開(kāi)球時(shí)的策略 MoonAttack( &env->home 2,env); /由二號(hào)小車(chē)發(fā)球 break; case PENALTY_KICK: /發(fā)生罰球(點(diǎn)球)時(shí)的策略 switch (env->whosBall) case ANYONES_BALL: MoonAttack( &env->home 1,env); break; case BLUE_BALL: MoonAttack( &env->home 4,env); break; case YELLOW_BALL: MoonAttack( &env->home 0,env); break; brea

溫馨提示

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

評(píng)論

0/150

提交評(píng)論