月別アーカイブ: 2007年12月

地球上を歩き回る GoogleEarth 対応 WbalanceGE v1.00

バランスWiiボード を使って GoogleEarth 上を歩けるようにしてみました。

ダウンロード及び詳細はこちら
WbalanceGE v1.00

WbalanceGE

3D 視点のリアルスケールで、リアルな時間で実際に足を動かして移動します。

○特徴
・体重の表示は無く、純粋に歩き(走り)に特化しています。
・コントローラは不要で、バランスボードだけで歩きます。
・歩行と区別できる 走り検出 を行ってみました。
・ログファイル保存記録機能あり

正月に、箱根を一緒に走れるかもしれません!

自分視点なので GoogleEarth で「建物の 3D 表示」を ON にしないと
見栄えが良くならないので注意。
あまりに広いところは、歩いても遠いし風景も単調になりがちです。
周囲に細かい建物があって割と狭いところの方が歩いている気分になれるようです。

GoogleEarth のカメラを直接操作したあと、その場から歩き出すには
  メニューの「Earth」→「開始位置設定」
が必要です。

参考ページ
Google Earth
Google Earth COM API を C++ で使う

関連エントリ
地球上の座標

地球上の座標

地球の上、どこにいるのか緯度と経度でわかります。
例えば GoogleEarth の座標も緯度、経度。

自分が好きな方向に 1m 進んだ場合の位置はを求めるには
緯度方向はほぼ一定
 1度 = 約111km
 1分 = 約1852m
 1秒 = 約30.9m
 1m = 0.000009度
float では足りないので倍精度が必要。
(double の演算ライブラリを全く用意していなかったことにふと気が付く)

経度の変化量は場所によって異なるのと、直進が経度方向に一致しないので、
簡単ではなさそうです。

慣れているベクトルに変換してみます。
角度は度分秒で時間と同じ。度 + 分/60 + 秒/3600
完全な球とみなして極方向を Y、赤道面を X-Z とすると

const double	dtr= _PI / 180.0;
double	rlat= latitude * dtr;
double	rlon= longitude * dtr;
Position.y= sin( rlat );
double	xlength= cos( rlat );
Position.x= xlength * sin( rlon );
Position.z= xlength * cos( rlon );

これで位置が求まるので、接ベクトルを求めれば移動できそうです。
極で矛盾するけど取りあえず

const static double	vup[3]= { 0.0, 1.0, 0.0, };
Cross( tvx, vup, Position );
Normalize( tvx );
Cross( tvy, Position, tvx );

自分の向きの表現は GoogleEarth では方位角度で、0 が北 180 が南と
なるようです。よって

double razimuth= azimuth * dtr;
double rxa= sin( razimuth ) * speed;
double rya= cos( razimuth ) * speed;
Position+= tvx * rxa + tvy * rya;

Position は正規化されているので、speed は 1/地球の半径 倍する
必要あり。
移動したら緯度経度に戻します。

Normalize( Position );
double	rlon= atan2( Position.x, Position.z );
double	xlength= sqrt( Position.x*Position.x + Position.z*Position.z );
double	rlat= atan2( Position.y, xlength );
latitude= rlat * rtd;
longitude= rlon * rtd;

最初に変換してベクトルのまま保持しておいた方がよさそうです。

参考ページ
Wikipedia 緯度
Google Earth COM API を C++ で使う
Google Earth COM API Documentation

Windows x64 (Vista,XP 64bit) で親指シフト その後

以前のエントリ。
2007/10/22 em1keypc 64bit Windows でも 親指シフト
これ以降もプログラムを何度か更新しました。
最新版は下記からどうぞ。

em1keypc 1.31 for PC Win32/Win64
oyayubiwm v1.44

今のところ他の方の 64環境で動いているかわかりませんが、
自分は WindowsVista x64 環境×2 で em1keypc + oyayubiwm を常時
起動しています。(ドッグフードを兼ねて)
64bit といっても特別な操作も設定も必要なく、全く同じバイナリを
起動するだけでよくなっています。

バランスWiiボード をPCで使う wiibalancepc v0.08

バランスWiiボード とのペアリングが前より簡単になりました。

ダウンロード
wiibalancepc v0.08 バランスWiiボードを使った PC体重計

Wiiリモコン にオキシライド電池を入れたら、wiibalancepc での
バッテリー残量表示が 113% に! (たぶん電圧の差)

関連エントリ
Windows Bluetooth API (2)
Windows Bluetooth API
バランスWiiボード をPCで使う wiibalancepc v0.07

Windows Bluetooth API (2)

取りあえずパスキー無しの Bluetooth デバイスをプログラムで
ペアリング&追加/接続する方法がわかりました。

WiiリモコンやバランスWiiボードは電源を入れるたびに毎回 sync
しなければなりませんが、これでいちいち
「Bluetooth デバイスの追加ウィザード」を使わなくてよくなります。

(1) 新規デバイスの列挙
 BluetoothFindFirstDevice()
 BluetoothFindNextDevice()
 BluetoothFindDeviceClose()

(2) 対応デバイスかどうか名前で判別
 BLUETOOTH_DEVICE_INFO の szName を参照。

 例えば Wiiコントローラなら
  ”Nintendo RVL-CNT-01″ (Wiiリモコン)
  ”Nintendo RVL-WBC-01″ (バランスWiiボード)

(3) 接続済みかどうか判定
 BLUETOOTH_DEVICE_INFO の fConnected が 0 以外ならすでに
 接続中なので無視。

(4) サービスの追加

#include  // GUID の定義
BluetoothSetServiceState( hradio, &devinfo,
	&HumanInterfaceDeviceServiceClass_UUID,
	BLUETOOTH_SERVICE_ENABLE );

ただし既に一度追加したことがあり、サービスが Enable のままの
デバイスは (4) に失敗します。
BluetoothRemoveDevice() を使って (4) の直前に登録情報を削除して
おくと確実に接続できるようです。

Wiiリモコン・バランスWiiボード 側は、(1) の新規デバイスの検索中
に赤い sync ボタンを押しておきます。

関連リンク
Windows Bluetooth API
バランスWiiボード をPCで使う wiibalancepc v0.07