黒ラインをトレースするプログラム(改良版) ~レゴマインドストームEV3~ | そう備忘録

黒ラインをトレースするプログラム(改良版) ~レゴマインドストームEV3~

ライントレースの改良版について

以前に教育用レゴマインドストームEV3のトレーニングロボットを使って楕円コースの黒ライン上をトレースするプログラムを作成した。

その時のプログラムはカラーセンサーで黒ライン上かそうで無いかを判断してスイッチブロックで左右の車輪のどちらか一方を停止して、蛇行をしながらライントレースをする一番単純なプログラムだった。

※詳細は前回の記事を参照

しかし蛇行をしながらのトレースは速度も遅いし電池も消耗するのでもう少しスマートな方法は無いかを試行錯誤した時の備忘録。

誰かの参考になれば幸いです。

トレーニングロボットによるライントレース 拡張版

尚、トレーニングロボットの組み立てについてはこちらを参照

プログラミングの方向性

前回のプログラム

まずは前回のプログラムの課題を検証する。

前回のプログラム
黒ラインをトレースするプログラム

どちらか一方の車輪が停止するロジックになっているので蛇行をしながらトレースするロジックになっている。

そのためライントレースは出来るのだけれども無駄な動きが発生してしまう。

改良の方向性

改良版のプログラムの方向性は以下の通り。

  1. 黒ラインと白い部分の真ん中を中心位置としてカラーセンサーでトレースする様にする
  2. 片方の車輪を停止するのでは無く、中心位置からの距離に比例して左右の車輪のパワーを制御してスムーズなトレースを行う
  3. 楕円コースの時計、反時計回り両方でトレースできるようにする

尚、今回はハード(機体)の改良は行わずにソフトウェアでの改良を目指す。

カラーセンサーを2つにしたり車輪の改良などによってもスムーズなトレースは実現できると思うのだけれども、まずはソフトウェアでの改良を目指すことにした。

黒ライン上のカラーセンサー

トレースの中心位置とパワーの制御

「黒ラインと白い部分の真ん中をトレースする」を図にすると以下の通り。

トレースの中心位置

また「中心位置からの距離に比例してパワーの制御を行う」のイメージ図は以下の通り。

左右の車輪のパワー制御のイメージ図

中心位置の反射光の強さの測定

まずは中心位置と黒、白位置での反射光の強さをカラーセンサーで測定する。

尚、この値は環境(朝、昼、夜、室内、室外など)によっても変わってくるので環境が変わるたびに測定をし直した方が確実。

EV3ソフトウェアから読み取る

測定方法で一番簡単なのはカラーセンサーを所定の位置に置いてレゴマインドストームEV3のソフトウェアの右下にリアルタイムに表示される数値を読み取る方法。

レゴマインドストームEV3ソフトウェア

結果は以下の通り

中心位置

反射光の強さ:42

ここが中心位置となるようプログラミングする

反射光の強さ 中心位置

黒ライン上

反射光の強さ:10

※黒は光を吸収するので反射光の強さは弱くなる

反射光の強さ 黒ライン上

反射光の強さ:84

※反対に白は光を反射する

反射光の強さ 白

反射光の強さの推移を可視化する

プログラミングをする分には上記の測定結果で十分なのだが、念の為データロギングブロックを使って反射光の強さの推移を可視化してみる。

トレーニングロボットで黒ラインを横切りながら反射光の強さをロギングする。

反射光の強さの推移、測定方法

測定時のプログラムは以下の通り

データロギングプログラム
データロギングプログラム

プログラム開始

データロギング開始

  • 1秒間に10回測定
  • カラーセンサーの反射光の強さを測定する
  • 測定結果をインテリジェントブロックのMyDataに保存する

パワー5でゆっくりと直進する

データロギング終了

上記プログラムを実行した後にレゴマインドストームEV3のソフトウェアで「+」ボタンー>「新しい実験」をクリックする。

新しい実験

次に右下のアップロードをクリックするとインテリジェントブロックと通信をする。

アップロードボタン

対象プログラムのフォルダーの下のMydata.rdfファイルを選択してインポートする。

対象のファイルを選択してインポートする

データロギングの結果がインポートされて表示される。

反射光の強さの推移

上記のグラフの結果から以下のことが分かる

  • 白紙上での反射光の強さは84前後(最初の測定結果と同じ)
  • 黒ライン上での反射光の強さは10前後(最初の測定結果と同じ)
  • 白→黒へ移動時の測定結果は完全に比例している訳ではない(※印部分が直線では無い)

カラーセンサーは等速度で移動しているので白から黒への移動時に完全に直線になれば比例していると言えるのだが最初と最後の部分で若干だが直線の角度が変わっている。

このカラーセンサー特有の現象なのか、どの個体でも同様の傾向が見られるのかは分からないがカラーセンサーの照射跡が丸いのでもしかしたらそのせいなのかも知れない(反射光の強さは完全に比例した測定ができないのかも)

いずれにしても今回はそれ程大きな影響は出ないだろうとの判断で、完全に比例しているという前提でプログラミングをする事にした。

カーブを曲がるために必要な左右のパワー差

次に楕円コースのカーブの部分をスムーズに曲がるのに必要な左右車輪のパワー差を探してみた。

カーブを曲がれるパワー差を求める

nに複数の値を入れて実際に時計周りでカーブを曲がってみた所、n=10(左右のパワー差=20)ときにスムーズに曲がれることが判明した。

しかし反時計回りの場合は黒ラインの内側を走行するので若干カーブがキツくなる事とカーブで中心位置から外れた時はより強い角度で走行ラインを補正する必要があるのでnの最大値は15~20前後(左右のパワー差=30~40前後)で補正するのが良いのではないかと当たりをつけた。

プログラム概要

プログラムの概要は以下の通り

  1. 初期値の設定
  2. リアルタイムの反射光の強さから補正値を計算
  3. 補正値を左右の車輪のパワーに加・減算

大きく分けて上記3つのロジックから成り立っている。

尚、記事の最後にプログラミングと実際を動きの動画を載せているので確認してみて欲しい

プログラム概要

プログラム全体

プログラム全体

プログラム開始

変数Centerに42を格納する

変数Powerに30を格納する

5~13までを繰り返す

カラーセンサーで反射光の強さを測定する

変数Centerから42を取り出す

(反射光の強さー42)÷2.4を計算して補正値として出力する

変数Powerから30を取り出す

30+補正値を計算して出力する

10

9の結果を左車輪のパワー値とする

11

変数Powerから30を取り出す

12

30ー補正値を計算して出力する

13

12の結果を右車輪のパワー値とする

使用したブロック

今回使用したブロックは以下の5種類。

変数ブロック

プログラム中の数値や文字列、ロジック(”真” or ”偽”)を保存することができる。

変数ブロックの詳細についてはこちらの記事を参照のこと。

変数 Center 書き込み

黒ラインと白い部分の中心位置の反射光の強さ(42)を保存する為の変数

  • 変数:書き込み、数値
  • 値:42
変数 Center 読み込み

中心位置の反射光の強さ(42)を読み込む

  • 変数:読み込み、数値
  • 値:データワイヤーで数学ブロックに値を引き渡す
変数 Power 書き込み

直進時の車輪のパワー値を保存する

  • 変数:書き込み、数値
  • 値:30

この値をベースに左右の車輪のパワーを加・減算して黒ラインをトレースする

変数 Power 読み込み

直進時の車輪のパワー値(30)を読み込む

  • 変数:読み込み、数値
  • 値:データワイヤーで数学ブロックに値を引き渡す

ループブロック

指定した条件に一致するまでループ(同じ処理を繰り返す)する。

ループブロック

プログラム終了まで繰り返す

  • ループ:無限

カラーセンサーブロック

カラーセンサーには3種類のモードがある。

  1. 色の判定
  2. 反射光の強さの測定
  3. 周囲の光の強さ(明るさ)の測定

今回は2の反射光の強さを測定するモードを使用する。

カラーセンサー 反射光の強さ

カラーセンサーの反射光の強さを測定してデータワイヤーで出力する

  • カラーセンサー:測定、反射光の強さ
  • 照明:測定値をデータワイヤーで出力する

数学ブロック

数学計算を行って結果を出力する

数学ブロックの詳細についてはこちらの記事を参照のこと。

数学ブロック 補正値の計算

現在の反射光の強さと中心位置の反射光の強さ(42)との差から補正値を計算する

  • 数学:拡張機能
  • a:現在の反射光の強さがデータワイヤーで入力される
  • b:中心位置の反射光の強さ(42)がデータワイヤーで入力される
  • c:2.4※
  • d:未使用
  • =:計算結果、データワイヤーで出力する
  • 計算式:(aーb)÷c

※aーbの値をそのまま左右の車輪のパワーに加・減算してしまうと値が大きすぎて蛇行してしまうので、適当な数値で割っている

数値の根拠は以下の通り

白紙上にいる場合

  • 白の時の反射光の強さ:84
  • 中心位置の反射光の強さ:42

(84ー42)÷2.4=17.5 ← カーブを曲がる時のパワー差を参照

黒ライン上にいる場合

  • 黒ライン上の反射光の強さ:10
  • 中心位置の反射光の強さ:42

(10ー42)÷2.4=-13.3

実際には3から0.2刻みで色々な数値を試してみて時計、反時計回りでスムーズにトレースする数値を見つけた

また中心位置と白紙上との差が42(84-42)で中心位置と黒ライン上との差が32(43-10)なのでより正確に補正するためにはカラーセンサーの測定値が42以下の時(黒ライン寄り)のときにはより強めに補正する必要がある。

例えば42/32を乗算するなどである。

より細かくチューニングする時にはスイッチブロックで計算処理を分岐したほうが良いが、実験の結果このままでも両周りでトレースは可能だったので今回はこの計算式でいくことにした

数学ブロック 左車輪のパワーの補正

ベースのパワー(30)と上記の補正値を合算して左車輪のパワーに代入する

  • 数学:足し算
  • a:ベースのパワー30をデータワイヤーで受け取る
  • b:補正値をデータワイヤーで受け取る
  • 結果:a+bの結果をデータワイヤーで左車輪(ポートB)のパワーに引き渡す
数学ブロック 右車輪のパワーの補正

ベースのパワー(30)から補正値を減算して右車輪のパワーに代入する

  • 数学:引き算
  • a:ベースのパワー30をデータワイヤーで受け取る
  • b:補正値をデータワイヤーで受け取る
  • 結果:aーbの結果をデータワイヤーで右車輪(ポートC)のパワーに引き渡す

反射光の強さと補正値、両車輪のパワーと結果の関係は以下の通り。

現在位置反射光の強さ補正値左車輪右車輪結果
中心位置42(42-42)÷2.4=030+0=3030-0=30直進する
白紙寄り60(60-42)÷2.4=7.530+7.5=37.530-7.5=22.5右に曲がる
黒ライン寄り30(30-42)÷2.4=-530+(-5)=2530-(-5)=35左に曲がる

Lモーターブロック

左右のパワーの計算結果をデータワイヤーで受け取って制御する。

Lモーター 左車輪

左車輪のパワーを制御する

  • Lモーター:オン
  • パワー:数学ブロックから計算結果を受け取る
  • ポート:B
Lモーター 右車輪

右車輪のパワーを制御する

  • Lモーター:オン
  • パワー:数学ブロックから計算結果を受け取る
  • ポート:C

プログラミングと実際に動かしてみた時の動画

プログラミングと実際に動かしてみた時の動画。

ライントレースの様子は動画だと分かりやすいので見て欲しい。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

4件のフィードバック

  1. 玉ねぎ ボーヤ より:

    EV3を使ってセンサー2個でライントレースをしようと思ったのですが、なかなか上手くいかずどのようなプログラムをすればよいのかわかりません。誰か質問できる人がいるわけでもないのでそのまま放置だったのですが久しぶりにやってみようと思って質問しました。なかなかセンサー二つで走らせるプログラムの紹介をしている人がいなかったので紹介していただけると有難いです。センサーを2個使う理由はコースの途中でラインが途切れているところがセンサー1個じゃ走破できないのでセンサーを二個にしました。2個にしてみた事はいいけどプログラムが分からない…教えてくださーい!!

  2. 匿名 より:

    EV3を使ってカラーセンサ一つでやっているのですが黒い板に白いラインだとどのような変更をすればいいのでしょうか

    • souichirou より:

      基本的にこのページのプログラムの逆をやれば良いと思います。
      つまり白寄りなら左に、黒寄りなら右に曲がるようにするので「プログラム全体」のロジックだと処理10(ポートB)と処理13(ポートC)を逆にすれば白ライントレースをするように思います。
      また白と黒の真ん中の反射光の強さですがこのプログラムでは42に設定していますがそれも調整が必要だと思います。

玉ねぎ ボーヤ へ返信する コメントをキャンセル

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。