fix(crane_local_planner): ボール回避でtarget_pos==ball_pos時のNaNをガード#1394
Open
HansRobo wants to merge 1 commit into
Open
fix(crane_local_planner): ボール回避でtarget_pos==ball_pos時のNaNをガード#1394HansRobo wants to merge 1 commit into
HansRobo wants to merge 1 commit into
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のボール回避調整RVO2Planner::adjustForBallAvoidanceにおいて、目標位置とボール位置が一致する場合に NaN が発生し、target_posが汚染される不具合を修正します。問題
rvo2_planner.cppのボール回避処理で、目標位置target_posとボール位置ball_posが一致(またはほぼ一致)している場合に NaN が生成され、補正後のtarget_posが NaN に汚染されます。attacker など「ボールそのものを目標位置にするスキル」では、ボール回避を有効にしたままボール位置へ到達しうるため、この条件に容易に到達します。下流に再 NaN チェックが無いため、汚染された
target_posがそのまま伝播します。原因
条件
(target_pos - ball_pos).norm() < MIN_BALL_DISTANCEはnorm() == 0(完全一致)を含みます。このとき(target_pos - ball_pos)はゼロ長ベクトルとなり、Eigen::normalized()がゼロ長ベクトルに対して各成分0/0を計算するため NaN を返します。結果としてtarget_posが NaN になります。修正内容
normalized()を呼び出す前にノルムのゼロ判定(> 1e-9)を追加しました。ノルムがゼロ近傍(目標位置とボール位置がほぼ一致)の場合は、方向が定義できないためボール回避調整をスキップしtarget_posを変更しません(フォールバック挙動)。これにより NaN の発生を防ぎます。修正は当該 1 箇所のみに限定し、無関係な整形やリファクタは行っていません。
検証
cwm の独立オーバーレイ worktree 上で
colcon build(--no-rdeps)を実行し、crane_local_plannerパッケージが正常にコンパイルされることを確認しました(Build complete.)。レビュー観点
target_posを変更しない方針としています。この挙動が意図に沿うかご確認ください。1e-9の妥当性。本PRはソースコード監査ワークフローで検出・敵対的検証されたバグに対する単一修正です。