Meridian console
Meridian計画。
Meridianはロボットの3Dビジュアライズやシミュレーション環境として、ROS系やUnityなど既存のアプリケーションを使うことを想定しています。
しかし、データ送受信についての試行錯誤や検証を開発段階で進めるには、専用の小さいアプリケーションがあると便利です。
Meridianの中身はMeridim配列という1パケット分の小さなデータ配列なのですが、データをコンパクトに保ちながら機能を盛り込もうとすると、中身はそれなりに複雑になってきます。
このデータを見やすくするために準備しているのが"Meridian console"です。
アプリはPythonで作成しており、UIにはDearPyGuiというライブラリを利用しています。
主な機能はMeridim配列のデータのビジュアライズや、コマンド送信のGUI操作です。
コードも比較的シンプルで、仕様を決めたり変えたりしながら作っていくことができるのも便利なところです。
エラーリポートを充実させたい
通信スピードを安定させるための試行錯誤では、各経路でのエラー検出が重要になっていました。
最初のテスト段階では、各経路で計測したエラー回数やエラー率そのままデータ配列につっこんでいました。
扱いは便利なのですが、これだと経路1箇所のエラー調査だけで配列を2つ(32bit)も消費してしまい、あっという間にデータが満タンになってしまいます。
エラー検出は今後も必要になりそうなので、なんとかデータを圧縮してMeridianの仕様に盛り込んでおきたいところです。
そこで思いついたのがフラグを上げ下げしてカウントする方式です。
データを受信した際、
チェックサムでNGであればフラグを挙げ、前回OKだったデータを渡す。
チェックサムでOKであればフラグを下げ、最新のデータを渡す。
というだけのシンプルなルールです。
フラグの上げ下げに必要なデータ量は1bitです。
具体的には、たとえばPC側でデータを受信した際、データを調べてESP32のUDP受信エラーフラグが挙がっていたら、PC内に持っているエラーカウンターを1増やす。平行して、データを受信した回数もPC内で計測しておく。
これで、PC内でエラー数やエラー率を算出することができるようになります。
32bitも使おうとしていたデータ量を、たったの1bitまで圧縮できることがわかりました。
これらのエラー検知用のフラグデータは、Meridim配列の[88]番にまとめています。
チェックサムをすり抜けるエラーがあった
また、データ受信時のチェックサムではOKが出ていても、実際にはデータを受信しそびれているという場合があることにも気が付きました。
何かの都合で届けるべきデータをスキップして次のデータを送受信してしまった場合です。
チェックサムは配列自体のデータの合否は判断できるのですが、データの順番が飛んでいる場合にはそれを検知できません。
そこで、Meridim配列の[88]番の下位8ビットを利用して、0~199までの数字を順番に流すようにしました。
こうすることで、受信時にデータが順番にきているかどうかを確認できるようになります。(よく考えたら8bitもいらないかもしれません)
ちなみにMeridianではデータの欠損があった場合には次に来た正しいデータで辻褄をあわせようとするので、動作の上ではある程度の欠損であれば簡易的に補完できるようになってはいます。
エラーリポートはMeridian Console上ではとりあえずMessage欄にまとめて表示するようにしてあります。
シームレスで柔軟なデータ構造
Meridian consoleの左上に並んでいるスライダーは、サーボの現在位置を示します。
ロボットを動かすと、その角度データに連動してスライダーも動きます。
さらに、console上からサーボのパワーを入れられるようになっており、スライダから実機のサーボを動かすことができます。
これは送受信のデータが表裏一体となっているMeridianならではの機能です。
ROSノードもコンソールに統一
Meridian ConsoleからROS1のノードを立てjointデータをpublishするチェックボタンもつけてみました。
もちろん前述のスライダーも併用できるので、実際のロボットのポーズをRvizなどの表示にリアルタイムに反映させることができます。
将来的にはROS2との送受信もこのコンソールからできるといいなーと思っています。
リモコンの状態も確認できる
これも便利なところです。
ROSの受信はこれから
いま作っています。
自作のコンソールなだけに、機能を好きなだけ自由に追加できるところが気に入っています。
次回記事:
前回記事:
目次:
この記事が気に入ったらサポートをしてみませんか?