黒ラインをトレースするプログラム(改良版) ~レゴマインドストームEV3~
Contents
ライントレースの改良版について
以前に教育用レゴマインドストームEV3のトレーニングロボットを使って楕円コースの黒ライン上をトレースするプログラムを作成した。
その時のプログラムはカラーセンサーで黒ライン上かそうで無いかを判断してスイッチブロックで左右の車輪のどちらか一方を停止して、蛇行をしながらライントレースをする一番単純なプログラムだった。
※詳細は前回の記事を参照
しかし蛇行をしながらのトレースは速度も遅いし電池も消耗するのでもう少しスマートな方法は無いかを試行錯誤した時の備忘録。
誰かの参考になれば幸いです。
プログラミングの方向性
前回のプログラム
まずは前回のプログラムの課題を検証する。
どちらか一方の車輪が停止するロジックになっているので蛇行をしながらトレースするロジックになっている。
そのためライントレースは出来るのだけれども無駄な動きが発生してしまう。
改良の方向性
改良版のプログラムの方向性は以下の通り。
- 黒ラインと白い部分の真ん中を中心位置としてカラーセンサーでトレースする様にする
- 片方の車輪を停止するのでは無く、中心位置からの距離に比例して左右の車輪のパワーを制御してスムーズなトレースを行う
- 楕円コースの時計、反時計回り両方でトレースできるようにする
尚、今回はハード(機体)の改良は行わずにソフトウェアでの改良を目指す。
カラーセンサーを2つにしたり車輪の改良などによってもスムーズなトレースは実現できると思うのだけれども、まずはソフトウェアでの改良を目指すことにした。
トレースの中心位置とパワーの制御
「黒ラインと白い部分の真ん中をトレースする」を図にすると以下の通り。
また「中心位置からの距離に比例してパワーの制御を行う」のイメージ図は以下の通り。
中心位置の反射光の強さの測定
まずは中心位置と黒、白位置での反射光の強さをカラーセンサーで測定する。
尚、この値は環境(朝、昼、夜、室内、室外など)によっても変わってくるので環境が変わるたびに測定をし直した方が確実。
EV3ソフトウェアから読み取る
測定方法で一番簡単なのはカラーセンサーを所定の位置に置いてレゴマインドストームEV3のソフトウェアの右下にリアルタイムに表示される数値を読み取る方法。
結果は以下の通り
反射光の強さの推移を可視化する
プログラミングをする分には上記の測定結果で十分なのだが、念の為データロギングブロックを使って反射光の強さの推移を可視化してみる。
トレーニングロボットで黒ラインを横切りながら反射光の強さをロギングする。
測定時のプログラムは以下の通り
1 | プログラム開始 |
2 | データロギング開始
|
3 | パワー5でゆっくりと直進する |
4 | データロギング終了 |
上記プログラムを実行した後にレゴマインドストームEV3のソフトウェアで「+」ボタンー>「新しい実験」をクリックする。
次に右下のアップロードをクリックするとインテリジェントブロックと通信をする。
対象プログラムのフォルダーの下のMydata.rdfファイルを選択してインポートする。
データロギングの結果がインポートされて表示される。
上記のグラフの結果から以下のことが分かる
- 白紙上での反射光の強さは84前後(最初の測定結果と同じ)
- 黒ライン上での反射光の強さは10前後(最初の測定結果と同じ)
- 白→黒へ移動時の測定結果は完全に比例している訳ではない(※印部分が直線では無い)
カラーセンサーは等速度で移動しているので白から黒への移動時に完全に直線になれば比例していると言えるのだが最初と最後の部分で若干だが直線の角度が変わっている。
このカラーセンサー特有の現象なのか、どの個体でも同様の傾向が見られるのかは分からないがカラーセンサーの照射跡が丸いのでもしかしたらそのせいなのかも知れない(反射光の強さは完全に比例した測定ができないのかも)
いずれにしても今回はそれ程大きな影響は出ないだろうとの判断で、完全に比例しているという前提でプログラミングをする事にした。
カーブを曲がるために必要な左右のパワー差
次に楕円コースのカーブの部分をスムーズに曲がるのに必要な左右車輪のパワー差を探してみた。
nに複数の値を入れて実際に時計周りでカーブを曲がってみた所、n=10(左右のパワー差=20)ときにスムーズに曲がれることが判明した。
しかし反時計回りの場合は黒ラインの内側を走行するので若干カーブがキツくなる事とカーブで中心位置から外れた時はより強い角度で走行ラインを補正する必要があるのでnの最大値は15~20前後(左右のパワー差=30~40前後)で補正するのが良いのではないかと当たりをつけた。
プログラム概要
プログラムの概要は以下の通り
- 初期値の設定
- リアルタイムの反射光の強さから補正値を計算
- 補正値を左右の車輪のパワーに加・減算
大きく分けて上記3つのロジックから成り立っている。
尚、記事の最後にプログラミングと実際を動きの動画を載せているので確認してみて欲しい。
プログラム全体
1 | プログラム開始 |
2 | 変数Centerに42を格納する |
3 | 変数Powerに30を格納する |
4 | 5~13までを繰り返す |
5 | カラーセンサーで反射光の強さを測定する |
6 | 変数Centerから42を取り出す |
7 | (反射光の強さー42)÷2.4を計算して補正値として出力する |
8 | 変数Powerから30を取り出す |
9 | 30+補正値を計算して出力する |
10 | 9の結果を左車輪のパワー値とする |
11 | 変数Powerから30を取り出す |
12 | 30ー補正値を計算して出力する |
13 | 12の結果を右車輪のパワー値とする |
使用したブロック
今回使用したブロックは以下の5種類。
変数ブロック
プログラム中の数値や文字列、ロジック(”真” or ”偽”)を保存することができる。
変数ブロックの詳細についてはこちらの記事を参照のこと。
ループブロック
指定した条件に一致するまでループ(同じ処理を繰り返す)する。
カラーセンサーブロック
カラーセンサーには3種類のモードがある。
- 色の判定
- 反射光の強さの測定
- 周囲の光の強さ(明るさ)の測定
今回は2の反射光の強さを測定するモードを使用する。
数学ブロック
数学計算を行って結果を出力する
数学ブロックの詳細についてはこちらの記事を参照のこと。
現在の反射光の強さと中心位置の反射光の強さ(42)との差から補正値を計算する
※aーbの値をそのまま左右の車輪のパワーに加・減算してしまうと値が大きすぎて蛇行してしまうので、適当な数値で割っている 数値の根拠は以下の通り
実際には3から0.2刻みで色々な数値を試してみて時計、反時計回りでスムーズにトレースする数値を見つけた また中心位置と白紙上との差が42(84-42)で中心位置と黒ライン上との差が32(43-10)なのでより正確に補正するためにはカラーセンサーの測定値が42以下の時(黒ライン寄り)のときにはより強めに補正する必要がある。 例えば42/32を乗算するなどである。 より細かくチューニングする時にはスイッチブロックで計算処理を分岐したほうが良いが、実験の結果このままでも両周りでトレースは可能だったので今回はこの計算式でいくことにした | |||||
ベースのパワー(30)と上記の補正値を合算して左車輪のパワーに代入する
| |||||
ベースのパワー(30)から補正値を減算して右車輪のパワーに代入する
|
反射光の強さと補正値、両車輪のパワーと結果の関係は以下の通り。
現在位置 | 反射光の強さ | 補正値 | 左車輪 | 右車輪 | 結果 |
中心位置 | 42 | (42-42)÷2.4=0 | 30+0=30 | 30-0=30 | 直進する |
白紙寄り | 60 | (60-42)÷2.4=7.5 | 30+7.5=37.5 | 30-7.5=22.5 | 右に曲がる |
黒ライン寄り | 30 | (30-42)÷2.4=-5 | 30+(-5)=25 | 30-(-5)=35 | 左に曲がる |
Lモーターブロック
左右のパワーの計算結果をデータワイヤーで受け取って制御する。
プログラミングと実際に動かしてみた時の動画
プログラミングと実際に動かしてみた時の動画。
ライントレースの様子は動画だと分かりやすいので見て欲しい。
EV3を使ってセンサー2個でライントレースをしようと思ったのですが、なかなか上手くいかずどのようなプログラムをすればよいのかわかりません。誰か質問できる人がいるわけでもないのでそのまま放置だったのですが久しぶりにやってみようと思って質問しました。なかなかセンサー二つで走らせるプログラムの紹介をしている人がいなかったので紹介していただけると有難いです。センサーを2個使う理由はコースの途中でラインが途切れているところがセンサー1個じゃ走破できないのでセンサーを二個にしました。2個にしてみた事はいいけどプログラムが分からない…教えてくださーい!!
玉ねぎボーヤさん
コメントありがとうございます?
センサー2個の時の記事です。
参考にしてみてください
https://www.souichi.club/lego/linetrace-03/
ポイントはセンサー2個で黒ラインをまたぐように設置することです。
頑張ってください!
EV3を使ってカラーセンサ一つでやっているのですが黒い板に白いラインだとどのような変更をすればいいのでしょうか
基本的にこのページのプログラムの逆をやれば良いと思います。
つまり白寄りなら左に、黒寄りなら右に曲がるようにするので「プログラム全体」のロジックだと処理10(ポートB)と処理13(ポートC)を逆にすれば白ライントレースをするように思います。
また白と黒の真ん中の反射光の強さですがこのプログラムでは42に設定していますがそれも調整が必要だと思います。