FC2ブログ

(ブレーキ/アクセル/ターンイン)タイミングリアルタイム表示アプリ作成

前回の記事で、ブレーキ、アクセルのタイミングをリアルタイムでチェックできたらいいな、と書いていたのですが、iRacing の SDK を使って自作してみました。
(何年かぶりのソフト開発で、Pythonは初めて使いましたが、フリーだし、使いやすくていいですね)


文中のVRSTとは、VRSでのデータパックのチュートリアルのデータを意味しています。

■できること。(走行中に確認可能)
各コーナーでのVRSTに対して
・ブレーキタイミングチェック
・アクセルオンタイミングチェック
・ターンインタイミングチェック
(これらの位置情報は、VRSTからハードコーディング)
・最大ブレーキ踏み込み量、VRS、自分(パーセント)
・ラップタイム、スピードデルタ表示(色分けあり)
・VRSTのブレーキ、アクセル波形
・自分のブレーキ、アクセル波形

・タイヤ温度平均
・タイヤ摩耗度平均
・VRSTの各セクションタイムと自分のセクションタイムの比較(セクションタイムは、VRSTからハードコーディング)
・上記と、ブレーキ、アクセル、ターンインポイントの全てのコーナーの前周のデータ表示
・VRSTと自分の過去のラップの比較
・時刻

その他:(リプレイでのリアルタイムで解析(VRST比較)も可能です。)

画面はこんな感じです。
ira.png
(クリックで拡大)
これを OVRdrop に表示

■今後やりたい事
・別画面でコーナー毎のVRSTと自分のブレーキ、アクセルの波形表示(プログラム的には簡単なんだけど、Pythonでの動的グラフ表示がちょっとやっかい)
⇒できました(2019年7月2日)

■以下は、自分向け忘備録
2019年6月24日夜、作成開始
・とりあえず、目標ブレーキ距離(OBD)、目標スロットル距離(OTD)はハードコーディングで入れる
・LapDist でスタートラインからの位置は把握できる。
・スタートライン通過後、ブレーキ開度信号(Brake)が10%以上になったら、OBD - LapDist を表示 、アクセル開度信号(Throttle)が10%以上になったら、LapDist -OTD を表示
(上記考察作業約1時間)
python3.4 、 PyYaml、pip、distribute インストール(若干てこずる)
pyirsdk インストール
iRacingでpyirsdk動作確認
(上記作業約30分、合計1時間30分)
pyirsdkビルド環境作成。(結構手間取る。)
PYTHONPATH に C:\Python34\PyYAML-3.13-cp27-cp27m-win32 パスを設定
以下を参照
https://devhub.io/repos/kutu-ir-text-overlay
yamlは3.1.1でないとだめ。yamlのpy ファイルを3.1.1に置き換えればOK
(上記作業約2時間、合計3時間30分)
irsdkはライブラリで、アプリケーションを呼ぶ必要があることが判明、
tutrialsの Base application を参考、変更して、スピード、スロットル開度をloop()で表示できることを確認
(上記作業約30分、合計4時間)
要求仕様から詳細設計
・変数
各コーナーでのOBD、OTD、(配列、インデックスはコーナーカウンター)
上記の処理用カウンター(コーナーカウンター)
Brake、Throttleの前回値
・定数
コーナーの数
・アルゴリズム
Brakeの前回値がゼロで、今の値がゼロでないとき、OBD[] - LapDist を計算してプリントアウト
Throttleの前回値がゼロで、今の値がゼロでないとき、LapDist -OTD[] を計算してプリントアウト
LapDist と OTD[カウンター値] を比較し、100m 以上離れていたら、コーナーカウンターインクリメント
コーナーカウンターがコーナーの数になったら、コーナーカウンターリセット
LapDist が 10m以下の場合、コーナーカウンターリセット
(上記作業約40分、合計4時間40分)
pythonの変数の使い方、配列の使い方、条件分岐をチェック
(上記作業約5分、合計4時間465分)
設計から動作確認、デバッグしながら、コーディング。仕様通りの動作となることを確認
(上記作業約2時間、合計6時間45分)
仕様追加:コマンドラインではなく、別Windowに結果表示、一つのコーナー終了毎に結果表示
(上記作業約5分、合計6時間50分)
PythonでWindow表示させるには、Tkinter を使えばよいという事が分かり、プロトタイプ作成、動作確認
マルチスレッドプログラミングの必要があることが分かる
(上記作業約1時間、合計7時間50分)
Pythonのマルチスレッドプログラミング調査
(上記作業約10分、合計8時間)
描写の更新ができず、かなりてこずる。
text_widget.update() これで更新できることが分かった。
(上記作業約3時間!、合計11時間)
仕様追加1 結果の距離情報、ブレーキ開度を整数表示にする。ブレーキ開度の内部変数を%にする
仕様追加2 各コーナーでのブレーキの最大値を表示する
要求仕様から詳細設計、コーディング、デバッグ
(上記作業約30分、合計11時間30分)
仕様追加 ボタンを押してアプリ終了
一時間ほどやってみたが、上手くいかなかったので、あきらめる。テストしたところ、ブレーキ最大値の計算にバグがあることが判明。修正に4時間もかかってしまった。
(上記作業約4時間、合計15時間30分)
仕様追加 ブレーキのグラフを表示
プロッターの使用方法調査、matplotlibインストール
https://matplotlib.org/2.0.2/users/installing.html
python -m pip install -U pip setuptools
python -m pip install matplotlib
(上記作業約10分、合計15時間40分)
グラフの再描写方法調査、テスト
(上記作業約1時間、合計16時間40分)
実装したが、マルチスレッドの問題で解決は難しそうなので、ブレーキ波形描写はあきらめる
(上記作業約30分、合計17時間10分)
仕様追加 ターンインのタイミングチェック
実装、デバッグ
(上記作業約30分、合計17時間40分)
ボタンによる終了を再度考察。結局できない。
(上記作業約30分、合計18時間10分)
仕様追加 タイヤ温度、タイヤ摩耗度を表示させる。(4本、真ん中、両端の平均)
実装
(上記作業約30分、合計18時間40分)
まだバグがあり、修正
(上記作業約1時間、合計19時間40分)
仕様追加、変更
現在位置対目標ブレーキの表示
現在位置対目標ターンインの表示
現在位置対目標アクセルオンの表示
目標ブレーキ、ターンイン、アクセルオン位置表示
目標ブレーキの10m手前で、フォントの色を赤に。目標ブレーキ位置で黒に戻す。
目標ターンインの10m手前で、フォントの色を黄色に。目標ターンイン位置で黒に戻す。
目標アクセルオンの10m手前で、フォントの色を青色に。目標アクセルオン位置で黒に戻す。
文字色変更方法の調査
(上記作業約1時間、合計20時間40分)
実装、デバッグ
(上記作業約10分、合計20時間50分)
仕様追加 各コーナーでの目標最大ブレーキ表示
実装、デバッグ
(上記作業約10分、合計21時間)
ここまで、2019年6月28日午前
デバッグ、VR向けサイズなど調整
(上記作業約3時間、合計24時間)
仕様追加 現在時刻表示、ラップタイムデルタ表示
実装、デバッグ
(上記作業約3時間、合計27時間)
仕様追加 過去9週のデルタラップタイム表示
実装、デバッグ
(上記作業約1時間、合計28時間)
仕様追加 VRSのデータパックのトレーナーのチュートリアルタイム(VRST)の各セクションの時間と自分の時間の差分とその合計を表示
実装、デバッグ
仕様が曖昧で、考察、実装しなおし、デバッグに時間がとられてしまい、8時間かかってしまう。
VRSTのセクション差分時間の開始、終了は、セクション開始位置、終了位置の時点での時間(データに入力する固定時間
自分のセクション差分は、終了は、上記のセクション終了位置のラップタイムと、開始位置のラップタイムの差分
表示するのは上記の差分
(上記作業約8時間、合計36時間)
仕様考察 別画面でコーナー毎のVRSTと自分のブレーキ、アクセルの波形表示
Pythonでの動的グラフ表示、pngデータの読み込み、表示が必要
実現方法調査、プロトタイプ作成
(上記作業約3時間、合計39時間)
実装しようとしたが、ノートだとOKだったのに、デスクトップだと、numpyがインストールできずに苦戦。
結局AnacondaでPython3.7で動作させる。
Anacondaからの起動は不便なので、Pyton3.4をアンインストール(再起動必要)Pyton3.7インストール。script Pathを再設定。
(上記作業約3時間、合計42時間)
実装。プロッター画面はプロセスでやろうとしていたが、プロセスとスレッドはグローバル変数を共有できないことが分かったので、プロッター画面もスレッドにする。
ドットで描写しようとしたが、遅くてNGなので、折れ線にすることに。描写方法、色の変更方法チェック
(上記作業約30分、合計42時間30分)
スレッドが動かないので、ノートPCにPython3.7インストール、matplotlibインストール
(上記作業約10分、合計42時間40分)
ブレーキ、スロットル波形表示検討。この、コールバックによる方法を試すが、frameの引数が上手くいかず、断念。
この、スキャッタープロットの方法を試すが、スキャッターでは、動作が遅く、波形が把握できない。
Cython, Numbaを試すが、高速化できず。
結局、このmatplotlibサイトのチュートリアルを解析して、なんとか、そこそこの速度で波形を表示できるようになった。
5時間ほどかかってしまう。
(上記作業約5時間、合計47時間30分)
VRSTのブレーキ、アクセル波形表示実装
ファイル名の文字列を配列に入れる文字列操作の確認
(上記作業約1時間、合計48時間30分)
上記、そのほかバグつぶし
(上記作業約3時間、合計50時間30分) 2019年7月2日 (50.5/216(9日)時間)
ブレーキ、アクセルプロットが正しいタイミングで出力されないバグを修正
やってる途中で、リプレイを使えば、自分で走らなくてもデバッグできることに気づく
これを応用して、viewでチェース等すれば、自分の走りをよりよく解析できる。
(上記作業約6時間、合計56時間30分)
VRSTとの差分がきちんと表示されなかったバグ修正
(上記作業約1時間30分、合計58時間)
仕様追加 コーナー毎の結果を1周分表示。
(上記作業約3時間、合計61時間)
構想から、ここまで約2週間、そろそろ完成かな。
仕様追加 各コーナーでのVRSのチュートリアルのコメントを表示
(上記作業約30分、合計61時間30分)
仕様追加 過去5ラップのデータを別画面に表示。2次元配列の宣言にちょっとはまってしまう。
(上記作業約5時間、合計66時間30分)
仕様追加 オンラインレース時用に、小さい表示画面に(コマンドライン引数で選択)
(上記作業約30分、合計67時間)
仕様追加 サーキットレイアウト表示。同じアプリでは表示できなかったので、別アプリで
(上記作業約30分、合計67時間30分)
変更:VRSのブレーキ、アクセル画面の余計な余白を削除
(上記作業約30分、合計68時間) 2019年7月7日
VRSのブレーキ、アクセル画面に自分のデータプロットを重ねる検討したが、難しく断念。
(上記作業約1時間、合計69時間)
仕様追加 自分のブレーキ、ターンイン、スロットルオンの結果の位置の表示、別画面にブレーキ、ターンイン、スロットルオン等の情報の表示
(上記作業約30分、合計69時間30分)
新規アプリ作成 イメージトレーニング用、ブレーキ、ターンイン、スロットルオン位置画像表示
(上記作業約1時間30分、合計71時間)
仕様変更 目標のブレーキ、ターンイン、スロットルオンから20m以上離れたとき、赤で表示
(上記作業約30分、合計71時間30分)
replayだと、CarIdxEstTime(ラップタイム)は正確でない様子
仕様追加 (段々チートっぽくなってきてる?いや、これは効率よく練習するための手段)左足ブレーキトレーニングモード追加。昔GTR2のトレーニングモードでで同じコーナーを何回も連続して練習できた感じ。
(上記作業約2時間、合計73時間30分)
仕様変更 トレーニングモード、イグニッションオンでプロット開始、ブレーキ踏んで5秒後にプロットリセット
(上記作業約30分、合計74時間)2019年7月12日
まだまだいろいろ思いついてしまう。
仕様追加 トレーニングモード、ステアリングのボタンを押すと、VRSのビデオ開始と同時にプロット開始
pip install opencv-python
(上記作業約3時間、合計77時間)
仕様追加 (タイミングプロット)スタートラインからの距離と、ブレーキ、ターンイン、スロットルオンの目標をそれそれ別画面でプロット。よりタイミングが把握しやすくなる。
(上記作業約2時間、合計79時間)2019年7月15日
仕様変更 2019年9月18日
ウィンドウ表示させると、FPSが下がるので、負荷を下げるために、コマンドラインに最小の情報を表示させるアプリ作成
・時刻、ラップタイムデルタ、残り燃料、タイヤ温度
・目標ブレーキ、目標アクセル差分
設計
変数 コーナーのカウンター(以下の配列のインデックス) 初期値 0
目標ブレーキ、目標アクセルの配列
-70m <目標ブレーキ、目標アクセル<70m でブレーキ、アクセル踏まれたら、目標値との差分を表示
上記内で一度ブレーキが踏まれたらコーナーカウンターインクリメント再度踏まれてもカウンタインクリメントはしない。
スタート位置になったら、カウンターリセット
↑アクセルは無し、ブレーキのみに。計算周期を0.2秒毎に(FPS落とさず、なるべく短い周期で)
(上記作業約2時間、合計81時間)
↑アクセル部分の追加。起動オプションでブレーキ表示、アクセル表示を変更
(上記作業約2時間、合計83時間)2019年9月25日

コメントの投稿

非公開コメント

レースシム
レースシムとは何ぞや?
ここ読んでください(英語)
レースシムWiki
レースシムやるのに必要なもの
■必須なもの
・PC
・レースシムソフト
■あった方がいいもの
・PC知識(ハード、ソフト)
・PC自作(組み立て)能力
・ステアリングコントローラー
・ペダル
・複数ディスプレイもしくはVR
・上記が設置できる部屋
・英語力
・ネットワーク知識
・車両セットアップ知識
・家族の理解
■速くなるために必要なもの
(Skip Barber氏より)
・インテリジェンス
・デターミネーション
現在の機器構成
CPU:i9 9900KF
GPU:1080ti
メモリ:32GB
マザボ:msi Z370
VR:HP Reverb
ハンコン:OSW、Small MiGE
ペダル:Fanatec CSL EP LC
SimVibe
ウィンドシミュレータ
コックピット:普通の机、椅子
最近の記事
カテゴリー
プロフィール

hiro

Author:hiro
レースシムにはまっています。今はiRacingを主にやってます。

Twitter
最近のコメント
リンク
ブログ内検索
FC2カウンター
月別アーカイブ