2.7 例題プログラム ROBOT.BASの解説
目次へ戻る
- このプログラムは、種々の寸法の6面体を簡単なロボット部品としてつなぎ、これらを動かして観察するようにしたものです。
- 最初にロボットの全体寸法を設計をするとき、簡単な図面を描いて部品相互の配置と寸法とを決めておきます。部品の寸法は、表の形で与えておいて、BSIZE(3,9)の配列にDATA文で読み込ませます。寸法数値は実数型ですが、データ文の数値は整数で与えることができます。数値と数値との区切り(delimiter) には、コンマを使いますが、単に空白(スペース)をあけてもよいような NUCE_BASIC の仕様になっています。DATA文で、同じ数字がn個連続して並ぶ場合には、n*数字、の形式が使えます。
- READ文で、配列名だけを書けば、配列の個数分のデータが読み込まれます。
- 例題のロボットの部品は全部で9個で、先端の方から基礎に向かって "A1", "A2",… "A9" と名前を登録しました。9個の部品は、コマンドLMTREEを使って、"A9"を最長老の親として"A8", "A7",...."A3"の一列状の木構造で論理的に繋ぎます。先端の"A1"と"A2"とは兄弟で、"A3"を親として繋ぎます。
- 個々の部品は、その重心が世界座標の原点に来るように作られていますので、部品の相対的な位置関係が所定の位置にくるように移動させます。まず、"A1"と"A2"とを、原点から、それぞれベクトル成分(-15,0,5),(-15,0,-5)で平行移動させます。こうすると、"A1"と"A2"とが"A3"と接して、カタカナのコの形になります。
- 次に、"A3"をベクトル成分(-20,0,0) で平行移動させます。このときのコマンドPGDIS は、ITREE=1 の移動モードになっていますので、"A1"、"A2"、"A3"の全体が移動し、結果としてロッド状の部材"A4"の先端に繋がります。以下、順々に部材をITREE=1 の移動モードで延長して全体を作ります。なお、個々の部品の座標系も部品と共に移動するモード imod=0 の仕様でコマンドPGDIS を使っています。
- ロボットアームの動きは、コマンドPGROT で制御させます。例題のプログラムは、部品"A3"と"A5"と"A7"の場所で、それぞれの部品のx軸、y軸、z軸回りに回転させます。変換モードは itree=1に指定されています。変換を FOR-NEXT 文で回しますが、一回の回転角度を小さくして、回数を増やすとアニメーションが得られます。
- なお、拡大・縮小を行なわせるコマンド PGFACT/PGPAN/PGLONGの動作を確認するための処理を含ませてあります。
- ロボットの動きを透視図で観察するとして、カメラの位置は (300,200,180)、つまり座標系では第1象限にあります。カメラの視点は世界座標の原点を向きますが、これはロボット底盤"A9"の中心で、柱材"A8"との境になります。カメラの視点を変えることができませんので、目標とする視点位置を変えたいときは、被写体の方を全体として上下左右に移動させます。
- l 画像のグラフィックスは、簡易隠線消去のアルゴリズムを利用したコマンドHFDISPを利用しています。完全隠線消去で画像を描きたいときには、コマンドHLDISPを使います。いずれのコマンドを利用するときでも、itree=1 のモードにしてください。
10 PRINT "GEOMAP Demonstration Program"
20 PRINT "--- Moving and Deformation of Models ---"
30 DIM BSIZE(3,9),AXIS(3,2),NAME$(9)
40 READ BSIZE : REM ------ DATA FOR BSIZE ------
50 DATA 20 15 5, 20 15 5, 10 15 15, 30 8 8, 3*20
60 DATA 8 30 8, 3*20, 12 12 65, 50 50 20
70 READ AXIS : REM ------ DATA FOR AXIS ------
80 DATA 5 5 0, 1 0 0
90 READ NAME$ : REM ------ NAMING FOR BODIES ------
100 DATA "A1","A2","A3","A4","A5","A6","A7","A8","A9"
110 REM ============================== DPCAM
120 CAM(1)=300: CAM(2)=200 : CAM(3)=180 : TH=0.8
130 DPCAM CAM,TH
140 CMINIT : REM ===================== PCUBE
150 FOR I=1 TO 9
160 PCUBE NAME$(I), BSIZE(1,I), BSIZE(2,I), BSIZE(3,I)
170 NEXT I
180 REM ============================== LMTREE
190 FOR I=3 TO 8
200 LMTREE NAME$(I+1),NAME$(I)
210 NEXT I
220 LMTREE "A3", "A1", "A2"
230 REM ============================== PGDIS
240 DIS(1)=-15: DIS(3)=5 : PGDIS "A1",,DIS
250 DIS(3)=-5 : PGDIS "A2",,DIS
260 DIS(1)=-20 : DIS(3)=0 : PGDIS "A3",,DIS,1
270 DIS(1)=-25 : PGDIS "A4",,DIS,1
280 DIS(1)=0 : DIS(2)=25 : PGDIS "A5",,DIS,1
290 DIS(1)=0 : PGDIS "A6",,DIS,1
300 DIS(2)=0 : DIS(3)=42.5 : PGDIS "A7",,DIS,1
310 DIS(2)=0 : PGDIS "A8",,DIS,1
320 DIS(3)=-50 : PGDIS "A9",,DIS,1
330 REM ============================== PGROT
340 ANG1(1)=30 : ANG2(2)=15: ANG3(3)=45 : ITREE=1
350 CLS : HFDISP "A9",1,0
360 FOR I=1 TO 5
370 PGROT "A3","A3",ANG3,CEN(1),ITREE
380 PGROT "A5","A5",ANG2,CEN ,ITREE
390 PGROT "A7","A7",ANG1,CEN ,ITREE
400 CLS : HFDISP "A9",ITREE
410 NEXT I
420 REM ============================== PGFACT
430 PGFACT "A9",,CEN,-0.5,ITREE
440 CLS : HFDISP "A9",ITREE
450 PGFACT "A9",,CEN,-1.0,ITREE
460 CLS : HFDISP "A9",ITREE
470 REM ============================== PGPAN
480 PGPAN "A9",,AXIS,2.0,ITREE
490 CLS : HFDISP "A9",ITREE
500 REM ============================== PGLONG
510 PGLONG "A9",,AXIS,-2.0,ITREE
520 CLS : HFDISP "A9",ITREE
530 END
目次へ戻る