*

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にて公開しています。

ではっ!

関連記事

MindStormControl_SprachScreen

EV3開発サポートツール(1)-C#のユーザーコントロール開発

どもです。 突然ですが、今回はC#に関するエントリになります。 具体的には、C#/WPFで、独自

記事を読む

toppers

C言語でEV3開発(25)-Q_Learningを実装してみた…が!?

どもです。 今回の内容は、「失敗しました」という内容です。 最近、流行になっている深層学習/

記事を読む

no image

C言語でEV3開発(21)-モーター出力の制御

どもです。 前回は、超音波センサから前方障害物との距離を取得し、それを元に安全状態を判断する、とい

記事を読む

eclipse_4.3_kepler

elicpse/CDTでのgdbでのソースを追従したデバッグができない問題

どもです。 今回のエントリーは、Eclipse上でgdbを利用したデバッグ中に発生する問題について

記事を読む

eclipse_oxygen

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

どもです。 前回のエントリでは、WindowsにRaspberryPi3のクロスコンパイル環境の構

記事を読む

raspberry-pi

RaspberryPi3を購入しました

どもです。 突然ですが、「Raspberry Pi3 model B」を購入しました。 今回のエ

記事を読む

RasPi_Qt

QtでRaspberryPi/GUI開発(5):pigpioを使ってみた

どもです。 RaspberryPiを購入して、LEDも手に入れたのでコレをチカらせてみようと思いま

記事を読む

no image

C言語でEV3開発(17)-コマンドによるTOPPERS/HRP2 EV3RT アプリケーションの制御(コントロール)

どもです。 今回は、TOPPERS/HRP2 EV3RT で作成したアプリをPC上から操作するため

記事を読む

RasPi_Qt

QtでRaspberryPi/GUI開発(10)-SPI通信をしてみた(その3)

どもです。 えー。 「Qtで…」とか書いておきながら、今回もやっぱりQtは出てきません。 そろ

記事を読む

MindStormControl_SprachScreen

EV3開発サポートツール(2)-C#のユーザーコントロール開発(2つ目)

どもです。 前回に引き続き、今回もC#/WPFでの独自UI(ユーザーコントロール)の作成についての

記事を読む

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="">

Arduino_Logo
ホールセンサーの種類と使い方(割込み編)

どもです。 前回に引き続き、今回もホールセンサーについてです。

Arduino_Logo
ホールセンサーの種類と使い方

どもです。 今回のエントリは、表題にある「ホールセンサー」についてで

Arduino_Logo
1台のarduinno nanoで割込みとSPIの同時使用

どもです。 先日手に入れたArduino nano(中華)で遊んでい

Arduino_Logo
Arduino nano(中華版)をセットアップしてみた

どもです。 突然ですが、「Arduino nano」互換(なのか?)

raspberry-pi
libpigpioでのRaspberryPi3とArduinoのSPI通信

どもです。 今回は、libpigpioを使用してRaspberryP

→もっと見る

PAGE TOP ↑