Rerun入門【Rust製可視化ツールをPythonで使う】

# Rerunとは
:::note info
↓以下の記事を書きました．合わせてお読みください
:::
https://qiita.com/ryhara/items/0e46aeda57fa75096dca

https://qiita.com/ryhara/items/cc82fbd4fbd5f72d9e28

Rerunとはマルチモーダルなデータストリームを可視化して操作するためのSDKおよびviwerです．
- 特徴
    - 無料
    - 導入が容易
    - Python, C++, Rustで使用可能
    - 柔軟で，拡張可能
    - Rustで実装され，高速
    - オープンソース，MITとApache 2のデュアルライセンス
    - 時系列データの扱いに強い

- 可視化の例
    - RGB camera feed
    - depth images
    - lidar scan
    - segmentation image (how the robot interprets what it sees)
    - its 3D map of the apartment
    - all the objects the robot has detected (or thinks it has detected), as 3D shapes in the 3D map
    - its confidence in its prediction
    - etc


<table>
  <tr>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/24e62f34-89da-165a-a7e6-ae939d37ed4b.png" alt="Image 1"/></td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/fd40e6a5-1745-dd6d-12b1-72adf619413d.png" alt="Image 2"/></td>
  </tr>
  <tr>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/4d5ebaf6-7c8d-752d-15e7-3174a80b64bb.png" alt="Image 3"/></td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/5b62e518-80b7-4108-a192-0d37a8d70d2d.png" alt="Image 4"/></td>
  </tr>
</table>

※ [examples](https://rerun.io/examples)より引用

::: note info
exampleの`view`ボタンを押すとviewerの雰囲気が分かります．
(いくつか表示できないものもありました)
https://rerun.io/examples
:::

- 公式サイト
    - 以下必見ページ
    - [What is Rerun?](https://rerun.io/docs/getting-started/what-is-rerun)
    - [quick start (Python)](https://rerun.io/docs/getting-started/quick-start/python)
    - [Get Data into Rerun (Pyhton Tutorial)](https://rerun.io/docs/getting-started/data-in/python)
    - [Examples](https://rerun.io/examples)
    - [rerun command manual](https://rerun.io/docs/reference/cli)
    - [Python API](https://ref.rerun.io/docs/python/0.18.2/common/)
    - [GitHub](https://github.com/rerun-io/rerun/)


個人的には，遠隔でviewer表示を出来る点が気に入っています．
ssh接続などでリモートサーバ上で作業をしている際にopencvのimshowなどでwindow表示をしたい状況がよくあるのですが，ウィンドウシステムが〜〜〜みたいなエラーで上手く行った例が有りません．
ですが，Rerunでは[TCP](https://github.com/rerun-io/rerun/blob/main/ARCHITECTURE.md#logging-apis)ベースの通信方法でデータの通信を行っているようなのでウィンドウシステムの必要はなくIPアドレスやポート番号を指定してデータを送信することで，ssh接続をしているクライアント側の画面で可視化を出来る点が非常にありがたいと感じています．

本記事ではRerunの基本的な使い方について簡単に解説したいと思います．
サンプルプログラムは以下で公開しています．

https://github.com/ryhara/rerun-example

# Pythonでの使い方
### install
```shell:terminal
pip3 install rerun-sdk
```

### rerunコマンドのヘルプ表示
```
rerun -h
```

### viewerの起動
デフォルトで`0.0.0.0:9876`でlistenされています
```:terminal
rerun
```
or
```python
import rerun as rr

rr.init("test")
rr.spawn(port=9876)
```

### client, log側からviewerに接続
```python
import rerun as rr

rr.init("test")
rr.connect(addr="0.0.0.0:9876")
```

### 可視化結果を`.rrd`ファイルに保存
```python
rr.save("/path/to/save")
```

### ファイルの読み込み
対応しているファイル
  - Native Rerun files: `rrd`
  - 3D models: `gltf`, `glb`, `obj`, `stl`
  - Images: `avif`, `bmp`, `dds`, `exr`, `farbfeld`, `ff`, `gif`, `hdr`, `ico`, `jpeg`, `jpg`, `pam`, `pbm`, `pgm`, `png`, `ppm`, `tga`, `tif`, `tiff`, `webp`
  - Point clouds: `ply`
  - Text files: `md`, `txt`
```python
rr.log_file_from_path("/path/to/file")
```

### memory-limit
RerunではRAMに収まるデータしか表示できない．デフォルトではRAM全体の75%まで表示することが出来る

- オプションの指定の形式 (`16GB` or `50%`)
```shell:option
rerun --memory-limit 〇〇
```
- python関数
```python
def spawn(*, port=9876, connect=True, memory_limit='75%', hide_welcome_screen=False, default_blueprint=None, recording=None)
```

### notebookでの使用

notebook optionをつけたinstall
```shell
pip install rerun-sdk[notebook]
```
通常のrerunの使い方+最終行に以下を追加
```python
rr.notebook_show()
```

自分が導入時に気になった点について主にまとめました．
初期化周りは[こちら](https://ref.rerun.io/docs/python/0.18.2/common/initialization_functions/#rerun.init)を参考にすると良いです．


PointやMesh, 画像など，それぞれのモダリティの実際の表示方法については公式ドキュメントを参照してください．
その他も細かい実装は[APIs](https://ref.rerun.io/docs/python/0.18.2/common/initialization_functions/#rerun.init),すぐに使えそうなものを探したい時は[Examples](https://rerun.io/examples)を参考にすると良いと思います

# 最後に
まだまだ日本語の解説記事は少ないので，今後もRerunについての記事を書いていきたいと思います．