Skip to content

Commit

Permalink
Support PathPlanner using custom units
Browse files Browse the repository at this point in the history
* update to 1.1.28

* update pplib

* implement units compatibility with pplib
  • Loading branch information
sswadkar authored Feb 7, 2024
1 parent 22c4d20 commit 4c4c630
Show file tree
Hide file tree
Showing 7 changed files with 224 additions and 42 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ publishing {
release(MavenPublication) {
groupId = 'org.team4099'
artifactId = 'falconutils'
version = '1.1.26'
version = '1.1.28'

from(components["kotlin"])
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package org.team4099.lib.pplib

import com.pathplanner.lib.controllers.PPHolonomicDriveController
import com.pathplanner.lib.path.PathConstraints
import com.pathplanner.lib.path.PathPlannerTrajectory
import com.pathplanner.lib.util.ReplanningConfig
import org.team4099.lib.geometry.Pose2d
import org.team4099.lib.kinematics.ChassisSpeeds
import org.team4099.lib.units.AngularAcceleration
import org.team4099.lib.units.AngularVelocity
import org.team4099.lib.units.LinearAcceleration
import org.team4099.lib.units.LinearVelocity
import org.team4099.lib.units.base.Length
import org.team4099.lib.units.base.Time
import org.team4099.lib.units.base.inMeters
import org.team4099.lib.units.base.inSeconds
import org.team4099.lib.units.base.seconds
import org.team4099.lib.units.derived.Angle
import org.team4099.lib.units.derived.inRotation2ds
import org.team4099.lib.units.inMetersPerSecond
import org.team4099.lib.units.inMetersPerSecondPerSecond
import org.team4099.lib.units.inRadiansPerSecond
import org.team4099.lib.units.inRadiansPerSecondPerSecond
import java.util.Optional
import com.pathplanner.lib.path.GoalEndState as pplibGoalEndState
import com.pathplanner.lib.util.HolonomicPathFollowerConfig as pplibHolonomicPathFollowerConfig

class PathPlannerHolonomicDriveController(
translationConstants: PathPlannerTranslationPID,
rotationConstants: PathPlannerRotationPID,
maxModuleSpeed: LinearVelocity,
driveBaseRadius: Length,
period: Time = 0.02.seconds
) {
private val pplibController: PPHolonomicDriveController =
PPHolonomicDriveController(
translationConstants.pplibTranslationConstants,
rotationConstants.pplibRotationConstants,
period.inSeconds,
maxModuleSpeed.inMetersPerSecond,
driveBaseRadius.inMeters
)

val positionalError = pplibController.positionalError
val isHolonomic = pplibController.isHolonomic

fun calculateRobotRelativeSpeeds(
currentPose: Pose2d,
targetState: PathPlannerTrajectory.State
): ChassisSpeeds {
return ChassisSpeeds(
pplibController.calculateRobotRelativeSpeeds(currentPose.pose2d, targetState)
)
}

fun reset(currentPose: Pose2d, currentSpeeds: ChassisSpeeds) {
pplibController.reset(currentPose.pose2d, currentSpeeds.chassisSpeedsWPILIB)
}

fun setEnabled(enabled: Boolean) {
pplibController.setEnabled(enabled)
}

fun setRotationTargetOverride(rotationTargetOverride: () -> Angle) {
PPHolonomicDriveController.setRotationTargetOverride {
Optional.of(rotationTargetOverride().inRotation2ds)
}
}

companion object {
data class HolonomicPathFollowerConfig(
val translationConstants: PathPlannerTranslationPID,
val rotationConstants: PathPlannerRotationPID,
val maxModuleSpeed: LinearVelocity,
val driveBaseRadius: Length,
) {
val pplibConfig =
pplibHolonomicPathFollowerConfig(
translationConstants.pplibTranslationConstants,
rotationConstants.pplibRotationConstants,
maxModuleSpeed.inMetersPerSecond,
driveBaseRadius.inMeters,
ReplanningConfig()
)
}
data class GoalEndState(
val velocity: LinearVelocity,
val rotation: Angle,
val rotateFast: Boolean
) {
val pplibGoalEndState: pplibGoalEndState =
pplibGoalEndState(velocity.inMetersPerSecond, rotation.inRotation2ds, rotateFast)
}

data class PathConstraints(
val maxVelocity: LinearVelocity,
val maxAcceleration: LinearAcceleration,
val maxAngularVelocity: AngularVelocity,
val maxAngularAcceleration: AngularAcceleration
) {
val pplibConstraints =
PathConstraints(
maxVelocity.inMetersPerSecond,
maxAcceleration.inMetersPerSecondPerSecond,
maxAngularVelocity.inRadiansPerSecond,
maxAngularAcceleration.inRadiansPerSecondPerSecond
)
}
}
}
29 changes: 29 additions & 0 deletions src/main/kotlin/org/team4099/lib/pplib/PathPlannerRotationPID.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.team4099.lib.pplib

import com.pathplanner.lib.util.PIDConstants
import org.team4099.lib.units.Velocity
import org.team4099.lib.units.derived.Angle
import org.team4099.lib.units.derived.DerivativeGain
import org.team4099.lib.units.derived.IntegralGain
import org.team4099.lib.units.derived.ProportionalGain
import org.team4099.lib.units.derived.Radian
import org.team4099.lib.units.derived.inRadians
import org.team4099.lib.units.derived.inRadiansPerSecondPerRadian
import org.team4099.lib.units.derived.inRadiansPerSecondPerRadianPerSecond
import org.team4099.lib.units.derived.inRadiansPerSecondPerRadianSeconds
import org.team4099.lib.units.derived.radians

data class PathPlannerRotationPID(
val kP: ProportionalGain<Radian, Velocity<Radian>>,
val kI: IntegralGain<Radian, Velocity<Radian>>,
val kD: DerivativeGain<Radian, Velocity<Radian>>,
val iZone: Angle = 1.0.radians
) {
val pplibRotationConstants =
PIDConstants(
kP.inRadiansPerSecondPerRadian,
kI.inRadiansPerSecondPerRadianSeconds,
kD.inRadiansPerSecondPerRadianPerSecond,
iZone.inRadians
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.team4099.lib.pplib

import com.pathplanner.lib.util.PIDConstants
import org.team4099.lib.units.Velocity
import org.team4099.lib.units.base.Length
import org.team4099.lib.units.base.Meter
import org.team4099.lib.units.base.inMeters
import org.team4099.lib.units.base.meters
import org.team4099.lib.units.derived.DerivativeGain
import org.team4099.lib.units.derived.IntegralGain
import org.team4099.lib.units.derived.ProportionalGain
import org.team4099.lib.units.derived.inMetersPerSecondPerMeter
import org.team4099.lib.units.derived.inMetersPerSecondPerMeterPerSecond
import org.team4099.lib.units.derived.inMetersPerSecondPerMeterSeconds

data class PathPlannerTranslationPID(
val kP: ProportionalGain<Meter, Velocity<Meter>>,
val kI: IntegralGain<Meter, Velocity<Meter>>,
val kD: DerivativeGain<Meter, Velocity<Meter>>,
val iZone: Length = 1.0.meters
) {
val pplibTranslationConstants =
PIDConstants(
kP.inMetersPerSecondPerMeter,
kI.inMetersPerSecondPerMeterSeconds,
kD.inMetersPerSecondPerMeterPerSecond,
iZone.inMeters
)
}
2 changes: 0 additions & 2 deletions src/main/kotlin/org/team4099/lib/units/Derivatives.kt
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,5 @@ inline val AngularAcceleration.inDegreesPerSecondPerSecond: Double
inline val AngularAcceleration.inRotationsPerSecondPerSecond: Double
get() = value / (2 * PI)



inline val AngularAcceleration.inRotationsPerMinutePerMinute: Double
get() = value * SECONDS_PER_MINUTE * SECONDS_PER_MINUTE / (2 * PI)
78 changes: 46 additions & 32 deletions src/main/kotlin/org/team4099/lib/units/derived/Controller.kt
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,6 @@ inline val <K : UnitKey> Value<K>.perDegreePerSecond
inline val <K : UnitKey> Value<K>.perRotationPerMinute
get() = (perRadianPerSecond * SECONDS_PER_MINUTE) / RADIANS_PER_ROTATION



inline val Double.VoltsPerVolts
get() = Value<Fraction<Volt, Volt>>(this)

Expand Down Expand Up @@ -163,7 +161,6 @@ inline val DerivativeGain<Velocity<Radian>, Volt>.inVoltsPerDegreesPerSecondPerS
inline val DerivativeGain<Velocity<Radian>, Volt>.inVoltsPerRotationsPerMinutePerSecond: Double
get() = inVoltsPerRadiansPerSecondPerSecond / SECONDS_PER_MINUTE * RADIANS_PER_ROTATION


inline val Double.AmpsPerAmps
get() = Value<Fraction<Ampere, Ampere>>(this)

Expand Down Expand Up @@ -254,7 +251,6 @@ inline val DerivativeGain<Velocity<Radian>, Ampere>.inAmpsPerDegreesPerSecondPer
inline val DerivativeGain<Velocity<Radian>, Ampere>.inAmpsPerRotationsPerMinutePerSecond: Double
get() = inAmpsPerRadiansPerSecondPerSecond / SECONDS_PER_MINUTE * RADIANS_PER_ROTATION


inline val Double.radiansPerSecondPerRadiansPerSecond
get() = Value<Fraction<Velocity<Radian>, Velocity<Radian>>>(this)

Expand All @@ -276,13 +272,16 @@ inline val ProportionalGain<Radian, Velocity<Radian>>.inRadiansPerSecondPerDegre
inline val ProportionalGain<Radian, Velocity<Radian>>.inRadiansPerSecondPerRotation: Double
get() = inRadiansPerSecondPerRadian * RADIANS_PER_ROTATION

inline val ProportionalGain<Velocity<Meter>, Velocity<Radian>>.inRadiansPerSecondPerMetersPerSecond: Double
get() = value
inline val ProportionalGain<Velocity<Meter>, Velocity<Radian>>.inRadiansPerSecondPerMetersPerSecond:
Double
get() = value

inline val ProportionalGain<Velocity<Radian>, Velocity<Radian>>.inRadiansPerSecondPerRadiansPerSecond: Double
inline val ProportionalGain<
Velocity<Radian>, Velocity<Radian>>.inRadiansPerSecondPerRadiansPerSecond: Double
get() = value

inline val ProportionalGain<Velocity<Radian>, Velocity<Radian>>.inRadiansPerSecondPerRotationPerMinute: Double
inline val ProportionalGain<
Velocity<Radian>, Velocity<Radian>>.inRadiansPerSecondPerRotationPerMinute: Double
get() = inRadiansPerSecondPerRadiansPerSecond * RADIANS_PER_ROTATION / SECONDS_PER_MINUTE

inline val IntegralGain<Meter, Velocity<Radian>>.inRadiansPerSecondPerMeterSeconds: Double
Expand Down Expand Up @@ -324,7 +323,8 @@ inline val DerivativeGain<Meter, Velocity<Radian>>.inRadiansPerSecondPerInchPerS
inline val DerivativeGain<Meter, Velocity<Radian>>.inRadiansPerSecondPerFootPerSecond: Double
get() = inRadiansPerSecondPerMeterPerSecond * METERS_PER_FOOT

inline val DerivativeGain<Velocity<Meter>, Velocity<Radian>>.inRadiansPerSecondPerMetersPerSecondPerSecond: Double
inline val DerivativeGain<
Velocity<Meter>, Velocity<Radian>>.inRadiansPerSecondPerMetersPerSecondPerSecond: Double
get() = value

inline val DerivativeGain<Radian, Velocity<Radian>>.inRadiansPerSecondPerRadianPerSecond: Double
Expand All @@ -336,16 +336,18 @@ inline val DerivativeGain<Radian, Velocity<Radian>>.inRadiansPerSecondPerDegreeP
inline val DerivativeGain<Radian, Velocity<Radian>>.inRadiansPerSecondPerRotationsPerMinute: Double
get() = inRadiansPerSecondPerRadianPerSecond / SECONDS_PER_MINUTE * RADIANS_PER_ROTATION

inline val DerivativeGain<Velocity<Radian>, Velocity<Radian>>.inRadiansPerSecondPerRadiansPerSecondPerSecond: Double
inline val DerivativeGain<
Velocity<Radian>, Velocity<Radian>>.inRadiansPerSecondPerRadiansPerSecondPerSecond: Double
get() = value

inline val DerivativeGain<Velocity<Radian>, Velocity<Radian>>.inRadiansPerSecondPerDegreesPerSecondPerSecond: Double
inline val DerivativeGain<
Velocity<Radian>, Velocity<Radian>>.inRadiansPerSecondPerDegreesPerSecondPerSecond: Double
get() = inRadiansPerSecondPerRadiansPerSecondPerSecond * RADIANS_PER_DEGREES

inline val DerivativeGain<Velocity<Radian>, Velocity<Radian>>.inRadiansPerSecondPerRotationsPerMinutePerSecond: Double
inline val DerivativeGain<
Velocity<Radian>, Velocity<Radian>>.inRadiansPerSecondPerRotationsPerMinutePerSecond: Double
get() = inRadiansPerSecondPerRadiansPerSecondPerSecond / SECONDS_PER_MINUTE * RADIANS_PER_ROTATION


inline val Double.metersPerSecondPerMetersPerSecond
get() = Value<Fraction<Velocity<Meter>, Velocity<Meter>>>(this)

Expand All @@ -367,13 +369,16 @@ inline val ProportionalGain<Radian, Velocity<Meter>>.inMetersPerSecondPerDegree:
inline val ProportionalGain<Radian, Velocity<Meter>>.inMetersPerSecondPerRotation: Double
get() = inMetersPerSecondPerRadian * RADIANS_PER_ROTATION

inline val ProportionalGain<Velocity<Meter>, Velocity<Meter>>.inMetersPerSecondPerMetersPerSecond: Double
get() = value
inline val ProportionalGain<Velocity<Meter>, Velocity<Meter>>.inMetersPerSecondPerMetersPerSecond:
Double
get() = value

inline val ProportionalGain<Velocity<Radian>, Velocity<Meter>>.inMetersPerSecondPerRadiansPerSecond: Double
get() = value
inline val ProportionalGain<Velocity<Radian>, Velocity<Meter>>.inMetersPerSecondPerRadiansPerSecond:
Double
get() = value

inline val ProportionalGain<Velocity<Radian>, Velocity<Meter>>.inMetersPerSecondPerRotationPerMinute: Double
inline val ProportionalGain<
Velocity<Radian>, Velocity<Meter>>.inMetersPerSecondPerRotationPerMinute: Double
get() = inMetersPerSecondPerRadiansPerSecond * RADIANS_PER_ROTATION / SECONDS_PER_MINUTE

inline val IntegralGain<Meter, Velocity<Meter>>.inMetersPerSecondPerMeterSeconds: Double
Expand Down Expand Up @@ -415,7 +420,8 @@ inline val DerivativeGain<Meter, Velocity<Meter>>.inMetersPerSecondPerInchPerSec
inline val DerivativeGain<Meter, Velocity<Meter>>.inMetersPerSecondPerFootPerSecond: Double
get() = inMetersPerSecondPerMeterPerSecond * METERS_PER_FOOT

inline val DerivativeGain<Velocity<Meter>, Velocity<Meter>>.inMetersPerSecondPerMetersPerSecondPerSecond: Double
inline val DerivativeGain<
Velocity<Meter>, Velocity<Meter>>.inMetersPerSecondPerMetersPerSecondPerSecond: Double
get() = value

inline val DerivativeGain<Radian, Velocity<Meter>>.inMetersPerSecondPerRadianPerSecond: Double
Expand All @@ -427,16 +433,18 @@ inline val DerivativeGain<Radian, Velocity<Meter>>.inMetersPerSecondPerDegreePer
inline val DerivativeGain<Radian, Velocity<Meter>>.inMetersPerSecondPerRotationsPerMinute: Double
get() = inMetersPerSecondPerRadianPerSecond / SECONDS_PER_MINUTE * RADIANS_PER_ROTATION

inline val DerivativeGain<Velocity<Radian>, Velocity<Meter>>.inMetersPerSecondPerRadiansPerSecondPerSecond: Double
inline val DerivativeGain<
Velocity<Radian>, Velocity<Meter>>.inMetersPerSecondPerRadiansPerSecondPerSecond: Double
get() = value

inline val DerivativeGain<Velocity<Radian>, Velocity<Meter>>.inMetersPerSecondPerDegreesPerSecondPerSecond: Double
inline val DerivativeGain<
Velocity<Radian>, Velocity<Meter>>.inMetersPerSecondPerDegreesPerSecondPerSecond: Double
get() = inMetersPerSecondPerRadiansPerSecondPerSecond * RADIANS_PER_DEGREES

inline val DerivativeGain<Velocity<Radian>, Velocity<Meter>>.inMetersPerSecondPerRotationsPerMinutePerSecond: Double
inline val DerivativeGain<
Velocity<Radian>, Velocity<Meter>>.inMetersPerSecondPerRotationsPerMinutePerSecond: Double
get() = inMetersPerSecondPerRadiansPerSecondPerSecond / SECONDS_PER_MINUTE * RADIANS_PER_ROTATION


inline val Double.MetersPerMeters
get() = Value<Fraction<Meter, Meter>>(this)

Expand Down Expand Up @@ -527,7 +535,6 @@ inline val DerivativeGain<Velocity<Radian>, Meter>.inMetersPerDegreesPerSecondPe
inline val DerivativeGain<Velocity<Radian>, Meter>.inMetersPerRotationsPerMinutePerSecond: Double
get() = inMetersPerRadiansPerSecondPerSecond / SECONDS_PER_MINUTE * RADIANS_PER_ROTATION


inline val Double.DegreesPerSecondPerDegreesPerSecond
get() = Value<Fraction<Velocity<Radian>, Velocity<Radian>>>(this)

Expand All @@ -549,13 +556,16 @@ inline val ProportionalGain<Radian, Velocity<Radian>>.inDegreesPerSecondPerDegre
inline val ProportionalGain<Radian, Velocity<Radian>>.inDegreesPerSecondPerRotation: Double
get() = inDegreesPerSecondPerRadian * RADIANS_PER_ROTATION

inline val ProportionalGain<Velocity<Meter>, Velocity<Radian>>.inDegreesPerSecondPerMetersPerSecond: Double
get() = value
inline val ProportionalGain<Velocity<Meter>, Velocity<Radian>>.inDegreesPerSecondPerMetersPerSecond:
Double
get() = value

inline val ProportionalGain<Velocity<Radian>, Velocity<Radian>>.inDegreesPerSecondPerRadiansPerSecond: Double
inline val ProportionalGain<
Velocity<Radian>, Velocity<Radian>>.inDegreesPerSecondPerRadiansPerSecond: Double
get() = value

inline val ProportionalGain<Velocity<Radian>, Velocity<Radian>>.inDegreesPerSecondPerRotationPerMinute: Double
inline val ProportionalGain<
Velocity<Radian>, Velocity<Radian>>.inDegreesPerSecondPerRotationPerMinute: Double
get() = inDegreesPerSecondPerRadiansPerSecond * RADIANS_PER_ROTATION / SECONDS_PER_MINUTE

inline val IntegralGain<Meter, Velocity<Radian>>.inDegreesPerSecondPerMeterSeconds: Double
Expand Down Expand Up @@ -597,7 +607,8 @@ inline val DerivativeGain<Meter, Velocity<Radian>>.inDegreesPerSecondPerInchPerS
inline val DerivativeGain<Meter, Velocity<Radian>>.inDegreesPerSecondPerFootPerSecond: Double
get() = inDegreesPerSecondPerMeterPerSecond * METERS_PER_FOOT

inline val DerivativeGain<Velocity<Meter>, Velocity<Radian>>.inDegreesPerSecondPerMetersPerSecondPerSecond: Double
inline val DerivativeGain<
Velocity<Meter>, Velocity<Radian>>.inDegreesPerSecondPerMetersPerSecondPerSecond: Double
get() = value

inline val DerivativeGain<Radian, Velocity<Radian>>.inDegreesPerSecondPerRadianPerSecond: Double
Expand All @@ -609,11 +620,14 @@ inline val DerivativeGain<Radian, Velocity<Radian>>.inDegreesPerSecondPerDegreeP
inline val DerivativeGain<Radian, Velocity<Radian>>.inDegreesPerSecondPerRotationsPerMinute: Double
get() = inDegreesPerSecondPerRadianPerSecond / SECONDS_PER_MINUTE * RADIANS_PER_ROTATION

inline val DerivativeGain<Velocity<Radian>, Velocity<Radian>>.inDegreesPerSecondPerRadiansPerSecondPerSecond: Double
inline val DerivativeGain<
Velocity<Radian>, Velocity<Radian>>.inDegreesPerSecondPerRadiansPerSecondPerSecond: Double
get() = value

inline val DerivativeGain<Velocity<Radian>, Velocity<Radian>>.inDegreesPerSecondPerDegreesPerSecondPerSecond: Double
inline val DerivativeGain<
Velocity<Radian>, Velocity<Radian>>.inDegreesPerSecondPerDegreesPerSecondPerSecond: Double
get() = inDegreesPerSecondPerRadiansPerSecondPerSecond * RADIANS_PER_DEGREES

inline val DerivativeGain<Velocity<Radian>, Velocity<Radian>>.inDegreesPerSecondPerRotationsPerMinutePerSecond: Double
inline val DerivativeGain<
Velocity<Radian>, Velocity<Radian>>.inDegreesPerSecondPerRotationsPerMinutePerSecond: Double
get() = inDegreesPerSecondPerRadiansPerSecondPerSecond / SECONDS_PER_MINUTE * RADIANS_PER_ROTATION
Loading

0 comments on commit 4c4c630

Please sign in to comment.