記事一覧

VSD for GPS に仮想光電管実装

ファイル 153-1.jpg

 先日公開した VSD for GPS,ありがたいことに既に何人かの人に使ってもらってるようだ.メーターとか走行軌跡表示とかは割りと反応がよさげだが,ラップタイム計測機能はいまいち不人気w たぶん計測方法がしょぼくて (全ラップでスタートラインを通過した瞬間を探し出してマークしなければならない),使い勝手が悪いんだろうな.

 というわけで,仮想光電管機能を実装した.これは,スタートラインの座標だけ与えてやれば,あとは GPS の位置情報からそこを通過した時刻を割り出して自動的に全ラップタイムを計測できる.まぁ GPS データロガーではメジャーな機能なんだけど,実装が大変なので先送りしていた.

 悩んだのは,AviUtl の GUI でどうスタートラインを座標指定するか.LAP+ の光電管ファイルをリードするのも考えたけど,LAP+ で作ってセーブして,また AviUtl でリードとかあまりいけてない.
 結局映像に一発だけマークを打つことでスタートライン位置を指定するようにした.これだとスタートラインの位置を映像で確認しながら仮想光電管を配置できるし.割と無理のない GUI にできたんじゃないかな.

 画像は,今回追加されたスタートラインの表示.微妙すぎて誰もきづかねぇよwww

車載動画スーパーインポーズフィルタを GPS に対応

ファイル 151-1.jpg

車載動画スーパーインポーズフィルタを GPS に対応中.

 今日は GPS ログ (NMEA-0183) を読み込んで車載動画と合成するところまで作りこんだ.といってもほとんどの部分は PSP GPS のときに実装しているので,新たに作るべきはログフォーマットの変更・スピードメーター表示・加速度計算くらい.

 で出かけついでにテストしてみたら以下の問題が見つかった.
・スピードメーターがプルプルするw
 生 GPS データはそんなに振動してないので,どうやら 5→30Hz にアップサンプリングするのに使用している Ferguson / Coons 曲線のアルゴリズムと GPS データの微妙な誤差の問題らしい.
 つうわけで当時苦労して仕込んだ当アルゴリズムは削除して単純な等比分割にしてみたけど,(GPS ログが 1Hz のデータでも) 大して差がなかったので,当初からいらんかったやんこれ.

・横 G がおかしい
 理論的には GPS のデータだけで前後左右加速度が求まるはずなので実装してみたけど,横 G のデータがおかしい.LAP+ では結構まともそうな横 G グラフが出せるので,算出方法を見直さないとな.
追記:と思ったら,360度のラップアラウンドが考慮もれしてただけだったw あと平滑化したら結構まともになった.


以下は残項目リスト
・最速ラップとのタイム差のリアルタイム表示
・仮想光電管の位置情報からラップタイムを自動計測

----
完成しました.欲しい人はここからどうぞ→VSD for GPS

新しいオモチャの予感

ファイル 150-1.jpg

 PhotoMate887 という GPS ロガーを購入.これ自体は 5Hz でログが吐けること以外は普通の GPS ロガーだが,LAP+ というフリーの解析ソフトと組み合わせることで,本格的なモータースポーツ用データロガーになる!! (たとえばラップタイムを計測できたり,各周回の走りを数値で比較できたり)

 あと,計測時は PhotoMate887 だけをどこかに固定するだけなので,カートでも使えるのが大きい.レンタルカートだと計測機器をごちゃごちゃ設置できるわけがないので.また走行会なんかでも気軽に他の人の車に載せることもできるし.

 この手のモータースポーツ用データロガーって,ちゃんとしたのは大体 5~10万円するのよね.真剣に競技やってるわけでもない自分にとって¥5万はお遊びで投入できる金額ではないので,PSP の GPS ユニットをハックして同様のものを自作しようとしてみたりしたけど,こいつは 1Hz でしかデータを取得できなかったのでデータロガーとしては役に立たなかったわけで.
 
 こんな環境が ¥8,800 で構築できるなんて,いい時代になったなぁ(゜ーÅ)ほろり
 というわけで,車載動画スーパーインポーズフィルタを PhotoMate887 に対応させる計画発動!

これは酷いwww

ファイル 95-1.jpg

 美浜サーキットでの走行会があったので,再び GPS ログを撮ってみたのだが…

 これはヒドイwww

メインストレートとバックストレートが完全に重なってるし.
各コーナーも,ライン取り見るとかそんなレベルじゃないな.

やっぱ GPS のデータだけでは精度に問題があるか.

データロガー + GPS 実戦投入


鈴鹿ツインサーキットでの走行会があったので,データロガー + GPS を実戦投入.GPS の捕捉も 1分ほどで終わり,GPS ウォームスタートの設定は有効なようだ.

で,車載映像と重ねてみたのが上の動画.やはり GPS の精度が不足気味で,走行ラインがぶれているようにみえる.実際はこんなにいろんなラインは走っていないのだが.やはり走行ラインの研究には使えないな.あと,(早送り動画だとわかりにくいけど) メータの描画と GPS の位置が 1秒ほどずれている模様.これは画像合成フィルタに時間あわせ設定を追加せねばなるまい.

かけた時間の割には,あまりうれしくないなこの機能_| ̄|○

PSP GPSウォームスタート成功

コールドスタートになっていると思われる PSP データロガーの GPS,10分たっても捕捉開始しねぇ,という事で,ウォームスタートを実装.

コード自体は,いつもお世話になってる Deniska 氏のとこの PSP-290 テストプログラムを見ると,sceUsbGpsSetInitDataLocation( int ) というのが使われているので,これだろうという事で LuaPlayer に実装.問題は引数で,0 〜 2 の値を指定するらしい.おそらく,ウォームスタートのためのデータ保存スロットが 3箇所分あり,そのどれかを GPS ユニットにロードするのだろう.MAPLUS がどのスロット使ってるかは分からないが,とりあえず 0 を指定しておいた.

で,MAPLUS で位置を測位するまでほっとく→電源 OFF→データロガープログラム起動! で,3分後くらいに見たら,おお! 捕捉開始してるではないかヽ(´ー`)ノ どうやらsceUsbGpsSetInitDataLocation( 0 ) は正解だったようだ.

車載動画への自車位置表示も実装したことだし,これでやっと実用になるな.

車載動画スーパーインポーズフィルタをアップデート


車載動画スーパーインポーズフィルタを大幅アップデートしてみた.

■コースマップ
 ついにコース上の自車位置表示を実装.前回のフリー走行でコース上での GPS ログ取りに失敗したので,上の動画では鈴鹿スカイラインを走ったときのログを無理やり貼り付けてみたが,結構いい感じ.一秒毎の位置計測データを 30ポイントに補完する処理もうまくいっているようだ.

■最速ラップとのタイム差表示
 何か走行分析に有用な情報を表示させようとしてみたのがこれ.データロガーには走行距離も記録されているので,各周の同一走行距離における経過時間がわかるので,最速ラップとのタイム差がわかる.
 実装してみると,意外とまとも.データは距離メーターが全てなので,タイヤが空転したり最速ラップと大幅に違うラインを大回りしたとかなると怪しくなるが,動画を見ながら今のライン取りはうまくいったんだなとか,けっこう新発見があった.

■640x480 の見栄えを改善
 今まで 320x240 でのエンコードを前提としたメーター描画だったので,フォントサイズが小さいとか,ラインが細すぎとか,見栄えがよくなかったが,640x480 でのエンコードを前提とした見栄えの改善をしてみた.
 後,メーターの配色や,ラップタイム表示を縁取り文字にして背景の白をやめてみた.


んー,満足ヽ(´ー`)ノ
これで画像合成フィルタでやりたい事はほぼ終わったかな.

GPS ログ取り失敗

 車載動画に走行軌跡を合成する計画の一環で,16日に,GPS ログつきのデータロガーのログを取るべく,鈴鹿ツインサーキットのフリー走行に行ってきた.GPS の捕捉にはある程度時間がかかるので,走行開始 10分前に PSP を立ち上げたのだが… 10分たっても捕捉開始されなかった(゜ーÅ)ほろり というわけでこの日の一番の目的であった GPS ログ取りは失敗_| ̄|○
 どうも GPS がコールドスタートになっているようだ.ウォームスタートの方法を探らないと,GPS 動くには動くのだが実用にはならんなぁ…

まあフリー走行自体はとくに言うこともなく.

 みんカラで車載動画を上げるときは,「らくちんFLVメーカー」というサイトを利用していたのだが,最近「デコ枠」なる機能が付いてますます使えなくなった.そもそもらくちんFLVメーカーを使っていたのは,ブラウザの大きさに合わせて動画も大きくできたからなのだが,「デコ枠」になってから 320x240 固定.つかえねー.しかも,記事にビデオを埋め込む形式だと,勝手に動画データのロードを始めてしまうので,複数動画を貼るとメチャメチャ重くなる.

なので,ついに YouTube に移行してみた.

これで完璧! と思ったら,スピード表示と YouTube のロゴが被ってるよ(゜ーÅ)ほろり まぁ誰もスピードとか気にしてないだろうからいいや.

データロガー+GPS (PSP部分だけ)完成

ファイル img_26537677_0.png

データロガーのログ取りプログラム ( LuaPlayer のスクリプト ) に,GPS ログ取り機能を追加してみた.ってこれ前もやったよなぁ.データロガー + GPS 計画を一旦中止したので,そんときにコードを消しちゃったんだっけ(゜ーÅ)ほろり

まぁ気を取り直して再コーディング.GPS のデータに関しては,PSP で表示するものはあまりなくログに記録するだけなので,結構楽.とっとと完成させて,給油がてらログを取ってみた.

が,GPS と関係ない問題が一つ.Lua の os_date で日付を取得すると 1970/1/1 になってしまう.os_date の部分のソースコードを見ると,localtime() で日付を取得していたので,sceRtcGetCurrentClockLocalTime() に書き換えたら,正常に取得できた.でもなんで? localtime() も追っていけばたぶん sceRtcGetCurrentClockLocalTime() に行き着くと思うのだが…???

これで,後は車載動画と合成するプログラムを残すのみとなったが,めんどくさそうw

LuaPlayer+シリアル通信復活!!

LuaPlayer@3.xx カーネル のシリアル通信が復活!

3.xx カーネルではシリアル通信が出来ないのかとあきらめていたところ,新型 PSP ですでにシリアル通信が動いているとの情報を頂き,それを組み込んでみた.…だが,やっぱり動かない.んー残念!! こうなりゃ意地だと,いろいろ解析してみると奇妙な事が分かった.

シリアル通信のルーチンでは,「シリアルデータを受信してバッファに書き込む割り込みルーチン」と,「バッファから 1バイト読み出すスレッド」から成り立っており,割り込みルーチンと読み出しスレッドは変数を介して通信するのだが,割り込みルーチンが書き込んだ値を読み出しスレッドで読めないという事に気づいた (無論変数は volatile 指定している).さらに解析を進めたところ,大きい配列を介すると,変数を介した通信が成功する.

何でだ?? と思って,C コードをアセンブラに落としてみた.

上手くいかないほうのコード:

lw $3,%gp_rel(uRxBufWp)($28)


これは,uRxBufWp という変数の値を,レジスタ $3 にロードしているところだが,怪しいのが %gp_rel(...)($28) で,$28 からの相対アドレスでロードする事によって,命令数を少なくしている.$28 はおそらくスレッド開始時に初期化されて,その後変更されないのだろう.

一方上手くいくほうのコード:

lui   $2,%hi(cRxBufWp)     ; $2 = (cRxBufWp のアドレス値の上位)
addiu $2,$2,%lo(cRxBufWp) ; $2 += (cRxBufWp のアドレス値の下位)
lw $4,0($2) ; $4 = [$2], すなわち $4 には変数 cRxBufWp の値が入る


このように,$28 の相対アドレスではなく,$2 に直接 cRxBufWp のアドレス値を代入してから,$4 に cRxBufWp の値をロードしている.

以上の事から推測すると,スレッドごとに $28 の値が異ることがあり,C 言語上では同一の変数を指定していても,異なるスレッド同士では実際のアドレスは異なる事がありうる?

でもこんな仕様ありえねー.コレってコンパイラか BIOS か,なんかのバグだよなぁ.

-----

で,シリアル通信のほうは,けっきょく元々のソースコードの,通信に使用していた変数をちょこっと変更するだけで,無事動いたヽ(´ー`)ノ

というわけで,データロガー + GPS 計画復活!!

LuaPlayer+シリアル割り込みコネ━━━━(゜A゜)━━━━ッ!!

LuaPlayer + USBGPS,点を曲線で結ぶアルゴリズムの習得,と,走行動画に走行軌跡を合成する計画は着々と進行中.今日は,PSP の画面表示+ログ プログラムに GPS ログも記録する機能を追加して,データロガーと接続してテストしてみた.

…シリアル通信ができない_| ̄|○

3.xx カーネルモードの LuaPlayer が悪さしてるのか? と思って 1.50 カーネルの LuaPlayer で動かしてみたら,(当然 GPS は使えないものの) シリアル通信は出来た.

3.xx カーネルの LuaPlayer,シリアル割り込みが出来てないじゃん_| ̄|○
シリアル割り込みのソースコードは,どっかから持ってきたやつなので,自分ではどうしようもない.更にシリアル割り込みとかやってる人なんか他にいなさそうなので,3.xx で動く記述とかどこ探してもないだろうなぁ…

これにて,データロガーに GPS ログも記録する計画は中止(゜ーÅ)ほろり

LuaPlayer + GPS

長い間ほうっておいた,LuaPlayer で GPS を駆動する,を再開.けっきょく GPS の位置情報は最短で 1秒ごとにしか更新されないので,データロガーの情報としては使い物にならないが,まぁ車載ビデオに現在位置をプロットしてみるのも面白いかも,と思ってね.

前回までに PSP-GPS テストコードを参考に,UsbGps の prx ロードとか,初期化コードとかの組み込みは終わっているのだが,どうやら usbgps の prx の sceKernelLoadModule() で死んでいる模様.…何で? (゜ーÅ)ほろり

ちなみに,LuaPlayer は,ブートプログラム ( EBOOT.PBP ) と LuaPlayer の本体 .prx とに分かれているので,sceKernelLoadModule() を EBOOT.PBP のほうに移動したら,sceKernelLoadModule() 自体は成功している模様.ただし,その他の初期化コード (本体 prx の方にある) が失敗する.

んー,初期化コードも EBOOT の方に移動せにゃならんのか? でもそうしてしまうと,GPS 使う / 使わないにかかわらず,LuaPlayer 起動するだけで GPS が動き出してしまう.それは気持ち悪い.理想は lua のスクリプトで GPS 初期化ルーチンを呼んで初めて GPS が動き出す,てな動きだが.

んー,いろいろややこしいね.

予想通りのオチがつきました

 PSP-GPS がデータロガーに使えるかどうか調べてみる.データロガーとして使うには,最低でも 10Hz の更新頻度がないとダメだろう.で LuaPlayer を改造する前に,「そういや PSP-290 のテストプログラムを誰かが公開してたよなぁ」というのを思い出して,さくっとダウンロード & 実行.

 念のため,GPS テストプログラムの GPS データリード間隔を 100ms に改造してみたが,データの更新頻度は 1秒間隔でした.要するに 10回は同じ位置情報しか読み出せない.あーーーーー,やっぱダメか_| ̄|○

とりあえず GPS でラップタイム測る計画はおじゃんだなぁ.いや,欠けた位置情報を車速パルスや Gセンサーで補間できるか? でも精度が…

あるじゃん! Σ( ̄□ ̄;

ファイル img_21401771_0.jpg

すでに前回の磁気センサーは,自分の中ではなかった事になっている模様(;´д⊂)
ああ,そうですとも,はいはい失敗ですよ ┐('~`;)┌ ヤレヤレ

で,最近のデータロガーは GPS つきが当たり前になっているみたい.GPS つきだと,走行ラインが描けるだけかと思ってたけど,ここのヤツとかは,スタートラインの位置情報を設定すれば,GPS でそこを通過した事を認識して,タイム計測までできるみたい.へー,その使い方は目からウロコだ.

そうなってくると,my 自作データロガーにも GPS をつけたいなぁ… でも何買ってきてどうやって付けたらいいのか見当もつかんよ.( ̄-  ̄ ) ンー

て,あるじゃんw GPS.

ま,GPS データ更新が 1秒間隔な気が激しくするので,やる前からダメダメな気はするがw
誰かが LuaPlayer から PSP-GPS を制御してたような気がするので,とりあえずダメもとでやってみますか.と,思ったら,LuaPlayer に prx をロードする命令とかは無いのね.直に LuaPlayer を改造せにゃならんのか…

ページ移動

  • 前のページ
  • 次のページ