2013年9月16日月曜日

Raspberry Pi camera モジュールでOpenCV (引き続きVisualGDBお試し中)

 Raspberry Pi の専用カメラモジュールを入手して、本体に取り付けて、コマンドで画像取得はできたんですが、OpenCVで使おうと思ったら、他のUSB Webcamの様にはOpenCVでは認識してくれませんでした。
 "raspistill"コマンドのソースが公開されているので、それらを解析して、画像取得部分を取り出さないとダメなのかなぁ?面倒だなぁ?なんて躊躇している間に、世の中にはさっさとやってくれている人がいらっしゃいました。他力本願ですが、こちらのサイトで公開されている資料やソースをそのままコピー&ダウンロードして、使わせて頂くことにしました。
 ただ、開発環境の方は、先日から評価版インストールでお試し中のVisualGDBです。頂いてきたソースをそのままWindows上のViisualGDBのプロジェクトに登録して、Makefile settingsの部分を環境に合わせて(include,libのパスと使用するlibの設定)、SSH接続でのRaspberry Pi上でのコンパイルで実行してみました。

 プロジェクトの構成はこんな感じ。


 Makefileの設定。


 includeパス。


 libraryパス。


 library。


で、ビルドして実行してみました。


 サンプルはOpenCVのcvWindowで画像を表示して、ファイルfoobar.bmpに保存するような内容ですが、その通りの動作(当たり前か?)です。実際のOpenCVのコードが書かれている部分をステップ実行で探したところ、camcv.c の encoder_buffer_callback関数内で行われていました。1フレームのデータが取得されてエンコードされたあとに呼び出されるような関数でしょうか?その中でOpenCVの処理を行っています。この部分に顔検出やらそのほかのOpenCVの処理を追加していけばいいのだと思うのですが、raspstillコマンドのソースを元にしているためもあって、全体のコードがやりたいことに対して大きくなってしまいますね。もう少しシンプルにcameraモジュールを使う方法があるといいんですけど。他のUSB webcamみたいにOpenCVで扱えるといいんですが・・・。
 なんか、この感じだと、専用cameraモジュールを使うよりもUSB webcam使ったほうが、Raspberry Piから少し離れたところへの引き回しや固定(専用cameraモジュールは15cmくらいのリボンケーブルで基板むき出し)しやすいし、ソフトウェア的にもOpenCVが素直に認識してくれれば(最近のUSB webcamならUVC対応で、たいがい認識してくれるだろう)、全然楽な気がしてきました。う~ん、使い道が・・・。






VisualGDBでBeagleBone Blackも試してみました。

 先日、VisualGDBでRaspberry Piを試しましたが、今回は、BeagleBone BlackにVisualGDBが使えないか試してみることにしました。VisualGDBはRaspberry Piをサポートしているので、SSH接続でのターゲット上でのコンパイル開発もWindows上でのクロスコンパイラによる開発もサポートしていますが、BeagleBone Blackはサポートされていないので、Windows上でのクルスコンパイラは無理だと思います。しかし、同じARM Linux (ディストリビューションは違うけど)へSSH接続してターゲット側でコンパイルするのであれば、ターゲット側に元々gccやgdbの環境さえ動いていれば、同じように利用可能なんじゃないか?と思ったわけです。実際、VisaulGDBのメニュー画面の記述も「LinuxのターゲットにSSH接続して・・・」的な記述なので、SSH接続してターゲット側でコンパイルするパターンであればx86だろうがARMだろうが、あるいはディストリビューションに関係なく、もともとセルフ開発できてSSH接続できる環境がターゲットにあるなら使えるということを意味しているんだと思います。

 で、Lチカを試してみました。


 あっさり動いてしまいました。おそらく、少なくともコンソールアプリは行けそうです。






2013年9月10日火曜日

VisualGDBで Visual Studio を使ってのRaspberry Pi のクロス開発

 以前に、Debian Linux 上のEclipseから Raspberyy Pi のクロス開発を行う環境の構築について記述したことがありますが、ネットを徘徊している時に VisualGDB なるものを見つけたので、試してみることにしました。
 Visual Studio 2010 or 2012 のプラグインとしてインストールして、Raspberry Pi のクロス開発ができるというものです。残念ながら有料ですが、30日の体験版インストールが可能だったので、試してみることにしました。

 VisauGDBプラグインをインストールして、新規プロジェクトでVisualGDBを選択すると、いくつかのプロジェクトの種類が選択できます。


 Linux Project Wizard を選択すると、「Build the project under Linux over network」と「Build the project locally with a cross-compiler」が選択できる画面になります。

 「Build the project under Linux over network」はSSH接続でVisual Studio で編集したソースを Raspberry Pi 側(のリソースを使って)でビルドします。


こちらの方式では、ビルドにRaspberry Pi のリソースを使用するので、時間がかかります。HelloWorldくらいでは差はでませんが、OpenCVを使ったプロジェクトをビルドしたりすると、後のクロスコンパイラ環境に比べてかなり時間がかかって待たされます。ただし、ビルドのためのプロジェクトのプロパティの設定は比較的簡単です。Raspberry Pi 側でMakefileでビルドできる環境になっていれば、Makefileの中身相当のものをプロパティのフィールドに埋めていけばOKな感じです。

 これに対して、「Build the project locally with a cross-compiler」を選択すると、Windows上でWindowsマシンのリソースを使用してクロスコンパイラによるビルドが行われます。


こちらは、今どきのCorei7,SSDでメモリも数Gあるマシンならビルドはあっという間です。Raspberry Pi上にあるライブラリやヘッダファイルをどうするのかという問題が有りますが、環境の同期機能のようなものが有り、「同期」ボタンを押すだけで開発系のライブラリやソースをWindowsマシンのクロス開発環境のディレクトリにコピーして準備を整えてくれる機能が装備されています。ただ、自分がOpenCVを使ったプロジェクトをこちらの方式でビルドしようとしたところ、上手くビルドできず(ライブラリを見つけられず)、プロジェクトのライブラリのパス設定なども行ったんですが、今のところ上手く行っていません。たぶん、何かの設定ミスだと思うのですが、引き続き調査です。WiringPiを使ったプロジェクトはこちらのクロス開発でも上手くビルドすることが出来ました。

 このVisualGDBの凄いところは、どちらの方式でも Windows 上の Visual Stduio からブレークポイントを置いたデバッグが出来て、しかも、コンソールアプリだけでなく、OpenCVのアプリケーションのようなものでも Xサーバを使って、Windows上に実行画面を表示しながらデバッグできてしまうところです。



 このXサーバを使ったGUIアプリのデバッグ機能は正直驚きです。

 また、VisualGDB は Raspberry Pi 上での Qt4 での開発にも対応しており、


詳しくはこの辺のチュートリアルを見ていただくとして、やはり、Xサーバでの実行・デバッグが出来ます。


かなり、便利。問題は価格でしょうか。Raspberry Pi が3枚以上買えます。



2013年9月2日月曜日

LEGO 21103 BACK TO THE FUTURE デロリアン

 2週間ぶりの投稿です。ここのところ土日も仕事で本業の趣味の方が手薄になっています。この週末は私用があって仕事はおやすみしたので、積みレゴのなかから1つ作ることにしました。今回作ったのは、在庫の中で一番新しいもので、「LEGO 21103 BACK TO THE FUTURE Delorean time machine」です。楽天のトイザらスで国内発売のものを予約しようと思ったら、品切れになっていたので、Amazonで若干割高で並行輸入品を買いました。


 パッケージ裏側にはBACK TO THE FUTURE Ⅰ~Ⅲ のデロリアンが再現できる旨が載っています。


 このデロリアンはもともと LEGO CUUSOO から発案されたもののようです。計器類等のシールも凝っています。
 箱を開けて部品を取り出したところ。パーツ数はそれほど多くなさそうですが、出来上がるデロリアンのスケールを考えると、意外とたくさんパーツが有るな、と感じました。



 外側をブロックで囲って中は隙間になる感じかと思っていたんですが、実際にはプレートをきっちり積み上げていって、1ポッチの細かい部品などが多く使われていて、結構、作りがいがありました。また、自分は初めて見るようなタイプのブリックも幾つもあったので勉強になりました。


 ガルウィングも再現されています。ミニフィグはマーティ(スケートボード付き)とドクが付いています。


 内部の計器類もシールで再現されていて、マーティを座らせることもできます。(ドクは髪の毛の高さがあるので、車中に入れるときに少しひっかかります。)
 デロリアンの主な可動部としては左右のガルウィングドアとタイヤ四輪の回転と(飛行形態になるときの)折りたたみです。
 車両後部のエンジン(ブースタ?)のダクトの斜めの再現などのブリックの使い方に、こんな使い方もあるんだなぁ、と感心させられるところも多かったです。
 自分は、にわかレゴファンになってから、テクニックシリーズとマインドストームが中心なので、ビームとペグとシャフトばっかり使うことが多いですが、プレートやブロックも使って何か形にしてみたくなりました。


2013年8月15日木曜日

夏休みの工作 ・・・ センサグローブとロボットハンド、別名、パイ揉みハンド

 昨日からのお盆休みを利用して、夏休みの工作です。そういえば、子供の頃、夏休みの宿題は全然やらないで、8月終わりにしかたなしにやってたけど、工作だけは妙に力を入れてやっていた記憶があります。
 さて、今回は、スイッチサイエンスさんで入手した曲げセンサを使ってみようと思います。


 電極部分にピンヘッダをつけて、


 接続用のケーブルを作成。今回は、インプットとして、曲げセンサをArduino Microにつないでみます。なぜ、今回は、Arudino Microにしたかというと、やっぱり、小さいこと。Arduino Microと曲げセンサのコネクタを接続するためのベースを秋月のスルーホール基板を切断したものでハンダ付け。


 これらを、近所のワークマンで買ってきた手袋に実装しました。
 じゃん。


 

 なかなか、サイバーな雰囲気。


 同じ手袋を二重にしてカバーの代わりにしました。
 曲げセンサは曲がり具合で抵抗値が増加するセンサです。10kΩで5Vにプルアップして、曲げ具合で抵抗(電圧)の増加をArduino MicroのA0~4のAnalogインプットで取得し、USBから1指1バイトのデータとして送信するようなスケッチを書き込みました。

 続いて、出力側として子供の科学教材として売っているロボットハンドのおもちゃをサーボでコントロールできるようにしてみます。



DIY店で買ってきた20mm幅のアルミ板材を加工して、サーボ用の金具を作成します。



 以前に紹介したポケットベンダーが大活躍。



 Raspberry Pi からサーボの制御は、これまた以前に登場したAdafruit の I2C サーボコントローラを使用しました。

 Arduino Micro でセンサグローブの曲げを検出して、USB接続でRaspberry Pi にセンサグローブの情報を送信し、Raspberry Pi からI2C経由でセンサグローブの曲げ情報をサーボに渡しています。「Raspberry Pi を用いた揉み動作のハンドロボットへの伝達システム」、略して、「パイ揉みハンド」です。



2013年8月14日水曜日

LEGO Mindstroms EV3 が届きました。

 数カ月前にLEGO Mindstorms EV3が発売になるというニュースを見て、以前から一度触ってみたいと思っていたLEGO Mindstormsをまずはネットにいろいろな情報がある現行のNXTから、ということで、NXTを入手して、いろいろ遊んでいたんですが、すっかりハマってしまい、結局うEV3も予約をしてしまっていました。数日前に届いていたんですが、触っている時間がなかったので、お盆休みの三日間を使って、少し遊んでみようと思っています。


 新しいEV3ではコントローラブリックやセンサ・モータ類も全体に角ばったというかフラットな印象に変わっています。NXTに比べた最大の特長は、CPU他のスペックアップとLinuxをOSに採用したところですが、そのせいで、起動と終了がNXTに比べて非常に時間がかかるようになってしまいました。NXTは組み込み用の独自OSでスイッチOn/Offですぐに使えて終了出来ましたが、EV3ではスイッチを入れてからLinuxが起動して使用できるまで、あるいは、スイッチを切って使い終わる時もLinuxのシャット・ダウンが行われるので、この部分は非常にうっとおしくなってしまって残念な点ではあります。


 しかし、Linuxが載ったということは、より色々と遊び甲斐が広がったわけで、早速、いじってみたいと思います。まずは、無線LANドングルを接続してEV3ブリックをネットワークに接続します。EV3の設定画面か自IPアドレスを確認できるので、外部からの接続を試みます。先日、日経Linux9月号でtelnet接続できるというような情報を見かけたので、試してみます。
 EV3のIPへtelnet接続して、rootでパスワードなしでログインします。


 あっさり、ログインできてしまいました。/binフォルダ等も存在します。sshコマンドもあるようなので、ここから、Raspberry Pi にsshログインしてみます。


 おお、出来た。まあ、Linuxなんだから、当たり前といえば、当たり前なんだけど・・・。
まだ、EV3の情報は少ないですが、Linuxなので色々インストールしたりできると思うんだけど、動かなくなった場合、どうしよう?NXTブリックは単体で3万円ちょっとかけるくらいで買えるんだけど、EV3ブリックは単体で買うといくらするんだろ?もう少し、人バシラーの皆さんが頑張ってくれるまで待ったほうが無難かも・・・。

 今日から、つかの間のお盆休みなので、昼間からビール飲んじゃおうかな。おつまみは、昨日、妻が買ってきてくれた、これ・・・


 「戦いは数だよ、兄貴っ!」


 ドズル兄さん、かっけぇ~。


 箱がでかすぎて、冷蔵庫に入らないので、とりあえず、開梱して格納。ガンプラ風の取説付き。

2013年8月2日金曜日

Raspberry Pi と Node.js でLチカ

 AmazonからInterface 9月号が届いたので、前回の続きを試して見ることにします。Interface 9月号の特集の6章にRaspberry Piでの記事があり、やはり、node.jsでのIO制御の記事でしたが、Interfaceの記事ではv0.10.12をインストールしていたので、前回、v0.8.11をインストールしたんですが、v0.10.12に変えることにしました。バージョンアップの方法がわからないので、とりあえず、既存の node_modules フォルダを適当な名前にリネームした後、

   wget http://nodejs.org/dist/v0.10.12/node-v0.10.12.tar.gz
   tar -zxf node-v0.10.12.tar.gz
   cd node-v0.10.12
   ./configure
   make
   sudo make install

として、上書きしてしまいました。

   node -v

で v0.10.12 と表示されるので、多分大丈夫?でしょう。

 npmで追加パッケージをインストール。

   npm install connect
   npm install socket.io
   npm install websocket.io
   npm install express

 前回、WebSocketと思って socket.io をインストールしたんですが、これは間違いで、socket.io と websocket.io は別です。WebSocketはwebsocket.ioを入れないといけなかったみたい。今回は両方入れときます。

 記事にしたがって、チュートリアル的に進めていって、とりあえず、Lチカまでは成功。node.jsのサーバサイドJavaScriptでgpio操作を書いたシェルスクリプトを実行する形でブラウザ→Lチカと連携するという内容でした。実際のソース等は雑誌の内容になってしまうので載せられませんので、雑誌を見るか、あるいは、こちらのブログ等が参考になるのではないでしょうか。Google+の電子工作コミュで教えてもらったんですが、色々興味深い内容です。自分もこれからこちらのブログを参考にさせて頂いて勉強しようかと思っています。

 ところで、node.jsなんかだと、node-inspectorとかGUIデバッガがWebブラウザ(デバッグ対象のRaspberry Piをサーバにして)で利用できる仕組みがあったりします。あるいは、Cloud9というIDEなんかもあったりします。こういうような仕組みでRaspberry Piの開発を外部のブラウザでできたらいいのにな、と思ったんですが、調べてみたところ、ちょっと気になるものを発見。Ada姉さんのところで、adafruit WebIDEというものがベータ版として公開されています。こちらは、Pythonの開発をRaspberry Pi上で動かしているサーバに対して、外部PCからブラウザ上で行えるIDE環境のようです。さすが、Ada姉さん。こちらも面白そう。