Skip to content

fix(crane_web_debugger): robot_test 画面の複数表示不具合を修正#1351

Merged
HansRobo merged 6 commits intodevelopfrom
feature/fix-robot-test-world-model-initial-send
Apr 23, 2026
Merged

fix(crane_web_debugger): robot_test 画面の複数表示不具合を修正#1351
HansRobo merged 6 commits intodevelopfrom
feature/fix-robot-test-world-model-initial-send

Conversation

@HansRobo
Copy link
Copy Markdown
Member

概要

crane_web_debuggerrobot_test 画面で発生していた複数の表示不具合を修正する。

背景・根本原因

1. 「世界モデル待機中...」が長時間表示される

WebSocket 接続確立時に latest_world_model_ のスナップショットが送られておらず、次の /world_model publish まで新規クライアントに届かなかった。また、world_model_publisher が起動直後に利用可能になった際も 10Hz タイマー(100ms)の次の発火まで配信が遅延していた。

2. 存在しないロボット(ID 19)が表示される

  • world_model_data_provider.cpp のトラッカーフレーム処理でリセット対象が available_vision のみで available_tracker がリセットされず、前フレームで一時的に検出されたロボットが ghost として残り続けた
  • robot_test.js の敵ロボット描画ループに available_vision/tracker フィルタが欠けており、未検出の敵ロボット 20 体すべてが描画されていた

3. Chart.js が CDN から読み込まれオフライン環境で失敗

chart.umd.min.jscdn.jsdelivr.net から取得していたため ERR_ADDRESS_UNREACHABLEChart is not defined エラーが発生していた。

変更内容

  • websocket_server.cpp: WebSocket 接続確立時に latest_world_model_ を該当コネクションに即時送信
  • websocket_server.cpp: broadcastWorldModel / sendWorldModelToConnection / createWorldModelMessage を分離(play_situation と同パターン)
  • websocket_server.cpp: world_model 初回受信時に接続中クライアントへ即座ブロードキャスト(10Hz タイマー待ち不要)
  • websocket_server.cpp: WebSocketConnection::sendMessage にスレッドセーフ保護(send_mutex_)を追加
  • world_model_data_provider.cpp: トラッカーフレームリセットで available_tracker もクリアするよう修正
  • robot_test.js: 敵ロボット描画に available_vision || available_tracker フィルタを追加
  • robot_test.html / robot_telemetry.html: Chart.js を /assets/chart.umd.min.js(ローカル)から配信

WebSocket新規接続確立時にlatest_world_model_のスナップショットを
該当コネクション単体へ送信するようにした。

従来はworld_modelのブロードキャストが10Hzタイマー+更新フラグ駆動だったため、
接続確立直後に次の/world_modelトピックpublishが来るまでの間、
robot_test画面が「世界モデル待機中...」のまま固着していた。
viewer画面はaggregated_svgsで描画が成立するため問題が顕在化しなかった。

play_situationと同じパターンで createWorldModelMessage / sendWorldModelToConnection
を切り出し、handleWebSocketConnection内で初期スナップショットを送るように修正した。
【問題1】WebSocketConnectionのsendMessageがスレッドアンセーフ
タイマースレッド(world_model 10Hz broadcast)・接続スレッド(初期メッセージ送信)・
PiStatusのデタッチスレッドが同一ソケットに並行してboost::asio::writeを呼ぶと
WebSocketフレームが破損し、connected_=falseになっていた。
robot_testではこの競合が発生しやすく、世界モデルを受信できないまま
「世界モデル待機中...」が表示され続けていた。

修正: sendMessageにsend_mutex_を追加してシリアライズ。
connected_をstd::atomic<bool>に変更してマルチスレッドから安全に参照・更新可能にした。

【問題2】新規接続時に世界モデルの初期スナップショットを送っていなかった
play_situation / robot_feedbackは接続時に即座に送られていたが
world_modelはtimerフラグ駆動(最大100ms遅延)だったため、
接続直後にworld_modelが届かない場合があった。

修正: handleWebSocketConnection内でlatest_world_model_を該当connectionへ即時送信。
createWorldModelMessage / sendWorldModelToConnectionを切り出してplay_situationと同じパターンを適用。
world_model_publisherが起動直後に利用可能になったタイミングで
接続中のWebSocketクライアントへ即座に配信する。

従来は10Hzタイマー(100ms間隔)で定期ブロードキャストしていたため、
接続後にworld_modelが初めて届くまでrobot_testの「世界モデル待機中...」が
残り続けることがあった。初回受信時のみ即座にbroadcastWorldModel()を呼ぶことで
この遅延を解消する。
…示される問題を修正

2点の修正:

1. robot_test.js: 敵ロボット描画にavailable_vision/available_trackerフィルタを追加。
   友軍ロボットと同様に、未検出の敵ロボット(ID19等)がフィールド原点に表示されるのを防ぐ。

2. world_model_data_provider.cpp: trackerフレーム処理でavailable_visionのみをリセットしていたのを
   available_trackerも毎フレームリセットするよう修正。
   前フレームで検出されたがcurrentフレームに存在しないロボットのavailable_trackerが
   trueのまま残り、ghost表示の原因となっていた。
オフライン環境でChart.jsが読み込めず「Chart is not defined」エラーが発生する問題を修正。
cdn.jsdelivr.netへの参照を/assets/chart.umd.min.js(ローカル配置)に変更。
robot_test.htmlとrobot_telemetry.htmlの両方を対応。
sendMessage()の二重チェックパターン(mutex取得前のアーリーリターン)を
cppcheckが同一条件と誤検知していた。
mutex取得後のチェックのみに統一し、スレッドセーフ性は維持する。
@HansRobo HansRobo merged commit f8a0735 into develop Apr 23, 2026
8 checks passed
@HansRobo HansRobo deleted the feature/fix-robot-test-world-model-initial-send branch April 23, 2026 19:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant