ホーム > プログラミング

プログラミングのアーカイブ

Raspberry PiでMono+OpenNIを動かして、XtionのデータをWireless LAN経由でJitterに突っ込む

XtionとかKinectで色々遊んでると、USBの取り回しがめんどくなってくる。というわけで、小型安価な1board PCであるRaspberry Piを使って無線化してみた。
前にRaspberryPi上でMonoを動かすことはできていたので、試しにC#で書く。遅いのは知ってる。
最初はUser detectionまでやろうかと思ったが、OpenNIのMiddlewareであるNITEがUser detectionを担当しているらしく、NITEはOpen sourceでは無いらしく、諦めた。CortexAなど用のARMバイナリを配布している人は居たが、RaspberryPi用は見つからなかった。方法があれば誰か教えて下さい。
というわけでUser detectionは諦め、とりあえずDepth情報のみをNetworkで投げてみることにした。

ついでに、プロトコルをJitterに合わせることで、Max/MSPで簡単に受信できるようにした。
Jitterで流れている情報はRGBXなフォーマットなので、とりあえずGBにDepthの2byteをそのまま埋める。手抜き。

紆余曲折を経たが、基本的にHard-float coreを使わなければOK。ちゃんと動いた。
xtionjitter
無線LANとXtionを駆動するので、Self-powerのUSB hubは必須。Raspberry Pi本体の電源もHubから取れた。
コンパクトに無線化できたので、余ってたプラダンでガワを作って三脚に設置してみた。
xtionraspberrypi
VNCで無線LANからGUI操作できるので、外にはUSB hubの電源だけが出る感じ。5V – 2AのAC Adapterなので、USB Mobile Batteryとか使えば完全無線化できる気がする。こんど買ってこよう。

裏からの図。青いLEDが光ってるのがUSB Hub。緑に光ってるのが無線LANアダプタ。
RaspberryPi本体のUSBにUSB Hubと無線LANアダプタ、USB HubにRaspberryPiの電源のMicroUSBとXtionが刺さっている。
xtionraspberrypi_back

おまけ
xtionjitter_neko

.NET Framework on Raspberry Pi

MonoとMonoDevelopがRaspberryPiで動くことを確認した。
latest kernelを使っていると、Hard-float ABI絡みのバグでMonoが起動しないが、公式ページからダウンロードできるSoft-float版を使うと難なく起動できた。
WinFormsのプロパティコントロールとか、重そうなGUIが難なく動くのは感動する。動作はそりゃあ遅いが、そのへんは使い方次第。

ついでに、自分がRaspberry Piにしている設定をメモしておく。

  • Setup Wireless LAN driver

たいてい、まずは無線LAN化したい。すべてはこの方が書いてくれている。
しかも、PlanexのUS-GW MicroNというUSB無線LANアダプタは秋葉原で300円で叩き売られてたのを以前まとめ買いしたので、家にありました。
ドライバを登録したら、wicdをインストールしてさくっと無線LANパスワードなどを設定できます。もちろんAuto-Connectにしとく。固定IPにしとくとあとで色々楽。
いまどき有線LANとHDMIディスプレイが同じ所には無いので、最初に無線化しておけばディスプレイやテレビの裏に放置して作業できる。

  • Setup on-screen keyboard

いちいちキーボードをつなぐのは面倒なので、matchbox-keyboardをインストールしてマウスのみで操作できるように。
sudo apt-get install matchbox-keyboard するだけ。

  • X11vncを自動起動させる

そうこうしていると、PCからRaspberryPiを操作したくなってくる。メインのPCでぐぐってコピペしたいときとか。
x11vncを入れると、HDMIで表示している画面をリモートから操作できる。
自動起動するようにしておけば、電源だけ入れてRaspberryPi本体をどっかに放置しとけば、母艦PCからいじれる。
本家のBBSに自動起動の方法がある。.desktopファイルを作るのがポイント。
http://www.raspberrypi.org/phpBB3/viewtopic.php?p=108862#p108862

  • Display sizeを変更する

VNCで接続すると、ワイド大画面で優秀さをアピールしてくるRaspberryPiちゃんを、適度な画面サイズに調教する。/boot/config.txtのframebuffer_widthとheightを800*600ぐらいにしておく。

  • Synaptic

GUIでSearchしながらいろいろInstallしたい。sudo apt-get install synapticしておくと、普通に使える。

  • 日本語Fontのインストールとlocaleの変更

ttf-takaoなど、日本語フォントをSynapticでインストールしてから、sudo raspi-configでlocaleを変更する。フォントを先に入れないと文字化けする。

このへんまでやっとけば、あとはいろいろなアプリケーションを入れて遊べると思う。
ついでのつもりが、Raspberry Pi初期設定がメインになってしまった。。

Maker Faire Tokyo 2012に行ってきた

去年までのMake Tokyo Meetingには参加できていなかったのですが、今年は行けました。今年から有料化したらしい。

夢溢れる巨大ロボを華麗にスルーして、まずはDIY MUSICを見学、そのままRSのプレゼンを聞いて、オライリー本を立ち読み、その後時間をかけて1周回りました。
非常に盛況で、内容も充実してました。仕事で展示会にはよく行きますが、こんなに熱気のある展示会はあまりありません。
3Dプリンタ、Arduino、Raspberry Piなどでみんないろいろ工作してました。以前から出店してた方も多かったらしいですが、僕は初めて行ったので新鮮なネタが沢山。
学生時代にこの場に来てたら、もっと興奮していただろうなー。時間が欲しい。

RaspberryPiにMicroSDを挿せるようにして出っぱりが少なくなるアダプタ買った。
http://yuki-lab.jp/hw/rasp-ext/index.html
あと、Arduino基板がいつのまにか非常に安くなってたので購入。
http://tiisai.dip.jp/?p=1401
標準セットだと1000円で遊べる!
中学生がお小遣いで組み込み始められるとか、すごい時代だ。
今は忙しいけど、RaspberryPiが一段落したら遊んでみよう。

ちなみに、社会人はボーナスで基板切削マシンとか3Dプリンタとか買える。どっちも20万切ってる。やべー

Raspberry PiでXtion+OpenNIを動かす

買って久しく眠っているRaspberry Piですが、以前から挑戦してみようと思ってたOpenNIのビルドとKinect互換デバイスXtionの認識に挑戦しました。
思い立った頃はあんまやってる人がいなかったけど、結婚とかしているうちにやりたい亊そのまんまな資料を公開している人が居た!
この通りにやって難なくできました。難なくとは言ってもビルドにはかなりの時間がかかりましたが。
サンプルのSimpleViewerも動きますが、かなり重いので、表示系は使っちゃダメな感じ。
とはいえ、4000円弱の名刺サイズのLinuxボードで3次元データが撮れるのは熱い!

というか、同じことやってた人、色々おもしろそうな亊やっているようです。
http://mewgen.com/
そろそろ何か形にしたいなー

この辺をやるにはPCLの勉強が必須な気がする。まあそのうち手をつけよう。。

App Inventor for Androidがヤバい

Androidもいじってみとかないとな、と思って、色々開発環境をインストールした。
調べてみると、クロスプラットフォームな開発環境が多くてびっくり。Linuxじゃ無理っぽいのはUnityぐらいだった。
開発環境はクロスプラットフォームで、WindowsもMacもLinuxも動くものが多いんだけど、対象デバイスをクロスプラットフォーム=iPhoneでもAndroidでもソースレベルでは互換性があるようにしようとすると、選択肢は少ない。あたりまえだけど。
結局、Titaniumなんかは両方(開発環境がクロスプラットフォーム&対象OSがクロスプラットフォーム)を満たしているっぽいんだけど、まだ手を付けていない。
なぜかというと、最初に手を付けたApp Inventorが楽しいから。

App Inventorは、もともとGoogle Labsで公開されていた、Visual Programming環境で、今はGoogle Labsの閉鎖に伴ってMITに移っている。まあ画面キャプチャとかはググれば出てくる。
Visual programmingというとPdやMAXやScilabのScicosやMATLABのSimulinkなど、先で繋いでくものが思いつく。いや思いつく人少ないか。ちなみにオープンソースを先に挙げてるのはわざとね。
App Inventorは、Visualといっても、ソースコードそのまんま箱に入れただけみたいな構造。先に挙げた配線系のやつらはプログラミングいらず!とか言って宣伝できるけど、App Inventorはプログラミングじゃん!というかんじ。だと思った。
ぶっちゃけ配線するスタイルはコード書くのが普通な人には馴染めないところがあると思うんだけど、その点逆にわかりやすかった。

わかりやすすぎて、音声認識でTweetしてみようと思って、実機テストするまで1時間ぐらいだった気がする。
ログインボタンでTwitterコンポーネントを用いたログイン、音声認識ボタンで音声認識コンポーネントを用いて音声認識、あとは確定ボタンとTweetボタンをちょこっと書くだけ。

GPSとかのセンサ情報を得たり、SMSでメッセージを送ったりもコンポーネントが用意されていて一瞬でできる。ヤバい。
とくに携帯アプリとかって、簡単な構造でも便利な機能を思いついたりする。そんなときにさっと作れるのが素晴らしい。しかも、データはすべてクラウドにあるので、一度環境を作ってしまえば、PCもOSも選ばない。Windowsデスクトップでコード書いてて急に出かけても、Ubuntuノートで続きが書ける。僕のような引篭りにはあまり関係ないが、よく出かける人は便利だと思う。

かといってけっこう凝ったこともできて、例えばFusion tablesというGoogleが提供するデータベースサービスにクエリを投げて、クラウドなデータベースを作れる。上手く使えばサーバーにモバイルのセンサ情報を送って処理したりできる。ぽい。

というわけで、プログラムかじったことある人は使ってみると良いと思います。
App Inventorと関係ないけど、VirtualBoxにx86用Androidをインストールして、ホストオンリーアダプタ経由でデバッグすると、糞重いAndroidエミュレータとオサラバできてより快適です。このデバッグ方法もおすすめ。

XtionによるSkeleton Trackingの弱点

Xtionによる、というかOpenNIによるのかな?
ライブでの利用を想定して、プロジェクタ画面との位置関係の算出をしようとゴニョゴニョしていたけど、どうもうまくいかない。
結論から言うと、骨格認識の精度が悪い。KinectとかXtionとかは、Motion detectするために、Realtime性重視のアルゴリズムになっているらしく、Frame rateは速いが、その分精度はよくないらしい。
特に後ろ姿の認識や、壁の近くでの認識率が非常に良くない。手や頭の座標精度というよりは、手や頭が在るかどうかの認識が出来なかったり、柱を誤認識したりする。
まあ、もともとゲームなどの用途だし、しょうがないか。。3D点群の座標自体の精度は思ったよりよさそうなのに、残念。
横向きに撮るなどして精度改善を狙おう。

Kinect互換デバイスXtion Proで遊んでる

Xtionで色々遊んでいます。
とりあえず、ジェスチャー認識で色々やってみてたりする人がたくさん居る中で、新しくて使えそうなことをやりたかったので、ちょっと数学を使う分野に手を出してみている。
やりたい事は、プロジェクターとのカップリング。プロジェクターで映像が映せるとこに持って行って、適当に設置して、ちょっとキャリブレーションするだけでスクリーンの位置を認識して、なんかスクリーンの前に立つ人とのインタラクションする。
Xtionでとった3次元空間から平面っぽいところを認識して、人がプロジェクターの映像の四隅を指さしたりすることで、プロジェクター画面の座標と3次元座標を対応付ける予定。

いつか書いた開発環境についてはVisual Studio on WindowsとMonoDevelop on Linuxを横断して、Dropboxでプロジェクトファイルごと同期しながら書いてる。特に安物ノートPCのUbuntu上でこれほど簡単に空間認識できるのはヤバい。
後はMacの動作確認をしたい所。

Kinect互換デバイス購入して開発環境作った

Kinect hackっぽいことをしてみようと思っています。
数年前に流行りましたが、今ではもはやHackでも何でもなく、Microsoftから公式SDKも公開されている。

Hardware

とりあえずKinect sensorを買っても良かったんですが、互換デバイスであるXtionを買うことにしてみた。
本家Kinectとの違いは以下の通り。機能は多少犠牲になるが、モバイル性能重視でXtionにした。

  • バスパワー駆動。USBケーブル1本で接続完了!
  • 小さい。Kinectの半分ぐらいに見える。
  • 普通のカメラが無く、RGB画像は撮れない。Depth画像のみ。
  • チルトモーターが無い。本家は首がモーターで上下に傾くらしい。

Software library

とりあえずOpenNIをいじっている。本家KinectだとKinect SDKがいいかもしれない。
OpenNIは骨格認識の際に、上半身だけとかでも認識できるらしい。ライセンス的にもOpenNIの方がよさそう。何よりLinux対応の良さが重要。

Development Environment

開発に使うOSと開発環境(開発言語)は迷うところ。
KinectやXtionを使う人はメディアアート界隈の人が多くて、openFrameworksなどからプラグイン経由で使ってる人とかが多いのかな?
MaxとかjitterとかopenFrameworksとか、そのへんの仕組みは面白そうだし、cross platformなのも魅力だが、変化が激しいし、コードを書くのに慣れた人には逆にとっつきにくい。

で、結局いつものパターンで開発言語はC#を使いたい。慣れてるから。現在、LinuxなMobile PCとWindowsなDesktopを使っているので、両方に対応したい。てことでMonoDevelopってことになる。
Xtionは情報が少なくて、特にMonoで動かす事例があんまり無い。公式にもLinuxでの対応言語にC#は無い。
最悪C++でいいや!と思って買っちゃったが、WindowsでビルドできたプロジェクトをLinuxでも普通にビルド&実行できた。
(落としてきたまんまのサンプルのバイナリは動かなかったが、理由は追っていない。)

Gtk#でWorker threadからのGUI更新のInvokeがうまくいかない

最近悩まされたBugのメモ。

最近メインで使うのがLinuxなので、Cross-platformなGUI ToolkitとしてGtk#を使っている。MonoDevelopにGUIデザイナが統合されていて、Linuxでコード書くときには非常に便利。
ところが、最近悩まされていたメモリリークの原因がどうやらGUI周りだったようで、僕の勉強不足なのか、ToolkitのBugなのかはよくわからん。内容はよくあるWorker threadからの定期的なGUI更新。Windows FormsでいうところのBeginInvokeする場面。プログレスバー表示とかの時のアレね。
Gtk#の場合にどうやってやるかというと、Mono Projectのサイト内に書いてある通りにGtk.Application.Invokeしたり、Gtk.ThreadNotify使ったりすればよい。はずだった。。

気づいた過程としては、なぜかGC.Collect()してるのにメモリ使用量がどんどん増えていて、CLR Profilerで見てみるとManagedメモリは正常。パフォーマンスモニタでUnmanagedなメモリがリークしてる。Unmanagedな処理は極力避けてるぞ?と思って思い当たったのがGtk#でした。

しかしこれからGUI Toolkitどうしよう。Cross-platformでC#から呼べるのってQtとかが思いつくけど、QtのC#ラッパーがUbuntu11.10のリポジトリには見つからないぞ?

今回、CLR Profilerとかパフォーマンスモニタとかで、メモリの中身を調査する方法がかなり理解できたので、まあ勉強にはなった。

.NET FrameworkでLOH断片化によるメモリリークもどき

ちょっと前に、画像とかをManagedな配列で持つと、処理は遅いけどGarbage Collectionしてくれるし良いかも的な事を書いたけど、どうやら遅いだけでは無いらしい。

Garbage Collectionがメモリの配置をゴニョゴニョ弄ってくれるおかげでメモリリークをある程度気にしなくて良いかと思いきや、やはり巨大なデータをゴニョゴニョするのは時間がかかるらしく、C#(というかCLR)では85kbよりでかい配列などのメモリはLarge Object Heap (LOH)に入れて、再配置はしないようになってるそうです。
http://msdn.microsoft.com/ja-jp/magazine/cc534993.aspx

てことで、画像とかGC任せで管理するのは危険とおもはれる。
アプリを開いてから閉じるまでの枚数が限られてたりする場合はいいけど、そうじゃない場合は断片化してメモリ食っちゃう可能性がありそう。
まあ考えてみれば当然ですよね。世の中の画処理ライブラリもそうなってるし。。
でも僕のような素人のために画処理の本の最初に書いといて欲しい。

結局Marshal使ってunmanageで頑張るしか無いらしい。
msec単位で時間かかるとしても、GCにLOHメモリの再配置を指示できればいいのに。。。

1 2

ホーム > プログラミング

カレンダー
« 2018 年 7月 »
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
最近の反応
メタ情報

ページの上部に戻る