【STA23】C#動くグラフ SkiTracer rev07動画部分<プロット方法備忘録>

2023年のSTA23データ処理プログラムは、実用的な機能を重視して作成してます。

特徴1:従来よりターンを拡大して、中央にオートトレースさせてます。
特徴2:右ターンは、左スキー、左ターンは右スキーをBOLD表示して見やすくしてます。
特徴3:ターン番号でパラメータを管理してます。
特徴4:RTKとIMU(BNO055)のデータを同期させて比較検討できるようにしてあります。
特徴5:位置精度が、基線長ベースで相対距離0.1mm単位で表現してますので、緯度経度の換算誤差無いです。

●YOTUBE

●プログラム全体
C#のフォームアプリです。
https://gist.github.com/dj1711572002/ff13484e9d512b9aeb402bc475577b09

苦労した点1:RTKデータは、0.3~数%で欠落、Nullなど受信不良が存在するので、それを除去、補修する処理プログラムに手間どりました。
苦労した点2:データ量が、2021年システムの5倍に増えたので、M5Stack系からTeensy4.1に変更して高速大容量化しましたが、システムのハード構成が複雑になりました。
苦労した点3:左右別々のファイルを検査補修、ターン抽出処理して合体させるプログラムで

手間取りました。

 

 

●グラフィック部分
基本は、BITMAP展開シリーズのテクニックを使ってますが、VBをC#に置き換えてます。
①処理手順備忘録
手順1:プロットデータの正規化
  1-1基準点を決めて、基準座標に変換 
スキースタート時点での右スキーBaseアンテナを基準位置(0,0)にして、右Rover,左Base,左Roverと位置を
計算して、全データを変換。

1-2 座標を回転させる
      右Baseのデータで、滑走開始点と滑走終了点の直線の角度を求めて、滑走開始点を原点に移動させて、
     角度分だけ回転して座標変換をおこなう。
     こうすることで、BITMAPのメモリー節約とグラフと実データを1:1で参照しやすくする。
1-3  回転させた座標データでMax Minを求める
4本の配列データでMax Minを求めて、最大長方形のサイズを求める。
1-4    ソースビットマップの上限サイズを超えていたら、縮小率を計算して縮小する
ソースビットマップは、Windowsの32ビット整数の上限までなので、2GB以内となります。
実際は、1.2GBくらいが上限で、超えるとVisualStudioが定義エラーになるので、サイズを下げます。
本プログラムでは、横長で100000ドットx5000ドットしてます。
縮尺は0.5dot/cm (2cm/dot) 固定で使ってます。縮尺は固定したほうが、直観的に判り易いです。
       詳細はこちら
【STA】RTKデータ解析用グラフィック機能開発ーその2ー<ソースBITMAP表示基礎>

1-5 プロット座標を生成時点で、プロット座標とターン番号参照配列作成
グラフをセンタースクロールした時にグラフ座標と実データの参照とする配列を
     作っておく。

1-6  デバッグ用にデータをチェックしやすいように、DataGridViewを3個作る
 dgv1:右スキーデータ、dgv2:左スキーデータを合体させてdgv3を作る
     dgv3:左右スキーデータ を使ってプロットデータを作成

手順2:ソースビットマップの切取
   2-1 全データをソースビットマップへプロット  void XYplot3rl()
    WINDOWS座標と一般的なXYグラフの座標が違う点が重要です。
     X軸は、右方向がプラスですが、Y軸は、下方向がプラスなので、逆さになります。
     何もしないと逆さグラフになるので、元座標(x,y)プロット座標(ox,py)では、
      px=x;
                      py=height-y;
       heightは、ソースビットマップの高さ ここでは5000ドットとなります。
       y=0は、プロット座標では、py=5000となります。

   2-2 hScrollBarの設定
     hscrollBar2.Maximum=最終データ配列番号(=
dgvの最後の行番号)として
スクロールバーを動かすとデータ番号を指定できるようにします。
     2-3 ソースビットマップを切取って、表示用ビットマップにする準備
【STA】RTKデータ解析用グラフィック機能開発ーその3ー<自動追尾機能の中身>
sourceBitmapを     xyBitmap=new Bitmap(100000,5000);
destenationBitmapを  xysBitmap=new Bitmap(1000,400);
pictureBox2を      pictureBox2.Width=1000;pictureBox2.Height=400;
最終的な画像表示は、    pictureBox2.Image=xysBitmap; で表示させます。
   2-4 DrawImageで、切取コピ処理  void smodeCutrn(データ番号)
          切り取るには、矩形の左上座標を与える必要があるので、中心座標から左上座標計算
    中心座標: xcenter=xR[rn],ycenter=yR[rn]
    左端上座標:  xstart=xcenter-pictureBox2.Width/2

                                       ystart=ycenter-pictureBox2.Heght/2
      寸法的には、1000x400dotで20mx8mの矩形が表示できます。
     中心座標から、(10m、4m)の地点からの動きまで切取ってます。
      これだけあれば、どんなターンでも適格に表示できる寸法になってます。

●以後
時系列グラフとの同期とパラメータの詳細な表示をして解析機能を追加します。
FallLineと落差による速度、IMUデータとの照合など行っていきます。

※不具合、追加したい機能メモ
①dgv3の欠落データ補修で、Status記述部分を補修してなくて空白になっているのを補間する。
②ターンの左右の区別をつけるパラメータを設ける
③時系列グラフを左右データ合体させて左右ターンで切り替える
④時系列グラフとXYグラフの同期させる方法を検討する(データ配列とX座標での同期)
⑤FallLineをXYグラフに表示する方法を考える
⑥ターン構造体データをdgvへ反映させる
⑦SDログから、dgv3まで自動取り込み処理を検討。
⑧BNO055の精度評価の方法を考えてプログラム
⑨無線モニターシステムの大幅改良
=>モニターデータをログしない方針なので、ESP-NOWで受信して、小型LCDにHMD風にして主要データのみ表示する方法を検討する。
=>SDログをESP-NOWで転送した場合速度のネックが、Serial転送になるので、ESP32でのシリアル転送460800bpsの送信が可能か調べる。
➉スキー実験だけでは、季節の制限があって、開発活動に大きな制限があるので、スキーに似た運動動作で、実験できる方法を考える。
=>インラインスケート、スケートボード、ランニング、ドローン、ラジコンバギーなど
RTK2CHで無線データを試験できる方法を検討して、夏から秋に実験できるようにしたいです。

コメントを残す

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