====== 9. スクリプト言語 ====== ===== はじめに ===== Go Simulation!では、ユーザー側でロボットのプログラムを作成することができます。\\ Go Simulation!には独自のプログラム言語(スクリプト言語)があり、これを使うことで簡単にロボットのプログラムを作成することができます。 プログラムには、対話実行と、プログラム実行の2つのモードがあります。 対話実行は、一つ一つコマンドを打ち込んで実行させる方法です。\\ 動作の確認がしやすいのが特徴です。\\ ただし、一部の命令しか使えないため、簡単な動作チェックしかできません。 プログラム実行は、複数行に渡ってプログラムを記述します。\\ 複雑なアルゴリズムを記述することが可能です。 ===== 対話実行の例 ===== ロボット設計モードでロボットプロジェクトを開いてから([[ja:manual:robot_design_mode#プロジェクトメニュー|ロボット設計モードページのプロジェクトメニューの節]]参照)、メニュー→【モーション設計】→【コマンドウィンドウ】を選択してください。\\ コマンドウィンドウを開いたら、図 9-1 のように1+2と入力し、Enterキーを押してください。\\ \\ {{:ja:manual:sc1.png|}}\\ 図 9-1 コマンドウィンドウ\\ すると画面に >1+2 ans = 3 と表示され、足し算(1+2=3)が実行されたことが分かります。 同様に以下の結果になるようにコマンドを実行してみてください。 >a=3 a = 3 >a*5 ans = 15 変数aに3が代入され、a*5の計算をして15という答えが出ました。\\   もう少し複雑な演算も可能です。 >a=100 a = 100 >b=200 b = 200 >(b-a)*2+300 ans = 500 >(b+a)/100 ans = 3 このように、四則演算や変数に値を代入するといった計算が可能です。 ===== 変数の値の範囲 ===== 変数は全て整数で、範囲は-32768から32767となっています。 ===== 制御用変数 ===== ロボットの制御用に変数が用意されています。\\ 例えば、デフォルトのロボットを開いた状態で、ShoP_R=9000と入力してください。 図 9-2 のように、ロボットの右肩が90度動きます。 {{:ja:manual:sc2.png|}}\\ 図 9-2 コマンドから角度を駆動\\ このようにロボットの各関節(モーター)には変数が割り当てられています。\\ どのような変数名が割り当てられているかは、メニュー→【構成設計】→【サーボモータ設定】で確認できます。 図 9-3 の【ID】は設計エディタ([[ja:manual:robot_design_mode#設計エディタ|ロボット設計モードページの設計エディタの説]])に 表示されている関節の番号、【変数名】の欄で関節毎に変数名を設定しています。\\ {{:ja:manual:sc3.png|}}\\ 図 9-3 サーボモータ設定(変数名) また、関節がHINGE(回転モーター)の場合、変数1カウント当たり0.01度に指定されています。 よって、ShoP_R=9000とすると、9000*0.01=90度動くことになります。 関節のタイプ毎に、変数1カウント当たりの関係を表 9-1 を参照ください。 ^表 9-1 関節タイプと変数1カウント当たりの値^^^ ^関節タイプ ^制御タイプ ^1カウント当たり ^ |HINGE |位置制御 |0.01度 | |HINGE |速度制御 |1.0度/秒 | |SLIDER |位置制御 |0.001m/秒 | |SLIDER |速度制御 |0.001m/秒 | また、関節の変数名の先頭に特定の文字をつけると、サーボモータの特性を変更することが可能です(表 9-2 )。サーボモータの特性については[[ja:manual:robot_design_mode#サーボモータ設定|ロボット設計モードページのサーボモータ設定の節]]を参照ください。 ^表 9-2 サーボモータ制御用の変数^^^ ^変数名 ^機能 ^例 ^ |変数名のみ |指令値の設定 |ShoP_R | |変数名_Err |指令値-実際の値 |ShoP_R_Err | |Kspeed_変数名 |位置gainの設定 |Kspeed_ShoP_R | |Kp_変数名 |モータPgainの設定 |Kp_ShoP_R | |Kd_変数名 |モータDgainの設定 |Kd_ShoP_R | ===== その他制御用変数 ===== Go Simulation!で使用しているその他の変数を表 9-3 に示します。 ^表 9-3 予約変数^^^ ^変数名 ^概要 ^備考 ^ |KEY |ジョイパッドのキー入力値が入る | | |KEY_UP |↑ボタンの値 |固定値。変更しないでください。 | |KEY_DN |↓ボタンの値 |〃 | |KEY_LEFT |←ボタンの値 |〃 | |KEY_RIGHT |→ボタンの値 |〃 | |KEY_A |Aボタンの値 |〃 | |KEY_B |Bボタンの値 |〃 | |KEY_C |Cボタンの値 |〃 | |KEY_D |Dボタンの値 |〃 | |KEY_L1 |L1ボタンの値 |〃 | |KEY_R1 |R1ボタンの値 |〃 | |KEY_L2 |L2ボタンの値 |〃 | |KEY_R2 |R2ボタンの値 |〃 | |GyroEna |1:ジャイロ制御有効設定\\ 0:ジャイロ制御無効設定 | | |EneX |敵のX座標[mm] @絶対座標 | | |EneY |敵のY座標[mm] @絶対座標 | | |EneD |敵のZ座標[mm] @絶対座標 | | |EneTh |敵の方向[deg]@自ロボット座標 | | |MyPit |自ロボットのピッチ角[deg]@絶対座標 | | |MyRol |自ロボットのロール角[deg]@絶対座標 | | |EneAttSen |敵からみた自ロボットの角度@敵ロボット座標 | | |EneAttFlg |1: EneAttSenの値有効\\ 0: EneAttSenの値無効(敵が倒れている時) | | ===== モーション実行 =====  コマンドから[[ja:manual:robot_design_mode#モーションのセーブとロード|ロボット設計モードページのモーションのセーブとロードの節]]で作成したモーションを実行させることができます。\\ 例えば、モーションファイル「0Walk.rmo」を実行させたいときは以下のように実行してください。\\ 歩行モーションを実行していることを確認してください。\\ >rmo(0Walk) ===== モーショングループ実行 ===== コマンドから[[ja:manual:robot_design_mode#モーショングループ|ロボット設計モードページのモーショングループの節]]で設定したモーショングループを実行させることができます。\\ 例えば、モーショングループ「ZenGo.rmo」を実行させたいときは以下のように実行してください。\\ モーショングループが実行されていることを確認してください。\\ >rmg(ZenGo) ===== プログラムモード ===== コマンドをプログラムに記述し、自動的に順番に実行させることが可能です。 プログラムはモーションデータ等と同じ場所の、 (マイドキュメント)\Go Simulation!\ROBOT_PROJECTS\(ロボット名)\ Program の下に置いてください。 ここにtest.txtというファイルを作成し、以下のプログラムを記述して保存してください。 #-------------------- :START #もし上ボタン(KEY_UP)を押されたら if(KEY=KEY_UP){ #モーション(0Walk)を実行する rmo(0Walk) } #KEYクリア KEY=0; #1ミリ秒待ち #goto文の前に必ず入れてください wait(1) #ラベルSTARTに行く goto START コマンドウィンドウから、以下のように実行してください run(test) ジョイパッドの↑ボタンを押すと、ロボットが前進歩行(0Walkモーションの実行)します。 このようにロボットのプログラムを作成することができます。\\ バトルで使用できるAI実行のロボットもプログラムで動いています。 ===== 予約語 ===== ^予約語 ^機能 ^使用例 ^ |else |if文の分岐 |if(KEY=KEY_R1){\\  :rmo(0TurnRight)\\ }else if(KEY=KEY_L1){\\  :rmo(0TurnLeft)\\ }else{\\ } | |else if |if文の分岐 |〃 | |exit |プログラムの停止 |exit | |goto |ラベルまでジャンプする |goto AAA\\ (別の行で:AAAが定義されていること)| |help |ヘルプの表示 |help | |if |if文 |elseを参照 | |motion |モーション配列の実行 |motion(_0Walk) | |rmo |モーションの実行 |rmo(0Walk) | |rmg |モーショングループの実行 |rmg(ZenGo) | |run |プログラムの実行 |run(joystick)\\ または単に\\ run\\ と打つとmain.txtが実行されます | |wait |1ミリ秒単位で、待ち時間の設定 |wait(1) | |: |ラベル名の定義 |:AAA | |; |計算結果をコマンドウィンドウに表示させないようにする |a=1; |