Tuesday, August 28, 2012

Python:PILをWindows7 64bit環境で使う

こんにちは。もう9月だというのにまだまだ暑いですね。

 今回はPythonを使用していてハマったエラーの対処法を載せておきます。
Pythonにおいて画像を処理しよとするとよく用いられるのが、PIL(Python Imaging Library )です。

[参考]Python Imaging Library (PIL) : http://www.pythonware.com/products/pil/

このライブラリを使うと簡単に画像処理ができます。
具体的にはPNG画像を表示するためにPILを使用したいと考えました。
しかし、ライブラリをインストール後以下の様なエラーメッセージが表示され、正常に動作しません。

ImportError: The _imaging C module is not installed

モジュールをインストールしたはずなのに見つからないようです。
*インストールはインストーラではなく手動で行いました
このエラーメッセージを頼りに検索していくと、Windowsの64bit環境において起きるということがわかりました。

[参考]流れ着いたら。。。:http://www.flotsam-fareast.com/2011/02/64bit-windows-python-image-library-20110212.html

そこで、以下のサイトから64bit用のPILのインストーラをダウンロードしてインストールしました。

Unofficial Windows Binaries for Python Extension Packages:http://www.lfd.uci.edu/~gohlke/pythonlibs/

しかし、インストラーを起動すると以下の様なメッセージが表示され、それ以上進めなくなりました。
Python version 2.* is required, which was not found in the registry
PILを手動でインストールしなければその時点で発生したエラーだと思います。
そこで対処法を調べると、レジストリを読み間違えているということがわかりました。
[参考]Yamada Program:http://yamada-program.blogspot.jp/2011/05/pythonsetuptools-64bit.html

ただし、私はPythonのレジストリを書き換えたくないという事情があり、他の方法を模索することとしました。

Unofficial Windows Binaries for Python Extension PackagesでダウンロードしたPILはインストールできないので、EXEファイルをExplzhで解凍して問題のあるDLLを直接置き換えることとしました。

まず、Python Imaging Library (PIL)からPython Imaging Library 1.1.7 Source Kitをダウンロードし、解凍します。
次にUnofficial Windows Binaries for Python Extension Packagesから自分のPython環境に合致するインストーラをダウンロードします。
ダウンロードしたインストーラをExplzhで解凍します。
展開すると中には、以下の二つのフォルダがあります。

・PLATLIB
・SCRIPTS

まず、PLATLIBの中のPILというフォルダの中身をすべて、Imaging-1.1.7>PILに上書きします。
次にSCRIPTSの中身をすべて、Imaging-1.1.7>Scriptsに上書きします。

最後にImaging-1.1.7のフォルダをPython26\Lib\site-packagesなどに移し、PYTHONPATHを通せば完了です。
PYTHONPATHの通し方は、前の記事を参照して下さい。

これでレジストリを書き換えることなくWindows7 64bit環境でPILが使用出来るようになりました。
今回は以上となります。

Sunday, August 12, 2012

Python:super()の謎エラー

こんばんは。最近健康面に不安を感じ、大学近くのジムに通い始めました。
大学に入る前より15キロ太ったので、なんとかそのときの体重に戻したいです。

 さて、最近Pythonにはまっております。
[参考]日本Pythonユーザ会 :http://www.python.jp/Zope
Pythonは非常に開発がやりやすいうえ、WindowsだろうがLinuxだろうが同じコードで動いてくれるのが研究でも趣味でも役に立ちます。
特にお気に入りなのは、対話型シェルを使用して一行ずつプログラムを書ける点です。
これを使えば、使い方の分からないメソッドをその場でテストしたり、自作関数の動作テストも容易に出来ます。
 また豊富な機能を実現するモジュールが数多く存在するのが素晴らしいです。
例としてTkinterというGUI製作用のモジュールが存在します。
[参考]Tkinter 8.4 reference: a GUI for Python :http://infohost.nmt.edu/tcc/help/pubs/tkinter/
PythonをWindowsにインストールしたときに標準でついてくるIDLEは、Tkinterで製作されているようです。
Tkinterの使い方は日本語のサイトはいつかあるようですが、紫藤さんのWebページを参考にさせていただきました。
[参考]紫藤のページ :http://www.shido.info/py/index.html

 今回はそのときに真っ先にハマった内容を備忘録を兼ねて書きます。
参考にしたサンプルの内容としてはWidgetを配置する簡単なものです。
その際の初期化を再現すると以下の様になります。


class Son(Parent):
    def __init__(self):
        Parent.Frame.__init__(self)



直接、親クラスの初期化メソッドを呼んでいました。
しかし、Python(2.x系列)では、


super(クラス名, self).メソッド(…)


と書けば親クラスのメソッドを呼べるのに、なぜそうしないのか気になりました。
そこで、実際にsuperを使用して記述しなおしました。


class Son(Parent):
    def __init__(self):
        super(Son, self).__init__()


これを実行すると、以下のようなエラーが出ました
TypeError: super() argument 1 must be type, not classobj
検索してみると、結構困っている人が多いようですが、なんとか以下のような記述を発見しました。
"the problem is that you are using old-style python classes, which do not support super. The easy way to fix this is to put object at the base of your inheritance tree. "
[参考]Open Source Applications Foundation :http://chandlerproject.org/Projects/UsingSuper
どうもクラスのスタイルが古いらしいです。
最初の例題通りのやり方で回避できるようですが、クラスのスタイルが古いとはどういうことでしょうか。
もう少し調べると、hope-echoesさんのwebページを参考にして答えが出ました。
[参考]大カフェイン :http://d.hatena.ne.jp/hope-echoes/20080409/1207732499
Objectクラスを親にもつクラスは全て新形式のクラスで、持たないものは旧形式のクラスのようです。
type()で調べると

・新形式


>>> type(datetime.datetime)
��type 'type'>


・旧形式


>>> type(Tkinter.Frame)
��type 'classobj'>


となりました。
ここでtypeが'classobj'になるものは旧形式のクラスのようです。
つまりTkinterのFrameは旧形式のクラスなので、super()のサーポート外だったようです。

 これでsuper()でエラーが出る理由と回避方法がわかりました。
Pythonはやりはじめなので、今後もこのようなエラーにハマると思いますが、がんばります。
今回は以上で終わりです。

Tuesday, August 7, 2012

苺サーボでヒューマノイドを作る その2

こんばんは。
そろそろ世間は夏休みでしょうか? 電車で親子連れや子供をよく見ます。

前回の実験にサーボモータを7つ追加して再実験しました。
今回も以下の項目を調べます。
 ・トルク
 ・消費電流
 ・消費電力

実験に使用したサーボは以下の8つです。すべてシリアル(コマンド)サーボとなっています。
選定基準は手元に合ったものや、借りられたものです。

・Pirkus
PRS-DE07MS
PRS-S40M

・Futaba
RS301CR-H3b
RS405CB

・KONDO
KRS-6003HV ICS
KRS-4033HV ICS
KRS-4034HV ICS
KRS-2552RHV ICS

実験の詳細や様子は以下の動画を御覧ください。


実験結果として、およその値ですが以下のようになりました。
シリアルサーボ実験結果
*この値はこちらの実験環境による結果なので参考程度に留めてください。

 実験結果を眺めるとRS-DE07MS以外は、公称値のトルクより低く出ました。
どのように公証トルクを算出しているのかわからないのでなんとも言えませんが、実験機材の都合として3 [kg]までしか計測できないので200 [mm]という長いアームのせいでうまくトルクが伝達していないのかもしれません。
しかし、実際にはロボットに組み込むので損失は絶対に発生します。
そいう意味ではそのへんも考慮しながら結果を眺めるといいかもしれません。

 消費電流はKRS-4034HVが出力トルクを考えると群を抜いて低いです。すごくエコみたいです。

また、本実験の動画にない注意としてサーボモータが全て新品というわけではありません。
RS301CR、KRS-6003HV、KRS-4033HV、KRS-4034HVだけが新品となっています。
なので、古いサーボほどへたっている可能があります。
それと、動画を見ればわかるのですが、サーボ出力が安定せず採用した値が妥当かどうかはわからないので、動画からご自分で考えていただけると助かります。

 ロボメカの後輩がすでにPWMサーボで同様の実験を行なっていますので、そちらの動画も楽しみにしたいです。
それでは今回はここまでです。

最後に、今回の実験に協力してくれた皆様ありがとうございました。