*

C言語でEV3開発(26)-EV3で機械学習(1)-QLearningをC#に委譲してみた

公開日: : C#, C言語, マインドストーム/EV3, 開発

どもです。
前回の投稿では、Q-LearningをEV3本体に実装してみたら、メモリが足りなくて動かせなかった、という内容を書きました。
今回の投稿では、この問題を解決すべく、Ev3側に実装していたQ-Learnig処理をPC側に委譲、計算させてみました。

1.PCへの委譲内容
PC側へ委譲するQ-Learningは、状態の判定から行動の評価、および評価関数の一式です。
これらの処理に必要な情報をEV3から取得し、一連の処理(状態の判定~次の行動の決定)を行い、その後決定した行動に基づくパラメータの通知をPC側で行うようにします。
すなわち、一連の処理を記載すると、下記のようになります。

1:状態の判定に必要なパラメータ、状態情報を各種センサーから取得。
2:取得したセンサー情報を、PCへ通知する。
3:PCは、取得したセンサー情報からQ-Learningを実施し、次の行動を決定する。
4:PCは、決定した行動をEV3に通知する。

なお、取得するセンサー情報、状態情報は前回と同じく、下記のものを取得します。
・モーターの出力値(出力目標) x2
・超音波センサーの距離値

2.PCとEv3の通信
PCとEv3の通信は、Bluetoothで行います。
なお、この通信処理については、EV3開発サポートツール(3)-Ev3Controllerで紹介したアプリケーション(GitHubで公開済み)で作成した機能を流用します。

3.PC側の実装
PC側のアプリケーションは、C#で実装します。
これは、先に記載したとおり、過去の記事で紹介したツールの機能を流用するためです。
また、C#で実装するQ-Learning処理については、EV3側で実装したコードをほとんど変更せずに流用しています。
ただし、Q-Learningでの報酬の与え方のみ変更しています。
なお、今回は前述のセンサー値/状態情報でQ-Learningがどのように学習、振る舞うかの確認を目的としているため、開発するアプリケーションは、コンソールアプリケーションとしています。

実装は、下記の通りです。
全てのコードは記載できないので、Q-Learningを行うクラスのみを記載します。

3.動かした結果
今回は、都合により位置を固定しています。
すなわち、距離センサーの値が変わらない環境で、検証を行いました。
その実行結果が、下記のグラフです。
Ev3ConsoleDeepLearning

グレーの線が距離センサー値、青とオレンジがモーターの動作値と動作目標値、黄色が動作指示値(学習結果)になります。
動作開始時点では、「0」付近でうろうろしていますが、次第に動作目標値、動作指示値が増加しています。
また、突然センサー距離値が小さくなっている箇所がありますが、そのタイミングでは目標値が小さくなり、それにあわせて指示値も減少しています。
その後、距離が正常(?)に戻れば、またモーター指示値が増加し始めています。
すなわち、前方に障害物があればモーターの動作指示値を下げ、前方に障害物が無ければモーターの動作指示値を上げています。
これらの結果から、「期待する学習が行われている」ということが確認できます。

4.結論
前回、今回と、Ev3での強化学習/Q-Learningの実施例を書いてきました。
Ev3購入時に一緒についてくるセンサーだけでも、強化学習が可能であることを示すことができました。
今後は、センサー情報を増やす、学習方法を増やすことで学習結果がどのように変化するかを見てみたいです。

5.公開しています
今回作成したプログラムの全ては、GitHubにて公開しています。

ではっ!

関連記事

toppers

C言語でEV3開発(24)-APIの実行時間を測定してみた。

どもです。 今回、以前から気になっていた、開発環境/プラットフォームであるTOPPERS HRP2

記事を読む

no image

C言語でEV3開発(8)-opOUTPUT_POWERコマンド

どもです。 今回のエントリーでは、EV3でモーターを動かします。 なお、今回のエントリーでも

記事を読む

python

VisualStudioCommunityでのPython開発環境構築

どもです。 最近、VisualStudioでのPython開発を始めました。 その際の環境構築に

記事を読む

toppers

C言語でEV3開発(20)-超音波センサと安全状態

どもです。 前回は、BluetoothでPCとEv3を接続してコマンドの送受信について書きました。

記事を読む

google_test

C言語でEV3開発(6)

どもです。 今回のエントリーは、前回のエントリーの続き、google testでの単体テスト環境に

記事を読む

no image

C言語でEV3開発(14)-opOUTPUT_TIME_SPEEDコマンド

どもです。 今回のエントリーは、モーターを動かすコマンドである「opOUTPUT_TIME_SPE

記事を読む

no image

C言語でEV3開発(12)-opOUTPUT_TIME_POWERコマンド

どもです。 今回のエントリーでは、これまた前回に引き続き、モーターを動かすためのコマンドについて書

記事を読む

no image

Windows/EclipseでRaspberryPiのクロス環境を構築してみた

どもです。 今回は、Windows/EclipseでRaspberry Piのクロス環境を構築した

記事を読む

python

Ev3開発サポートツール(4)-Pythonによるグラフ表示

どもです。 前回のエントリーで、VisualStudioCommunityでのPythonの開発環

記事を読む

toppers

C言語でEV3開発(22)-ロギング機能

どもです。 前回は、モーターの出力を制御する方法について記載しました。その際に、モータ/車体が期待

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

eclipse_oxygen
Linux/EclipseでRaspberryPiのクロス環境を構築してみた…がっ!

どもです。 前回のエントリでは、WindowsにRaspberryP

no image
Windows/EclipseでRaspberryPiのクロス環境を構築してみた

どもです。 今回は、Windows/EclipseでRaspberr

eclipse_oxygen
Eclipse/CrossCompile環境でプロジェクトをクリーンできない

どもです。 今回は、Eclipseでクロスコンパイル環境を作成した場

raspberry-pi
RaspberryPi3を購入しました

どもです。 突然ですが、「Raspberry Pi3 model B

toppers
C言語でEV3開発(28)-EV3の移動距離を計算できるようにしてみた

(テーマ) C言語でEV3開発(28)-EV3の移動距離を計算できる

→もっと見る

PAGE TOP ↑