ロボットに黒い線の上を走らせてみよう
 2011年6月13日(月)
      
線に沿って走る

- [吉田]た、立った!!ロボ太が立ったよ~!これで自立は完成だね~!
 - [舟元](ロボ太って何だ??)うん。次は、ラインをトレースしてみようよ。
 - [吉田]んー。でも、ラインをトレースって、線のとおりに走るんでしょ?そんなことできるの?
 - [舟元]大丈夫、大丈夫。こんな感じで、白だったら右、黒だったら左、というのを繰り返せば、線の左縁を走っていけるんだよ。
 
| 
				 
  | 
		
| 図6:ライントレースの動作イメージ | 
- [吉田]ほほー。なるほどねー。でも、白とか黒とかってどうするの?
 - [舟元]光センサっていうのが付いているでしょ。
 - [吉田]この下向きに付いてるやつ?でも光センサでどうするの?色が分かるの?
 - [舟元]そこなんだけど、光センサは、センサ周辺の明さを測るセンサだから色自体は分からないんだ。でも、黒いところよりも白いところのほうが光をよく反射するから、それで黒なのか白なのかが分かるんだよ。
 - [吉田]光センサの値を、この値なら白で、この値なら黒っていう感じに、プログラムで色に変換すれば良さそうだね。
 - [舟元]光センサの値は、白いと低くなって黒いと高くなるから、プログラムのイメージはこんな感じかな。
 
色で進む方向(右か左)を決める:
forward = 前進量;
lightness = ecrobot_get_light_sensor(光センサのポート);
if (lightness < 黒と白の境界) {
    turn = 右旋回量;
} else {
    turn = 左旋回量;
}
黒と白の境界は、実際に白いところと黒いところの光センサの値を計測して、その中間となる値を設定してください。
- [吉田]よし。じゃあ、さっき作ったやつに組み込んでみよう。
 
ライントレースをするタスク:
TASK(Main) {
    S8 pwm_l, pwm_r;
    S8 forward = 0, turn = 0;
    U16 lightness;
    nxt_motor_set_count(PORT_MOTOR_L, 0);
    nxt_motor_set_count(PORT_MOTOR_R, 0);
    balance_init();
    ecrobot_set_light_sensor_active(PORT_LIGHT);
    while (1) {
        if (isPushed() == 1) {
            break;
        }
        systick_wait_ms(100);
    }
    while (1) {
        forward = 20;
        lightness = ecrobot_get_light_sensor(PORT_LIGHT);
        if (lightness < BLACK_WHITE_THRESHOLD) {
            turn = 80; // 白いときは、右へ
        } else {
            turn = -80; // 黒いときは、左へ
        }
        balance_control(
                forward, turn,
                ecrobot_get_gyro_sensor(PORT_GYRO),
                GYRO_OFFSET,
                nxt_motor_get_count(PORT_MOTOR_L),
                nxt_motor_get_count(PORT_MOTOR_R),
                ecrobot_get_battery_voltage(),
                &pwm_l, &pwm_r);
        nxt_motor_set_speed(PORT_MOTOR_L, pwm_l, 1);
        nxt_motor_set_speed(PORT_MOTOR_R, pwm_r, 1);
        systick_wait_ms(4);
        if (isPushed() == 1) {
            break;
        }
    }
    nxt_motor_set_speed(PORT_MOTOR_L, 0, 0);
    nxt_motor_set_speed(PORT_MOTOR_R, 0, 0);
    while (1) {
        systick_wait_ms(100);
    }
}
- [吉田]お!走ったぁ。
 - [舟元]やっとスタートに立てたね。
 - [吉田]でも、なんかガタガタしていて、イメージと違うなー。もっとスイスイ走っていけないものなの?
 - [舟元]今はまだ一番簡単な方法だからね。まだまだスムースでもないし遅いし。次回はスムースに走るように修正していこう。
 
今回のまとめ
- [吉田]今回は、走行体で動くソフトウェアを作るために最低限必要なファイルの理解と、走行体が自立する仕組みを教わって、実際にソフトウェアで自立させました。さらに自立した状態でライントレースまでできちゃいました。
 
- 走行体を制御するソフトウェアでは、ecrobotとリアルタイムOSのAPIを利用する。
 - ecrobotは、センサーの値を読み込んだり、モーターを動かしたりする。
 - リアルタイムOSは、ソフトウェアの構成や動きを担当する。
 - 走行体を自立させるためには、倒立振子ライブラリを使う。
 - 倒立振子ライブラリは、走行体の傾きなどからモーターをどれだけ回せば良いかを計算してくれる。
 - センサーの入力からアクチュエータの制御量を決め制御する制御のことをフィードバック制御という。
 - 人間の時間と、コンピュータの時間は違う。
 - 人間が1回タッチセンサを押しただけだと思っていても、走行体は起動チェックと終了チェックの2回のチェックを実行していた。
 - 押されているかの確認ではなくて、押されていない状態から押された状態に変化するときをチェックすればOK。
 - 白なら左、黒なら右を繰り返してライントレースすることができる。
 - 走行体は、直接色は分からないので、光センサを通して明さを色に変換する。
 

※レゴ、レゴ マインドストームは、レゴグループの登録商標です。
【参照リンク】
<最終アクセス:2011.06>
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
  



