RerunでWMX3のログを可視化する
This content is not available in your language yet.
Rerunというオープンソースのログ可視化ツールを使ってみます。 Rerunについては、詳しくは公式サイトをご覧ください。
Try browser demoからブラウザでサンプルを見ることができるので、イメージがつかめると思います。
サンプルにはないデモもたくさんあり、Examplesにあります。
今回は、WMX3の軸の位置をRerunビューワで可視化するサンプルを紹介します。 コードは以下です。
実行するには、wmx3-rerunでcargo runします。
すると、Rerunビューワが起動し、軸0の指令位置をロギングします。
ログの頻度はPCのパワー依存です。PCパワーに依存せずにログできるサンプルはこちらです。
Rerunを使用するにはあらかじめインストールが必要です。 Installing the Viewerの手順に従ってインストールしてください。
また、この記事はWMX-Rustで構築したRustからWMX3 APIを利用するコードをベースにしています。
コード説明
Rust側の実装
main.rsで、C APIで取得した軸0の指令位置をRerunで可視化します。
use std::time::Duration;
// lib.rsでビルドしたFFIコードを参照use wmx3_rerun::*;
use std::time::Instant;
fn main() -> Result<(), Box<dyn std::error::Error>> { let ret = unsafe { open_wmx() }; println!("open_wmx = {}", ret);
// rerunビューワをスポーン。 let rec = rerun::RecordingStreamBuilder::new("wmx3-rerun").spawn()?;
// あらかじめ波形を登録しておく。 rec.log_static( "axis0/cmdpos0", &rerun::SeriesLines::new() .with_colors([[255, 0, 0]]) .with_names(["cmdpos0"]) .with_widths([2.0]), )?;
// 10秒間できるだけ指令位置を取得してプロットに適用する。 let start = Instant::now(); while start.elapsed() < Duration::from_secs(10) { let pos = unsafe { get_pos(0) };
rec.set_time("time", std::time::SystemTime::now()); rec.log("axis0/cmdpos0", &rerun::Scalars::single(pos))?; }
let ret = unsafe { close_wmx() }; println!("close_wmx = {}", ret);
Ok(())}このように、非常に短いコードでRerunで可視化できます。
まず、Rerunビューワを開きます。"wmx3_rerun"はApplicationIdと呼ばれるもので、通常はアプリ名を設定します。
このアプリ名で記録されたプロットは、Rerunビューワからまとめて見ることができます。
同時に別アプリで異なるApplicationIdで記録すれば、ログがしっかりと別れて記録してくれるということになります。
// rerunビューワをスポーン。 let rec = rerun::RecordingStreamBuilder::new("wmx3-rerun").spawn()?;次に、あらかじめ波形の名前や形状などを登録します。
log_staticの使用目的はそれだけではないですが、それはまた今度触れます。
"axis0/cmdpos0"はEntityPathと呼ばれるもので、どのエンティティ(プロット)かというのを指定します。
/で区切ることでグループ分けができます。つまり、これはaxis0のcmdpos0というエンティティを意味しています。
// あらかじめ波形を登録しておく。 rec.log_static( "axis0/cmdpos0", &rerun::SeriesLines::new() .with_colors([[255, 0, 0]]) .with_names(["cmdpos0"]) .with_widths([2.0]), )?;次に、指令位置をログします。
rec.set_timeで横軸(タイムライン)を指定します。
"time"は横軸(タイムライン)の名前です。横軸の値として現在時刻を指定しています。
rec.logでちょうど指定した時刻での位置を指定します。
ログできるアイテムは色々ありますが、今回はプロットなのでスカラです。
rec.set_time("time", std::time::SystemTime::now()); rec.log("axis0/cmdpos0", &rerun::Scalars::single(pos))?;実行結果です。予めWOSで往復運転させています。 サイズが7MBと大きいので、リンクにしています。見てもいいよという方はリンクをクリックしてご覧ください。
アニメーション画像を見る。