2024年11月12日

004-2.ライントレース入門-第2回「光センサの誤差」

「ライントレースロボット」とは、床面にある線(ライン)を追いかける(トレースする)ロボットのことです。こうしたロボットには「入力」と「出力」という制御の基本が詰まっている(なおかつ奥が深い)ので、ロボット競技の世界では定番の要素となっています。
このコーナーでは、「教育用レゴ マインドストームNXT(以下、NXT)」を使ってライントレースロボットを作り、制御することの面白さをお伝えしたいと思います。(文/松原拓也)

◆ センサの誤差とは

今回は光センサの誤差について考えてみたいと思います。

前回に引き続き、ライントレースロボットとして「三輪型ロボット」の互換機を使います。 このロボットはレゴマインドストームNXTの説明書に一番最初に登場するロボットと性能的に同じになるよう作られています。

ロボットにつなぐモータとセンサは次のとおりです。

  • 右モータ:出力ポートB(正転で前進)
  • 左モータ:出力ポートC(正転で前進)
  • 光センサ:入力ポート3

参考までに三輪型ロボットの裏側です。
後輪はキャスターになっています。

まずは誤差の検証その1、「距離による誤差」です。 過去に何度か紹介してきましたが、光センサは測定の対象となる物体との距離によって値が変わります。

実際に測定した結果がこちらです。
おおざっぱな計算ですが、1mmの距離の変化で明るさが1%ズレるようです(ちなみにこの現象を使って、光センサで距離を検出することもできます)。センサの値は5mmくらいがピークで、そこから激減します。センサの近づけすぎには注意しなくてはいけません。

◆ センサの個体差

誤差の検証その2、「回路の個体差」です。
光センサ内部の回路の性能の違いで起きる誤差を検証してみます。
ここでは、手持ちの光センサを3個用意しました。外見上はまったく違いがわかりません。左からa、b、cと呼ぶことにします。

光センサをシートの黒い部分に当てて、メニューの「View」を使って光センサの明るさを読みとってみました。

結果は写真のとおりです。
なんと最大で9%も違っていました。

さらにシートの白い部分も計って、グラフにしてみました。これが3つの光センサの特性です(なお、X方向の軸は白「1」か黒「0」だけです)。
グラフを見たところでは、3つの線がほぼ平行になりました。 違っているのは切片(土台となる値)だけで、感度はほぼ同じということになります。

◆ 照明の影響

誤差の検証その3、「照明の差」です。
照明の明るさがどれくらい光センサの値に影響を与えるか、検証してみました。

床から70cm手前に蛍光灯のライトを置いて、計測しました。
光センサの値は「30%」をしめしました。

そこから半分の距離、約35cmにライトを置き直します。
光センサの値は2%ほど増えて、「32%」をしめしました。

さらにライトを10cm手前まで近づけた状態。
光センサの値は一気に7%増えて、「39%」をしめしました。
光センサの値は30~39%の範囲で変動しました。

◆ 反射率の影響

誤差の検証その4、「反射率の差」です。
材質も大きさも同じ紙ですが、片方だけにセロハンテープを貼ってみました。

テープを貼ると、明るさが3%ほど増しました。見た目には変化ありませんが、センサには反応するようです。

最後にオマケとして、カメラのフラッシュが光センサにどんな影響を与えるのか、検証してみたいと思います。

フラッシュを検出するためのプログラムを作ってみました。 入力ポート3に接続した光センサの値をインテリジェントブロックの画面(LCD)にグラフとして表示します。
[Download]光センサのテストプログラム
(リテール版NXTソフトウェア1.0で作成)

プログラムを実行させて、その動作中にフラッシュを使って、カメラを撮影してみました(実際にフラッシュを使ったときの写真)。

結果は、、、反応ありません。
(もし反応があったらグラフに「ヒゲ」が現れる)。
5回ほどフラッシュ撮影をやってみましたが、同様に反応ありませんでした。 瞬間光なのでセンサが読みそこなったか、回路上で対策されているのでしょうか?
断言はしにくいのですが、フラッシュによる誤動作の心配はあまりなさそうです。

◆ センサの学習機能

今までの実験でわかった光センサの誤差をまとめると、次のようになります。

  • (1)距離による変化:最大40%
  • (2)センサの個体差:最大9%
  • (3)光源による変化:最大9%
  • (4)反射率による変化:最大3%

一般的な環境で白と黒との明るさの差が25%だとすると、この変化の大きさは無視できません。
動作する場所が変わったり、部品が変わることでロボットが正しく動かなくなることが考えられます。 これは、ロボット競技では重要な問題となります。

そこで、今回はロボットの「学習機能」を取り入れたライントレースロボットを作ってみました。
学習機能というと大げさですが、光センサの「しきい値」の調整をできるだけ簡単に済ませるように工夫しています。
プログラムが長くなってしまいましたので、前半と後半に分けて紹介します。
[Download]ライントレーサ1号機
(リテール版NXTソフトウェア1.0で作成)

プログラムの前半です。
光センサのしきい値を学習する部分です。「Center」という変数に光センサの値を入れています。

プログラムの後半です。
ラインをトレースする部分です。変数「Center」の値を元に光センサの差を求め、それに比例して左右のモータのパワーを割り振ります。

プログラムを実行した様子です。
実行すると、画面には「siro50% kuro50%」と表示されます。

この状態で、光センサをシートの「白」と「黒」の中間の位置に合わせます。赤い光の円が、ぴったり中心の位置にくるように調節してください。

光センサの位置が中心に合わさったら、ここでオレンジのENTER(入力)ボタンを押します。これで、光センサのしきい値を記憶して、走り出します。

このプログラムでは、光センサの値に比例してモータのパワーを設定しています。ジグザグに進まず、なめらかに進むのが特徴です。

ちなみにこの学習した「しきい値」は電源を切ると、忘れてしまいます。この値を消さないためにはファイル書きこみ/読み込みのブロックを使ってみるといいのではないでしょうか。

◆ センサの学習機能2

先に紹介したプログラムは、「光センサを白と黒の中間の位置に合わせる」という作業をとっていました。
しかし、これを正確に行うのが面倒なので、「白」と「黒」、2度に分けて学習するという方式に改造してみました。
プログラムの前半部分を、こちらの写真のように書き換えます。
[Download]ライントレーサ2号機
(リテール版NXTソフトウェア1.0で作成)

、、、と、いう改造をやってみたのですが、いきなり失敗しました。
1号機の時よりも動作が安定せず、直線でジグザグに進んでしまいます。
これはいったいなぜでしょう?

プログラムの前半部分の最後に、写真のようなブロックを追加します。これで、設定値が画面に表示されるようになります。
このプログラムを実行してみるとわかりますが、実際の中間の値よりも少ない値が表示されました。
「白と黒を足せば中間の値になる」と考えていたのですが、実際には違うようです。

これについては、白と黒の感度の違いという説を考えたのですが、きちんと検証できませんでした。
次回では、ハッキリさせたいと思います。

当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。