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

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

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

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

前回の記事はこちら

中心位置からの距離に比例して左右の車輪のパワーを補正する事により比較的スムーズにライントレースをする事ができたが、パワーを上げてスピードを出すとトレースから外れてしまうことも時々発生していた。

今回はカラーセンサーを2つ付けてライントレースのスピードアップを目指した時の備忘録。

カラーセンサー2つでライントレース

カラーセンサーを2つにする理由

カラーセンサーが1つの時のライントレース方法は黒ラインと白い部分の真ん中をトレースしていた(詳細は前回の記事を参照)。

この方法は進行方向に向かって右側に黒ライン、左側に白紙がある状態を維持するように両車輪のパワーを制御するのだが、カーブを曲がりきれない、車輪が滑る等の理由で右側に白紙を検出してしまうと一気にコースアウトしてしまう。

理由は常に左側に白、右側には黒ラインが”ある”前提でプログラミングをしているので逆の状態になると車輪を逆に制御してしまうためだ。

特にスピードを出すと何かの加減でコースアウトする可能性が高まり、安定的な走行をする為には両車輪のパワーが30前後までだった。

一方、カラーセンサーを両側に2つ付ける方法だとラインから外れた時の許容範囲が広がるので、よりスピードを出しやすくなる。

カラーセンサー1つと2つの違い

制御の考え方

前提

黒は光を吸収するので反射光の強さは弱くなる、逆に白は光を反射するので反射光の強さは強くなる。

当方の環境での反射光の強さは以下の通りだった。

測定の詳細については前回の記事を参照の事。

白紙上

84前後

黒ライン上

10前後

尚、外部環境(室内、屋外、昼、夜など)によっても測定値は変わってくるので必要に応じてその都度測定をした方が良い。

制御方法

カラーセンサーが2つの時の制御の基本的な考え方は以下の通り。

左右のカラーセンサーの反射光の強さの差分を利用して左右の車輪のパワーを制御する。

尚、カラーセンサーも個体差があるので個体差間の若干の補正を行う必要もあるので注意が必要。

カラーセンサーが2つの時の制御の考え方

プログラム概要

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

  1. 初期値の設定
  2. 左右のカラーセンサーの反射光の強さの差分から補正値を計算
  3. 補正値を左右の車輪のパワーに加・減算

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

基本的な考え方は前回のカラーセンサーが一つの時と同様だが左右のカラーセンサーの反射光の強さの差分を元にパワーを制御する所が若干異なる。

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

プログラム概要

プログラム全体

プログラム全体図

プログラム開始

変数Powerに60を格納する

4~11までを繰り返す

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

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

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

変数Powerから60を取り出す

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

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

10

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

11

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

使用したブロック

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

変数ブロック

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

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

変数ブロック 書き込み

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

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

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

変数ブロック 読み込み

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

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

ループブロック

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

ループブロック

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

  • ループ:無限

カラーセンサーブロック

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

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

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

カラーセンサーブロック

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

ポート1と4の2つのカラーセンサーで反射光の強さを測定する

  • カラーセンサー:測定、反射光の強さ
  • 照明:測定値をデータワイヤーで出力する
  • ポート:1(進行方向左側)、4(進行方向右側)

数学ブロック

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

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

数学ブロック

左右の反射光の強さの差分から補正値を計算する

  • 数学:拡張機能
  • a:左側の反射光の強さがデータワイヤーで入力される
  • b:右側の反射光の強さがデータワイヤーで入力される
  • c:2.5※
  • d:未使用
  • =:補正値の計算結果、データワイヤーで出力する
  • 演算:(aーb)÷c

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

またこの数値はパワー変数によって変える必要がある

パワーを強くするとカーブを曲がり切るためにより強い補正が必要になるので小さい数値に変更する

数学ブロック 加算

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

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

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

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

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

現在位置左・反射光右・反射光補正値左車輪右車輪結果
中心位置8484(84-84)÷2.5=060+0=6060-0=60直進する
左寄り8460(84-60)÷2.5=9.660+9.6=69.660-9.6=50.4右に曲がる
右寄り6084(60-84)÷2.5=-9.660+(-9.6)=50.460-(-9.6)=69.6左に曲がる

Lモーターブロック

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

Lモーター 左車輪

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

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

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

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

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

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

パワー30と60とでライントレースをしているので見て欲しい。

souichirou

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

おすすめ

2件のフィードバック

  1. より:

    ガイちゃんやん

  1. 2021年3月6日

    […] 出展:『黒ラインをトレースするプログラム(改良版その2) ~レゴマインドストームEV3~』 https://www.souichi.club/lego/linetrace-03/ […]

へ返信する コメントをキャンセル

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