Inside of LOVOT

GROOVE X 技術ブログ

可視化ツールFoxgloveとFoxglove Extensionの紹介

この記事は、GROOVE Xアドベントカレンダー2025 の22日目の記事です。

こんにちは、ふるまいチームのきゅんどうです。 今回はLOVOTのふるまい開発のデバッグのために使っているFoxgloveというアプリとその拡張機能についてご紹介します。

Foxgloveとは

Foxglove は、「時系列のメッセージデータ」を、再生・可視化・デバッグするためのツールです。ログを開いて後から解析するのはもちろん、データソースに接続してリアルタイムに観察することもできます。 ログのデータ形式としては、ROS 1の.bagファイルや、ROS 2で採用された.db3、ROS 2 Iron以降で使われる.mcapファイルなどに対応しています。 リアルタイムデータについてはROS 1のメッセージや、Websocketなどが対応しています (ROS 2向けにはwebsocketへのブリッジが提供されており、それを使うことになります)。

これらのデータ形式の中でも、わたしたちのログシステムではmcapファイルにprotobuf schemaを使って記録するところから始めました。LOVOT内部のメッセージングのためにprotobufを管理する仕組み が社内に整備されているためです。 LOVOT内部ではROSは一部にしか使われてないことや、ROSを使うことに慣れていないメンバがいることもあるので、rosbag play を実行するハードルが高いです。Foxgloveならアプリでファイルを読み込むだけで可視化できるので、使いやすいです。 またrqtのツール群と比べると、Foxgloveは必要な画面が一つのアプリ内にデフォルトで集まっているような直感的に操作しやすい構成になっており、使いやすいとも思っています。 そういった理由でmcapとFoxgloveの組み合わせを選びました。 より詳しい比較は公式ブログにもまとまっています(Foxglove vs RViz)。

Foxgloveでの可視化の様子

ただ、Foxgloveでデフォルトで表示できるデータ形式は決まっており、カスタムデータを表示するにはデータ形式の変換が必要なケースがあります。 またFoxgloveのデフォルトの表示方法以外の表示をしたいという、RVizにおけるPluginのような機能も必要です。 そういったケースのためにFoxgloveではExtensionを設定することができます。

Foxglove Extension

Foxglove Extension は、Foxgloveに「変換」「表示」「読み込み」などの機能を追加する仕組みです。 拡張の種類として message converters / custom panels / data loaders / user-script utilities があります(Foxglove Extensions)。

ここでは、それぞれのExtensionをLOVOT開発でどう使っているかも触れながら、簡単に紹介します。

Message Converters

カスタム定義したメッセージを、Foxgloveの既存パネルが解釈しやすい形に変換したいときに使います。 わたしたちの使う限りはカスタムメッセージを、3Dパネルに表示するためのSceneUpdateメッセージに変換するという使い方が多いです。 それ以外の例ですと、数値として記録されたデータを理解しやすい文字列に変換することで読みやすくするということもやったりしています。

Message Converterには、Schema Message Converter と Topic Message Converter の2種類があります。

  • Schema Message Converter: 入力データSchema -> 出力データSchema の変換
  • Topic Message Converter: 複数トピック -> 新トピック の変換

この2つのConverterですが良し悪しがあって使い分ける必要があります。

Schema Message Converter の難しい点

Schema Message Converterでは複数入力を扱うことができません。 複数のトピックを統合して一つの出力としたい場合はTopic Message Converterを使う必要があります。

また、入力/出力Schemaのペアに対して1つしか設定できません (これは公式ドキュメントでは明確に記述がありませんが、2025/12/19時点での実動作はこうなっています)。 同じ入力を複数の形式で可視化したいということがあるのですが、そういう場合にはSchema Message Converterは使いにくいです。例としては、3Dオブジェクトとラベルの組み合わせで構成されるようなつぎのような表示があります。

複数SceneUpdateの例

このとき、ラベルだけ非表示/表示をUIから切り替えられるにしたいという場合には、ラベルと直線をそれぞれ別のSceneUpdateメッセージにする必要がありますが、入力も出力もSchemaが同じなので別のSchema Message Converterを登録することができません (2つめ以降登録しても無視されます)。 マニアックな話ですが、これに対してtopic aliases という機能を組み合わせることで同じtopicに対して複数変換するというハックができますが、今日ではこういった場合にはTopic Message Converterを使うほうがやりやすいです。

Topic Message Converter の難しい点

Topic Message Converter はトピック名を予め決める必要があるので、同じSchemaの別のトピック名のメッセージが来ても、可視化できません。 いまのところ、別のtopicを可視化したいときにはExtensionの実装を変えるということをやっているので、イレギュラーなケースではFoxglove Extentionの開発に慣れたメンバしか使いこなせていません。

以上を踏まえると、基本的にSchema Message Converterが使える場合には使ったほうがいいです。ただ使えないケースも多いので、そういうときはTopic Message Converterを使うことになります。

Custum Panel

Foxgloveの標準パネルだけでは表現しづらい表示をしたいときに、custom panel extensionでパネル自体を実装できます。 トピックを購読して独自に描画したり、必要があればpublishしたり、といったことができます。 そのため、Message Converterのような使い方もできなくはないかもしれませんが、それについては検証したことがありません。

LOVOTでは複数搭載されているToFセンサの計測値やその信頼度などを表示するパネルを独自に作って使っています。つぎの図は一部を抜粋しています。センサが色々な向きに回転して取り付けられているので、生のデータより見やすい形に回転させたりすることでログの分析がしやすくなります。

センサ値表示用パネル

User Script / User-Script Utility

User Scriptは、ログファイル全体を処理した出力を作りたい場合に使います。 例えば最もLOVOTに近づいた人の距離、のような時系列上の統計をしたい場合などがわたしたちのユースケースです。ただし、Topic Message Converter でもstatefulな変換ができるので、User Scriptじゃないとできないというものはなかなか無いと思います。User Scriptは各ユーザーが自由に自分のローカルで書いて保存できるという点が他のConverterとは少し違う点です。一方で、Foxglove Organization内での共有ができないという課題がありました。最近リリースされた、Foxglove 2.39.0 からはユーザースクリプトそのものではないですが、ユーザースクリプトから使えるutilityをExtensionに追加することでOrganization内で共有できるようになり、社内共有に少し近づきました。

Data Loader(独自ファイル形式の読み込み)

「そもそもログがFoxgloveで直接開けない形式」になっている場合は、data loaderで読み込み処理を実装して、Foxgloveにメッセージとして渡すことができます。 LOVOTでもmcapに変える前の旧形式のCSVデータなどがあるので、使ってみたいなと思うのですが、まだ試せていません。

おわりに

LOVOTのふるまい開発のための可視化ツールについてご紹介しました。 今回ご紹介できなかった様々な可視化の工夫がありますので、チャンスがあったらまた公開できればと思います。読んでくださりありがとうございました。 GROOVE Xでは、一緒に働く仲間を募集しています。少しでも興味を持ってくださった方がいましたら、下記のリンクをご参照ください。

recruit.jobcan.jp