線に沿って走る

  1. [吉田]た、立った!!ロボ太が立ったよ~!これで自立は完成だね~!
  2. [舟元](ロボ太って何だ??)うん。次は、ラインをトレースしてみようよ。
  3. [吉田]んー。でも、ラインをトレースって、線のとおりに走るんでしょ?そんなことできるの?
  4. [舟元]大丈夫、大丈夫。こんな感じで、白だったら右、黒だったら左、というのを繰り返せば、線の左縁を走っていけるんだよ。

図6:ライントレースの動作イメージ
  1. [吉田]ほほー。なるほどねー。でも、白とか黒とかってどうするの?
  2. [舟元]光センサっていうのが付いているでしょ。
  3. [吉田]この下向きに付いてるやつ?でも光センサでどうするの?色が分かるの?
  4. [舟元]そこなんだけど、光センサは、センサ周辺の明さを測るセンサだから色自体は分からないんだ。でも、黒いところよりも白いところのほうが光をよく反射するから、それで黒なのか白なのかが分かるんだよ。
  5. [吉田]光センサの値を、この値なら白で、この値なら黒っていう感じに、プログラムで色に変換すれば良さそうだね。
  6. [舟元]光センサの値は、白いと低くなって黒いと高くなるから、プログラムのイメージはこんな感じかな。

色で進む方向(右か左)を決める:

forward = 前進量;
lightness = ecrobot_get_light_sensor(光センサのポート);
if (lightness < 黒と白の境界) {
    turn = 右旋回量;
} else {
    turn = 左旋回量;
}

黒と白の境界は、実際に白いところと黒いところの光センサの値を計測して、その中間となる値を設定してください。

  1. [吉田]よし。じゃあ、さっき作ったやつに組み込んでみよう。

ライントレースをするタスク:

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);
    }
}
  1. [吉田]お!走ったぁ。
  2. [舟元]やっとスタートに立てたね。
  3. [吉田]でも、なんかガタガタしていて、イメージと違うなー。もっとスイスイ走っていけないものなの?
  4. [舟元]今はまだ一番簡単な方法だからね。まだまだスムースでもないし遅いし。次回はスムースに走るように修正していこう。

今回のまとめ

  1. [吉田]今回は、走行体で動くソフトウェアを作るために最低限必要なファイルの理解と、走行体が自立する仕組みを教わって、実際にソフトウェアで自立させました。さらに自立した状態でライントレースまでできちゃいました。
  • 走行体を制御するソフトウェアでは、ecrobotとリアルタイムOSのAPIを利用する。
  • ecrobotは、センサーの値を読み込んだり、モーターを動かしたりする。
  • リアルタイムOSは、ソフトウェアの構成や動きを担当する。
  • 走行体を自立させるためには、倒立振子ライブラリを使う。
  • 倒立振子ライブラリは、走行体の傾きなどからモーターをどれだけ回せば良いかを計算してくれる。
  • センサーの入力からアクチュエータの制御量を決め制御する制御のことをフィードバック制御という。
  • 人間の時間と、コンピュータの時間は違う。
  • 人間が1回タッチセンサを押しただけだと思っていても、走行体は起動チェックと終了チェックの2回のチェックを実行していた。
  • 押されているかの確認ではなくて、押されていない状態から押された状態に変化するときをチェックすればOK。
  • 白なら左、黒なら右を繰り返してライントレースすることができる。
  • 走行体は、直接色は分からないので、光センサを通して明さを色に変換する。

※レゴ、レゴ マインドストームは、レゴグループの登録商標です。

【参照リンク】

ETロボコン2011公式サイト

<最終アクセス:2011.06>

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30