Skip to content

fix(crane_physics): FLYINGボールの着地時間計算でpos_zを考慮するよう修正 - #1390

Open
HansRobo wants to merge 1 commit into
developfrom
fix/physics-ball-flying-landing-time
Open

fix(crane_physics): FLYINGボールの着地時間計算でpos_zを考慮するよう修正#1390
HansRobo wants to merge 1 commit into
developfrom
fix/physics-ball-flying-landing-time

Conversation

@HansRobo

Copy link
Copy Markdown
Member

概要

crane_physicsBallPhysicsModel において、FLYING(チップキック飛行中)状態のボールの着地時間計算が現在高度 pos_z を無視していた不具合を修正します。

問題

ball_physics_model.cppgetStopTime / getMaxDistance の FLYING 分岐では、着地時間を

landing_time = max(0, -2 * vel_z / gravity)

で算出していました。この式は地面(z=0)から打ち上げたボールの滞空時間を表すものであり、現在のボール高度 pos_z を完全に無視しています。

そのため、高所からの落下中(vel_z <= 0)では landing_time が 0 にクランプされ、飛行中の水平移動が一切加算されません。結果として停止時間・最大到達距離(着地位置)の推定が過小評価されていました。

一方で同クラスの predictPosition / predictVelocity は正しく pos_z を考慮した放物運動の根を解いており、関数間で挙動が不整合な状態でした。

原因

地面(z=0)からの打ち上げ滞空時間の式を流用し、getMaxDistance では引数 pos_z[[maybe_unused]] として無視、getStopTime ではそもそも pos_z を受け取っていませんでした。

修正内容

  • predictPosition / predictVelocity と同一のロジックで着地時間を解く private ヘルパー getFlyingLandingTime(pos_z, vel_z) を新設しました。
    • z(t) = pos_z + vel_z * t + 0.5 * gravity * t^2 = 0gravity は負値)の正の最小根を返します。
    • 判別式が負、または正の根が存在しない場合は 0 を返すフォールバックを備えます。
  • getStopTime のシグネチャに pos_z を追加し、FLYING 分岐で当該ヘルパーを使用するよう変更しました。
  • getMaxDistance の引数 pos_z[[maybe_unused]] を外し、FLYING 分岐で当該ヘルパーを使用するよう変更しました。
  • 呼び出し側 ball_info.cppBall::getStopTime() を新シグネチャ(pos_z 受け渡し)に追従させました。

これにより、飛行中の高度を考慮した着地時間・着地位置が算出され、predictPosition / predictVelocity との整合性が取れます。

検証

  • cwm の独立オーバーレイ worktree 上で、colcon build--no-rdeps)による crane_physics のコンパイルが成功することを確認しました(Build complete.、エラーなし。既存テストコードの警告のみ)。
  • 当該パッケージのユニットテストを実行し、全件パスを確認しました。
    • colcon test --packages-select crane_physics: 1 package finished
    • colcon test-result --verbose: 118 tests, 0 errors, 0 failures, 0 skipped(gtest 10 件含む)

レビュー観点

  • チップキック飛行中(FLYING、vel_z <= 0 を含む高所落下中)における停止時間・最大到達距離(着地位置)推定の妥当性。
  • getFlyingLandingTime の根の選択(正の最小根)とフォールバック(判別式負・非正根)の妥当性、および predictPosition / predictVelocity との一貫性。
  • getStopTime のシグネチャ変更に伴う呼び出し側の追従漏れがないこと。

本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