Skip to content

fix(crane_geometry): Interval::eraseの境界一致ケース取りこぼしを修正 - #1379

Open
HansRobo wants to merge 1 commit into
developfrom
fix/geometry-interval-erase-boundary
Open

fix(crane_geometry): Interval::eraseの境界一致ケース取りこぼしを修正#1379
HansRobo wants to merge 1 commit into
developfrom
fix/geometry-interval-erase-boundary

Conversation

@HansRobo

Copy link
Copy Markdown
Member

概要

crane_geometryInterval::erase(区間減算)における境界一致ケースの取りこぼしを修正しました。

問題

interval.hpperase は厳密不等号(< / >)のみで境界判定を行っていたため、ある erase が生成した境界に後続の erase が接するケース等で境界一致を取りこぼし、不正な区間を生成していました。

再現例:

append(1, 8);
append(8, 19);   // 境界 8 で接する 2 区間
erase(1, 7);     // 期待: 幅 12([7,8] + [8,19])だが、修正前は 18 のまま

この区間計算は world_model_wrapper.cpp:306 のシュートコース角度計算で利用されており、誤った区間幅が実害につながっていました。

原因

  • 区間減算の境界条件で <= を使うべき箇所が < になっており、境界一致時に区間が正しく縮められなかった。
  • uppers / lowers を個別に 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 のペア対応を常に保持します。これにより個別 sort によるペア崩れの脆さも解消しています。

検証

  • cwm 独立オーバーレイ worktree 上で当該パッケージのみをビルド(cwm ws build --no-rdeps)し、コンパイルが正常に完了することを確認(Build complete.)。
  • colcon test --packages-select crane_geometry を実行し、ユニットテスト(test_interval / test_geometry を含む gtest 2 件、linter / copyright / xmllint 含む計 23 チェック)がすべて成功することを確認(0 errors, 0 failures)。
  • 手計算ケース(上記再現例 append(1,8); append(8,19); erase(1,7) で幅が期待どおり 12 になること)でもロジックを検証。

レビュー観点

  • 区間減算の場合分け(境界一致での <= の使用、中抜き分割、端の縮め)の網羅性と正当性。
  • uppers / lowers をペアとして再構築することで対応が崩れないこと。

本PRはソースコード監査ワークフローで検出・敵対的検証されたバグに対する単一修正です。

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