trajectory/ballistics/constraints/

HeightAtPositionBC: Added unit test module

Also, manually invoke the ReversableRadialBM
handler if type check passes
This commit is contained in:
Ray Healy 2026-02-28 08:44:20 -05:00
parent afdfed6fd5
commit 00342a98fd
2 changed files with 135 additions and 2 deletions

View File

@ -44,7 +44,7 @@ public class HeightAtPositionBC extends BallisticConstraint {
}
public <M extends ReversableRadialBM<P>, P> Double evaluate(
public <M extends ReversableRadialBM<?>> Double evaluate_reversable(
M model, BCEvalParams evalParams
) throws UnhandledEnumException{
Time timeAtTarget;
@ -87,7 +87,10 @@ public class HeightAtPositionBC extends BallisticConstraint {
public <M extends BallisticModel<P>, P> Double evaluate(
M model, BCEvalParams evalParams
) {
) throws UnhandledEnumException {
if(model instanceof ReversableRadialBM) {
return this.evaluate_reversable((ReversableRadialBM<?>) model, evalParams);
}
return null;
}
}

View File

@ -0,0 +1,130 @@
package org.fairportrobotics.frc.robolib.trajectory.ballistics.constraints;
import java.util.List;
import org.fairportrobotics.frc.robolib.trajectory.Velocity3d;
import org.fairportrobotics.frc.robolib.trajectory.ballistics.constraints.HeightAtPositionBC.PositionType;
import org.fairportrobotics.frc.robolib.trajectory.ballistics.models.ConstantBM;
import edu.wpi.first.math.geometry.Translation3d;
import edu.wpi.first.units.Units;
import edu.wpi.first.units.measure.Distance;
import org.junit.jupiter.api.Test;
public class HeightAtPositionBCTest extends BallisticConstraintTest<HeightAtPositionBC> {
//
// Tests
//
private TestConstraintEvalParams<HeightAtPositionBC> mkParams(
String name, Distance resultHeight, PositionType positionType,
Double expected
) {
return this.mkParams(
name, resultHeight, Units.Meters.of(0.5), positionType,
expected
);
}
private TestConstraintEvalParams<HeightAtPositionBC> mkParams(
String name, Distance resultHeight, Distance testPos,
PositionType positionType, Double expected
) {
return this.mkParams(
name,
resultHeight,
Units.Meters.of(0.0),
Units.Meters.of(1.0),
testPos,
positionType,
expected
);
}
private TestConstraintEvalParams<HeightAtPositionBC> mkParams(
String name, Distance resultHeight, Distance minHeight,
Distance safeHeight, Distance testPos, PositionType positionType,
Double expected
) {
return this.mkParams(
name,
new ConstantBM(
Translation3d.kZero,
new Translation3d(
Units.Meters.of(1.0),
Units.Meters.of(1.0),
Units.Meters.of(1.0)
)
).setPositionResult(
Units.Meters.of(0.0),
Units.Meters.of(0.0),
resultHeight
),
minHeight,
safeHeight,
testPos,
positionType,
expected
);
}
private TestConstraintEvalParams<HeightAtPositionBC> mkParams(
String name, ConstantBM model, Distance minHeight, Distance safeHeight,
Distance testPos, PositionType positionType, Double expected
) {
return new TestConstraintEvalParams<HeightAtPositionBC>(
name,
model,
new BCEvalParams(
Velocity3d.zero, Units.Degrees.of(0), Velocity3d.zero, Velocity3d.zero
),
new HeightAtPositionBC(
minHeight,
safeHeight,
testPos,
positionType
),
expected
);
}
@Test void testHeightEval() {
for (PositionType positionType : PositionType.values()) {
this.testConstraintEval(List.of(
this.mkParams(
"Pass (Ideal, " + positionType.name() + ')',
Units.Meters.of(2.0),
PositionType.TargetRadius,
0.0
),
this.mkParams(
"Fail (" + positionType.name() + ')',
Units.Meters.of(-1.0),
PositionType.TargetRadius,
null
),
this.mkParams(
"Pass (Near Border, " + positionType.name() + ')',
Units.Meters.of( 1.0),
PositionType.TargetRadius,
1.0
),
this.mkParams(
"Pass (Mid, " + positionType.name() + ')',
Units.Meters.of(0.5),
PositionType.TargetRadius,
0.5
),
this.mkParams(
"Pass (Far Edge, " + positionType.name() + ')',
Units.Meters.of(0.0),
PositionType.TargetRadius,
0.0
)
));
}
}
}