記事一覧

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

AviSynth プラグインフィルタ自作(2)

ファイル 136-1.jpg

 ほぼ移植完了.AviUtl と AviSynth の差分は,画像データに点を打つ関数と,画像のプロパティ (縦横サイズとか) 取得部分のみなので割とすんなりと実装は済んだ.
 …と思ったら,MediaPlayerClassic で映像と音声とメーターがズレてるよ_| ̄|○ MediaPlayerClassic で動画のプロパティ見るとなぜか 25fps になってた.ffdshow のオンスリーンディスプレイでは 29.970fps になってるのに,いみがわからん.
 調べてみたら,.mp4 が 25fps になってしまうのは ffdshow のけっこう有名な問題らしい.そういや,AviUtl で ffdshow 経由で .MP4 開いたときもおかしくて,mp4input.aui 経由で読むように変えた過去があったし.でも ffdshow の新しいバージョンでは改善されたとかの記述もあるし,よくわからん.
 でとりあえず Haali Media Splitter 入れたら直ったヽ(´ー`)ノ そういや昔はこれ入れてた気もするが,ffdshow が新しくなってから入れなくても .mp4 見れるようになった(?) ので,入れてなかった.Haali Media Splitter 入れてない状態で,ffdshow 再インストしたら .mp4 見れなくなったので,何らかの .mp4 スプリッタが入ってたらしく,25fps 化はこの謎スプリッタが原因みたい.

 で,いろいろ使ってみたのだが,AviSynth 対応は自分ですら予想しなかったほど便利であること発覚.例えば 320*240 で撮影した動画は,640*480 に拡大してからメーターを重ねるなんてことが簡単にできるし,↓のようなスクリプトで 2つの車載動画を並べて同時再生とかもできるし.

c1 = DirectShowSource("SANY0001.MP4").ConvertToYUY2(). \
    VSDFilter( \
        "vsd20090123_095934.log", \
        video_start=8324, \
        video_end=68034, \
        log_start=4522, \
        log_end=34980, \
        map_length=240, \
        map_size=460, \
        map_angle=3406, \
        lap_time=1, \
        g_snake=1 \
    ). \
    BilinearResize( 320, 240 )

c2 = DirectShowSource("SANY0002.MP4").ConvertToYUY2(). \
    VSDFilter( \
        "vsd20090123_111455.log", \
        video_start=221, \
        video_end=52536, \
        log_start=8611, \
        log_end=35296, \
        map_length=240, \
        map_size=460, \
        map_angle=3406, \
        lap_time=1, \
        g_snake=1 \
    ). \
    BilinearResize( 320, 240 )

StackHorizontal(c1, c2)

こりゃ便利だわヽ(´ー`)ノ

AviSynth プラグインフィルタ自作

 車載動画スーパーインポーズフィルタ (vsd_filter) を,AviSynth プラグインフィルタに改造中.なんでそんなことしてるかというと,
・AviUtl で合成した動画は,.avi に書き出さなくても AviUtl で再生することはできるが,プレーヤーとしていけてないので,DirectShow 経由で普通のプレイヤーで見たい.
・Adobe Premiere とかで合成した動画を編集したいとき,いったん .avi に書き出さないといけない.AviSynth 経由なら,いちいち .avi に書き出さなくても直に読み込める
と,それなりに利点はあるので.かつて DScaler フィルタで作ろうと思ったけど,DScaler のプラグイン SDK は有料(?) みたいなので断念していた.
 というわけでここを見ながら AviSynth のプラグインフィルタについて勉強中.

移植に当たっての問題点は,
・AviUtl でダイアログで設定してるパラメータを,AviSynth では GUI で設定できない.なので,AviUtl の設定パラメータをファイルにライト・リードする機能を付加した.これで AviUtl の GUI でパラメータ調整→パラメータ書き出し→AviSynth のスクリプト内でパラメータファイルを指定,のようにすればパラメータを読み込めるはず.
・YUY2 のオペレーション.線とか円を書くとかの関数はクラス化してるので移植は容易で,これらの関数は最終的に 1ピクセルの点を打つ関数を呼んでいるので,アプリに依存しているのはこの 1ピクセルの点を打つ処理だけ.問題は YUY2 フォーマットでは U/V が横 2ピクセルで 1データを共有しているので,1ピクセルだけ打つというのが (画質を追求すると) めんどくさいよなぁ…

カート動画分析

ファイル 134-1.png

先日 YouTube にカートのヘルメットカメラ動画を up したのだけれど,知らない誰かが同じような動画を up していて,しかもその人のほうが早かったので,自分の弱点を知るべく素人なりにそれぞれの動画を分析してみた.

まず,コースを適当に 4つのセクターに分けてそれぞれの区間タイムを計る.(セクター分けやコーナー No. などは自分が勝手に割り振ったものなので…)
セクター1: スタートライン~3コーナー
セクター2: 4~8コーナー
セクター3: 8コーナー脱出~バックストレート
セクター4: 10コーナー~スタートライン

その結果:

セクター自分参考動画Diff
18.778.53+0.23
29.809.44+0.36
37.007.28-0.28
48.278.15+0.12

さらに,動画から走行ラインをなんとなく割り出してみて図に起こしたのが上の図.

セクター1 はそんなに差がないだろうと思っていたのに,0.2秒も差がついている.おそらく 1コーナーでブレーキを踏みすぎているのが原因かと思う.参考動画のほうが大回り傾向にあるが,大回りして速度を上げたほうがいいのだろうか?

セクター2 は自分でも苦手と思っていたが,やはりここで一番大差がついている.たぶん 4コーナーの進入がすべてではないかと.自分では 4コーナーで突っ込みすぎて 5, 6 コーナーが苦しくなってロスしていると思うが,参考動画では 4コーナの CP が割と奥にあった.
7, 8は,コンパクトに回って距離を稼ぐか,大回りして速度を稼ぐかいつも悩んでいる.結局 7-8 間はコンパクトに回って,8-9 間は大回りして速度を稼いでいたつもりだが,参考動画では逆で,7-8 間で速度を速めに立ち上げて,8は思いっきりショートカットして距離を稼いでいるんだろうか?

唯一勝っているセクター3,自分のカートが当たりだっただけかもしれないが,これまで何回か走った経験からここで前走と距離が詰まると感じたことが多かったので,セクター3 が速いってのはあながち間違いでないのかもしれない.というのも自分は体重が軽いので,加速だけはよいのだろう.

セクター4 は,ライン的には参考動画と変わらない気がしたのだけど,それでも 0.1 秒の差.ここもブレーキングの差なのかなぁ? 気になったのは,参考動画はあまりカウンターを当ててなかったこと.ライン以外に何か考慮すべき点があるのかもしれない (体重の乗せ方とか???)

とりあえず,優先順位的に,
・4 コーナーの CP を奥にとる
・8 コーナーはショートカット,8-9 は大回りせず距離を稼ぐ
・1 コーナーでなるべく速度を殺さない
・10 コーナーでなるべく速度を殺さない
でがんばってみようと思う.

簡易ラップタイム計測機能だけ使用

ファイル 133-1.jpg

データロガーネタなんだけど,もはや PSP とは関係ないな…

めでたくカートでのヘルメットカメラ動画撮影に成功したので,これにラップタイムを合成表示させてみたくなった.ラップタイムのスーパーインポーズ機能自体はこのとき仕込んではあるのだが,あくまでも副次的な機能だったので,データロガーのログファイルを読み込まないとラップタイム計測機能は使えないようになっていた.

なので,さくっとメーター表示せずにラップタイム計測機能だけ使えるように改造.

ほしいひとはここからどうぞー.

現実とゲームの区別があいまいに…なるわけねーだろ

 グランツーリスモ4 が発表されたとき,「日産のトップテストドライバーを例に挙げ、同一車種で実車と「GT4」で走行した場合、5秒以内(1%程度)のラップ差が実現できている」と書かれた記事を見てから,GT4 の再現度ってそんなに高いの? と常々疑問に思っていた.大体,タイムが近い=再現性が高い つうわけでもないだろうに.
 これを確かめる一番手っ取り早い方法は,自分で同じコース・同じ車で走ってみて,挙動の違いを確かめればいいのだが,GT4 に収録されているコースを走る機会がなかなかなかった.だがついに鈴鹿サーキット西コースを破格で走れる機会があったので,かねてからの疑問を晴らすべく突撃!!

 で,その結果↓ (ニコ動アカウントがない人はこちら)

まずタイムは…GT4 が 1'40.900,リアルが 1'47.703.リアルが 7秒落ちwww (ちなみにゲーム中の車は,フルノーマル・N1 タイヤ・アシスト類全 OFF という,考えうる最低の設定)
 もちろんリアルの腕がしょぼいのが一番の原因だとは思うが (130R の突入速度が 30km/h も違うw),挙動に関しての大きな違いは,ゲーム中の車が安定しすぎてるんじゃないかな.
・フルブレーキでハンドル切ってもなんともない→ブレーキを遅らせられる
・スプーン出口とかでアクセルがばっと開けてもなんともない→立ち上がり速度が稼げる
現実でそんなことしたら (少なくとも俺の腕では) スピン死確定だよ.

 ちなみに,一緒に走った S1 STD・ライトチューン・NEOVA・鈴鹿経験あり のそこそこ熟練者が 1'40 で走ってたことからも,GT4 の 1'40 は眉唾ものと言えよう.

 まぁ走行会前に事前に GT4 で練習したけど,コース覚えるのとかライン取りとか,ブレーキングポイントとか,事前に予習するのには役立ったかな.

簡易ラップタイム計測機能追加


VSD for サーキットの友」に,簡易ラップタイム計測機能をつけてみた.

原理としては,動画でスタートラインを通過した瞬間に手動で目印をつけることで,目印~目印間の時間計測をして表示すると.なので原理的に動画の fps を超える精度の時間計測はできない (例えば動画が 30fps ならば,タイム計測の精度は 1/30 = 0.033秒) が,ラップタイマー持ってない人にとってはこれだけでも十分うれしいのではないかと.

ラップタイム表示のコード自体は,もともとの自作データロガー用 VSD が持っているので,問題は AviUtl の GUI でどうやってスタートラインの位置を入力するか.幸い,「マーク」という機能があって,任意のフレームにマークをつけることができるので,それでスタートライン通過フレームの指定をすることにした.

てなわけで,チャッチャと実装完了.

車載動画スーパーインポーズフィルタをサーキットの友に対応

ファイル 109-1.pngファイル 109-2.jpg

自分はデータロガー環境を独自に構築しているが,これを他の人に広めようとしても,一番のネックになるのは車両からの情報を収集する方法.自分では H8 マイコンを用いているが,少なくともハンダ付けが必要なので他の人に展開するのはほぼ不可能だろう.

しかし世の中にはうまいことを考える人もいるようで,簡単なケーブルを自作するだけで,ノーパソが車両からの情報を収集できる機械になってしまうというものがあった↓
サーキットの友
原理としては,ライン (マイク) 入力に車両からの信号を突っ込んで,サウンドカードを AD 変換器代わりに使用して,CPU パワーでその波形をリアルタイムに解析すると.ステレオ入力だと最大 2ch (スピード・タコ) が解析できるから,簡易的なデータロガーになる.そういや同じような考えで,ライン入力をオシロスコープ代わりに使用するソフトもあったっけ.

もっと早くこれを知っていたら,自作データロガーとかわざわざ作らなかったかもw

で,サーキットの友 で車両のログを取ることはできるが,車載動画と合成する機能まではないので,自分の作った車載動画スーパーインポーズフィルタをサーキットの友対応にしてみた.

欲しい人はこちら

これは酷いwww

ファイル 95-1.jpg

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

 これはヒドイwww

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

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

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


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

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

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

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


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

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

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

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


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

データロガーのGセンサー表示をちょこっと変更

ファイル img_24363833_0.jpg

 自作データロガーの,メーター合成ソフトに Gセンサーの軌跡を表示する機能をつけてみた.緑の円が現在の G で,濃い緑の線が過去 3秒間の G の軌跡.これは左コーナを曲がってる途中の写真だが,こうして軌跡を見ると,スムーズなブレーキ残しが出来ていないのかなぁ? という気が.まあ所詮俺のようなシロウトがこんなデータ見たところで何も分析できないのだがw

 ちなみにちょっと検索してみると,自作データロガーとほとんどおんなじ事してる製品が Kaaz から出てて笑った(笑) これはカメラで撮った映像とメーター情報をリアルタイムに合成 (スーパーインポーズ) して録画する製品みたいだけど,これだと,カメラと録画機器が分離していないといけない (カメラ出力→このモニターで合成→録画という流れのため) ので,全体で見てもスゲー高いシステムになりそう.モニター本体だけでもミニマムセットで \73,298!!

 その点,自作データロガーは,リアルタイムに合成は出来ないものの,家に帰ってからカメラの映像とメーター情報を PC で合成するので,一般的なカメラで実現できるので安上がり.自作データロガー本体も部品代だけでいけば \1万以内はず.\3万くらいで売ったら儲かるだろうか?(笑)


上の写真の動いている映像はこちら

PSPデータロガー実戦投入


鈴鹿ツインサーキットでの走行会があったので,PSP データロガーを実戦投入してみた.ノート PC が持ち物から無くなったので,荷物量が減る減るw あと,ラップタイムが非常に見やすくなってかなりイイ.赤外線ラップタイマも調子がよく,今回は 1ラップも取りこぼすことが無かった.
それと,タイム計測の誤差も調べることができた.今回はコース公認の計測器も使用したので,それとの時間差を調べてみると,最大 1/100秒ほどの誤差.まぁ,パーソナルユースだからこんなもんでも十分っしょ.

だが実際に使ってみて問題点も分かった.ひとつは,カーステで音を鳴らすためのピンジャックがデータロガー本体に挿せなかったw どういうことかというと,1ラップ計測するたび,またはファステストラップが出るたびに PSP で音を鳴らして,タイム更新したかどうかを音だけで分かるようにしていたのだが,PSP シリアル通信ケーブルはリモコン端子に挿すので,当然 PSP からは音が出ない.そこで,データロガー側まで音声信号を引っ張って,データロガーにカーステのピンジャックを挿そうと思っていたのだが挿すスペースが無かったw こりゃ,データロガーのケース (\100均のタッパーウェア(笑)) を切り刻むしかないな.

もうひとつはもっと深刻で,上の動画を見てもらえば分かるように,映像とメーター描画の同期が微妙にズレている.これは,PSP がデータロガーからのデータを取りこぼしている事を示している.んー,バッファサイズは十分に取ったはずなのに… これは解析の必要ありだな.

ページ移動

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