こんにちは、しゅうです。今回はパンは一旦お休みです。
前回はセンサの物理調整と内部調整を行いました。
今回は、タイヤ径やタイヤ間距離の内部調整、つまり今回もparameters.h
ファイルに書かれている値を調整します。この時、壁を認識して位置調整を行うCON_WALL_KP
の値を0.0にするのをお忘れなく!これが0.2などの値のままだと純粋なタイヤ径やトレッド幅の調整ができなくなってしまいます。
3) タイヤ周りの調整
タイヤ径
まずはタイヤから調整します。この数値はparameters.h
の6行目あたりにある#define TIRE_DIAMETER
で定義されています。
調整モード2にまっすぐ走行するプログラムが設定されているので、それを実行します。
この時、straight_check(x)
にある変数x
は進みたい距離を表します。ここで言う「距離」とは迷路の区画が単位となっています。つまり、xを4とした場合は4区画分直進します。さらに、1区画は180mm x 180mmであるため、xが4の場合は180*4 = 720 mm直進します。広めのスペースを確保することをお勧めします。次の動画は実際にstraight_check(4)
を実行した時の様子です。
直進する距離が少ないと、小さい誤差に気付きにくくなります。ここで直進する距離を増やすとその誤差が積み重なり、大きくなり、気付きやすくなります。これを「積算誤差」と呼びます。ただし、広いスペースを確保できない時は3区画分ほどでも問題ありません。
動かすときは、タイヤの中心が迷路の柱に並ぶようにおいてから実行しましょう。するとマウスが進んだ距離と設定した距離にどの程度ずれが生じたのかが分かりやすくなります。
デフォルトではTIRE_DIAMETER
は48です。小数点以下の調整も可能で、進みすぎたら48+0.1のように値を大きくし、足りない場合は48-0.1のように値を小さくして調整を行います。
詳しい理由は、「本体組立完成後 まとめ」マニュアルを参照してください。
タイヤ間距離
次はタイヤ間距離の調整です。この数値はparameters.h
の#define TREAD_WIDTH
で定義されています。先程のタイヤ径のすぐ下にあります。ここで、タイヤ間距離とは次の図に示すところの距離になります。
調整モード3に直進→180度回転→直進→180度回転、を繰り返すプログラムが設定されています。
ただし、このプログラムを実行するためには、直径が3から4区画ある円形のスペースが必要となります。それは、この「180度回転」が必ずしもぴったり180度にはならないからです。プログラム上のタイヤ間距離が実際のものと異なる場合、回転角度が多かったり小さかったりします。そのため、Pi:Coがだんだんと左右にズレていきます。ここで、とある先輩のブログを読んで得た情報を共有します。
それは「回転調整方法を独自に設定すること」です。ただひたすらにその場回転をさせます。プログラム自体は難しくありませんが、下記にrotate
関数を用いた関数を示します。
// This does a 360 turn on the spot
void rotate_many(int x){
access = SEARCH_ACCEL; // Inserting the value defined at parameters.h
wait_ms(1000); // Wait one second
rotate(right, x*4); // rotate to the right 90 degrees, x*4 times
}
引数int x
は回転の回数を示します。rotate
関数は90度ずつ回転をする関数なので*4をすることで1回転になります。
こちらの動画は調整前のもので
こちらの動画は調整した後のものです。
最後に!
以上でパラメータ調整は完了です。ここで、壁補正の値CON_WALL_KP
を元の値に戻し、計測したり調整した値を書き込んだファイルを保存、ビルドをして無事Pi:Coに書き込み終えたらモード1を実行してみましょう。左手法で迷路内を走ります。スタートは左下でゴールは右上にあります。
後半、ゴールから戻ろうとしている途中で壁に近付きすぎるところがありました。これは迷路の場所によって照明の当たり具合がかわりセンサ値がばらけていることが考えられます。大会本番では大きい迷路が用いられるので、十分に起きそうですね・・・もう少しパラメータ調整を試みる必要があるかもですね。
次回はこの左手法などの迷路解析手法について解説いたします。