2012年12月30日日曜日

Raspberry Pi のSDカードイメージの作成~日本語環境~VNC等インストールのおさらい

 夏ぐらいに注文してあった追加のRaspberry Pi が届いたので、この機会に Raspberry Pi のSDカードイメージの作成のおさらいをすることにしましした。で、SDイメージのダウンロートページを見たら、ちょうど更新されたバージョンがアップされていました。

 まず、必要な物をダウンロードしてきます。作業環境としてはWindowsを前提にしています。

 ダウンロードした Raspberry Pi の SDカードイメージは zip圧縮ファイルになっているので、解凍します。 2012-12-16-wheezy-raspbian.img のようなファイルが展開されます。
 Win32 Disk Imager を起動して、展開したイメージファイルと書込先デバイス(間違えないようにしましょう。他のディスクを消してしまうと大変です)を選択して「Write」ボタンを押します。


 書込みが終わるまで、待ちます。成功すれば「Write Success」のダイアログが表示されます。

 出来上がったSDカードをRaspberry Piに挿して、モニタをHDMI端子またはコンポジット端子に接続します。自分はHDMI入力のあるモニタを持っていないので、プラズマテレビにつないで一時的にモニタ代わりにしました。また、キーボードとマウスはUSB接続します。Ethernetケーブルを接続して、MicoroUSBへ充電用ACアダプタ等(1Aくらいの容量があるもの)接続して電源Onです。


 Raspberryマークが左上に表示されて、Linuxの起動画面がしばらく表示された後、


 Raspi-config 画面が表示されます。今回利用したイメージでは
   info                     :説明。
   expand_rootfs        :ディスク領域拡張。
   overscan              :オーバースキャン。
   configure_keyboard :キーボード設定。
   change_pass          :パスワード変更。
   change_locale        :ロケール(言語)設定。
   change_timezone    :タイムゾーン設定。
   memory_split         :グラフィックなどのメモリー割り当ての変更?試してないです。
   overclock             :オーバクロック設定。
   ssh                     :SSHサービスの起動設定。
   boot_behaviour      :起動時にデスクトップ(GUI)を起動する設定。
   update                :アップデート。
のメニューが並んでいました。とりあえず、起動時に設定するのは
①sshをEnableに設定して、外部からSSH接続できるようにしておく。
②change_timezoneでタイムゾーンをTokyoにしておく。
③config_keybordでキーボードを105→Japanese→OADG109(この辺は人による)にしておく。
④expand_rootfsでSDカードの利用領域を広げる。
です。とりあえず、このくらいで、他はあとから設定・変更でもいいはずです。下手にchange_localで日本語を設定してしまうと、Fontがないので文字化けします。

 これで再起動するとディスクが拡張されて、GUIで起動されます。
 自分はここまで来たら、TVは使わず、Windows PCからネットワーク経由で接続して作業を進めました。ローカル(TV)画面側でifconfigでIPアドレスだけ調べておき、SSHで接続します。(ちなみに、ユーザーは pi 、パスワードは変更していなければ raspberry です。)


 一応、dfコマンドでディスクが拡張されているか確認します。
 次に、自分はGUIをWin PC上からリモートで利用したいので、VNC Serverを入れました。
     sudo apt-get install tightvncserver
で。デフォルト状態ならrootはパスワードなしなので、そのままsudoできるはずです。


 VNC Serverを起動します。
     tightvncserver


 初回はパスワードを聞かれるので適宜設定します。PC側からVNC Viewerで
     Raspberry PIのIPアドレス:5901
へ接続します。


 とりあえず、VNCでGUIにリモート接続するところまでは完了です。

 次は日本語環境をセットアップしていきます。GUIとCUIの両方のリモート接続を使っていきます。コマンドの実行はCUIでもGUI内のLXTerminalでもいいと思いますが、自分はCUI接続側でコマンド実行して、GUI側で確認・・・の感じで進めました。
 まずは、フォントのインストール。
     sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname


 次にロケール設定。sudo rasp-configで先の設定画面に行って、change_localeするか、または、
     sudo dpkg-reconfigure locales
で、en_GB.UTF-8 UTF-8、ja_JP.EUC-JP EUC-JP、ja_JP.UTF-8 UTF-8 あたりにチェックを入れて


 ja_JP.UTF-8 をデフォルトにして進みます。
 続いて、IMEです。
     sudo apt-get install ibus-anthy



 ここで一旦リブート。
     sudo reboot
 再度SSHでログインして tightvncserverを起動し、VNC Viewerで接続します。
 が、ここで、IME(ibus-anthy)のインストールに失敗していました。もう一度、試したところ、「いくつかのアーカイブを取得できません・・・・」的なメッセージ。そこで、一旦
     sudo apt-get update
してから、再度
     sudo apt-get install ibus-anthy
して、 sudo reboot。今度は成功。GUI右下にキーボードのマークが表示されるので右クリックして設定画面を開いて、設定を行います。

 インプットメソッドのタブでAnthyを追加しておきます。一般のタブで全角・半角キーとCTRL+SPACEでIME起動となっていましたが、自分の環境ではCTRL+SPACEでしかIME On/Offしませんでした。VNC経由だからかもしれません。とりあえず、Midoriブラウザか何かで入力を確認。


 どうやら、日本語入力できているようです。これで一応、基本的な環境はできた感じ。あとは、アプリケーション類を入れていきます。
 まず、Chromiusブラウザ
     sudo apt-get install chromium


 エディタとして Geany。
     sudo apt-get install geany


Geanyエディタにプラグインを入れたいんだけど、たしか、gitから持ってくるので、まずは、
     sudo apt-get install git
で、gitを入れた後、
     git clone git://github.com/geany/geany-plugins.git
で、ディレクトリを移って
     cd geany-plugins/
依存関係のあるファイルが足りないみたいなメッセージ・・・・
もしかして、apt-getでダイレクトに行けたりして・・・
     sudo apt-get install geany-plugins
あれ、うまく行っちゃったかな?以前はダメだったと思うんだけど、まあ、いいか。


 GeanyでのGDBデバッグの方法は こちらの方の解説を参考にされるといいと思います。

 あとは、wiringPi を ここの説明を元にgitから入れようと思ったんだけど、うまく行かず、ファイルをダウンロード・解凍する方法でインストールしました。
gitでインストール(自分は失敗)
     git clone git://git.drogon.net/wiringPi

    cd wiringPi
    ./build

なので、手動ダウンロード
     cd /tmp
    wget http://project-downloads.drogon.net/files/wiringPi.tgz

    tar xfz wiringPi.tgz
    cd wiringPi/wiringPi
    make
    sudo make install
    cd ../gpio
    make
    sudo make install


 次にI2Cを使えるようにするための設定です。/etc/modules をエディタで編集して
     i2c-dev
の一行を追加して、/etc/modprobe.d/rasp-blacklist.conf 内の
     blacklist i2c-bcm2708
をコメントアウトまたは削除して、sudo reboot します。そして、
     sudo apt-get install i2c-tools
でI2C用パッケージをインストールします。

 続いて OpenCVです。こちらを参考にさせてもらいました。
     sudo apt-get update
     sudo apt-get -y install build-essential cmake cmake-qt-gui pkg-config libpng12-0 libpng12-dev libpng++-dev libpng3 libpnglite-dev zlib1g-dbg zlib1g zlib1g-dev pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools
     sudo apt-get -y install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs ffmpeg libavcodec-dev libavcodec53 libavformat53 libavformat-dev libgstreamer0.10-0-dbg libgstreamer0.10-0 libgstreamer0.10-dev libxine1-ffmpeg libxine-dev libxine1-bin libunicap2 libunicap2-dev libdc1394-22-dev libdc1394-22 libdc1394-utils swig libv4l-0 libv4l-dev python-numpy libpython2.6 python-dev python2.6-dev libgtk2.0-dev pkg-config
     wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.2/OpenCV-2.4.2.tar.bz2
     tar -xvjpf OpenCV-2.4.2.tar.bz2
     cd OpenCV-2.4.2/
     mkdir build
     cd build
     export DISPLAY=xxx.xxx.xxx.xxx:0.0
     cmake-gui
CMAKEでsource codeとbuild先のパスを指定してConfigureボタンを押し、インストールするものを選んでチェックボックスを入れて、Generateボタンを押します。


その後
     make
    sudo make install
しますが、makeで半日かかってしまいました。ついでにカメラ動作確認等用に guvcview というのも入れておきます。
     sudo apt-get install guvcview

...と、ここまできて、デスクトップに以前のバージョンではなかった Pi Storeというアイコンが存在することに気づきました。


 まだ、ラインナップがゼロに等しいですが、将来的にはGoogle PlayやApple Storeみたいに様々なアプリケーションがワンクリックで簡単にインストールできるようになるんでしょうか。楽しみですね。




2012年12月24日月曜日

ディアゴのロビ、7号まで組み立て

 ディアゴのロビが創刊号から7号まで溜まったので一旦組み立てて部品を整理することにしました。


 7合の時点で、ダミーのボディに組立途中の頭部を取り付けた状態になりあす。ディアゴのシリーズ物の特性で仕方ないのかもしれないですが、このダミーのボディは最後は無駄になるはずですし、一旦組み立てた頭部もLEDライトやセンサーなどはついていないので、あとで分解してまた部品をつけることになるんだと思います。この「前号までで組み立てた何々を一旦ばらして・・・・」が非常にいやで、何十号も貯めてから作業をすることになります。この手のロボットのネジは2mmとか2.6mmとかの細いものなのでむやみに付けはずしするとネジ頭を潰してしまうことが多々あります。定期購読オプションで、手戻りが発生しない単位でまとめてディアゴが発送してくれるっていうのがあるとうれしいんだけどね。

2012年12月16日日曜日

ROBO XERO を外部からコントロールしてみる

前回、RXコントローラの使い方の基本を過去の冊子をおさらいして、少しは理解できたんですが、RXコントローラの機能が豊富(UIがわかりにくい?)お陰で、使いこなせていませんが、今回は、一歩進めて、PC等の外部からの連携・コントロールに挑戦しました。
 姫路ソフトワークスさんのJO-ZEROのページを見ながら、地道に調べていたんですが、ROBOMICさんのブログを途中で見つけて、こちらが大変参考になりました。たぶん、ROBO XEROユーザはみなさん知っている(自分は知らなかったけど)くらい有名なんだと思いますが、ROBO XERO持ってて見ていなかったら、ぜひ、見てみてください。大変参考になります。

 で、PCからコントロールしてみたところです。


 PC側で規定のフォーマットでコマンドを送信する簡単なプログラムを作って、ROBO XERO側にもそれに対応するシリアル通信からのコマンドを解析して対応する動作を行うためのプログラムが必要になります。今回、色々調べた資料(途中ですが)がこちらです。作ったソース(恥ずかしいレベルのもんではありますが)を公開したいんですが、どんな方法ですればいいのか調査中です。SorucefogeとかGoogle CodeとかCodePlexとか使っったことなんですが、こういったもので公開できるんでしょうか。(追記 → CodePlexにあげてみました。)



 で、ジャイロのオプションも取り付けただけで使っていなかったので、試してみました。ROBO XEROくんを小突いても転ばないくらい安定しました。ただ、歩行あるいは走行のモーションがうまく行かなくなってしまいました。(今までのモーションのパターンだと姿勢がやや反り気味な感じになって、動いた際に仰向けにひっくり返ってしまいます。)再度、各モーションを作ってやらないといけなさそうです。


 ジャイロとPSDセンサのオプションをつけた際に、KONDOのBluetoothシリアル無線モジュールも搭載しておいたので、ついでに動作を試してみました。KMR多脚ロボットで使ったANDROID用のコントローラソフト(有料だけど)を使っています。(ROBO側のソフトは前述の有線での接続と同じ物を使っています。)







2012年12月10日月曜日

いまさらだけど、RXコントローラ(ROBO XERO用PCソフト)のお勉強

 先日、ROBO XEROのオプションが届いたのと、土日、平日もわりと遅くまで仕事だったのが落ち着いてきたので、あらためてROBO XEROをいじって見ることにしました。シリーズが完結して組み上がってから、あんまりいじってあげていなかったので、遅ればせながらという感じです。
 で、今まで、少しは動かしたりして遊んではいたんですが、その際はどうしていたかというと、基本的には提供されているモーションのファイルとF5.TXT(これがROBO XEROのスタートアッププログラムになる大事なファイルです)を少しだけ書き換えて、モーションをCALLしたり、MOVEコマンドで数値を適当に書いて動かしていました。実はROBO XEROのRXコントローラというソフトを使えば、もっと、自分でポージングさせたり、モーションを作ったりすることもできるんですが、なにせ自分は説明書のたぐいを読まない人間なので、ソフトをインストールしてコードをいじったり、CPUに書き込んだりとかはなんとなく画面を見ながらできたんですが、さすがに、ポーズを作ったりそれをつなげてモーションを作る画面はスライダや小さいボタンなどの(Windows画面の)コントローラがいっぱい並んでいて、よくわからなかったのでノータッチでした。
 今回、あらためて、ちゃんと冊子の説明を読んで使い方を理解しました。ただ・・・、ディアゴのシリーズの性質上仕方ないんでしょうが、説明が色々な号にバラバラというか細切れに掲載されているので、読みにくいったらないです。説明が途中で途切れ途切れで10号位たってから「今までの作業を忘れず保存しましょう。じゃないと消えます・・・」って、自分はあとからまとめて読んでるからいいけど、リアルタイムに毎号読んでやってた人は画面立ち上げっぱなしだったのか?ROBO XEROのバッテリが30分くらいで切れて通信できなくなると作業進まなくなると思うんだけど、どうしてたんだろう?
 で、今回やったのは「正拳突き」のモーションを作るチュートリアルで
  • 33号:「正拳突き」モーションの新規作成
  • 35号:教示セットを作成する--上半身、右腕
  • 36号:教示セットを作成する--左腕、下半身
  • 37号:教示セットを作成する--右脚、左脚、腰
  • 38号:教示セットを作成する--全身、応用
  • 40号:ホームポジションの登録
  • 42号:「脚を開く」ポーズと作って登録する
  • 43号:「構え」のポーズの作成と登録
  • 47号:「突き」のポーズ(右/逆手)の作成と登録
  • 50号:「突き」のポーズ(右/順手)の作成と登録
  • 53号:移行時間の調整とポーズのコピー
この辺りの号をつまみ読みしながら、解説に従ってモーション作成を試してみました。以下がその動作。(ジャイロをオプションで装着していますが、使っていません。)


2012年12月6日木曜日

ROBO XERO のオプションが届きました。

 ROBO XERO 刊行終了のちょっと前くらいに申込受付のあったオプションパーツがようやく届きました。自分は赤外線センサとそれ用のフレーム、ジャイロを注文してありました。前にも書きましたがジャイロは秋月のジャイロを買えば数百円なのですが、せっかくなので純正品を4000円以上出して買ってしまったわけです。


 こんな感じの箱に入って来ました。中身を開けると


 手前が赤外線センサー用の肩に取り付けるフレーム、奥の左側が赤外線距離センサー(PSD)で近距離用と遠距離用が組みになっています。奥の右側がジャイロで透明なプラスティックケースに入っていました。
 添付のCDにサンプルプログラムとPDFの組み立てマニュアルが入っていたので、それに従い組立てROBO XEROに装着です。


 脚部のモータの付け根、腰部の中央にジャイロを両面テープで貼り付けるようになっていますが、上の写真は取付作業中のROBO XEROくんの恥ずかしい姿です。
 ジャイロと赤外線センサーは背中のCPU(コントロール)ボードに接続されます。


 オプション追加のついでに、以前に多脚ロボットでも使用したBluetoothシリアル通信モジュールを背中の蓋のパネルに取り付けて、無線化もできるようにしました。


 さて・・・、オプションも装備したけど、まだ、あんまりいじってあげてないな・・・。仕事が少し落ち着いたらプログラムして遊ばなきゃ。

2012年11月24日土曜日

kinection.jp さんで公開されていた kinect のチュートリアルを試してみた

 前回入手した kinect for windows ですが、まずは、開発環境を整えて、基本のプログラム作法をり愛する必要があります。amazonを探すと書籍もよさげなのがいくつか出ているんですが、自炊するのが面倒なのでちょっと購入を躊躇しています。なので、Webに情報を求めて、kinection.jp さん(http://kinection.jp/)に公開されていた骨格情報取得と音声認識のチュートリアルを試してみました。「あ~」とか「う~」とか言うと音に反応して空の吹き出しが、事前に指定した言葉(「こんにちは」)を認識するとそれが吹き出しに出ます。

 全十数回のチュートリアルで、一つのC#のプロジェクトを拡張していく感じで機能追加とともにKinectの使い方を覚えていくような形で、大変参考になりました。(まだ、途中です。これからポーズやジェスチャー認識に挑戦です。)こういう素晴らし情報を惜しげもなく公開されている方々がいらっしゃるのは感心します。自分も少しはだれかの役に立っているのだろうか?

2012年11月18日日曜日

Kinect for Windows

新しいガラクタです。Kinect for Winodwsです。
 しばらく前に「robo8080z さんがあなたの YouTube チャンネルを登録しました。」というメールが届いて、この「robo8080z」さんの動画リストを見させていただいたんですが、「すごい!!」です。多脚ロボットや車輪型ロボット等、色々やられていらっしゃいます。何かすごく同じ匂い・・・を感じてしまうんですが、ただし、robo8080zさんは自分と違って、技術レベルも高く本格的です。動くものを形にしています。それに比べて、自分は・・・とりあえず目新しいものをちょこっと囓って満足してしまうので、形のある成果がありません。まあ、自分はその「ちょこっと囓る」部分が趣味なんですが。
 robo8080zさんのブログ があったので、見させていただいたんですが、色々やられてますよ。面白いですから、みなさんも見てみてください。このサイト(ブログ)で世の中に「Kinect for Windows」というのがあるのを知りました。いわゆるゲーム機のXboxで使うモーションセンサですが、これのWindows用というのがあって、このWindows用Kinectだと提供されているSDKを使っての開発ができるとのこと。さっそく、Amazonでポチッっとして


 結構大きな箱に入ってきて、


 開けてみたところなんですが、黒いので写真がうまく写せなかった。ネットなどで調べたところ、正面にある丸い窓のうち向かって左側が深度(距離)センサの赤外線発光部、中央がカラーカメラ、中央右が深度センサ受光部で、マイクアレイも内蔵していて、SDKを使うと人検出や顔検出、関節検出、発音位置(方向)検出や音声認識などができるらしいです。
 相変わらず、使い道考えてないですが、また、「ちょこっと囓る」おもちゃができたので、しばらく遊んでみようと思います。

ディアゴのロビ

 10月末からディアゴスティーニで「ロビ」のシリーズが始まっていました。部品を貯めておくのが場所をとるので、どうしようかと思いつつ、結局、定期購読を始めました。


 全70号の予定となっていましたが、アンケートを見ると、ユーザによるプログラミングは現状では別売りオプションで用意するかどうかっていう感じみたいです。プログラムや外部制御ができないとこの手の物は魅力半減というか、あまり意味のないものになってしまうわけですが、まあ、デザインは高橋さんのいかにもって感じのものなので、最悪CPUボードを載せ替えてもいいかなって思ってたんですが、2号についてきた「サーボテスト」ケーブルを見ると、もしかして、サーボも特殊?定期購読は失敗だったか?

2012年11月16日金曜日

The MagPi の 7号

 The MagPi というオンラインで公開されている Raspberry Pi ユーザー向けの雑誌を御存知ですか。英語ですが、なかなか充実した内容で、Raspberry Piユーザなら読んでおいて損はありません。最新号(Issue 7)が公開されていました。Raspberry Pi と Arduino の接続・・・なんて内容もありました。過去号も読めるので、Raspberry Pi ユーザーは一度見ておくといいと思います。

ディアブロ(悪魔)とアンヘル(天使)が解禁

 この半月、本職の趣味が疎かになってしまっております。今週末はなにか新しいことに取り組みたいと思っているんですが・・・。
 とりあえず、このブログの内容とは関係ない話題ですが、投稿して更新しておかないと、また、以前のホームページやブログのように自然消滅してしまいそうです・・・。
 昨日11月15日はボジョレーヌーボーの解禁日でした。普段ワイン飲みの自分はボジョレ解禁に興味があるかというと・・・全然ありません。どちらかというと、フルボディのワインが好みなので、ボジョレは軽い感じで(いや飲むんですけどね)解禁日を心待ちにするほどでも無いです。で、そんなボジョレ解禁日に合わせて解禁される知る人ぞ知る「麦のワイン」というのがあります。厚木のサンクトガーレンという地ビール屋さんが毎年6000本限定で作る、「ディアブロ」というビールです。毎年、解禁日を待たずにホームページの予約分が売り切れてしまう人気商品です。自分は地元の酒屋さん「よしの」で入手しました。こんなど田舎にあって、ワインや外国ビール、日本酒を各種取り揃えてあります。スーパーやなんとかマートに比べると割高ですが、自分のようなワイン素人でも「こんなの飲みたい」というと店頭や奥の貯蔵庫からおすすめを探してきてくれます。なので、自分のお酒調達先はこの「よしの」とあと「フジスーパー」というスーパーなんですが、やけにお酒の品揃いがいいスーパーがあり、そこが中心となっています。
 さて、今年はディアブロとあわせてアンヘルという新種のビールが解禁されました。


 「ディアブロ」(悪魔)はその名の通りというか、濃厚で苦くて甘くて・・・複雑で表現できないんですが、ありきたりな言葉を使えば、官能的な味わい、悪魔の誘いです。今年初登場の「アンヘル」(天使)はディアブロが大麦を使ったバーレイワインなのに対して、小麦を使ったウィートワインです。アンヘルは(ディアブロに比べてですが)ライトで爽やかです。ディアブロが赤のフルボディならウィートはまだにボジョレあるいは白の辛口といった位置づけでしょうか。
 まず、見かけることはないと思いますが、お店で見かけたら、ぜひ入手して味わってみてください。お勧めです。

2012年10月31日水曜日

Raspberry Pi をオーバクロックしたら起動しなくなった。

 Raspberry Pi を sudo apt-get update & apt-get upgrade でアップデートしたら、いつのまにか raspi-config に "Orerclock"の項目が増えていました。せっかくなので、1000MHzを選択して(不安定になったら、700MHzに戻せばいいやって思って)起動しなおしたところ、Raspberry Pi (OS)が起動しなくなってしまいました...。VNCでGUIどころか、ターミナルでも接続できません。これじゃ元にも戻せないじゃん・・・。あきらめて、最新のディスクイメージを落としてきてSDカードを作り直すことに決めて、SDカードをWindowsマシンに挿したところFATディスクとして中のファイルが見えて


 その中に config.txt という、それっぽいファイル名のテキストファイルがあったので開いてみたところ、


#uncomment to overclock the arm. 700 MHz is the default.
arm_freq=1000

という記述があったので、上記の arm_freq=1000 をコメントアウトして、再度Raspberry Piに挿したところ、元通り起動しました。よかった、よかった。これで、この arm_freq の値を直接書き換えれば塩梅をみながらクロックを調整することができそうです。←懲りてない。

 もじ、自分と同じく、何も考えずに軽はずみで...、同じ状態になった人がいたら試してみてください。

2012年10月27日土曜日

Interface 12月号にRaspberry Piが載ってます

 Interfaceの今月号(2012年12月号)のARMコンピュータ特集に Raspberry Piの記事が載っていました。LinuxのSDカードイメージの作り方からGPIOへのアクセスまで解説された記事が載っています。日本語でのRaspbery Piのマイコンボードとしての使い方指南としては現状貴重な資料じゃないでしょうか。



2012年10月21日日曜日

KMR多脚ロボットに専用Bluetoothモジュールを載せた

 以前に組み立てた近藤科学のKMR多脚ロボットに純正のBluetoothモジュールKBT-1を載せました。値段は高めですが、純正オプションだけあって、固定や接続は簡単に出来ます。


 ちょっと、余った配線が汚いですが、とりあえず、設置完了。


 PCとペアリングして、コントロールソフトから制御。


 次にAndroid用のソフトがダウンロードできたので(有料だけど)、試してみました。


 純正なので、当然問題なく動きます。

 これで、リモートブレイン的にPC側で制御を行い、ロボットを自律で動かしてみたい。Arduinoを載せてセンサー情報をやはりBluetoothかXBeeで飛ばせば・・・と妄想は広がりますが、具体的なアイデアはまだありません。


2012年10月16日火曜日

Raspberry Pi + OpenCV で顔検出してみたけど・・・

 ミサイルランチャーの内蔵カメラは玉砕中ですが、とりあえず、動作確認できているELECOMのUVCカメラで顔検出を試してみました。OpenCV.jpなどにあったサンプルを元にカメラ取得画像に対して顔検出するようにしました。
 最近は、まずPCのVMWare Workstation上にインストールしたDebian上で一度プログラムを作成・動作させてから、Raspberry Piへソースを持って行ってコンパイルして動作確認、という開発スタイルになっています。やはり、Raspberry Pi上でのコンパイルは時間がかかるので回数を減らしたいというのがあります。ただ、VMのDebian上では快適あるいは正常に動くのにRaspberry Piに持って行くとパフォーマンスやドライバ(アーキテクチャ)の違いでダメというのは往々にしてあります。
 今回の顔検出もVMのDebian上では快適に動作しましたが、Raspberyy Pi 上だと、動くは動くんですが、画像フレームの更新が3秒に1回くらいで、(処理されて)画面に表示されるまで10秒くらいの遅延があります。


 これだと、ミサイルランチャーにカメラを載せて(本当は内蔵カメラを使いたい)、カメラで顔検出することでミサイルランチャーをフェイストラッキングさせて、ミサイル発射(って、おいおい・・・)させる目論見は難しそうです。相手が静止していればいいですが、普通に動いていたら、数秒前のあさっての方向にミサイルが飛んでいくことになります。となると、Raspberry Piは諦めて、リモートブレイン的なPCと無線でやり取りする方法に切り替えるか・・・。あるいは小型のノートPCで試してみるか。(っていうか、Raspberry Piでミサイルランチャーを遊ぶのが目的だったので、ちょっと脱線だけど。)
 とりあえず、顔検出のソース。実行フォルダにOpenCVに含まれている正面顔検出用のテンプレート haarcascade_frontalface_default.xml を置いておく必要があります。

// OpenCV カメラ画像顔検出のテスト。
// gcc -Wall -o "%e" "%f" -g -L/usr/local/lib 
//     -lopencv_core -lopencv_imgproc -lopencv_highgui 
//     -lopencv_ml -lopencv_video -lopencv_features2d 
//     -lopencv_calib3d -lopencv_objdetect -lopencv_contrib 
//     -lopencv_legacy -lopencv_flann -lusb
// 実行フォルダに haarcascade_frontalface_default.xml を置く。
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>

#include <opencv/cv.h>
#include <opencv/highgui.h>

int main(int argc, char **argv)
{
 CvCapture *capture = 0;
 IplImage *frame = 0, *src_gray = 0;
 int max_detect, min_detect;
 int c ,i;
 
 double width = 320, height = 240;
 //double width = 640, height = 480;
 
 // 正面顔検出のための検出器を読み込む。
 CvHaarClassifierCascade *cvHCC =
  (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_default.xml", 0, 0, 0);
 // 検出用のメモリストレージの用意。
 CvMemStorage *cvMStr = cvCreateMemStorage(0);
 // 検出情報格納用シーケンスの用意。
 CvSeq *detectFace;
 // 検出最小及び最大サイズ設定。
 max_detect = (int)height;
 min_detect = (int)(height / 5);
 
 
 // カメラに対するキャプチャ構造体を作成。
 if (argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
  capture = cvCreateCameraCapture(argc == 2 ? argv[1][0] - '0' : 0);
 
 // キャプチャサイズの設定。
 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width);
 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height);
 
 // ウィンドウ作成。
 cvNamedWindow("face_detect", CV_WINDOW_AUTOSIZE);
 
 while(1)
 {
  // 画像キャプチャ。
  frame = cvQueryFrame(capture);
  
  // グレイスケールイメージに変換。
  src_gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
  
  // 顔検出処理。
  detectFace = cvHaarDetectObjects(frame, // 対象イメージ。 
      cvHCC,  // Haar分類器カスケード。
      cvMStr, // メモリストレージ。
      1.1,  // スケーリングファクタ。
      3,   // 近接矩形グループ化。
      CV_HAAR_DO_CANNY_PRUNING,   // 処理モード。
      cvSize(min_detect, min_detect),  // 最小窓サイズ。
      cvSize(max_detect, max_detect)); // 最大窓サイズ。  
  // 検出結果を矩形&クロス表示。
  for (i = 0; i < detectFace->total; i++)
  {
   CvRect *faceRect = (CvRect*)cvGetSeqElem(detectFace, i);
   cvRectangle(frame,
      cvPoint(faceRect->x, faceRect->y),
      cvPoint(faceRect->x + faceRect->width, faceRect->y + faceRect->height),
      CV_RGB(255, 0, 0),
      3,
      CV_AA,
      0);
   cvLine(frame,
    cvPoint(faceRect->x + (int)(faceRect->width / 2) -10,
     faceRect->y + (int)(faceRect->height / 2)),
    cvPoint(faceRect->x + (int)(faceRect->width /2) + 10,
     faceRect->y + (int)(faceRect->height /2)),
     CV_RGB(255, 0, 0),
     3,
     CV_AA,
     0);
   cvLine(frame,
    cvPoint(faceRect->x + (int)(faceRect->width / 2) ,
     faceRect->y + (int)(faceRect->height / 2) - 10),
    cvPoint(faceRect->x + (int)(faceRect->width /2),
     faceRect->y + (int)(faceRect->height /2) + 10),
     CV_RGB(255, 0, 0),
     3,
     CV_AA,
     0);
  }
  
  cvShowImage("face_detect", frame);
  
  c = cvWaitKey(10);
  if(c != -1) break;
  //sleep(2);
 }
 
 // 後片付け。
 cvReleaseMemStorage(&cvMStr);
 cvReleaseHaarClassifierCascade(&cvHCC);
 cvReleaseCapture(&capture);
 cvDestroyWindow("face_detect");
 
 return 0;
}

2012年10月14日日曜日

USBスカッとミサイルランチャーを Raspberry Pi で動かしてみた。

 先週は仕事が忙しくて、家に帰ってからも疲れて酒のんで寝てしまって・・・、あんまり、本業の趣味の方に手が付けられませんでした。今週末は、親戚へのお墓参りも兼ねて 一泊でしたが 松之山温泉へ行って「ちとせ」さんにお世話になりました。部屋に源泉かけ流しの露天風呂がついていて、一日中好きなときにお酒片手に温泉につかれるという贅沢な体験ができました。朝日を浴びながら温泉に使って一杯は最高でした。お料理も美味しかったし、また行きたいと思います。ただし、周りには何もありません。自分はスキーもやらないので、ひたすら温泉に使って、お酒を飲むっていう・・・。でも、WiFiのFreeSpotが使えたのは意外でした。(以前に鬼怒川温泉に行ったときは携帯すら危うかった記憶がある。)


 で、温泉で(仕事の心の)疲れを癒して、今日は、久々に新しいキワモノをいじることにしました。今回のターゲットはセンチュリーの「USBスカッとミサイルランチャー」です。といってもセンチュリーがこういうものを開発しているわけはなく、ものとしてはDREAM CHEEKYのSTORM O.I.C というものです。以前にちょっと流行ったUSBミサイルランチャーですが、このモデルにはカメラもついています。となると、やっぱり、こいつを移動ロボットに載せて遠隔あるいは自立によって操作・制御したくなります。もちろんWindows用にはDREAM CHEEKYのサイトから制御アプリをダウンロードして利用することができます。このソフトもカメラに写った画面が表示され、砲台の制御・ミサイル発射ができるようになっていますが、独自に自作プログラムから操作しようとすると調査が必要です。また、ここはせっかくなので将来のロボット搭載も意識して Raspberry Pi での制御を実現したいと思います。

 まずは、Raspberry Pi のUSBにミサイルランチャーを接続して、接続情報を調べます。lsusb でUSBデバイスの認識情報を確認すると
   2123:1010 (空欄)
   0ac8:3450 Z-Star Microelectronics Corp.
というふうに表示されます。上の名前が空欄になっている方がミサイルランチャーでHIDデバイスとして認識されているようです。ミサイルランチャーをUSBに挿すと自分の環境ではそれぞれ "/dev/hidraw2"と"/dev/usb/hiddev0"が追加されました。HIDデバイスとして認識されているならもしかするとファイルデバイスとしてコマンドを書き込んでやれば動いてくれるかもしれません。また、下のZ-Star ・・・がカメラのようです。"/dev/video0"として認識され、"ls /dev/v4l/by-id"では
   usb-Vimicro_Corp._Altair_USB2.0_Camera-video-index0
と表示されます。OpenCVで画像取得してみたところ、320×240及び640×480で画像取得することができました。→ (訂正)当初、PC上のDebian環境では画像取得は問題なくできたんだけど、Raspberry Piに接続して確認したところ、画像取得時にtimeoutしてしまい、たまに取得できるんだけど、ほとんど黒画面という状態でした。

 とりあえず、内蔵カメラでの画像取得はできそうです →(訂正)厳しいかな?別途カメラを付けるのもなんか悔しいんだけど・・・。あとは とりあえず、ミサイルランチャーの制御です。ネットで色々調べてみたところ、この機種ではありませんが、過去に販売されていた同社のミサイルランチャーの制御をLinux上で行なっているサンプルがあったので、それらのコマンド記述を参考(というかコピー)にして "/dev/hidraw*"への書き込みスクリプトで操作しようとしたんですが、うまくいきませんでした。そこで、libusb というのを使うことにしました。使い方とかはこの辺とか、ネットで調べました。libusbのインストールは

   sudo apt-get install libusb-dev

で。


 Raspberry Pi のUSB端子に直接接続した状態だと砲台の駆動時に USB通信エラーになってしまい、途中で動かなくなってしまいました。これは、Raspberry PiのUSB駆動能力が140mA程度にポリスイッチで制限されているからだと思います。そこで、セルフパワー(ACアダプタ付き)のUSBハブを間に入れることで、ミサイル発射まで動かすことができるようになりました。ただし、数回に一度、ミサイル発射時にRaspberry Piのシステムが落ちます。発射時に突入電流やノイズのようなものがあるんでしょうか?でも、間にハブを入れているので、影響するんだろうか?この部分は今のところ原因不明です。
 以下、ソースです。

#include <stdio.h>
#include <unistd.h>

#include <usb.h>

#define HID_REPORT_SET (0x09)
#define BULK_OUT (0x02)

#define MISSILE_VENDOR_ID (0x2123)
#define MISSILE_PRODUCT_ID (0x1010)
#define MISSILE_CMD_HEADER (0x02)
#define MISSILE_CMD_DOWN (0x01)
#define MISSILE_CMD_UP (0x02)
#define MISSILE_CMD_LEFT (0x04)
#define MISSILE_CMD_RIGHT (0x08);
#define MISSILE_CMD_FIRE (0x10);
#define MISSILE_CMD_STOP (0x20);

const int USB_TIMEOUT = 3000;
const int BUF_SIZE = 8;

int main(int argc, char **argv)
{
 struct usb_bus *bus;
 struct usb_device *dev;
 usb_dev_handle *udh;
 struct usb_config_descriptor *config;
 struct usb_interface *interface;
 struct usb_interface_descriptor *altsetting;
 unsigned char buf[BUF_SIZE];
 int result = -1;
 int i = 0, j = 0;
 
 // 初期化。
 usb_init();
 usb_find_busses();
 usb_find_devices();
 
 // デバイスチェック。
 for(bus = usb_get_busses(); bus; bus = bus->next)
 {
  for(dev = bus->devices; dev; dev = dev->next)
  {
   if(dev->descriptor.idVendor == MISSILE_VENDOR_ID &&
    dev->descriptor.idProduct == MISSILE_PRODUCT_ID)
   {
    // デバイスオープン。
    if((udh = usb_open(dev)) == NULL)
    {
     // オープンに失敗。
     printf("usb_open Error.(%s)\n", usb_strerror());
     exit(-1);
    }
    
    printf("found usb missile launcher\n");

    config = &dev->config[0];
    interface = &config->interface[0];
    altsetting = &interface->altsetting[0];
    
    if (usb_set_configuration(udh, config->bConfigurationValue) < 0)
    {
     if (usb_detach_kernel_driver_np(udh,
              altsetting->bInterfaceNumber) < 0)
     {
      printf("usb_set_configration() error.\n");
      usb_close(udh);
      return -1;
     }
    }
    
    // インタフェースの使用をシステムに通知。
    if (usb_claim_interface(udh, altsetting->bInterfaceNumber) < 0)
    {
     // インタフェース使用要求でエラー。
     printf("claiming interface error\n");
    }
    else
    {
     for (j = 0; j < 6; j++)
     {
      // 送信データ構成。
      buf[0] = MISSILE_CMD_HEADER;
      switch (j)
      {
       case 0:
        buf[1] = MISSILE_CMD_RIGHT;
        break;
       case 1:
        buf[1] = MISSILE_CMD_LEFT;
        break;
       case 2:
        buf[1] = MISSILE_CMD_UP;
        break;
       case 3:
        buf[1] = MISSILE_CMD_DOWN;
        break;
       case 4:
        buf[1] = MISSILE_CMD_STOP;
        break;
       case 5:
        buf[1] = MISSILE_CMD_FIRE;
        break;
       default:
        break;
      }
      for (i = 2; i < 8; i++)
      {
       buf[i] = 0x00;
      }
      
      // 送信。
      result = usb_control_msg(
       udh,
       USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
       HID_REPORT_SET,
       0,
       0,
       (char*)buf,
       sizeof(buf),
       USB_TIMEOUT); 
      if (result < 0)
      {
       // 送信エラー。
       printf("usb write error.\n");
      }
      else
      {
       printf("send data.\n");
      }
      
      sleep(1);
     }
     
     // インタフェースの解放。
     usb_release_interface(udh, 0);
    }
    
    // デバイスクローズ。
    usb_close(udh);
    
    return 0;
   }
  }
 }

 return -1;
}

2012年10月8日月曜日

Raspberry Pi への OpenCV インストール

こちらに改めてセットアップに関して記述しています。

 相変わらず、GR-SAKURA のI2Cが上手く扱えず、Arduinoを主力で行くか悶々としている日々が続いているのですが、気分転換に Raspberry Pi へ OpenCV のインストールを行なってみました。Raspberry Piで画像処理が出来れば、センサやサーボ制御周りはロボット上のArduinoにやらせて、コントローラまでロボットに載せてしまいたいときはRaspberry Piを一緒に載せて、リモートブレイン的にいくときはBluetooth等の無線経由でパソコンで処理といった選択肢が広がります。そうなると、自分の知識ではI2C(のライブラリが他のArduinoやRaspberry Piと同じようにやっても)を思ったように動かせないGR-SAKURAの出番はますますなくなっていくわけですが・・・。

 当初、日本語で解説されているこちらのページを参考にさせていただいて、
   OpenCV-2.4.2.tar.bz2
のインストールを行ったんですがmakeで 3~4件のErrorが出てしまい、数日かけて色々試してみたんですが、結局サンプルも動かせない状態でした。
 そこで、こちらのページを参考にして、マイナーバージョンの一つ古い
   OpenCV-2.3.1a.tar.bz2
というのを試したら、あっさりインストールできてしまいました。おそらく、Raspberry Pi の Rapbian "wheezy" が古いバージョンを使っていることに起因しているんじゃないかと思います。う~ん、インストールするだけで数日かかってしまった。Windows ならこのへんのバージョン(まして、マイナーバージョン)なんてほとんど問題にならない、っていうか、何も考えずにダブルクリックだけで済んじゃうわけで、そういうところはやっぱり便利です(というか、それが当たり前だと思ってしまっていますが)。
 で、とりあえず、pythonのサンプルを動かしてみる。



 動くようです。これで、なんとか環境だけは準備できたかな?でも、ロボットで使うとなると大事なのはカメラが使えるかというところだと思います。Windowsなら、何も考えずにUSBに挿せば勝手にドライバーが入って(あるいは簡単なインストールで)動いてしまうわけですが、Linuxだとそうも行かないことは予想がつきます。カメラ側にLinux対応と買いて売っているものもまずありません。この辺りに有志の方の動作確認済み情報もありますが、日本で手に入りにくかったり、ロボットに載せるのに向いていなさそうなタイプのものだったりで、リストにあるLogitechのものを一つ買ってみようとは思っていますが、とりあえず、手元に在庫として転がっている(過去に使っていて今使っていないような)古いWebCamを試しに挿して動作を確認して見ることにしました。Logitechの昔のものなら、それなりに動く期待はもてるんじゃないかと・・・。
 で、カメラ自体の動作確認にはまずOpenCVとは別に guvcview というソフトを
     sudo apt-get install guvcview
でインストールして、行いました。

Logitech V-UM27 (100mA)
   lsusb では 046d:08f0 Logitech, Inc. QuickCam Messenger とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-046d_Camera-video-index0 としてリスト
   guvcview では 1fps, 160×120res, YU12 で動作。
   形的には目玉っぽくてロボットにいいかも。下部にネジ穴もあるので固定しやすそう。

Logitech V-US20 (100mA)
   lsusb では 046d:0870 Logitech, Inc. QuickCam Express とリストされる。
   ls /dev 以下に vidio0 としてリストされず。
   使えず。


Logitech V-UJ15 (100mA)
   lsusb では 046d:08b1 Logitech, Inc. QuickCam Notobuook Pro とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-0464_08b1-video-index0 としてリスト
   guvcview では 9.5fps, 160×120res, YU12 で動作。
   解像度も低く、ロボットに載せにくい形状。



Logitech V-UBU48 (500mA)
   lsusb では 046d:0991 Logitech, Inc. QuickCam Pro for Notebooks とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-046d_030E2026-video-index0 としてリスト
   guvcview では MJPEG, YUYV等で 160×120res, 3fps ~ 320×240 ~640×480 ~ 800×600, 1fps 等で動作。
   画質もクリアで使えそうだが、Rating:500mAって記述が気になる。Raspberry Pi のUSBは140mAくらいのポリスイッチ(リセッタブルヒューズ)が入っているらしい。


ELECOM UCAM-DLK130T (詳細不明、UVC)
   lsusb では 056e:700f Elecom Co. Ltd とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-ELECOM_ELECOM_UCAM-DLK130T-video-index0 としてリスト
   guvcview では YUYVで 160×120res,7fpsと320×240.5fpsと800×600,0.5fpsで動作。
   なぜかVGA解像度で動かなかった。ロボットに載せるのには加工が大変そう。



とりあえず、認識されてv4lで画像が取得できた、Logitech V-UM27、V-UJ15、V-UBU48、ELECOM UCAM-DLK130Tで OpenCVのカメラ画像取得を試してみました。といっても、OpenCVをいじるのは初めてなので、ネットでサンプルコードなどを拾ってきてお試ししました。

// OpenCV カメラ画像取得テスト。
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>

#include <opencv/highgui.h>

int main(int argc, char **argv)
{
 CvCapture *capture = 0;
 IplImage *frame = 0;
 int c;
 
 //double width = 160, height = 120;
 double width = 320, height = 240;
 //double width = 640, height = 480;
 //double width = 800, height = 600;
 
 // カメラに対するキャプチャ構造体を作成。
 if (argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
  capture = cvCreateCameraCapture(argc == 2 ? argv[1][0] - '0' : 0);
 
 // キャプチャサイズの設定。
 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width);
 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height);
 
 // ウィンドウ作成。
 cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE);
 
 while(1)
 {
  // 画像キャプチャ。
  frame = cvQueryFrame(capture);
  cvShowImage("Capture", frame);
  
  c = cvWaitKey(2);
  if(c == '\x1b') break;
  //sleep(2);
 }
 
 // 後片付け。
 cvReleaseCapture(&capture);
 cvDestroyWindow("Capture");
 
 return 0;
}

 とりあえず、それぞれのカメラで(対応している解像度で)の画像取得を確認できました。


 ただ、実際にOpenCVを使っての画像処理に関しては、全くこれからの初心者状態ですので、すこしずつ調べながら進めていきたいと思っています。

2012年10月2日火曜日

LSM03DLHディジタル・コンパス

 今回は SparkfunのLSM303DLH搭載傾き補償付きデジタルコンパス・加速度センサモジュール を試してみました。といっても、既にArduinoでお試しされている方はたくさんいて、ライブラリまで作ってくださっている方もおります。今回は、こちらのライブラリを流用して、お試しさせてもらいました。
 Arduino-IDEのバージョンが違うのと、ライブラリ内でどんな処理をしているのか知りたたかったので、あえて、ライブラリの中身をメインの処理にコピペして使わせてもらいました。元のライブラリはこちらのサイトで公開して下さっています。


 真ん中の小さい赤い基板がデジタルコンパス・加速度センサモジュールです。左側の赤いユニバーサルボードにタイヤがついているのは、この辺で使っていた差動二輪の台車が手狭に感じてきたので、一回り大きい板で用意したものです。といっても、モータは以前と同じく模型用の一番小ぶりのおもちゃのモータなので、ペイロードは期待できません。
 この週末というか日曜日は、前述のコンパスの動作確認と、台車の組立、もうひとつ、市販の多脚ロボットを台車とあわせて移動プラットフォームに今後使いたいと思い、組み立てていました。


 ビールを飲みながら、一日、ロボットを組み立て、ああ、なんか幸せ・・・。ところで、自分は普段は殆どビールは飲みません。主にワインを飲みますが、夏場暑くなると、唯一ギネスを一杯目として飲んだりという程度なんですが、今日はロボットを肴にビール祭りです。
 まず、ギネス


 実はビールの炭酸があまり得意じゃなかったりするんですが、クリーミィな泡立ちと苦すぎず、香りがいいので、ギネスは大好きです。
 ビールにあわせて、組立も進みます。


 それらしい形になってきました。
 ビールの方は二本目、サンクトガーレンのインペリアルチョコレートスタウトです。


 「チョコビール」ってチョコの入ったビールってどんな味だろうって思ったんですが、チョコが入っているわけではなくて、麦芽をチョコやコーヒー豆のような色になるくらい強く焙煎して、風味もチョコ的な風味がするビールっていうことらしいです。たしかに、口に含んだ瞬間ビターチョコのような感じを受けます。ただ、同じスタウトなら、自分はギネスのほうが飲みやすくて合っているなという感想でした。
 さて、ロボットの方はCPUボードなども実装して、一応、組みあがりました。


 なかなか、メカメカ?していて良い感じです。二足もかっこいいんですが、自分はこの手の多脚ロボット、虫とか蜘蛛とかムカデ系のがガシャガシャ動く様子を見るとなんだか嬉しくなってしまいます。(ちなみに本物の虫、蜘蛛、ムカデは苦手です。)
 で、完成を祝して、三本目、サンクトガーレンのその名も el Diablo です。


 バーレイワイン(麦のワイン)と言われるタイプのビールだそうです。これは・・・くせになります。とても濃厚で、苦味も強いですが、他の甘みや色々な味がはっきりとするので、強い苦味も嫌味でなく、美味しいです。ギネスを飲んだ以来の衝撃のビール(大げさ?)かも?でも、値段もかなりのもので、しかも、2011年ものは6000本しか作られていないらしく、晩酌で毎日・・・というわけには行かないです。秋には今年のものが発売されると思うので、今から楽しみです。

 さて、今後、今回組み立てた移動プラットフォームと今までに調べたセンサ類を使ってなにかやろうと思っているんですが・・・、具体的には、まだ、考えていません・・・