fix(crane_local_planner): 配置エリア回避でセグメント上のNaNをガード - #1398
Open
HansRobo wants to merge 1 commit into
Open
Conversation
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_local_plannerの配置エリア回避処理において、ロボットの現在位置が配置ラインセグメント上にある場合に目標位置が NaN となり、出力コマンドへ伝播する不具合を修正します。問題
rvo2_planner.cppのadjustForPlacementAvoidance()内(旧 837-840 行付近)で、getClosestPointAndDistance(placement_area.segment, current_pos)はcurrent_posが配置ラインセグメント上にあるときclosest_point == current_posを返します。このとき
(current_pos - closest_point).normalized()はゼロ長ベクトルの正規化となり NaN を生成し、target_position全体が NaN になります。NaN はそのままtarget_posに代入され、出力されるロボットコマンドに伝播してしまいます。原因
Eigen::Vector2d::normalized()がゼロ長ベクトルに対して未保護であること。INPUT_VALIDATIONは調整前の入力のみを検証しており、配置エリア回避の調整処理内部で生成される NaN を捕捉できないこと。修正内容
normalized()を呼ぶ前にゼロ長判定(norm() > 1e-6)を導入しました。escape_diff = current_pos - closest_pointの長さがしきい値より大きい場合は従来どおりescape_diff.normalized()を脱出方向に用いる。getVerticalVec((segment.second - segment.first).normalized()))を安全な脱出方向としてフォールバックする。これにより
escape_dirは常に有限の単位ベクトルとなり、target_positionへの NaN 伝播を防ぎます。逆方向(フィールド外候補が無効な場合)の算出も、同じescape_dirを符号反転して再利用することで同様に NaN を防止しています。検証
cwm 独立オーバーレイ worktree 上で
colcon build(--no-rdeps)によるコンパイル確認を実施しました。crane_local_plannerのビルドが成功(Build complete.)し、本修正によるコンパイルエラーが無いことを確認しました(出力された stderr は CMake の互換性に関する deprecation warning のみ)。レビュー観点
crane_sessions/include/crane_sessions/placement_avoidance_session.hppの 84-87 行付近にも、normalized()をゼロ長未保護で用いる同一パターンが存在します。本 PR では対象バグに限定して修正していますが、同様の NaN 生成リスクがあるため別途の対応をご検討ください。本PRはソースコード監査ワークフローで検出・敵対的検証されたバグに対する単一修正です。