BATCAM FX 概要
BATCAM FX 開発概要
1. はじめに
BATCAM FX は SM Instruments のリアルタイム音響カメラです。1600×1200 解像度の光学映像と 40×30 ビームフォーミング(BF)マップを併せて提供し、音が発生している位置を映像上に可視化できます。
本ドキュメントは BATCAM FX 連携開発の出発点です。装置が提供するインターフェースを一覧で紹介し、最も代表的な連携作業であるオーバーレイ映像合成のデータフローと接続方法を案内します。パラメータ制御、ROS 2 統合、ファームウェアアップデートなどの詳細なトピックは、それぞれの詳細ドキュメントへリンクしています。開発者センター全体の構成や他製品(BATCAM FX2、FX Viewer)のドキュメントについては、開発者センターを始めるを参照してください。
2. 提供インターフェース一覧
| インターフェース | 用途 | 関連ドキュメント |
|---|---|---|
| RTSP | カメラの原本映像ストリームの受信。ファームウェア 1.0.3 以上では、装置が自ら合成したオーバーレイ映像も RTSP で提供できます。 | オーバーレイパラメータ |
| WebSocket + Protobuf | ビームフォーミング(BF Map)・オーディオ・AI 部分放電(PRPD)分類結果のリアルタイムストリーミング | 本ドキュメント、Python Protobuf サンプル |
| REST API | アカウント管理、装置設定(ネットワーク・ファームウェア・再起動・機器情報)、イベントトリガー、ビームフォーミング・オーバーレイパラメータ、ROS Domain ID | BATCAM FX API プレイグラウンド |
| ROS 2 | トピック/アクションベースのデータ受信および設定(v1.0.3b 開発ファームウェアより対応) | ROS Integration |
| ファームウェアアップデート | Web ページまたはシェル(SSH)を通じたファームウェアのインストール | Web アップデート、シェルアップデート |
REST API の全エンドポイント仕様は API プレイグラウンドで確認でき、ブラウザから直接呼び出して試すことができます。WebSocket で送信されるメッセージのフォーマットは fx-stream-protocol スキーマと Python Protobuf サンプルのドキュメントを参照してください。
3. オーバーレイ映像合成のデータフロー
BATCAM FX のデータは、RTSP を通じたカメラの原本映像データと、WebSocket を通じた Protobuf プロトコルでエンコードされたデータとして送信されます。オーバーレイされた映像を直接取得したい場合は、以下の順序で映像を合成します。

-
RTSP(
rtsp://{device_ip}/raw)から原本映像を受信します。 -
WebSocket を通じて Protobuf 形式でエンコードされた Beamforming メッセージを受信し、これをデコードして合計 1200 個の Float 値で構成される配列(Float Array)に変換します。この配列は
40x30構造の BF Map を1x1200構造に展開したもので、25Hz 周期で送信されます。 -
Float Array を補間(インターポレーション)して、オーバーレイする画像を生成します。40×30 の BF Map は 1600×1200 の光学映像に合わせてマッピングされます。
-
RTSP 映像ストリームと受信した音源データを組み合わせて、リアルタイムで Beamforming オーバーレイ映像を生成できます。
💡 参考: ファームウェア 1.0.3 以上では、BATCAM FX が自らオーバーレイ画像を合成した RTSP ストリームの提供に対応しているため、直接合成しない構成も可能です。設定方法は オーバーレイパラメータのドキュメントを、BF Map の座標系と Listening Point の指定は Listening Point 座標のドキュメントを参照してください。
4. 接続情報と認証
以下の表の {device_ip} は装置の IP アドレスです。IP 設定は REST API(/setting/ip)で照会・変更でき、装置のファームウェアバージョンは機器情報照会 API(/setting/status)で確認できます。詳細な仕様は API プレイグラウンドを参照してください。
| 項目 | 値 | 備考 |
|---|---|---|
| RTSP 映像ストリーム | rtsp://{device_ip}/raw | ユーザー認証が必要 |
| WebSocket ストリーミング | ws://{device_ip}/ws | SubProtocol の指定が必須 |
| WebSocket SubProtocol | Subscribe | サンプルによっては小文字の subscribe 表記も使用されます |
| REST API | http://{device_ip} | 装置が API を直接提供 |
| ファームウェアアップデートページ | http://{device_ip}/firmware | Web アップデートを参照 |
| ファームウェアアップデートログ | ws://{device_ip}/firmware/ws | アップデート進行ログの受信 |
| 認証方式 | HTTP Basic | REST・RTSP・WebSocket 共通 |
BATCAM FX には、デフォルトで admin、user の 2 つのアカウントがあらかじめ設定されています。アカウントの作成は /auth/create、全アカウント一覧の照会は /auth/all、個別アカウントの照会・削除・パスワード再設定は /auth/account エンドポイントで行います。
⚠️ 注意: 出荷時の初期パスワードは必ず変更してからご使用ください。
Authorization ヘッダーの構成 — ご使用の WebSocket ライブラリが認証に対応している場合は Username と Password を指定し、対応していない場合は WebSocket 接続を要求する Header に Authorization キーを追加し、{username}:{password} の文字列を base64 でエンコードして含めます。
Authorization: Basic base64({username}:{password})
# 例: username=admin, password=password の場合Authorization: Basic YWRtaW46cGFzc3dvcmQ=購読(Subscribe)の開始 — WebSocket を接続した直後にメッセージが受信されるわけではなく、Protobuf の事前生成コードで提供される Subscribe オブジェクトを利用して、必要なデータストリームに対する購読をカメラへ送信する必要があります。ストリームごとの Subscribe ID は次のとおりです。
| Subscribe ID | メッセージ | 内容 | 送信頻度 |
|---|---|---|---|
| 0 | Beamforming | 40×30 BF Map(1×1200 Float 配列) | 25 Hz |
| 1 | WsAudio | 8000 サンプルの Float オーディオ(200 kHz × 40 ms) | 25 Hz |
| 2 | LPointAudio | Listening Point 3 チャンネルのビームフォーミングオーディオ | 25 Hz |
| 3 | Prpd | AI 部分放電分類結果(ファームウェア v1.0.3c 以上、AI PRPD 分類を参照) | 4 Hz |
5. サンプルコードと Protobuf スキーマ
Protobuf と WebSocket を利用してデータを送受信するサンプルは、当社の GitHub(C# サンプル)で公開されています。当該サンプルは上記のオーバーレイ合成の過程をすべて含んでおり、GUI サンプルも含まれています。
次は、WebSocket 接続、購読の送信、最初のメッセージのデコードまでの流れを示す Python のサンプルです。
import asyncioimport base64import websocketsimport fx_protocol_pb2 as pb # fx-stream-protocol の事前生成ファイル
async def stream(ip: str, user: str, password: str): cred = base64.b64encode(f"{user}:{password}".encode()).decode() headers = { "Authorization": f"Basic {cred}", "Sec-WebSocket-Protocol": "subscribe", } uri = f"ws://{ip}/ws"
async with websockets.connect(uri, additional_headers=headers, subprotocols=["subscribe"]) as ws: # Beamforming(ID 0) の購読を開始 sub = pb.Subscribe() sub.id = 0 sub.type = pb.Subscribe.SUBSCRIBE await ws.send(sub.SerializeToString())
async for raw in ws: event = pb.Event() event.ParseFromString(raw) if event.WhichOneof("data") == "beamforming": bf = event.beamforming print(f"bf count={len(bf.bf)} gain={bf.gain}") # bf count=1200
asyncio.run(stream("192.168.0.30", "admin", "password"))環境設定、Python バインディングの生成、メッセージタイプ別の詳細なサンプルは、Python Protobuf サンプルのドキュメントで段階的に案内します。
Protobuf をエンコード/デコードするために必要なスキーマと事前生成ファイルは、当社の OSS GitLab(fx-stream-protocol)で確認できます。本ドキュメントは v0.0.2 タグの事前生成ファイルを基準に案内しており、他のバージョンはリポジトリのタグ一覧で確認してください。
6. よく発生する問題(Troubleshooting)
| 症状 | 原因 | 解決 |
|---|---|---|
| WebSocket 接続が確立されない | SubProtocol の未指定 | 接続時に WebSocket SubProtocol を必ず Subscribe に指定します(ライブラリの subprotocols オプション)。 |
| 接続はされるがメッセージが受信されない | 購読(Subscribe)メッセージの未送信 | 接続の直後に Subscribe オブジェクト(id, type)を送信して購読を開始します。(C# 参考リンク) |
| 認証エラー(401)で接続が拒否される | 認証情報の欠落、または誤ったアカウント情報 | ライブラリの認証機能に Username/Password を指定するか(C# 参考リンク)、Authorization ヘッダーを上記の形式で直接構成します。アカウント・パスワードが正しいかご確認ください。 |
7. 次のステップ
-
BATCAM FX API プレイグラウンド — REST API の全仕様の確認と直接呼び出し
-
ビームフォーミングパラメータ — 周波数フィルター、増幅、LPoint 設定
-
オーバーレイパラメータ — 装置自体のオーバーレイ合成設定(ファームウェア 1.0.3 以上)
-
Listening Point 座標 — BF Map の座標系と LPoint の指定方法
-
ROS Integration — ROS 2 トピック/アクションおよびメッセージ仕様
-
ROS Domain ID — ROS_DOMAIN_ID の設定
-
AI PRPD 分類 — AI ベースの部分放電分類結果の受信
-
Web ソフトウェアアップデート · シェルソフトウェアアップデート — ファームウェアのインストール方法
-
ファームウェアリリースノート — バージョン別の変更点
-
開発リソース — サンプルリポジトリ・スキーマ集