ロボットを作る

子供のころ、映画「STARWARS」 を観てワクワクし、ガンプラにドキドキしていた。時間が経つのも忘れてしまう、そんな時間をもう一度、取り戻すために、Raspberry pi を使って、オヤジがロボット作りに挑戦する!

やり始めてみると、なかなか思い通りに行かない。時間の経つのも忘れて悪戦苦闘中。 「こんなちっちゃな Raspberry Pi で、こんなことができるんだ」を日々実感している今日この頃。

2015年04月

気になっていた O'REILLY 「実践 機械学習システム」をやっと買った。




これからちょっとずつ読み進めていこう。
まずは「第1章 Pythonではじめる機械学習」 から。

この本は、Pythonのライブラリである Numpy、Scipyを用い、scikit-learn で機械学習を学びます。 

準備として、


ソースコードを利用

この ch01 配下の .py をダウンロードして使う。

 ch01/
  data/
    web_traffic.tsv 
  gen_webstats.py
  analyze_webstats.py
  performance_test.py 


現状(2015/4/27時点)、このweb_traffic.tsv は、
1.5.1 データを読み込む で紹介されている不適切な値 nan は含んでいない。

サンプルプログラムの .py ファイル内の __file__ は、実際の環境に合わせて編集するべきものと、勝手に思い込んでいたが、実際には .py を実行するディレクトリに data フォルダを作ってやれば、そのまま実行できた。


analyze_webstats.py の実行中に、polyfitで warning が出たが、とりあえず実行は終わり png ファイルも生成された。

>>> f100 = sp.poly1d(sp.polyfit(x, y, 100))
/usr/lib/pymodules/python2.7/numpy/lib/polynomial.py:560: RankWarning: Polyfit may be poorly conditioned
  warnings.warn(msg, RankWarning)
>>> 

SciPyの numpy.polyfit

に、この原因について、
High-order polynomials may oscillate wildly:
と書かれている。

境目となるのは、コマンドラインから確認すると、

>>> f33 = sp.poly1d(sp.polyfit(xp, y, 33))
>>> f34 = sp.poly1d(sp.polyfit(xp, y, 34))
>>> f35 = sp.poly1d(sp.polyfit(xp, y, 35))
/usr/lib/pymodules/python2.7/numpy/lib/polynomial.py:560: RankWarning: Polyfit may be poorly conditioned
  warnings.warn(msg, RankWarning)
>>> 

であった。analyze_webstats.py の f100 の 100 を 30 に下げて、.py を実行。 あれ? 変わらず。
30 をさらに下げていくと、結局、後半の polyfit は 10 でも引っかかるようだ。


で、肝心の最適なモデルを決めることについて、本では 次数 2 のモデルが誤差が最小となっているが、analyze_webstats.py を実行する毎に変化する。次数 1 のときもあれば、次数 10 のときもある。

あれ? なんか変だな。

とりあえず、ひと通り進めてから考えよう。第1章でコケてるわけにはいかない。
 




キャタピラ模型に、RaspberryPi2 と ブレッドボードなどを載せる。


webiopi を自動起動するように、以下を設定。

 $ sudo update-rc.d webiopi defaults

本ではLCDで ip address を表示するようにしてあるのだが、LCDがうまく使えてないので、
一旦、モニターとかを付けて起動して、ip を確認してから切り離して、動かした。

 
DSC04906

家にあったモバイルバッテリーを乗せる。ブレットボードはセロハンテープで止めた。
RaspPi2 は、ネジサイズがあわず、ネジ止めがうまくできなかった。ネジりん棒で止めた。

DSC04907



で、動いたぁ~!!!!!

DSC04909

習うより、慣れろ。

機械学習を勉強するのにさわって学んでみよう。

scikit-learn Tutorials


1.インストール。scikit-learn を入れてみる

 $ sudo apt-get install python-sklearn

これだけ。


2.動作確認。さわってみる。

Webの情報のとおり、いきなりコマンドを叩いてみる。
インストールパッケージに含まれるサンプルデータ digits を使う。

load_digits の Examples

 $ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23) [GCC 4.6.3] on linux2
>>> 
>>> from sklearn.datasets import load_digits
>>> digits = load_digits()
>>> print digits.data.shape
(1797, 64)
>>> import pylab as pl
>>> pl.gray()
>>> pl.matshow(digits.images[0])
<matplotlib.image.AxesImage object at 0x2dfdef0>
>>> pl.show()
>>> 


【参考情報】
http://www.slideshare.net/tkm2261/scikit-learn 
http://sucrose.hatenablog.com/entry/2013/05/25/133021 
http://techblog.yahoo.co.jp/datascience/use_scikit-learn/ 

Raspberry Pi2 の起動時に warning が出る。
ずっと出ていたが、差し支え無かったので放ったらかしだった。
いまさらだが手当てしておこう。

kernel lacks cgroups or memory controller not avaiable, not starting cgroups [warn]



対処方法は、googleが教えてくれた。

/boot/cmdline.txt の elevator=deadline の後ろに、cgroup_enable=memory を入れる。

 変更前 rootfstype=ext4 elevator=deadline rootwait
 変更後 rootfstype=ext4 elevator=deadline cgroup_enable=memory rootwait

再起動。消えたことを確認した。 

うまく繋がったはずの wifiドングルが、つながらなくなった。


つながっているときは、

$ iwconfig 
wlan0     IEEE 802.11bgn  ESSID:"xxxx"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:2.432 GHz  Access Point: xx:xx:xx:xx:xx:xx 
          Bit Rate:150 Mb/s   Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=67/100  Signal level=28/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

 $ cat /proc/net/wireless 
Inter-| sta-|   Quality        |   Discarded packets               | Missed | WE
 face | tus | link level noise |  nwid  crypt   frag  retry   misc | beacon | 22
 wlan0: 0000   67.   31.    0.       0      0      0      0      0        0

で、Link Quality もこれくらいあった。で、何かの拍子にネットが切れてしまう。


debugのコマンドをとりあえず残しておく。

 $ sudo wpa_supplicant -d -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf

ただ出力結果を見てもいまいち分からなかった。で、つながっているときに iwconfig をなんどか叩いてると Link Quality が、50以下になるときもあった。
で、おそらく wifi 電波の強さが関係しているんだと思う。

家のリビングに置いてある wifi ルータから RaspPi2 までは、廊下を挟んだ距離にあり、ドアを締め切っていた。念のためドアを開けっ放しにしたら、取りあえずつながるようになった。

増幅器でも買ってくるか。
 




いよいよラジコンのように切り離す。wifiドングルはうまく使えるようになったので、poweroff スイッチを付ける。

/etc/rc.local の exit 0 の前に以下を足す。

  sudo python /home/pi/Desktop/raspi-sample/10-01-sw-poweroff.py

本では、LCDも足すのだが、前にテストでLCDがうまく認識できてなかったのでスキップする。(改めてLCDにリトライしよう。と思いつつ。。。)
 
再起動。・・・・、途中で止まる。 がぁーーー、やってしまった。rc.local に追記した行の最後に & を忘れた。

えーーー、どうしよう。Goolge に聞いてみよう。すぐに答えを教えてくれた。



【Rasbian OSを single mode user で起動し、ファイル編集】

起動直後のRaspberryマークで、 shift + 上↑ で、cmdline.txt を以下のとおり追記する。

 dwc_otg.lpm_enable=0 init=/bin/sh console=・・・・・

このまま立ち上がっても、rc.local を編集できない。write権を与えるために remount

  # mount / -o remount,rw

これでめでたく rc.local を編集できて、うまく立ち上がった。


で、タクトスイッチで poweroff できた。
が、起動はスイッチじゃだめなので、電源抜き差しに。



そしてキャタピラ模型を組み立てる! こんな感じに。

DSC04905
DSC04904


ELECOM WDC-150SU2MBK を使えるようにする。



なにげにはまった。Raspberry Pi2 で、8188eu のdriver を入れるの巻。



ここをちゃんと読んでやるべし。
https://www.raspberrypi.org/forums/viewtopic.php?p=462982

ここにちゃんと書いてある。Pi2 は、

"a different one for Pi 2 with kernel 3.18.7-v7+ #755, 8188eu-v7-20150212.tar.gz."

と。使うgzファイル名が違うのだと。

まず、自分のOSバージョン確認。以下に #755 と出てる。

$ uname -a Linux raspberrypi 3.18.7-v7+ #755 SMP PREEMPT Thu Feb 12 17:20:48 GMT 2015 armv7l GNU/Linux


だから wgetするのも違う。

  $ wget https://dl.dropboxusercontent.com/u/80256631/8188eu-v7-20150212.tar.gz
  $ tar xzf  8188eu-v7-20150212.tar.gz
  $ ./install.sh


でOK!


そのあと、いろいろあったが結果的に以下に落ち着いた。

$ sudo cat wpa_supplicant.conf 
 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="elecomXXXXX"
psk="PASSWORD"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
auth_alg=OPEN
}


これでやっと動いた。この Webも wifi 経由で書いてる。






ついにここまで来たぞ。
第10章「WebIOPiを用いたキャタピラ式模型の操作」


準備として、TAMIYAのキットを組み立てる。これは得意分野だ!

まずは、ギヤーボックスから。

 楽しい工作シリーズ NO.97
 ツインモーターギヤーボックス

DSC04897
DSC04898

と、思いきや、ちゃんと本を読んでから取りかかることに!


アームクローラー工作セットに付属するモータ1つのギアボックスと入れ替えるために、ちゃんと本を読んで、全体の工作ストーリーを理解してから取りかかることに。

 楽しい工作シリーズ NO.211
 アームクローラー工作セット


の説明書の応用編に「ツインモーターギヤボックスの取り付け」が出てきた。
本にも書いてあるが、ツインモーターギアボックスは、Cタイプで組む。

DCモータにコンデンサ(0.01μF=103)と25cm程の長めのケーブルをハンダ付けした。
DSC04899

モータドライバ2つを、左右のDCモータにつなげて、いざプログラム起動!

でけた。
 

商用のS/W。どうも避けて通れない感じのものか。否が応でも勉強しないといけない感じ?

MATLAB ans Simulink の新リリース 2015a。

新製品: Robotics System Toolbox



備忘録として残しておく。

第9章の
 9.5 ブラウザのスライダの利用 〜RGBフルカラーLED
 9.6 タッチイベントの利用 〜DCモーターの速度調整
を本のとおりに。



ブラウザのスライダの利用では、4本足のLEDを利用。前回3つ必要だったときは検証をスキップしたが、今回1つだけの利用なので、ちゃんとやってみる。

一番長い足が、共通アノード(+)で、抵抗を3つ接触しないように組んで完成。
本のとおりスライダを動かして、RGBでの濃淡がきれいに変化した。

次の検証へは念のため(接触させないため)電源切ってから組み替える。


タッチイベントも本のとおり、さくっとできた。
iphoneで、真ん中よりにタッチすると弱めで、外よりにタッチすると強めになった。


ここまできたか。
今年1月下旬に、この本に出会ってゆっくりではあるが、ここまできた。

ついに第10章の戦車!!!!だぁ!!!!

「Raspberry Pi で学ぶ電子工作」(講談社ブルーバックス)


 

第9章 P.250「9.4 ブラウザへの温度センサの値の表示」



I2C接続して前に利用した温度センサ ADT7410 を使用する。

準備として P.251の
 $ sudo apt-get update
 $ sudo apt-get install libi2c-dev
 $ wget http://ftp.de.debian.org/debian/pool/main/i/i2c-tools/i2c-tools_3.1.0.orig.tar.bz2

とりあえず本のとおり、3.1.0 を入れる。3.1.1 があったが。
 $ tar xf i2c-tools_3.1.0.orig.tar.bz2
 $ cd i2c-tools-3.1.0/py-smbus
 smbusmodule.c を sampleのものと入れ替える。
 $ python3 setup.py build
 $ sudo python3 setup.py install

エラーなく、終わった様子。



で、前回同様に iphone から http://<rasp ip>:8000/bb/02/ へアクセスしたが、あれ?

取りあえず、rasp自身のプラウザからはアクセスでき、温度も表示したのでネットワークが問題か。/etc/init.d/webiopi restart とかしてみる。

wireshark で iphoneからアクセスされてるかを確認しようと、
 $ apt-cache search "tshark"

で、wireshark を見つけて入れた。
 $ sudo tshark -i eth0 -f "port 8000"

を実行して流れてる。
あれ、今度は iphone で見れた。なんだったのか?  結局?のまま続きを読む

タイトルが気になったので、残しておく。

 2014/12/4 11 open source tools to make the most of machine learning.

なかでも以下は時間のあるときに調べてみよう。

 Project: Weka
 
 Project: scikit-learn 
 GitHub:
 https://github.com/scikit-learn/scikit-learn 

 Project: Mahout

 Project: 
MLlib

 Project: Cloudera Oryx 
 GitHub:
 
https://github.com/cloudera/oryx

 Project: GoLearn 
 GitHub: 
https://github.com/sjwhitworth/golearn

知らないことが多すぎるなぁ。そらそうか。



今度は本のサンプルファイルを用いてLチカする。

 $ sudo chown -R pi /usr/share/webiopi/htdocs
 $ cp -r 09-samples/bb /usr/share/webiopi/htdocs

最初は「9.3 ブラウザのボタンによるLEDの点灯」から。 
 $ sudo vi /etc/webiopi/config

[SCRIPTS]セクションに以下を追加。


 myscript = /usr/share/webiopi/htdocs/bb/01/script.py

そしてプロセスの再起動

 $ sudo /etc/init.d/webiopi restart


で、iphone から http://<respiのip>:8000/bb/01/ へアクセス。

でけた。

 



続いて、図9-5 LEDを点灯させる回路を作り、WebIOPi からLチカしてみる。

いままでのように Pythonプログラムを idle から起動させるようなことはない。
Raspi のGPIO 25pin をLEDへつなげるだけ。


P.237 「図9-6 デモアプリケーション GPIO Headerの画面」 は、
WebIOPi をインストールしたときの含まれていたデモアプリケーション。

本のとおり、自分のiphone から Lチカできた。なんかニヤニヤしてしまった。

 

第9章「WebIOPiを用いたPCやスマートフォンとの連携」に入る。



だが、2015/4/6現在、WebIOPiが Raspberry Pi2 に対応していないことは周知の事実であるようだ。 

ただ、この本の

著者のWeb 

の”第9章”では、すでにワークアラウンドが示されていた。これに添って進める。

WebIOPi-0.7.1をダウンロードし、/pi/homeに展開。
本のP.227-228のとおり進める。というのも解凍ツール Xarchiver 登場するが始めて見るので操作が、???な感じ。

そのあと、P.228 のインストールする前に、パッチを当てるようだ。
 $ wget https://dl.dropboxusercontent.com/u/69652790/bb/WebIOPi-0.7.1.patched.tgz
 $ tar zxf WebIOPi-0.7.1.patched.tgz
 $ cd WebIOPi-0.7.1/

 $ sudo ./setup.sh
  Do you want to access WebIOPi over Internet ? [y/n] n




無事終わったら、とりあえず、本のとおり webiopi を起動してみる.

$ sudo /etc/init.d/webiopi start

で、自分の iphone から Raspiの http://ip address:8000 でアクセスしてみると、
ログイン画面が出た。P.235 のユーザ名とパスワードで

 WebIOPi Main Menu

が出た。取りあえず出来た。

第8章の続き。



ここでは、精度の高いPWM信号を用いてサーボモータの角度制御を行う。

サーボモータ
Arduino Sidekick Basic Kit2 に付いてきたものを使う。
コネクタは、茶赤黄の3色。茶:GND、赤:+、黄:PWM信号


【準備】

wiringPi と wiringPi2-Pythonのインストール

 $ git clone git://git.drogon.net/wiringPi
 $ cd wiringPi
 $ ./build

 $ cd
 $ sudo apt-get install python-dev python-setuptools
   <ディスク容量喰うけどいいっすか?  yes> 

エラーでた。

  =================
  E: いくつかのアーカイブを取得できません。apt-get update を実行するか
  --fix-missing オプションを付けて試してみてください。
  =================



で、sudo apt-get update してからもう一度実行したらうまくいった。


 $ git clone https://github.com/Gadgetoid/WiringPi2-Python.git
 $ cd WiringPi2-Python
 $ sudo python setup.py install 


これで準備終わり。
 

08-04-servo.py を、おもむろに起動してみる。
=====================
>>> 
Traceback (most recent call last):
  File "/home/pi/Desktop/raspi-sample/08-04-servo.py", line 4, in <module>
    import wiringpi2 as wiringpi
ImportError: No module named wiringpi2
>>>  
=====================
エラーが出て、動かない。

 $ sudo python
 Python 2.7.3 (default, Mar 18 2014, 05:13:23) 
 [GCC 4.6.3] on linux2
 Type "help", "copyright", "credits" or "license" for more information.
 >>> import wiringpi2
 >>> wiringpi2.piBoardRev()
 2
 >>> 
 $

ん? もしや。
idle(python2.x)で動かすとできた。idle3(python3.x)だとこのエラーか。

とりあえず。でけたぁ。python2 と python3 の違いに注意。


機械学習を学んでみよう。

◆利用できそうなパッケージをキーワードで検索してみる。
$ apt-cache search "weka"
weka - Machine learning algorithms for data mining tasks
weka-doc - Machine learning algorithms for data mining tasks

 $ sudo apt-get install weka weka-doc

なんか入った。取りあえず起動してみる。
トップ画面が上がった。バージョン 3.6.6。エラーも出た。

$ weka
---Weka Editor Registration ---
Trying to add database driver (JDBC): RmiJdbc.RJDriver - Error, not in CLASSPATH?
Trying to add database driver (JDBC): jdbc.idbDriver - Error, not in CLASSPATH?
Trying to add database driver (JDBC): org.gjt.mm.mysql.Driver - Error, not in CLASSPATH?
Trying to add database driver (JDBC): com.mckoi.JDBCDriver - Error, not in CLASSPATH?
Trying to add database driver (JDBC): org.hsqldb.jdbcDriver - Error, not in CLASSPATH?


サンプルファイルから決定木を作り、木構造のビジュアル化で java のエラーがでた。
表示できるビジュアル化もある。

すこし修行が必要だ。 
 

↑このページのトップヘ