【Python】スキーターンVector線図描いてみた<自分のターン見える化できた>

Python pandasとmatplotlibを使って、スキーターンのベクトル線図と物理量をプロットすることができました。
ベクトル線図初めて4日でできました。
スキー板のズレを青と赤のベクトルの夾角で視覚的に認識できます。赤が進路方向で青が板の方向です。
一番時間がかかったのは、ログ不良データが0.3%以下で発生しているのですが、それがエラーになるので、それらの処理が一番時間を食いました。グラフ自体は、1日くらいでできました。
ソースは、GISTに置いてあります。
https://gist.github.com/dj1711572002/38d776e39a83163ee2c8855a5dc4f328

●Pythonデータ処理プログラムの良さ

グラフがデータ解析する立場で設計されていて、便利な自動機能がたくさんついてます。
ここ3年は、VisualStudioでVBとC#でグラフィックでターンのアニメーションを描いてきたのですが、
ターンの細部を分析するには、ターン形状によって、グラフスケールとウィンド枠を変更しないと見えないのですが、matplotlibだとそれが可能になりました。自動的にスケーリングとウィンドウサイズを変更してくれる機能で
どんなターンデータ来てもベクトルの配置と文字の配置を自動的にバランスをとってくれるので最初から最後までのターンの軌跡と情報が詳細に観察できるようになりました。C#だとやればできるでしょうが、相当手間がかかります。

「巨大なデータを扱うのに数行程度で片づけられる」
=>複雑な前処理をしていると、何をやっているのか判らなくなることがありますが、短いプログラムだと一望で、見返せるのが便利です。
=>データ配列処理では、pandas を使うと
C#の1/5以下の行数でコードが書けます。
=>データ型が自動付与なので、どんどん変数を作っていける、C#だと変数の厳格な管理が必要で頭がいっぱいになってしまう。
③pandas 便利
C#だと表は、DataGridViewで作るのですが、非常に遅くて,DataGridViewを使わないで、methodとかstructでデータ構造を作っているのですが、データのチェック視認性がダメです。pandas DataFrameのような構造のものがC#にはありません。

pandas DataFrameにプロットに必要な情報を全部まとめていれてあるので、追加したい列があればどんどんバージョンアップして、プロットに追加できる点が、具合が良いです。何しろ、一回の計測で、発生するバイナリファイルが3個あって、その中に、RTKのデータとIMUのデータ詰め込まれているのですが、フォーマットが3個3種類全然別のフォーマットなので、整理して1本のDFにまとめるのに長い前処理工程が必要です。
これをC#でやっていると、あまりにも複雑なので、デバッグ作業が大変で、とてもやりきれなかったのですが、pandas DFを使うことで、最後まで全ファイルを処理することができました。
列の名称(columns)が便利で、覚えやすい名前でデータ配列を置いておけるので、処理がはかどります。

●ベクトル線図の解説
今回は、右スキー上に設置したMovingBaseシステムのデータからプロットしました。
サンプリングは、MovingBaseが120msec  IMUが10msecでとってます。図は、120msec周期でプロットしてあります。
位置精度は、±3cm程度はでてます。角度精度は、±1度程度です。時々飛びがあるのがRTKの欠点です。
飛んだ場合はIMUのデータで補間することを念頭に測定システム組んであります。

北志賀のよませ温泉スキー場のメインバーンですが、最大斜度は20度前半で中斜面かっとびコースですが、今回は実験用に鈍速度でゆっくり滑ってます。

●計測方法と見方
①dataNoは、ログファイルのデータ行INDEX番号です。ファイル名で日付と時刻がわかります。
②縦軸が北南座標で上がプラスで北方向、横軸が東西座標で右がプラスで東方向
 下図だと、東南方向に滑っていることになります。
③座標値は、cm単位です。基準局は、20数km離れた長野市のNC_NAGANO様で、基準局のアンテナからスキー板の前部のアンテナまでの3次元座標値が0.1mm分解能で、120msec周期で計測されます。
精度は、水平方向で±3cm 垂直方向で±5cm程度でます。
④板の姿勢は、後部のアンテナと前部のアンテナ間の相対位置(MovingBase方式)で3次元で出力されます。
板の角度精度は、±1度以内でます。
⑤板の角付け角は、IMUのロール角で得られます。IMUは、10msec周期でサンプリングしてます。RTKの遅いサンプリング周期を同期補間する機能をもたせる予定です。yaw角があるので、MovingBase法を使わなくても板の姿勢がわかるのですが、精度が±5度程度しかでないので、RTKのデータで補正しないと使えません。
⑥データ諸元
今回は右足なので、左側から右へ回るターンが谷足のデータになります、図は、2ターン分NutralPoint4個で表示してます。
NutralPoint(プロットの最初と最後の位置)=スキーのターンの始動時は、前のターンから次のターンへ、スキー板を反対側に倒して
速度方向の差分が±ゼロ点を通過します。そこをNutralPointとなります。
spd(瞬間速度)=RTKのgSpeedです。GPS電波とのドップラー効果で計測してます。ですので低速ではノイズが大きいです。
skid(ズレ角)=板の向き(Heading角と板の運動方向(headMot角)との差がズレ角となります。ズラすことで、速度の調整をしてます。
Drop(落差)=ターン始動のNutralPointの標高をゼロとして、落ちていく標高落差をmで表してます。
FigNo=滑りだしログ開始から切り取ったターンの番号
TurnSlope(斜度)=始動点から終了点を直線で結んだときの傾斜角 deg ターンの傾斜で急かどうかがわかる
Edge(角付角)=板の傾き 左回転プラス 右回転マイナス deg  (IMUのロール角)

 

●滑走例

①少し速度を上げたターン
ズレ角が10度以下になってくるとぐんぐん加速していくのが判ります。
私は、板の角付け角が少ないです。傾けるのが怖いのでなかなかスキーに乗れてないということです。

②緩斜面でSKID角20度未満で、速めのターンになっている


上の続き
エッジが20-30度くらい立っている

 

●感想
Python/ pandas /matplotlibのおかげで、ここ4年で実現できなかったグラフが作れた。C#だったら面倒くさくてとてもたどりつけなかったと思います。

①細かくみていくと、細かくずらして、速度調整しているのが判る
②もっと、速度をあげたり斜度の急な斜面を滑ってみてデータをとる必要がある
③体の位置情報も欲しいので、両肩にアンテナ2本取り付けて肩の位置もMovingBaseで測定したい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です