Skip to content

RerunでWMX3のログを可視化する

This content is not available in your language yet.

Rerunというオープンソースのログ可視化ツールを使ってみます。 Rerunについては、詳しくは公式サイトをご覧ください。

Try browser demoからブラウザでサンプルを見ることができるので、イメージがつかめると思います。 サンプルにはないデモもたくさんあり、Examplesにあります。

今回は、WMX3の軸の位置をRerunビューワで可視化するサンプルを紹介します。 コードは以下です。

実行するには、wmx3-reruncargo runします。 すると、Rerunビューワが起動し、軸0の指令位置をロギングします。 ログの頻度はPCのパワー依存です。PCパワーに依存せずにログできるサンプルはこちらです。

Rerunを使用するにはあらかじめインストールが必要です。 Installing the Viewerの手順に従ってインストールしてください。

また、この記事はWMX-Rustで構築したRustからWMX3 APIを利用するコードをベースにしています。

コード説明

Rust側の実装

main.rsで、C APIで取得した軸0の指令位置をRerunで可視化します。

./src/main.rs
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と呼ばれるもので、どのエンティティ(プロット)かというのを指定します。 /で区切ることでグループ分けができます。つまり、これはaxis0cmdpos0というエンティティを意味しています。

// あらかじめ波形を登録しておく。
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と大きいので、リンクにしています。見てもいいよという方はリンクをクリックしてご覧ください。

アニメーション画像を見る。