パラメータといえば数学では「媒介変数」というものですが、ロボットのプログラミングではロボットの挙動を間接的に決めるための数値、という意味合いです。たとえば前回の「許容するライン中央からのずれ幅」や「ロボットを回転させる速度」もパラメータといえます。
最適なパラメータはロボットの設計、更には部品の個体差、コースの状況によって違います。今回は対話形式でのパラメータ調整を行う方法を紹介します。
今回はロボットのプログラミングというよりは次回以降の準備ですので、先にプログラムを示した上で必要な部分を説明します。
ビルド方法は第1回を参考にしてください。
まず前回同様、センサー調整を行います。センサー全部を黒い線の上に載せてスペースキーを押し、続いてセンサー全部を白い床の上に移動させてスペースキーを押します。
するとパラメータ調整画面が表示されます。
1. deadband=0.200000 2. turn speed=127 >
これは変更するパラメータを選ぶ画面です。現在のパラメータの値を表示しています。deadbandは中央からどのくらいずれたら復帰しようとするか、turn speedは復帰動作で車体を回転させる速度です。たとえば線から外れた時の回転速度を変えたい場合は2[Enter]と操作します。すると
value=
と表示されますので変更後の値を入力してください。たとえば60[enter]と入力します。パラメータ一覧に戻ります。変更されたのを確認してください。
パラメータを選ぶ画面、「>」に対して[Enter]のみを入力すると調整モードを終了します。
調整モード終了後、スペースキーを押すとライン追従動作を開始します。ロボットをラインの上に置いて動作を確認してください。[Esc]キーを押すとライン追従動作を終了し、パラメータ調整画面に戻ります。
パラメータによってロボットの動きが変わるのを確認してください。
ライン追従のプログラムはline_traceという名前の関数にまとめました。中のプログラムは前回とほとんど同じです。違いはturn_speed=回転速度とdeadband不感帯幅を引数として受け取り、それに応じた動作をする点です。例えば車体を回転させるようにモーターを駆動する部分は次のようになっています。
Mtr_Run(turn_speed, turn_speed, 0, 0); // 車体を左回転させる
パラメータ設定のメニューに相当する部分です。
while(1) {
int i;
char buf[80];
// 設定メニューを表示する
sprintf(buf, "1. deadband=%f\r\n2. turn speed=%d\r\n>",
deadband, turn_speed);
SciStrTx(buf, strlen(buf));
// どの値を調整するか入力する
if(inputDecInt(&i) == 0) {
//何も入力せずEnterを押した場合
break;
} else {
//何かが選択された場合
SciStrTx("value=", 6);
switch(i) {
case 1:
inputDecFloat(&deadband);
break;
case 2:
inputDecInt(&turn_speed);
break;
}
}
}
シリアル通信から数値を入力できるようにするため、inputDecInt
、inputDecFloat
という関数を用意しました。
inputDecInt
シリアル通信から整数を入力する
引数:
int *dst 結果を格納する変数のアドレス
戻り値:
正常に1つの整数を読み取れたら1、
そうでないとき(たとえば何も入れずEnter)は0。
inputDecFloat(&deadband);
のように使います。呼び出されると(シリアル通信の)入力待ちになります。Enterを押すと変数deadbandに入力した数が入ります。1文字も数字がなかった場合、例えばabc[Enter]と入力した場合や[Enter]のみを入力した場合はdeadbandの値は変わりません。
&
はアドレス演算子というものです。詳しくは大抵のC言語の入門書の関数呼び出しおよびポインタに関する項に載っていますので割愛します。