fix(crane_geometry): Intervalの境界一致処理(erase/append)を修正 - #1379
Merged
Merged
Conversation
erase() の境界一致修正と同じ厳密不等号の問題が append() の重複判定にも 残っており、境界がちょうど接する2区間(例: [1,8]と[8,19])がマージされず 2区間のまま残ってしまう状態だった。マージ判定を `>` から `>=` に変更し、 境界一致マージのテスト(AppendTouchingBoundaryMerges)を追加した。 また、erase() 側のバグ再現に単一区間・単一eraseで十分であることを示す 最小ケースのテスト(EraseExactBoundaryMatchShrinksInterval)も追加した。
HansRobo
force-pushed
the
fix/geometry-interval-erase-boundary
branch
from
September 17, 2026 10:00
99e6041 to
148e18e
Compare
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_geometryのIntervalクラスで、区間の境界が厳密に一致するケースを取りこぼす同種のバグがerase(区間減算)とappend(区間追加のマージ判定)の両方にあったため、両方を修正しました。問題
interval.hppの境界判定が厳密不等号(</>)のみで行われていたため、ある区間の境界値が別の区間・別の erase 範囲の境界値と厳密に一致する場合に判定を取りこぼし、不正な区間を生成していました。再現例(
erase側、単一区間・単一 erase で再現する最小ケース):erase(1, 7)の下限1が既存区間の下限1と厳密に一致するため、「下限修正」の判定 (lowers[i] > lower) が1 > 1 = falseとなり、区間が全く縮まりませんでした。2つの区間が絡む必要はなく、単一区間への単一eraseだけで発生します。同種の問題は
appendのマージ判定 (uppers[i - 1] > lowers[i]) にもあり、境界がちょうど接する2区間が本来1区間にマージされるべき場面でマージされずに残ってしまいます:この区間計算は
world_model_wrapper.cppのgetLargestGoalAngleRangeFromPoint(シュートコース角度計算)で使われています。ただし、この境界一致は連続的に変化する角度値どうしの厳密な浮動小数点一致を要求するため、実際の試合データで発生する確率は極めて低く、実際に誤ったシュート角度選択を引き起こしたという具体的な証拠(リプレイ等)はありません。ソースコード監査で見つかった潜在的な正当性バグという位置づけです。原因
eraseの境界条件で<=を使うべき箇所が<になっており、境界一致時に区間が正しく縮められなかった。appendのマージ判定も同様に>=を使うべき箇所が>になっており、境界がちょうど接する区間がマージされなかった。(過去のドラフトでは「個別 sort によるペア崩れ」を原因の一つとして挙げていましたが、複数ケースを手計算で検証した結果、ペア対応は sort 後も保たれており、これは実際の原因ではありませんでした。真の原因は上記の境界判定の厳密不等号のみです。)
修正内容
erase区間減算として正しく再実装しました。消去区間
[L, U]を各既存区間[lo, hi]から引く際、以下の場合分けを行います。U <= lo || L >= hi: 重なりなし(境界一致を含む)→ 区間はそのまま残すL <= lo && U >= hi: 完全に覆われる → 区間を削除L > lo && U < hi: 中抜き →[lo, L]と[U, hi]の 2 区間に分割L <= lo: 下端を縮める →[U, hi]lo < L,hi <= U): 上端を縮める →[lo, L]結果は新しい区間リストとして再構築することで、
uppers/lowersのペア対応を常に保持します。appendマージ判定を
uppers[i - 1] > lowers[i]からuppers[i - 1] >= lowers[i]に変更し、境界が接する区間も連続区間としてマージされるようにしました。検証
colcon build --packages-select crane_geometryでコンパイルが正常に完了することを確認。colcon test --packages-select crane_geometryを実行し、既存テストに加えて以下の回帰テストを追加のうえ全テスト成功を確認:AppendTouchingBoundaryMerges: 境界が接する2区間のappendが1区間にマージされることEraseExactBoundaryMatchShrinksInterval: 単一区間への単一eraseで境界厳密一致時も正しく縮まること(上記の最小再現例)レビュー観点
eraseの場合分け(境界一致での<=の使用、中抜き分割、端の縮め)の網羅性と正当性。appendの境界一致マージ (>=) が既存の重複マージ処理を退行させていないこと。uppers/lowersをペアとして再構築することで対応が崩れないこと。本PRはソースコード監査ワークフローで検出されたバグに対する修正です。