30 Jun 2017, 20:15

LEGO Mindstormsの crawler を強化学習で前に進むことを学習させた

LEGO x 強化学習の初の成果が出た。

強化学習の古典的問題、crawler に Q-Learningを適用して前に進むことを学習させたのだ

まずは見るのが早い。一つ目の動画は学習を開始して間もない動画。ランダムに尾をうごかして、運良く前にすすんでいることがわかる。

[https://www.youtube.com/embed/UD0_tK9DToc?ecver=1]

次に、10分ほど学習させた結果が以下。明らかに、意図して前にすすんでいることが分かる。

[https://www.youtube.com/embed/El13ZG2m_wY?ecver=1]

今回利用したアルゴリズムはQ-Learning。

赤外線センサで壁との位置を計測して、壁に塚づいたら報酬を与える。

以下が今回のソースコードです。

28 Jun 2017, 18:01

AtomでMarkdownを快適に執筆するための環境構築

AtomでMarkdownを快適に執筆するための設定を調べた。

自分はEmacs派なのだけれども、最近EmacsはWordPressの執筆用にしか使わなくなってきた。そこで、WordPressを快適に執筆するための環境を調べたところ、LinuxではAtomが良さそうだったので、試しにAtomでブログを書くことにした。

Emacsを捨てる気はないヨ! ちょっとした浮気だよ。

環境

  • Ubuntu 16.02
  • Atom 1.18.0

atomのインストール

公式サイトにアクセス https://atom.io/

Ubuntuなので、debパッケージをダウンロードし、以下のコマンドでインストール。

sudo dpkg -i atom-amd64.deb

基本設定

日本語化設定

  • メニューバーからHelp->WelComeGuideを選択
  • 「Install a Package」を選択
  • 「Open Installer」を選択
  • フォームに「japanese」と入力し、「Packages」を選択
  • パッケージが表示されるので、「japanese-menu」の「Install」を選択

フォントを設定する

フォントが小さいので大きくする。

  • 編集 -> 環境設定を選択
  • Editorsを選択
  • FontFamily にフォントを入力(ここではRictyを入力)
  • Font Size で適切な大きさを入力(ここでは18を入力)

テーマの設定

Monokaiが好きなので、それに変更する。https://atom.io/themes/monokai

  • SettingsからInstallを選択
  • Monokaiを検索し、インストール
  • Themesを選択し、Syntax ThemesでMonokaiを選択

基本パッケージのインストール

パッケージのインストール方法は、以下でいけます。

  • 編集 -> 環境設定を選択し、設定を開く
  • パッケージを選択
  • フォームでパッケージを検索してインストール

atomic-emacs

AtomでEmacsキーバインドを利用するためのパッケージ。これは必須だ。

highlight-line

現在ラインをハイライト

Markdown

もともとの目的である、Markdownでの執筆を便利にするプラグインを入れる。

markdown-preview

Markdownのプレビュー機能は、デフォルトでインストールされている。 Ctrl+Shift+Mで Markdownプレビューウィンドウをtoggleできる。

Markdownプレビュー画面のGithubスタイル適用

インストールパッケージからMarkdown-Previewを検索し、

Use Github.com Style にチェックを入れる。

markdown-scroll-sync

エディタにあわせて、markdown プレビュー画面を自動スクロール。

markdown-writer

Markdownの入力支援のパッケージ

たとえば、- の次に改行を入力すると、次の – が自動で挿入される。

tool-bar-markdown-writer

便利なツールバーを表示してくれる。Markdownの記法を覚えてないので、これは便利。

markdown-writerとtool-barが必要。

  • markdown-writerをインストール
  • tool-barをインストール
  • tool-bar-markdown-writerをインストール

tool-bar

tool-bar-markdown-writerの使用に必要

WordPressに投稿する方法

  • markdown previewから、右クリックで HTMLを保存を選択。
  • WordPressの投稿画面を開き、投稿画面にペースト。

28 Jun 2017, 13:38

LEGO Mindstorms教育版で作成可能なロボット

LEGO Mindstormsの教育版(#45544)を購入したので、ネットで手に入る設計図を調べた。

結論からいうと、以下のページにまとまっている。

標準セットで作成できるロボット

標準セット(45560)で作成できるロボットは以下の種類

  • Gyro Boy
  • Puppy
  • Color Sorter
  • Robot Arm
  • Robot Educator Model(たくさんあるので省略)

拡張セットで作成できるロボット

拡張セット(45560)で作成できるロボットは以下の種類

  • Elephant
  • Remote Control
  • Spinner Factory
  • Stair Climber
  • Tank Bot
  • Znap

拡張セットは、15000円くらい。

非公式

頑張ったらつくれた。

自分でつくるには・・・

自分で想像力をはためかせて作るには、以下の本が役に立ちそう。

まあ、そんな才能はないのだが。

レゴの設計図を見るたびに、よくこんなこと思いつくなと思う。

追記分

LEGO Design Builder(http://ldd.lego.com/ja-jp/) というソフトウェアがすごそう。

27 Jun 2017, 13:10

3000 回転んでも立ち上がれなかったロボット

前回、CartPole 問題が Q-Learning でやっと解けたので、 CartPole 問題を応用して、レゴマインドストームの GyroBoy で倒立振子を試みた。

結果

3000 回転んでも立ち上がらなかった。ヾ(´∀`)ノ

現実は、シミュレーション通りにはいかなかった。

しかし、悲観的になってはいけない。

始めは 1 秒しか立てなかったのが、5 秒立てるようになったのだ!!

ソースコード

gist にあげました。

26 Jun 2017, 13:33

OpenAI Gym の CartPole 問題が Q-Learning で解けたぞ

CartPole 問題は、今までこのブログでもなんども取り上げてきた。

CartPole 問題は、今までこのブログでもなんども取り上げてきた。 - [[http://futurismo.biz/archives/6481][OpenAI Gym の CartPole-v0 を試したメモ | Futurismo]] - [[http://futurismo.biz/archives/6549][CEM で CartPole-v0 を試したメモ | Futurismo]]

今日、ついに解けたのだ。

とくに、最後のリンクは、Reinforcement Learning のチュートリアルがまとまっている良リポジトリ。 この場を借りて、紹介したい。

課題

環境から取得できる情報は次の 4 つ。(observation_space) - 横軸座標(x) - 横軸速度(x_dot) - ポール角度(theta) - ポール角速度(theta_dot)

エージェントが取れる行動は環境状態によらず次の 2 つ。(acnton_space) - 左に動く - 右に動く

課題は、環境から取得できる値が連続値であること。 Q テーブル(状態、行動)対に対して一つの値を扱う。

つまり、連続値である状態を範囲で区切って離散の値に変換して、Q テーブルのインデックスに用いることが必要。

ここでは gdb さんのコード を参考に以下のように書いた。

def build_state(features):
    """get our features and put all together converting into an integer"""
    return int("".join(map(lambda feature: str(int(feature)), features)))

def to_bin(value, bins):
    return np.digitize(x=[value], bins=bins)[0]

cart_position_bins = np.linspace(-2.4, 2.4, 2)
cart_velocity_bins = np.linspace(-2, 2, 10)
pole_angle_bins = np.linspace(-0.4, 0.4, 50)
pole_velocity_bins = np.linspace(-3.5, 3.5, 20)

def transform(observation):
    # return an int
    cart_pos, cart_vel, pole_angle, pole_vel = observation
    return build_state([
        to_bin(cart_pos, cart_position_bins),
        to_bin(cart_vel, cart_velocity_bins),
        to_bin(pole_angle, pole_angle_bins),
        to_bin(pole_vel, pole_velocity_bins)
    ])

これで、transform を呼ぶと、ovservation に対して一意な離散値が出力されるので、それを状態値として扱う。

注目すべきは、ここ。横軸座標(x)は荒く、ポール角度は細かく値を区切っている。こうすると精度がよかったのでこうしている。

cart_position_bins = np.linspace(-2.4, 2.4, 2)
cart_velocity_bins = np.linspace(-2, 2, 10)
pole_angle_bins = np.linspace(-0.4, 0.4, 50)
pole_velocity_bins = np.linspace(-3.5, 3.5, 20)

Code

このコードは、Practical RL の week2 の宿題である。

以下を参考にした。 - Berkeley’s CS188 pacman project code http://ai.berkeley.edu/ - Victor Mayoral Vilches’s RL tutorial https://github.com/vmayoral/basic_reinforcement_learning - gdb openAI https://gym.openai.com/evaluations/eval_aHf1Kmc4QIKm5oPcJJToBA

Result

25 Jun 2017, 13:47

LEGO Mindstorms で GyroBoy を組み立てた

LEGO MindStorms EV3 を買ったので、まずは GyroBoy を組み立ててみた。

動かしてみる

早速、動かしてみたい!

倒立振子をするロポットの作り方は以下のチュートリアルに乗っている。 - Tutorial: Building BALANC3R - Robotsquare

バランスをとりながら倒立するロポットは 2 種類あるみたい。 - BALANCE3R - GyroBoy

チュートリアルでは BALANC3R の説明をしているけれども、 BALANCE3R をつくれるのは、LEGO MindStorms Home Edition なので、 私は、GyroBoy を作ることにした(わたしのは Education Edition)

組み立て方は以下のリンクから PDF がダウンロードできる。

出来上がったのは以下のロボット。かっこいい!組み立ての要領が悪く 5 時間かかった。

img

Python で倒立振子する

ev3dev-lang-python には、Balancer が提供さている。さすが。

開発の経緯 - Implement BALANC3R · Issue #130 · rhempel/ev3dev-lang-python

参考になったコード - segway/segway.py at master · laurensvalk/segway

ev3dev-lang-python にまーじされたコード - https://github.com/rhempel/ev3dev-lang-python/blob/d0625b5b1e1fdcdd69b7fa390695613a81191736/demo/BALANC3R

#!/usr/bin/env python3

import logging
from ev3dev.GyroBalancer import GyroBalancer


class BALANC3R(GyroBalancer):
    def __init__(self):
        GyroBalancer.__init__(self,
                              gainGyroAngle=1156,
                              gainGyroRate=146,
                              gainMotorAngle=7,
                              gainMotorAngularSpeed=9,
                              gainMotorAngleErrorAccumulated=3)


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(levelname)5s: %(message)s')
    log = logging.getLogger(__name__)

    log.info("Starting BALANC3R")
    robot = BALANC3R()
    robot.main()
log.info("Exiting BALANC3R")

これを実施すると、RemoteControl が定義されていないということで、エラーする

LEGO MindStorms は リモコンで制御するためのセンサーがあるのだけれども、 教育版にはリモコンセンサはついていない。なので、以下のソースをいじって REMOTE CONTROL にかかわる部分を全部削除した!

さあこれでどうだろう・・・立ち上がった!うれしい。

https://www.youtube.com/embed/7Sb4aqrfy3Y?ecver=1

25 Jun 2017, 00:50

ev3dev-lang-python 開発環境(Visual Studio Code)

ev3dev で Python の開発をするには、Visual Studio COde をローカル PC でつかうのがよさそう。

サーバ上でコーディングすると、サーバからのレスポンスが遅くてイライラする。

なので、ローカルで編集したファイルをサーバにアップロードする方式のほうがよさそう。

VS Code なら ftp-sync という拡張機能があり、保存のたびに サーバとローカルのフォルダの同期が走る。

Visual Studio Code の設定メモです。

環境

  • Ubuntu 16.04 LTS
  • Visual Studio Code 1.13.1

Visual Studio Code

VS Code の本体を手に入れる。

deb をダウンロードして、以下でインストール。

$ sudo dpkg -i code_1.13.1-1497464373_amd64.deb

anaconda

anaconda をつかって、専用の環境を用意する。

# ev3 環境を作成
$ conda create -n ev3
$ activate ev3

# python をインストール
$ conda install python

VS Code の ファイル > 基本設定 > 設定を選択。

ユーザ設定ファイル setting.json が作成される。setting.json に python のパスを追記する。

"python.pythonPath": "/home/tsu-nera/anaconda3/envs/ev3/bin/python",

ev3dev-lang-python

ev3dev ライブラリをインストール。

$ git clone https://github.com/rhempel/ev3dev-lang-python.git
$ cd ev3dev-lang-python
$ python setup.py

pylint

pylint をインストールすることで、エラーチェックを有効化。

$ conda install pylint

autocomplete

ev3dev-lang-python の API のコード補完ができない。

PyCharm だとこの辺ができるんだけどな。。。。解決策探し中。

拡張機能

python

Python で開発するための必須機能。

ftp-sync

VS Code のキモの拡張機能。sftp を利用してサーバとフォルダを同期する。

以下のように、ftp-sync.json を設定する。

sftp は port22 に変更することに注意。remotePath は同期したいサーバ上のフォルダ。

{
    "remotePath": "./experimentals",
    "host": "ev3dev.local",
    "username": "robot",
    "password": "maker",
    "port": 22,
    "secure": false,
    "protocol": "sftp",
    "uploadOnSave": true,
    "passive": false,
    "debug": false,
    "privateKeyPath": null,
    "passphrase": null,
    "ignore": [
        "\\.vscode",
        "\\.git",
        "\\.DS_Store"
    ],
    "generatedFiles": {
        "uploadOnSave": false,
        "extensionsToInclude": [],
        "path": ""
    }
}

23 Jun 2017, 23:57

LEGO Mindstorms EV3 を Python から制御するためのメモ

レゴマインドストーム EV3 を Python で制御するためのセットアップ作業メモです。

Environment

  • LEGO MindStorms EV3
  • Ubuntu 16.04(途中 micro SD カードのところは Windows10)
  • ev3dev (2017-06-09)
  • Python 3.4.2

ev3dev

ev3dev の OS 起動

ev3dev とは、Debian ベースの Linux OS.

Python でプログラミングするには、標準で入っている OS ではなく、ev3dev を利用する。 この ev3dev OS を micro SD カードに焼いて、カードから OS を起動してその上で作業する。

いわば これはデュアルブート。 なので、もともとの EV3 の OS を削除することなく、ev3dev OS を動かすことができる。

まずは、OS のイメージをダウンロードする。

ダウンロードしたファイルを解凍する。

micro SD カードに write するために、ツールを使う。自分の PC では Ubuntu で作業しているのだけれども、 カードがどうやっても認識できなかったので、Windows から micro SD カードに OS イメージを焼いた。 Windows では、Win32 Disk Imagerというソフトが利用できる。

SD カードを EV3 本体に差し込んで、起動ボタンを押す。1 分ほどで、立ち上がる。

wifi 接続

wifi 接続には、wifi ドングルが必要。

ssh でリモートログイン

ターミナルを起動して、以下を打ち込む。

ssh robot@ev3dev.local

ユーザ名は、robot, パスワードは maker.ログインが成功すると、以下の出力を得る。

             _____     _
   _____   _|___ /  __| | _____   __
  / _ \ \ / / |_ \ / _` |/ _ \ \ / /
 |  __/\ V / ___) | (_| |  __/\ V /
  \___| \_/ |____/ \__,_|\___| \_/

Debian jessie on LEGO MINDSTORMS EV3!

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Jun 23 10:55:42 2017 from 192.168.3.4
robot@ev3dev:~$ 

wifi 設定を永続化するために、/etc/wpa_supplicant/wpa_supplicant.conf の編集をする。

cd /etc/wpa_supplicant/
sudo touch wpa_supplicant.conf
sudo chmod a+w wpa_supplicant.conf
sudo wpa_passphrase <SSID> <passward> >> wpa_supplicant.conf

ev3dev のアップデート

sudo apt-get update

Python

Python

デフォルトでは、Python 2.x が入っているようだ。python3 で 3.x 系が使える。

robot@ev3dev:~$ python
Python 2.7.9 (default, Aug 13 2016, 17:33:18) 

robot@ev3dev:~$ python3
Python 3.4.2 (default, Oct  8 2014, 14:47:30

ev3dev-lang-python

Python で ev3dev のデバイス、 つまりセンサやモータなどを制御するためには、ev3dev-lang-python というライブラリを使う。

ライブラリを最新にする。

sudo apt-get install --only-upgrade python3-ev3dev

ライブラリのドキュメントは以下。

インタラクティブ

Hello World

まずは、Hello World から。Python インタープリタを起動する。

robot@ev3dev:~$ python3
Python 3.4.2 (default, Oct  8 2014, 14:47:30) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

ライブラリ を import する。

import ev3dev.ev3 as ev3

Hello, World と音をだす。

ev3.Sound.speak('Hello World!').wait()

モーター制御

ev3.LargeMotor でモーターのインスタンスを作成する。

run_timed で、時間指定でモーターを回す。

# インスタンス取得
m = ev3.LargeMotor('outA')

# 3 秒間動かす
m.run_timed(time_sp=3000, speed_sp=500)

時間指定なしでモーターを回すには、run_forever()を使う。止めるには、stop()を使う。

m.run_forever(duty_cycle_sp=30,speed_sp=500)
m.stop()

スクリプト

python3 を使うために、行頭に #!/usr/bin/env python3 を書く。run_motor.py を作成。

#!/usr/bin/env python3
import ev3dev.ev3 as ev3
import time

m = ev3.LargeMotor('outA')
m.run_forever(duty_cycle_sp=50, speed_sp=500)
time.sleep(3)
m.stop()

ターミナルから実行。

python3 run_motor.py

EV3 の本体から、スクリプトを選択して実行することもできる。スクリプトを実行可能にする。

chmod +x run_motor.py

画面から、File Browser を選択して、作成したファイルを選択すると実行できる。

開発環境

いろいろ試したけれども、PyCharm に落ち着きそう。

Emacs

ローカル PC(Ubuntu)の Emacs からリモートサーバの ev3dev のファイルをいじるには、 Emacs の Tramp を使う。

Emacs を起動して、C-x C-f を押してから以下を入力

/ssh:robot@ev3dev.local:

パスワードを聞かれるので maker と入力して Enter.

Windows での方法は、今回は未検証だけど、以下でいけるはず。

これで、ローカルで編集するのと同じ操作でリモートのファイルいじることができる。

追記

しばらくこれでやっていたのだけれども、tramp を使うと入力レスポンスが遅い。ときどきフリーズする。

じゃあサーバに emacs を入れてしまおうとインストールした。

sudo apt-get install -y emacs-nox

これでも遅い。

やっぱりローカルで編集して、編集したものをアップロードする方式がよさそう。

PyCharm

最近 PyCharm が Emacs よりもずっといいと思いはじめた。

PyCharm での 開発設定は以下にまとめられている。

ここには、git 経由で編集するやり方が書いてある。編集と確認のたびにソースをコミットする必要がありそう。

なにかうまい方法はないかと考え中。ローカルで編集したものを rsync でサーバと同期するか。

追記 source sync

うまい手をみつけた。プラグインで、source syncronizer というものがある。

ローカルからサーバへの一方向のアップロードのみできる。インストールは、ファイル > 設定 > プラグインを選択。 source sync を検索してインストールする。

インストールしたら、ツール > source sync を選択。プロトコルを SCP で作成(SFTP だとうまくいかなかった)

  • ホスト: ev3dev.local
  • ホストパス: アップロード先ディレクトリ
  • ユーザ名: robot
  • パスワード: maker

ファイル単位でのアップロードだと漏れがありそうなので、 やっぱり git で版数管理して同期するか、もしくは併用するのがいいかも。

anaconda 環境の設定方法

# ev3 環境を作成
$ conda create -n ev3
$ activate ev3

# python をインストール
$ conda install python

# ev3dev-lang-python をインストール
$ git clone https://github.com/rhempel/ev3dev-lang-python.git
$ cd ev3dev-lang-python
$ python setup.py

作成した仮想環境を PyCharm で利用するには、 ファイル > 設定 > プロジェクト > プロジェクト・インターセプタから、 作成した環境の Python へのパスを通す。

  • ~/anaconda3/envs/ev3/bin/python

なぜか候補に作成した環境があらわれなかったので、 歯車マークを選択して、ローカル追加を選択することで、パスを追加した。

Jupyter Notebook

頑張れば Jupyter Notebook をインストールして使えるようだ。以下のページを参考にした。

試してみたけれども、セルの実行に時間がかかりすぎたり、謎の kernel エラーが発生したりしたのでやめた。

Visual Studio Code

拡張機能で、ローカル PC とサーバのファイルを sync するものがある。これは便利。

21 Jun 2017, 22:04

Ubuntu での PyCharm 日本語化設定

Python の統合開発環境 PyCharm, デフォルトでは英語ですが日本語化できるようだ。

Eclipse で有名な Pleiades が日本語化のプラグインを配布している。

PyCharm を日本語化する手順は、以下。

ところが、Linux の環境について描かれていなくて少し迷ったので、 Linux での PyCharm 日本語化設定を備忘録としてメモしておきます。

環境

  • Ubuntu 16.04
  • PyCharm Communite Edition 2017.1
  • Pleiades 1.7.26

日本語化する手順

  1. Pleiades の配置 ——————

http://mergedoc.osdn.jp/ から Pleiades プラグインの “最新版ダウンロード”をクリックしてダウンロード。

(図を借ります)

zip を解凍。Linux の、p、plugins/jp.sourceforge.mergedoc.pleiades を

(PyCharm を配置したディレクトリ)/plugins 

の配下にコピーする。

  1. 起動オプションの編集 ———————–

PyCharm を起動して、ツールバーから Help : Edit Custom VM Options… を選択する。

これで、(PyCharm を配置したディレクトリ)/bin、p、pycharm.vmoptions というファイルが生成される。

編集画面が開くので、以下をファイルの末尾に貼り付け。

-Xverify:none
-javaage(P(Pleiades を配置した場所のフルパス)/jp.sourceforge.mergedoc.pleiades/pleiades.jar

以上、これで PyCharm を再起動すれば、日本語化されている。

18 Jun 2017, 16:51

MathJax を使って WordPress に org2blog で数式ありの投稿をする

このブログは、org2blog というライブラリを使って、 Emacs org-mode でかかれた文章を HTML に変換して投稿している。

今回、org-mode から HTML へ変換した文章中で 数式を扱う方法を調べてみた。

MathJax をつかう

MathJax とは、javascript でかかれた 数式を表示するためのライブラリ。 Latex なみの数式表現が扱えるようになる。

すべてのブラウザで動作し、表示するクライアント側での設定はいらない。

さらに、MathJax のファイル群のインストールは必要ない。

MathJax は、コンテンツデリバリネットワーク(Contents Delivery Network、CDN)で公開・配信されているので、 JavaScript ライブラリをダウンロードして、サーバーにアップロードといった作業は必要はないのである。

MathJax を使用するには、<html>…</html> タグの中に以下を書く。

<script type="text/javascript" async
  src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML">
</script>

<body>…</body> の中で、MathJax の記法(MathML、LaTeX、ASCIIMathML)を使って数式を書くと、 数式がレンダリングされる。

org-mode で MathJax をつかう

org-mode は MathJax にデフォルトで対応しているようだ(version. 9.0.5)

なので、org-mode の文章中に 数式を 書いて、org-export で HTML 形式で export すればよい。

これに今まで気づかなかったのは、自分の環境では、#+OPTIONS: TeX:nil を指定していたから。 ここは、Tex t でなければいけない。

Default の設定だと参照する MathJax の version が古いらしく、以下の設定で最新が使える。

(setf org-html-mathjax-options
      '((path "https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML")
        (scale "100") 
        (align "center") 
        (indent "2em")
        (mathml nil))
      )
(setf org-html-mathjax-template
      "<script type=\"text/javascript\" src=\"%PATH\"></script>")

org2blog は、html 形式に org-mode の文章を変換してから、WordPress にアップロードする。 org2blog で WordPress に投稿すれば、WordPress 上でも数式が表示される。

Example

\[〜\] で囲んで数式を表示

\[f(a)= \frac{1}{2\pi i}\oint_{\Gamma} \frac{f(z)}{z-a}dz\]

$$f(a)= \frac{1}{2\pi i}\oint_{\Gamma} \frac{f(z)}{z-a}dz$$

\(〜\) で囲んで本文中に表示

\(〜\) で囲んで、本文中に$a$を表示。

参考

あとは、Latex 記法を覚えるだけだ。(これが一番大変)