trajectory/ballistics/constraints: Added
HeightAtPositionBC Checks that z value is above a given minimum at a given X, Y, or target radial position
This commit is contained in:
parent
21f4a1100e
commit
a0eb653afd
|
|
@ -0,0 +1,93 @@
|
||||||
|
package org.fairportrobotics.frc.robolib.trajectory.ballistics.constraints;
|
||||||
|
|
||||||
|
import org.fairportrobotics.frc.robolib.Util;
|
||||||
|
import org.fairportrobotics.frc.robolib.trajectory.ballistics.exceptions.UnhandledEnumException;
|
||||||
|
import org.fairportrobotics.frc.robolib.trajectory.ballistics.models.BallisticModel;
|
||||||
|
import org.fairportrobotics.frc.robolib.trajectory.ballistics.models.ReversableRadialBM;
|
||||||
|
|
||||||
|
import edu.wpi.first.units.Units;
|
||||||
|
import edu.wpi.first.units.measure.Distance;
|
||||||
|
import edu.wpi.first.units.measure.Time;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ballistic constraint requiring ball be a minimum height at a given
|
||||||
|
* radius from the target
|
||||||
|
*/
|
||||||
|
public class HeightAtPositionBC extends BallisticConstraint {
|
||||||
|
|
||||||
|
enum PositionType {
|
||||||
|
TargetRadius,
|
||||||
|
AbsoluteX,
|
||||||
|
AbsoluteY,
|
||||||
|
RelativeX,
|
||||||
|
RelativeY
|
||||||
|
};
|
||||||
|
|
||||||
|
private final double minHeightMeters;
|
||||||
|
private final double safeHeightMeters;
|
||||||
|
private final Distance testPosition;
|
||||||
|
private final PositionType positionType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param minHeight The minimum passing height
|
||||||
|
* @param safeHeight The height above which no penalty is applied
|
||||||
|
* @param testPosition The position to test at
|
||||||
|
* @param positionType The type of position check to run
|
||||||
|
*/
|
||||||
|
public HeightAtPositionBC(
|
||||||
|
Distance minHeight, Distance safeHeight, Distance testRadius, PositionType positionType
|
||||||
|
) {
|
||||||
|
this.minHeightMeters = minHeight.in(Units.Meters);
|
||||||
|
this.safeHeightMeters = safeHeight.in(Units.Meters);
|
||||||
|
this.testPosition = testRadius;
|
||||||
|
this.positionType = positionType;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public <M extends ReversableRadialBM<P>, P> Double evaluate(
|
||||||
|
M model, BCEvalParams evalParams
|
||||||
|
) throws UnhandledEnumException{
|
||||||
|
Time timeAtTarget;
|
||||||
|
switch(this.positionType) {
|
||||||
|
case TargetRadius:
|
||||||
|
timeAtTarget = model.getTimeAtRadius(
|
||||||
|
evalParams.getCandidateVelocity(),
|
||||||
|
model.getRelativeHorizontalDistance().minus(testPosition)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case AbsoluteX:
|
||||||
|
timeAtTarget = model.getTimeAtX(evalParams.getCandidateVelocity(), testPosition);
|
||||||
|
break;
|
||||||
|
case AbsoluteY:
|
||||||
|
timeAtTarget = model.getTimeAtY(evalParams.getCandidateVelocity(), testPosition);
|
||||||
|
break;
|
||||||
|
case RelativeX:
|
||||||
|
timeAtTarget = model.getTimeAtXRelative(evalParams.getCandidateVelocity(), testPosition);
|
||||||
|
break;
|
||||||
|
case RelativeY:
|
||||||
|
timeAtTarget = model.getTimeAtYRelative(evalParams.getCandidateVelocity(), testPosition);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new UnhandledEnumException(this.positionType.name());
|
||||||
|
}
|
||||||
|
double zAtTargetMeters = model.positionAtTime(
|
||||||
|
evalParams.getCandidateVelocity(),
|
||||||
|
timeAtTarget
|
||||||
|
).getMeasureZ().in(Units.Meters);
|
||||||
|
|
||||||
|
if(zAtTargetMeters > safeHeightMeters) {
|
||||||
|
return 0.0;
|
||||||
|
} else if(zAtTargetMeters < minHeightMeters) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return Util.rangePercent(minHeightMeters, safeHeightMeters, zAtTargetMeters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public <M extends BallisticModel<P>, P> Double evaluate(
|
||||||
|
M model, BCEvalParams evalParams
|
||||||
|
) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
package org.fairportrobotics.frc.robolib.trajectory.ballistics.exceptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base exception for the ballistic calculator
|
||||||
|
*/
|
||||||
|
public class UnhandledEnumException extends BallisticException {
|
||||||
|
public UnhandledEnumException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnhandledEnumException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue