fix(crane_web_debugger): robot_test 画面の複数表示不具合を修正#1351
Merged
Conversation
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取得後のチェックのみに統一し、スレッドセーフ性は維持する。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
crane_web_debuggerのrobot_test画面で発生していた複数の表示不具合を修正する。背景・根本原因
1. 「世界モデル待機中...」が長時間表示される
WebSocket 接続確立時に
latest_world_model_のスナップショットが送られておらず、次の/world_modelpublish まで新規クライアントに届かなかった。また、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.jsをcdn.jsdelivr.netから取得していたためERR_ADDRESS_UNREACHABLE→Chart 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(ローカル)から配信