rerun-data-model について
Rerunへのデータ取り込みを設計するスキルです。変換コードを書く前に、エンティティ、コンポーネント、タイムライン、レイヤーをどう表すかを決められるよう、マッピング表と判断基準を示し、手作業のチャンク構築よりリーダーとレンズの利用を重視します。
主な機能
- 01エンティティ、コンポーネント、アーキタイプのモデリング
- 02プロパティ、コンポーネント、レイヤーの区別
- 03静的データと時系列データの選択
- 04タイムラインとマルチレートデータの指針
- 05取り込みマッピング表と失敗要因の確認
活用シーン
- 01センサーデータとエンティティパスの対応付け
- 02コンポーネント、プロパティ、レイヤーの選択
- 03変換前にリーダーか手製チャンクかを判断
- 04静的なキャリブレーションと時系列データの記録設計
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ rerun-io/ rerun --skill rerun-data-modelインストール後、Claude Code で/rerun-data-modelを入力して読み込まれたか確認します。
詳細
Rerun のデータモデル
データセットを取り込む際に難しいのは、API 呼び出しではなく、モデルの決定です。
モデルが正しければどのような仕組みでも機能しますが、間違っていればクエリ、ビュー、トレーニングのすべてに支障が出ます。
このスキルで扱うのは、決定事項だけです。
仕組みの詳細については、rerun-chunk-processing(パイプラインの仕組み)と、そこから案内されるインポータースキル(rerun-mcap、rerun-urdf、rerun-parquet、rerun-mp4、rerun-lerobot)を参照してください。
正確なシグネチャについては、rerun.io/docs/concepts/logging-and-ingestion のドキュメントを参照してください。
変換コードを書く前に、以下のマッピング表を埋めてください。 これが設計となり、人間が数秒でレビューできます。
バイト列をモデル化する前に、仕組みを選択する
モデル化によって各データが 何に なるかを決め、仕組みによってそれが どのように 実現されるかを決めます。デフォルトはチャンクを手作業で構築するのではなく、リーダーとレンズを使うことです。
- このソースに対応するリーダーはありますか? MCAP→
McapReader、URDF→UrdfTree、parquet→ParquetReader、HDF5→Hdf5Reader、RRD→RrdReader、LeRobot ディレクトリ→log_file_from_path。ある場合 →reader.stream()とレンズを使用します。チャンクを生成するのはリーダーであり、あなたではありません。 - ない場合、真の外部メタデータ(JSON のキャリブレーション、オフセット)または汎用リーダーでは対応できない特定のカスタム用途である場合**→**
Chunk.from_columnsを使用します。 - それ以外の場合:リーダーやレンズが生成すべきものを手作業で構築しようとしていないかを確認し、不明点があれば説明を求めてください。
特に MCAP の場合:Foxglove または ROS でデコード可能なファイルは、サポート対象のメッセージスキーマの一部について、Transform3D、Pinhole、VideoStream などのアーキタイプをすでに出力します。それらはそのまま渡し、決して再導出しないでください。レンズが必要なのは、カスタム protobuf 信号トピックだけです。判断の全体像とアンチパターンの一覧は、rerun-chunk-processing にあります。
モデル
Dataset → Segment → Layer → Recording → Entity → Component → Chunk
- エンティティ = パス(
/robot/arm/camera)で名前を付けた対象です。 コンポーネント = その対象に属する、型付きのフィールド(位置、画像、スカラー)です。 アーキタイプ = 一緒にログ記録され、レンダリングされるコンポーネントの標準的なまとまり(Points3D、Image、Transform3D)です。 - ログに記録するすべての値は、2 つの軸上に位置します。場所(エンティティパス + コンポーネント)と、時刻(どのタイムラインか、または 静的 = 常時)です。
- セグメント = 1 つのエピソードです。登録時に、その
recording_idがsegment_idになります。レイヤー = セグメントの上に重ねる追加の.rrdです。セグメントのrecording_idと一致することでのみ関連付けられます。この共有 ID だけがレイヤー化の仕組みです。
判断基準
既存のエンティティに新しいエンティティを作るか、コンポーネントを追加するか
独自の空間座標系(Transform3D/Pinhole)や注釈コンテキストを持つ場合、または個別に表示・クリア・共有する必要がある場合(各ロボットリンク、各カメラ、各センサー)は、新しいエンティティを作成します。同じインスタンスに付随するデータ(点ごとの信頼度など)の場合は、同じエンティティに追加のコンポーネントを追加します。
標準外のフィールドには AnyValues を使用します。
プロパティとコンポーネントとレイヤーの違い(最もよく混同されます)
- コンポーネント:タイムライン上のタイムスタンプごとの信号(関節角度、画像)。
- セグメントプロパティ:カタログのフィルタリングや検索に使う、エピソードごとに 1 つのメタデータ(オペレーター、ロボット、サイト、タスク、日付)。タイムスタンプごとのデータではありません。
- レイヤー:ベースセグメントに重ねる、派生データを含む
.rrdファイル全体(FK 変換、点群、グリッパー状態、ラベル、品質スコア)。ベースの一部であるかのようにクエリできます。
静的データと時間データ 静的データはすべてのタイムラインに属し、同じエンティティ上の同じコンポーネントの時間データを上書きします。キャリブレーション、座標系、ロボットメッシュ、注釈コンテキスト、動画アセットなどの不変データに使用します。フレームごとのデータを静的データにしてはいけません。
タイムラインの選択
センサー間のクロックを同期するには timestamp タイムライン(エポックからのナノ秒)を、フレームや序数を揃えるには sequence タイムラインを使用します。有用な場合は両方にタイムスタンプを設定します。
共通のレートにリサンプリングしないでください。 Latest-at は、各コンポーネントの最新サンプルを保持することで、クエリ時に複数のレートのストリームを調整します(補間は行いません)。
ベースとレイヤーの違い
ベース=元のストリームを忠実に変換したもの。計算されたデータは含みません。
レイヤー=派生データすべて(URDF+関節状態からの FK、深度+内部パラメーターからの点群など)。
別々の .rrd ファイルに保持します。
マッピングテーブル(コーディング前に作成)
| ソース(トピック/列/キー) | エンティティパス | アーキタイプ | コンポーネント | タイムライン | 静的/時間データ | ベース/レイヤー | プロパティ? |
|---|---|---|---|---|---|---|---|
mcap /joint_states | /robot/<joint> | Scalars | scalars | sensor_time | 時間データ | ベース | いいえ |
cam0/color.mp4 | /camera/cam0/video | VideoStream | codec+sample | video_time | codec は静的、sample は時間データ | ベース | いいえ |
calibration.json | /camera/cam0 | Pinhole(+Transform3D 外部パラメーター) | image_from_camera | — | 静的データ | ベース | いいえ |
| URDF+関節(計算値) | /robot/<link> | Transform3D | translation/rotation | sensor_time | 時間データ | レイヤー | いいえ |
episode.json の operator | セグメント | — | — | — | — | — | はい |
知っておくべきパターン
- Transform / FK ツリー:各リンクエンティティに
Transform3Dをログ記録します。これは親パスに関連付けられ、ツリーに沿って合成されます。(トポロジを柔軟なグラフにする必要がある場合に限り、CoordinateFrameとchild_frame/parent_frameを指定します。) - カメラ:カメラエンティティに外部パラメーター(
Transform3D)と内部パラメーター(Pinhole)を設定し、画像/深度を子として設定すると、投影が継承されます。 - 動画:圧縮サンプルには
VideoStreamを使用します。これは mp4(rerun-mp4)のデフォルトであり、Foxglove デコーダーがすでに渡す形式です。VideoStreamで表現できないコーデックの場合は、AssetVideo+VideoFrameReferenceを代替として使用します。 - 列指向の取り込み:既存の ファイル には、対応するリーダー(
rerun-mcap/-parquet/-mp4/-lerobot)を使用します。リーダーはチャンクを直接生成するため、カスタムパーサーからsend_columnsを手動で組み立てないでください。ライブロギングで列を直接ログ記録する場合、send_columnsはタイムラインを自動追加しないため、必要なタイムラインをすべて渡してください。 - カスタムデータ:未対応のデータを無関係なアーキタイプに無理に当てはめないでください。代わりに
DynamicArchetypeまたはAnyValuesを検討してください。DynamicArchetypeは意味のあるカスタムコンポーネントのグループ向けです。AnyValuesは、認識可能なオブジェクトやソースの型を構成しない、雑多な値向けです。
実際の障害につながる落とし穴
- クエリではコンポーネント列が
ListArrayとして返されます。[0]/[0][0]でインデックスを指定してください(DataFrame では 0 起点、SQL では 1 起点)。rerun-catalog-queriesを参照してください。 - レイヤーをアタッチするには、セグメントと同じ
recording_idを使用する必要があります。application_idは登録時に破棄されます。 send_columns/send_chunksはlog_time/log_tickを追加しません。存在するのは渡したタイムラインだけです。- 静的データは、そのコンポーネントのすべての時間的データを永続的に上書きします。ビューワーでは静的データが上書きされますが、
rerun rrd optimizeを実行するまで、書き込みはすべてディスクに残ります。 - フレームペアごとに関連付けられる
Transform3D/Pinholeは 1 つだけです。同じ関連付けを別のエンティティにログ記録すると拒否されます。 - エンティティパスはファイルパスではありません(
..に意味はなく、__は予約されています)。 - デフォルトの
RecordingStreamで書き込まれたカタログレイヤーは、/__(properties)(RecordingInfo)チャンクを挿入します。カタログがrecording_idでレイヤーをマージすると、ベースセグメントのプロパティと衝突する可能性があります。その場合、データセットのデフォルトのブループリントが開いたときに適用されなくなります。レイヤーのストリームはsend_properties=Falseを指定して構築してください。