線形回帰編sellPython,機械学習,scikit-learn,EV3,アフレルAI本記事の内容はベータ公開としているので内容が変更される場合があります。EV3(以降EV3)とPython環境を利用してライントレースに関する線形回帰を行っていく。環境構築に関しては前回の記事を参照してほしい。内容は以下の書籍を参考にしている。Pythonを使ったEV3の基本的な制御等については以下に網羅されている。上記書籍との内容の関係は以下の通りになる。実行結果まとめ線形回帰とは線形回帰はデータの分布があるとき、そのデータ群に一番当てはまる直線を求める分析手法である。以下のような2種類のデータ群があったとき、データに対してよく当てはまる線を引くことで所持していないデータに対してもある程度予測をすることで結果を得ることができる。やることEV3で線形回帰を行うことが大きな目的だが、EV3の動作と線形回帰による推論を結びつけて行く必要がある。今回は以下の手順で線形回帰を行いながら、ライントレースをなめらかな走行で行うことを目的とする。誤差と旋回値をcsvデータに蓄積していきそのデータをもとに線形回帰を行い誤差の少ない旋回値を推論しフィードバックする要約すると以下のようになる。目的:旋回値と誤差の関係からよりきれいに走れる旋回値を見つけライントレースをする旋回値について前項で登場した旋回値について説明する。今回利用するロボットのモデルは車型であるため左右のモーターのスピードを指定して操舵角を決める。今回はそこに旋回値という変数と左右のモータースピードを紐付けている。旋回値を指定することでスピードに依存せずに操舵角を設定できるようにする。イメージとしては車のハンドル操作に近いものとなる。EV3のモデルと走行コース今回利用するEV3のモデルは以下のような車型のモデルを利用する。車体前部にはカラーセンサーが付いており、ライントレース走行を可能にしている。車体後部にはジャイロセンサーが付いており、車体が向いている角度を逐一取得する。この角度の値を利用して走行経路を描画する。今回走行する楕円コースは以下のようなコースを利用する。使用するライブラリとインストール今回ev3devに加えて追加で利用するライブラリは以下である。NumpymatplotlibPandasScikit-learnNumpyNumpyはPythonで数値計算を行う際に、非常によく使われるライブラリである。ベクトルや行列計算などの配列計算の処理を容易に行うことができるようになる。今回は取得したセンサーデータを配列に格納したり、計算をしたりする際に用いる。numpyを実行するmatplotlibmatplotlibはPythonでグラフを描画する際によく使われるライブラリである。今回はジャイロセンサーデータを元に走行経路を描画するのに用いる。matplotlibを実行するPandasPandasはPythonでデータを効率的に扱うためのライブラリである。今回はcsvファイルの読み込みに利用する。pandasを実行するscikit-learnscikit-learnはPythonの機械学習ライブラリである。分類・回帰・クラスタリングなどが比較的簡単に実装することができる。今回は以下の3つのプログラムを作成する。LinearRegression.pyEV3のスペックには限度があるため、あくまで数値の計算や線形回帰の処理はPC側で行い処理結果の値をEV3に送るような構成にする。それぞれのプログラムの関係性について以下の図に示す。EV3側プログラムEV3側プログラムは、実際にEV3で実行するプログラムである。EV3の動作として旋回値を指定したライントレース、ソケット通信を利用したジャイロセンサー値の転送、旋回値のフィードバックの受信を実装する。以下EV3側プログラムdata_get_gyro.pyをVSCode上のワークスペースで作成する。ワークスペースの作成やEV3へのソースコード転送方法については前回の記事を参照してほしい。program')sys.exit()※EV3側環境は日本語でコメントアウトすると文字コードの性質上エラーが発生するので注意が必要。50010))は、後ほど環境に応じて書き換える。比較用コースデータプログラム比較用コースデータプログラムでは、ライントレースによって描画される軌跡の楕円と比較するために元のコースそっくりのデータを生成する。本プログラムは直接実行するわけではなく後ほど作成するLinearRegression.pyにインポートするために作成する。PCのデスクトップにprogramというフォルダを作成し、その中にcourse.pyをテキストドキュメントとして作成し以下の内容を記述する。plt.show()PC側プログラムPC側プログラムで、EV3から送られてくるジャイロセンサーのデータから走行経路を描画し、元のコースデータと比較し誤差を算出する。算出した誤差と旋回値をCSVファイルに記録し線形回帰による推論の結果として適正な旋回値の値をEV3にフィードバックする。course.pyと同じようにprogramフォルダにLinearRegression.pyをテキストドキュメントとして作成し、以下の内容を記述する。50010))はEV3側プログラム同様環境に合わせて以下の手順で変更する。ソケット通信のIP設定ジャイロセンサーの値や、旋回地のフィードバックを行うためにEV3側プログラムとPC側プログラムでソケット通信を介してデータをやりとりしているが、プログラム内に記述しているIPアドレスを環境に合わせて変更する必要がある。PC-EV3間のBluetooth接続に利用しているIPアドレスを調べるPCとEV3をBluetooth接続すると169.254.XXX.YYYのリンクローカルアドレスが割り当てられる。以下の手順でIPアドレスを調べる。ネットワークアドレスに表示されるIPアドレスをメモするdata_get_gyro.py側設定data_get_gyro.py内後半の以下の箇所のIPアドレスをメモしたものに変更する必要がある。PORT実際のプログラム編集としては以下のようになる。記述を変更したら、VSCode上でEV3にワークスペースを転送する。LinearRegression.py側設定LinearRegression.py内後半の以下の箇所のIPアドレスをメモしたものに変更する必要がある。PORT実際のプログラムの編集は以下のようになる。プログラムの実行3つのプログラムの作成と、2箇所のIPアドレスの記述変更ができたらプログラムを実行していく。以下が実行手順となる。program...と表示され待機状態になる。以下のようなポップアップがでたらアクセスを許可する。data_get_gyro.pyを実行する1周するごとにEV3がスタート地点付近で停止するので、インテリジェントブロックの上ボタンを押して次の周回を始める※以降6を繰り返す実行結果6周すると以下のような結果になる。コマンドプロンプトには周回ごとに旋回値と誤差、データ数(周回数)、次の旋回値を表示する。VSCode上のSSHターミナルにはPC側プログラムに逐一送信しているジャイロセンサーの値が表示されている。動作としては以下の動画ように、周回ごとにライントレースがなめらかになり周回のスピードも早くなっているのがわかる。※クリックするとYoutubeに飛びますデータを蓄積しているCSVファイルをエクセルで開くと、以下のようにデータがまとめられている。プログラム内でグラフ化させることも可能だが、今回はエクセル内で線形回帰のグラフを作成してみた。ある旋回値のときの誤差がある程度予測できているのがわかる。まとめ今回はライントレースと、その走行経路から旋回値を求める線形回帰を行った。2つの関連性があるデータを取得できればこのような方法で予測をすることができる。改良したい課題に対してどのようなデータで評価するのかを考え、カスタマイズする必要はあるが応用がきく手法である。次回はカラーセンサーで取得するRGBの数値データから分類して数種類の色を判定していく。