朝来てメール整理しながらコンピュータビジョン関係の実験準備してたら、Fabienがゲームショップの袋もってきて
「ここにWiiがあるよ」と一言。
実は年末に、SimonがMicoroRama(フランス最大とおぼしきゲームショップグループ)で最後の1台を入手していたらしい。
家で遊んでたのか!
ゲームはWiiSportsとか3本ぐらい。
遊ぶならRaymanを遊びたいところだけど、ここはぐっと我慢して、とりあえずWiiRemoteだけ取り出す。
さっそくDELL XPSにBluetoothペアリングしてみる。
TOSHIBAのHIDデバイスとして普通に認識されてしまった。
PINコードもなし。余計なものまったく買わずに接続終了。
やらなきゃならないことはたくさんあるんだけど、
こういうときに「あとでやろうっと」と言って、うまくいったものなんて、ない。
しかもWiiremote関係はこの1ヶ月で驚くべきスピードで進化しているし。
というわけで意を決してWii Remoteはっきんぐ第二弾いきます。
以前から気にはなっていたのでBlogにまとめておいてよかった。 [http://ameblo.jp/akihiko/entry-10021564025.html](http://ameblo.jp/akihiko/entry-10021564025.html)
それにしてもこの1ヶ月でまたいろいろ成果が出てきているなあ。恐るべし。 特に、センサバーが自作可能ってのは気がついていたけど、USB HUBで作れるとは。 ・センサバーにはセンサーがなかった [http://arena.nikkeibp.co.jp/tokushu/gen/20061130/119970/index7.shtml](http://arena.nikkeibp.co.jp/tokushu/gen/20061130/119970/index7.shtml)
・リモコン分解写真 [http://techon.nikkeibp.co.jp/article/NEWS/20061120/123998/](http://techon.nikkeibp.co.jp/article/NEWS/20061120/123998/)
・USBハブでセンサバーを自作する [http://www.kako.com/neta/2006-019/2006-019.html](http://www.kako.com/neta/2006-019/2006-019.html)
じゃあ画像処理でやってもよかったんじゃないのかな、絶対位置検出。
ガンコントローラみたいにVsyncとか画像信号つかってもいいだろうし。 剣神ドラゴンクエストと同じようにフォトダイオード4つとかではなく
低解像度CMOS画像センサを使っているらしいので、この辺は将来的にどうにかなるかもね(フィルタついてるけど)。 まあそれはともかく、ガシガシハッキングを進めてみる。 結論から言うと、みんなの仕事の速さに驚いた。 ハード解析で一番進んでいるのは、おそらくWiiLiで、メモリカードとかのアドレスも書いてある。 [http://www.wiili.org/Wiimote](http://www.wiili.org/Wiimote)
ユーザレベルで楽しく使うなら、GlovePIEが一番進んでる。 [http://carl.kenner.googlepages.com/glovepie_download](http://carl.kenner.googlepages.com/glovepie_download)
ちょっとした衝撃だったのはこんなにたくさんのPIEスクリプトがすでに存在しているということ。 BF2.PIE BF2142.PIE Battlefield2142Test.PIE CallOfDutyPC.PIE CounterStrike.PIE CounterStrikeHL2.PIE Cylon.PIE DTXMania.PIE DrummerKit.PIE EranmaneWiimote.PIE FpsControls.PIE FpsGames.PIE FpsGamesFred31.PIE Generic Joystick Driver.PIE
 ジョイスティック(デジタルパッド?)の代わりとして動くみたいなんだけど、試せるアプリが手元にない。 GlobalWinampFlashy.PIE GoogleEarth.PIE HL2.PIE HideThePr0nz.PIE Joystick-Mouse (4 Wiimotes).PIE Joystick-Mouse.PIE LED Zelda NES 0.2.PIE LedExtension.PIE LedLighter.PIE MarioKart64.PIE MarioTennis64.PIE MarioTennis64Nunchuk.PIE MetroidFusionPrime3.PIE MidiConductor.PIE MouseWebSurfingFriendly.PIE N64 Goldeneye Advanced.PIE N64 Goldeneye Basic.PIE N64 OoT.PIE NES.PIE NESController.PIE NESController2.PIE NeedForSpeed.PIE Ocarina.PIE OcarinaNunchuk.PIE OldMouseMovement.PIE OneDotMouse.PIE PPJoyEmulatorConfig.PIE RacingControls.PIE RumbleFight.PIE SecretOfMana.PIE SecretOfManaNoNunchuk.PIE Speaker.PIE
 十字キーでFrequencyとVolumeを変えられる。かなり音わるい。 SpeakerAngle.PIE
 角度情報を音に変えるデモ。 SpeakerOld.PIE
 以前の形式のサウンド再生方式、Peek/Pokeを使ってる。でも音質的にはこっちのほうがいいかも。 SteeringWheel.PIE SuperMario1or3Galaxy.PIE SuperMario2Galaxy.PIE SuperMario64Galaxy.PIE SuperMarioWorldGalaxy.PIE SuperMetroidPrime3.PIE SuperMetroidPrime3Joystick.PIE SuperSmashBros04.PIE SuperSmashBrosNunchuk.PIE TekkenNunchuk.PIE TestVelocityPos.PIE TombRaiderLegend.PIE TrackmaniaNations.PIE Trampoline.pie Two WiiMice.PIE Ultimate4PlayerPPJoy.PIE VirtuaTennis.PIE VirtuaTennis02.PIE VisualBoyAdvance.PIE WII Firefox.PIE
 FireFoxを操作。2キーと十字のコンビネーションで文字も打てる! WOW.PIE WarioWareTwisted.PIE Wii Lights 0.1.PIE
 これおもしろい。+-キーでLEDを変更できるだけなんだけど。 WiiBattery.PIE
 バッテリー残量表示。 WiiDrums2.PIE
 GlovePIEにはMIDI接続機能があるので、これだけで「どこでもドラム」ができてしまう。ソフトMIDIとはいえドラムセット。 WiiGoogleEarthIR.PIE WiiMouse 0.1.PIE
 センサーバーがないので、左右は回転で入力。方位角センサの回転を積分するサンプルはないのかな。 WiiMouse Accel.PIE WiiMouse IR Relative.PIE WiiMouse IR.PIE WiiSound2.PIE
 PCからWAVを鳴らす。スピーカーのデモではないみたい。 WiiWars.PIE
 STARWARSっぽいことが書いてあるので、セーバーかと思ったらゲーム用。 Wiibrator.PIE Wiibrator2.PIE
 十字キーで4種類の強度をバイブレータに出せる。強度は指定するのではなくて、駆動秒数で制御。 Wiilo.PIE
 スペースキーを押すとキャリブレーション。 WiimoteIdentifier.PIE
 複数のWiimoteを検出してLEDに表示。 WiimoteMouselook.PIE WiinAmp1.0.PIE Wiitar.PIE Guitar with 2 Wiiremote WinampController2.PIE WinampMkII.PIE WinampUltraIITurbo.PIE WindowsMediaPlayer.PIE
 メディアプレイヤーを前面においておくと再生速度などをコントロールできる Zelda.PIE ZeldaLinkPastTwilight.PIE ZeldaMinishCapTwighlight.PIE ZeldaOcarinaBMH.PIE ZeldaOcarinaTwilight.PIE dreidel.PIE goggles.PIE iTunes.PIE
 iTuneをコントロールキーで操作する代わりにWiimoteで操作。 test.PIE ★マウスコントロール系のPIEを起動してしまうと、とめるのが大変なので「SHIFT+P+I+E」でとめられることを覚えておくといいです。 一つ一つはたいしたものではないし、すごく快適に触れるか?っつうとどうかとも思うけど。 ちなみにマウス機能はセンサーバーががないと結構つらいです、左右は傾けて使うので。
ドキュメントには「The Wiimote doesn’t contain gyros (BOO!!!)」 とか書かれています。本当にそのとおりですね。
Tokinの3種混合センサー使ってたことがあるんですが、地磁気ジャイロはドリフトが多くてゲーム用絶対位置検出としては使えないことも多いんですが、実は小さな平行移動とかもとれるのでメインで使わないまでもアクセスできるようにしておくべきだとは思うんですよね…。まあWiiremoteの3軸センサはAnalog Devices製らしいけど、MR流体ジャイロとかなかったかもしれないしね。高くなるだろうし。
モーションセンサーAnalog Devices「ADXL 330」についてもうちょっと深く。
[http://www.analog.com/en/prod/0%2C2877%2CADXL330%2C00.html](http://www.analog.com/en/prod/0%2C2877%2CADXL330%2C00.html)
3軸iMEMSアナログ出力つき加速度デバイス。帯域1.6KHz、供給電圧2.0-3.6V、測定レンジ±3.6g、感度300mV/g±10%。Wiiremoteの自重が電池込みで大体250gってところなんだけど、実際にはこれの加速度を測っているわけじゃない。支持バネの上の測定用おもりの力を測っているらしい。値段は$5.45。
なお、モーションセンサの生値からコントローラの状態を算出する式などは、ここにまとまってます。
[http://www.wiili.org/index.php/Motion_analysis](http://www.wiili.org/index.php/Motion_analysis)
自分でもキャリブレーション測定してみようと思って式を検証してみたんですが、どうもサイトのほうに間違いを発見してしまいました。
(x1, y1, z1)…Aボタンを上にした状態でおいてみる
(x2, y2, z2)…赤外線センサを下にして立ててみる
(x3, y3, z3)…左側が上になるように寝かせてみる
私の手元にあるWiiremoteでは、それぞれ、
(x1, y1, z1) = (127, 127, 153)
(x2, y2, z2) = (127, 154, 128)
(x3, y3, z3) = (154, 127, 129)
(x4, y4, z4) = (100, 127, 129) ついでに測ってみた右側上
…となりました。
ここからゼロ点(x0, y0, z0)をみつもります。
x0 = (x1 + x2) /2 = 127
y0 = (y1 + y3) /2 = 127
z0 = (z2 + z3) /2 = 128.5
※それぞれの置き方における同じ軸の平均をとっている
センサからの生の整数値を(xraw, yraw, zraw)としたときに、以下の式で各軸の加速度が求まります。
(ここでWiiLiのサイト上に大きな間違いが…直しておいたんですが、TeXのコンパイルがうまくいってないみたいです)
間違い
x = (xraw - x0) / (x1 - x0)
y = (yraw - y0) / (y2 - y0)
z = (zraw - z0) / (z3 - z0)
正しくは
x = (xraw - x0) / (x3 - x0)
y = (yraw - y0) / (y2 - y0)
z = (zraw - z0) / (z1 - z0)
※測定した値を代入したらわかりますけど、間違ってるほうはわざわざゼロで割ることになってしまいますよね。
ちなみにその下に続いている例も間違ってます。
間違い
x1 - x0 = 27
y2 - y0 = 27
z3 - z0 = 27
正しくは
x3 - x0 = 27
y2 - y0 = 27
z1 - z0 = 27 (私の場合=26.5)
ところでセンサーバーってただの赤外線なのでIR-LEDがついているWebCAMとかでよさそうだな。
GlovePIEのドキュメントにもロウソクとかクリスマスツリーのランプでも使えるとか書いてありますし。
まあ赤外線を発光する剛体であればいいんだから、何でもいいよね。
一番手軽なのはライターとか白熱電球とかTVのリモコンあたりかも。 長さも、実はプロジェクタやモニタサイズにあわせて調整すべきであって。
自作する人はこの辺を参考に。
[http://pocketnews.cocolog-nifty.com/pkns/2006/12/wii_0ae8.html](http://pocketnews.cocolog-nifty.com/pkns/2006/12/wii_0ae8.html)
GlovePIEはソース公開してないので、当初は触る気なかったんだけど、スクリプトベースというのは実験には適してるな。 他の人が作ったものもバンバン公開できるし。
この作者は気になってたんだけど、おそらくVRの開発者か研究者だな。5DT社のP5というデータグローブの関係者と見た。
TrackIR, OptiTrack, SmartNavなど赤外線LEDに関する技術とか、そもそもGlovePIEもP5用のプログラマブル入力エミュレータだったっぽい。
それにeMaginのZ800とかIsoTrak II, FasTrak, Liberty, Patriot, Liberty LatusなんていうPolhemusデバイスは普通の人は持ってません。
Cerl Kennerさん
[http://carl.kenner.googlepages.com/glovepie](http://carl.kenner.googlepages.com/glovepie)
P5関係のページ
[http://www.geocities.com/carl_a_kenner/p5.html](http://www.geocities.com/carl_a_kenner/p5.html)
そーか、だからMIDIもサポートしているのね。ピアノみたいに弾ける。
スピーカー機能はこれからも開発続きそうだな、WAV読めるようにならないと。 バイブレータはこれぐらいの振動で十分な感じ。ヌンチャクも触ってみたいけどやめときます。
たとえば、今まだ存在しない、ライトセイバーっぽいものも、PIEスクリプトだけで作れないこともないし。 それからいまのPIEでできないこともローレベルアクセスがサポートされているから、不可能ではないはず。 var.a = Wiimote.InReport var.b = Wiimote.InByte1 WiimoteSend(1, 0x12, 1, 0x33)
内蔵メモリはこんな感じでアクセスできる。Miiのデータが入っているようだ。 WiimotePoke(1, 0x04B00033, 0x33) WiimotePeek(1, 0x04B00033) PIEで挙動を試してから、速度的な問題とか、実装上の問題とか、自分のゲームに組み込みたいとかいう理由で、ソース書いたらいいと思う。 正直、この値段で、ワイヤレスでこれだけの精度(8bit)の各速度センサとバイブレータがついているだけで、研究者としてはかなりイマジネーションをかきたてられる。ヤヴァイ。
ちなみに日本人もかなりがんばっていて、ここでは早くからソース公開されていた。 [http://www.kako.com/neta/2006-019/2006-019.html](http://www.kako.com/neta/2006-019/2006-019.html)
SDLつかってBuild.batで配布するのはかっこいいな。 ---
rem set environment for VC.NET2003 (VC7) call "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" cl wii_test1.cpp /D HAVE_OPENGL /MD /link user32.lib sdl\sdl.lib sdl\sdlmain.lib opengl32.lib tiny_hid_dll.lib /SUBSYSTEM:WINDOWS pause ---
こんな感じでビルドされる。.NET2003が入っている必要があるけど、Expressでも動きそうだな。 で、ちなみに上記デモにはHIDデバイスにアクセスするための肝心の「tiny_hid_dll.dll」が同梱されていない…が他のデモにはちゃんと含まれていますので探してみてね。
tiny_hidのソースが公開されてないのが何故かよくわからないけど、理論上は、上記GlovePIEで試してから同じポートを叩けば同じことができるはず。
ただ、読み込みスレッドは速ければ速いほどいいというわけではなく、適した周波数でアクセスしたほうがいいかもしれない、まだ未チェック事項。 有名なWiinRemoteはいつの間にかソース公開されてた。Delphiだけど。
[http://onakasuita.org/wii/](http://onakasuita.org/wii/)
とりあえず、マウス代わりに使いたいとか、挙動を確認したいって場合には便利だと思いますね。
■関連記事
・Wii Remoteはっきんぐ
[http://ameblo.jp/akihiko/entry-10021564025.html](http://ameblo.jp/akihiko/entry-10021564025.html)