fix(crane_physics): FLYINGボールの着地時間計算でpos_zを考慮するよう修正 - #1390
Merged
Merged
Conversation
Member
Author
|
LGTM |
着地時刻の計算が getFlyingLandingTime と predictPosition / predictVelocity の 3 箇所に重複しており、いずれも z(t)=0 の正の最小根を選んでいた。pos_z < 0 かつ vel_z > 0 のとき最小根は上昇中の地面通過であり、着地ではない。 - getFlyingLandingTime を大きい方の根(下降して地面に達する時刻)を返すよう変更 (pos_z >= 0 の場合は従来と同じ値) - predictPosition / predictVelocity も同じヘルパーを使い、停止時刻・最大到達距離と 空中→転がりの境目を一致させる - pos_z は接地面を 0 とする高さ、gravity は負値 [m/s²] であることをコメントで明記 - 高所から下降中・地面から上昇中・負の高度から上昇中・判別式が負のケースと、 予測位置・速度と停止時刻・最大到達距離の整合をテストで固定
Ball::ParabolicPhysics::getGroundIntersection / getGroundPoint も z(t)=0 の正の最小根を 選んでおり、z0 < 0 かつ vz0 > 0 では上昇中の地面通過を着地としていた。 getTimeToReachDistance などは BallPhysicsModel の停止時刻と getGroundIntersection の 着地時刻を併用するため、BallPhysicsModel::getFlyingLandingTime と同じく大きい方の根 (下降して地面に達する時刻)に揃える。z0 >= 0 では従来と同じ値になる。 z0≈0 で 0 を返す分岐・判別式が負で最高点を返す分岐・重力 -9.81 固定は既存テストで 固定された挙動なので変えていない。負の高度から上昇するケースをテストで固定した。
HansRobo
force-pushed
the
fix/physics-ball-flying-landing-time
branch
from
September 25, 2026 17:37
1df8195 to
04b32f6
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_physicsのBallPhysicsModelにおいて、FLYING(チップキック飛行中)状態のボールの着地時間計算が現在高度pos_zを無視していた不具合を修正します。問題
ball_physics_model.cppのgetStopTime/getMaxDistanceの FLYING 分岐では、着地時間をで算出していました。この式は地面(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 = 0(gravityは負値)の大きい方の根(下降して地面に達する時刻)を返します(当初は正の最小根。下記「追加修正」で変更)。getStopTimeのシグネチャにpos_zを追加し、FLYING 分岐で当該ヘルパーを使用するよう変更しました。getMaxDistanceの引数pos_zの[[maybe_unused]]を外し、FLYING 分岐で当該ヘルパーを使用するよう変更しました。ball_info.cppのBall::getStopTime()を新シグネチャ(pos_z受け渡し)に追従させました。これにより、飛行中の高度を考慮した着地時間・着地位置が算出され、
predictPosition/predictVelocityとの整合性が取れます。検証
colcon build(--no-rdeps)によるcrane_physicsのコンパイルが成功することを確認しました(Build complete.、エラーなし。既存テストコードの警告のみ)。colcon test --packages-select crane_physics: 1 package finishedcolcon test-result --verbose: 118 tests, 0 errors, 0 failures, 0 skipped(gtest 10 件含む)レビュー観点
vel_z <= 0を含む高所落下中)における停止時間・最大到達距離(着地位置)推定の妥当性。getFlyingLandingTimeの根の選択(大きい方の根)とフォールバック(判別式負・非正根)の妥当性、およびpredictPosition/predictVelocityとの一貫性。getStopTimeのシグネチャ変更に伴う呼び出し側の追従漏れがないこと。本PRはソースコード監査ワークフローで検出・敵対的検証されたバグに対する単一修正です。
追加修正(レビュー反映)
gravity < 0でz(t)は上に凸なので、z(t)=0の大きい方の根が下降して地面に達する時刻です。当初の「正の最小根」はpos_z < 0かつvel_z > 0(トラッカーの z が僅かに負のまま打ち上がった直後など)で上昇中の地面通過を着地としていました。pos_z >= 0では最小根と同じ値になります。predictPosition/predictVelocityが持っていた同じ解の公式のコピーをgetFlyingLandingTimeの呼び出しに置き換えました。これで予測位置・速度が空中から転がりへ切り替わる時刻と、getStopTime/getMaxDistanceの着地時刻が一致します。pos_zは接地面を 0 とする高さ [m](上向き正。checkStateTransitionもz <= 0を着地とみなします)、gravityは負値 [m/s²] です(Config の既定値とerforce_ball_physics.yaml/kicker_physics.yaml/calibrated_ball_physics.yamlはすべて -9.81)。Ball::ParabolicPhysicsの根の選び方も揃えた(1df8195e8):getGroundIntersection/getGroundPointも正の最小根を選んでいました。getTimeToReachDistanceなどは BallPhysicsModel の停止時刻とgetGroundIntersectionの着地時刻を併用するため、同じく大きい方の根に揃えました。test_ball_model.cpp): 高所から下降中・地面から上昇中・負の高度から上昇中・判別式が負の 4 ケースの着地時刻と、予測位置・速度が停止時刻・最大到達距離と整合することを固定しました。getGroundIntersection/getGroundPointの負の高度から上昇するケースも固定しています。-2 vel_z / gravity)に戻すと 3 件(下降中・負の高度から上昇中・判別式負)が落ちます。地面から上昇中のケースは旧式と同じ値なので落ちません。未対応の関連事項(本 PR の範囲外)
getGroundIntersectionには、BallPhysicsModel と食い違う挙動がまだ 3 つあります。どれも既存テスト(GetGroundPointAlreadyOnGround/GetGroundPointNoGroundImpact)で固定された挙動なので、この PR では変えていません。|z0| < 1e-6なら上昇中でも着地時刻 0 を返す。BallPhysicsModel は2 vel_z / |g|を返す。config_.gravityを見ない。これにより、FLYING の
getTimeToReachDistanceでは z≈0 で上昇中のとき、飛行区間の上限(getGroundIntersection由来)と探索上限のt_max(getStopTime由来)がずれます。検証(追加分)
各コミットで verify(colcon build・全パッケージの colcon test・差分ファイルへの pre-commit)を実行し、origin/develop に対する失敗集合の差分は空でした。