Skip to content
This repository was archived by the owner on Dec 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
c7e98ed
working on 3d splines
truher Dec 15, 2025
0f74054
3d trajectory WIP
truher Dec 15, 2025
45e5dde
3d trajectory WIP
truher Dec 15, 2025
1ab76f3
fix up 2d trajectory plotting
truher Dec 15, 2025
a4ef525
remove spline optimization
truher Dec 15, 2025
c165b0a
2d spline uses SE(2) direction for endpoints
truher Dec 16, 2025
d085158
add magic number to waypoint
truher Dec 16, 2025
18baedc
cleaning
truher Dec 16, 2025
d85848c
remove third derivative of position in splines
truher Dec 16, 2025
15a3c76
cleaning
truher Dec 16, 2025
b5627eb
remove jointconstraint since it was never finished
truher Dec 16, 2025
47ecd76
more trajectory WIP, not working
truher Dec 17, 2025
09b0056
splines and trajectories WIP
truher Dec 17, 2025
090b8a0
more trajectory WIP
truher Dec 18, 2025
887ad07
trajectory WIP
truher Dec 18, 2025
6815c29
more trajectory WIP
truher Dec 19, 2025
087ce48
multiple shooting experiment
truher Dec 19, 2025
4712657
fiddling with integrals
truher Dec 20, 2025
7e808ee
fiddling with direct method
truher Dec 20, 2025
adccb31
wip
truher Dec 21, 2025
9c88336
dt solve works
truher Dec 22, 2025
c6743cd
asymetric accel/decel constraint works
truher Dec 22, 2025
5d8730c
velocity dependent accel constraint
truher Dec 22, 2025
05f9311
more trajectory WIP
truher Dec 23, 2025
d30fb89
fix the build
truher Dec 24, 2025
819d88f
simplify trajectory constraints
truher Dec 24, 2025
8972b8a
fix curvature for turn-in-place
truher Dec 24, 2025
9252b13
more trajectories
truher Dec 24, 2025
cb80c38
fix the build
truher Dec 24, 2025
6cdc218
blarg
truher Dec 24, 2025
c2f4ffd
do not plot
truher Dec 24, 2025
ddb5a7d
cleaning
truher Dec 24, 2025
e5f1b06
organize metrics
truher Dec 24, 2025
c01000a
go back to pathwise distances to match curvature metric
truher Dec 24, 2025
8e23d41
finish making trajectory corner not work
truher Dec 25, 2025
8cda896
paring down schedule generator WIP
truher Dec 25, 2025
9421228
cutting up trajectory code WIP
truher Dec 25, 2025
088e53e
cutting up schedule generator WIP
truher Dec 25, 2025
da0ddbe
remove ConstrainedState
truher Dec 25, 2025
f5df326
cleaning
truher Dec 25, 2025
91feb5c
bleah
truher Dec 26, 2025
4790bde
finish overhauling ScheduleGenerator
truher Dec 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
import org.team100.lib.config.Feedforward100;
import org.team100.lib.config.Identity;
import org.team100.lib.config.PIDConstants;
import org.team100.lib.geometry.GlobalAccelerationR3;
import org.team100.lib.geometry.GlobalVelocityR3;
import org.team100.lib.geometry.HolonomicPose2d;
import org.team100.lib.geometry.AccelerationSE2;
import org.team100.lib.geometry.VelocitySE2;
import org.team100.lib.geometry.WaypointSE2;
import org.team100.lib.logging.Level;
import org.team100.lib.logging.LoggerFactory;
import org.team100.lib.logging.LoggerFactory.ConfigLogger;
import org.team100.lib.logging.LoggerFactory.GlobalAccelerationR3Logger;
import org.team100.lib.logging.LoggerFactory.GlobalVelocityR3Logger;
import org.team100.lib.logging.LoggerFactory.AccelerationSE2Logger;
import org.team100.lib.logging.LoggerFactory.VelocitySE2Logger;
import org.team100.lib.logging.LoggerFactory.JointAccelerationsLogger;
import org.team100.lib.logging.LoggerFactory.JointForceLogger;
import org.team100.lib.logging.LoggerFactory.JointVelocitiesLogger;
Expand Down Expand Up @@ -105,8 +105,8 @@ public class CalgamesMech extends SubsystemBase implements Music, PositionSubsys
private final JointForceLogger m_log_jointF;

private final Pose2dLogger m_log_pose;
private final GlobalVelocityR3Logger m_log_cartesianV;
private final GlobalAccelerationR3Logger m_log_cartesianA;
private final VelocitySE2Logger m_log_cartesianV;
private final AccelerationSE2Logger m_log_cartesianA;

private final LinearMechanism m_elevatorFront;
private final LinearMechanism m_elevatorBack;
Expand Down Expand Up @@ -146,8 +146,8 @@ public CalgamesMech(

LoggerFactory cartesianLog = parent.name("cartesian");
m_log_pose = cartesianLog.pose2dLogger(Level.DEBUG, "pose");
m_log_cartesianV = cartesianLog.globalVelocityR3Logger(Level.DEBUG, "velocity");
m_log_cartesianA = cartesianLog.globalAccelerationR3Logger(Level.DEBUG, "accel");
m_log_cartesianV = cartesianLog.VelocitySE2Logger(Level.DEBUG, "velocity");
m_log_cartesianA = cartesianLog.AccelerationSE2Logger(Level.DEBUG, "accel");

LoggerFactory elevatorbackLog = parent.name("elevatorBack");
LoggerFactory elevatorfrontLog = parent.name("elevatorFront");
Expand Down Expand Up @@ -317,14 +317,14 @@ public ModelR3 getState() {
EAWConfig c = getConfig();
JointVelocities jv = getJointVelocity();
Pose2d p = m_kinematics.forward(c);
GlobalVelocityR3 v = m_jacobian.forward(c, jv);
VelocitySE2 v = m_jacobian.forward(c, jv);
return new ModelR3(p, v);
}

// for testing only
public void setVelocity(GlobalVelocityR3 v) {
public void setVelocity(VelocitySE2 v) {
Pose2d pose = getState().pose();
GlobalAccelerationR3 a = new GlobalAccelerationR3(0, 0, 0);
AccelerationSE2 a = new AccelerationSE2(0, 0, 0);
ControlR3 control = new ControlR3(pose, v, a);

JointVelocities jv = m_jacobian.inverse(control.model());
Expand Down Expand Up @@ -490,87 +490,87 @@ public Command processorWithProfile() {

public MoveAndHold homeToL1() {
return m_transit.endless("homeToL1",
HolonomicPose2d.make(m_home, -1.5),
HolonomicPose2d.make(L2, -1.7));
WaypointSE2.irrotational(m_home, -1.5, 1.2),
WaypointSE2.irrotational(L2, -1.7, 1.2));
}

// NEVER CALL
public Command l1ToHome() {
return m_transit.terminal("l1ToHome",
HolonomicPose2d.make(L2, 1.3),
HolonomicPose2d.make(m_home, 1.5));
WaypointSE2.irrotational(L2, 1.3, 1.2),
WaypointSE2.irrotational(m_home, 1.5, 1.2));
}

public MoveAndHold homeToL2() {
return m_transit.endless("homeToL2",
HolonomicPose2d.make(m_home, 1.5),
HolonomicPose2d.make(L2, 1.5));
WaypointSE2.irrotational(m_home, 1.5, 1.2),
WaypointSE2.irrotational(L2, 1.5, 1.2));
}

public Command l2ToHome() {
return m_transit.terminal("l2ToHome",
HolonomicPose2d.make(L2, -1.5),
HolonomicPose2d.make(m_home, -1.5));
WaypointSE2.irrotational(L2, -1.5, 1.2),
WaypointSE2.irrotational(m_home, -1.5, 1.2));
}

public MoveAndHold homeToL3() {
return m_transit.endless("homeToL3",
HolonomicPose2d.make(m_home, 0.8),
HolonomicPose2d.make(L3, 1.5));
WaypointSE2.irrotational(m_home, 0.8, 1.2),
WaypointSE2.irrotational(L3, 1.5, 1.2));
}

public Command l3ToHome() {
return m_transit.terminal("l3ToHome",
HolonomicPose2d.make(L3, -1.5),
HolonomicPose2d.make(m_home, -2.3));
WaypointSE2.irrotational(L3, -1.5, 1.2),
WaypointSE2.irrotational(m_home, -2.3, 1.2));
}

public MoveAndHold homeToL4() {
return m_transit.endless("homeToL4",
HolonomicPose2d.make(m_home, 0.1),
HolonomicPose2d.make(L4, 1.5));
WaypointSE2.irrotational(m_home, 0.1, 1.2),
WaypointSE2.irrotational(L4, 1.5, 1.2));
}

public MoveAndHold homeToL4Back() {
return m_transit.endless("homeToL4",
HolonomicPose2d.make(m_home, 0.1),
HolonomicPose2d.make(L4_BACK, -1.5));
WaypointSE2.irrotational(m_home, 0.1, 1.2),
WaypointSE2.irrotational(L4_BACK, -1.5, 1.2));
}

public Command l4ToHome() {
return m_transit.terminal("l4ToHome",
HolonomicPose2d.make(L4, -1.5),
HolonomicPose2d.make(m_home, -3));
WaypointSE2.irrotational(L4, -1.5, 1.2),
WaypointSE2.irrotational(m_home, -3, 1.2));
}

public Command l4BackToHome() {
return m_transit.terminal("l4ToHome",
HolonomicPose2d.make(L4_BACK, 1.5),
HolonomicPose2d.make(m_home, -3));
WaypointSE2.irrotational(L4_BACK, 1.5, 1.2),
WaypointSE2.irrotational(m_home, -3, 1.2));
}

public Command homeToAlgaeL2() {
return m_transit.endless("homeToAlgaeL2",
HolonomicPose2d.make(m_home, 1.5),
HolonomicPose2d.make(ALGAE_L2, 1.5));
WaypointSE2.irrotational(m_home, 1.5, 1.2),
WaypointSE2.irrotational(ALGAE_L2, 1.5, 1.2));
}

public Command homeToAlgaeL3() {
return m_transit.endless("homeToAlgaeL3",
HolonomicPose2d.make(m_home, 0),
HolonomicPose2d.make(ALGAE_L3, 1.5));
WaypointSE2.irrotational(m_home, 0, 1.2),
WaypointSE2.irrotational(ALGAE_L3, 1.5, 1.2));
}

public Command algaeL2ToHome() {
return m_transit.terminal("homeToAlgaeL2",
HolonomicPose2d.make(ALGAE_L2, -1.0),
HolonomicPose2d.make(m_home, Math.PI));
WaypointSE2.irrotational(ALGAE_L2, -1.0, 1.2),
WaypointSE2.irrotational(m_home, Math.PI, 1.2));
}

public Command algaeL3ToHome() {
return m_transit.terminal("homeToAlgaeL3",
HolonomicPose2d.make(ALGAE_L3, -1.0),
HolonomicPose2d.make(m_home, Math.PI));
WaypointSE2.irrotational(ALGAE_L3, -1.0, 1.2),
WaypointSE2.irrotational(m_home, Math.PI, 1.2));
}

/**
Expand Down Expand Up @@ -598,14 +598,14 @@ public Command algaeReefExit(Supplier<ScoringLevel> level) {
*/
public MoveAndHold homeToBarge() {
return m_transit.endless("homeToBarge",
HolonomicPose2d.make(m_home, 0),
HolonomicPose2d.make(BARGE, -1));
WaypointSE2.irrotational(m_home, 0, 1.2),
WaypointSE2.irrotational(BARGE, -1, 1.2));
}

public MoveAndHold bargeToHome() {
return m_transit.endless("bargeToHome",
HolonomicPose2d.make(BARGE, 2.5),
HolonomicPose2d.make(m_home, Math.PI));
WaypointSE2.irrotational(BARGE, 2.5, 1.2),
WaypointSE2.irrotational(m_home, Math.PI, 1.2));

}

Expand Down Expand Up @@ -672,8 +672,8 @@ private void logConfig(EAWConfig c, JointVelocities jv, JointAccelerations ja, J
m_log_jointA.log(() -> ja);
m_log_jointF.log(() -> jf);
Pose2d p = m_kinematics.forward(c);
GlobalVelocityR3 v = m_jacobian.forward(c, jv);
GlobalAccelerationR3 a = m_jacobian.forwardA(c, jv, ja);
VelocitySE2 v = m_jacobian.forward(c, jv);
AccelerationSE2 a = m_jacobian.forwardA(c, jv, ja);
m_log_pose.log(() -> p);
m_log_cartesianV.log(() -> v);
m_log_cartesianA.log(() -> a);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,13 @@
import java.util.List;

import org.team100.lib.commands.MoveAndHold;
import org.team100.lib.geometry.HolonomicPose2d;
import org.team100.lib.geometry.WaypointSE2;
import org.team100.lib.logging.LoggerFactory;
import org.team100.lib.subsystems.prr.AnalyticalJacobian;
import org.team100.lib.subsystems.prr.ElevatorArmWristKinematics;
import org.team100.lib.subsystems.prr.JointAccelerations;
import org.team100.lib.subsystems.prr.JointVelocities;
import org.team100.lib.subsystems.r3.commands.GoToPosePosition;
import org.team100.lib.trajectory.TrajectoryPlanner;
import org.team100.lib.trajectory.timing.ConstantConstraint;
import org.team100.lib.trajectory.timing.JointConstraint;
import org.team100.lib.trajectory.timing.TimingConstraint;
import org.team100.lib.trajectory.timing.TorqueConstraint;
import org.team100.lib.trajectory.timing.YawRateConstraint;
Expand All @@ -22,7 +19,6 @@

/** Make a trajectory from the start to the end and follow it. */
public class MechTrajectories extends Command {
private static final boolean USE_JOINT_CONSTRAINT = false;

private final LoggerFactory m_log;
private final CalgamesMech m_subsystem;
Expand All @@ -36,21 +32,12 @@ public MechTrajectories(
m_log = parent.type(this);
m_subsystem = mech;
List<TimingConstraint> c = new ArrayList<>();
if (USE_JOINT_CONSTRAINT) {
// This is experimental, don't use it.
c.add(new JointConstraint(
k,
j,
new JointVelocities(10, 10, 10),
new JointAccelerations(10, 10, 10)));

} else {
// These are known to work, but suboptimal.
c.add(new ConstantConstraint(m_log, 10, 5));
c.add(new YawRateConstraint(m_log, 10, 5));
// This is new
c.add(new TorqueConstraint(20));
}
// These are known to work, but suboptimal.
c.add(new ConstantConstraint(m_log, 10, 5));
c.add(new YawRateConstraint(m_log, 10, 5));
// This is new
c.add(new TorqueConstraint(20));

// ALERT!
// The parameters here used to be double these values;
Expand All @@ -62,22 +49,22 @@ public MechTrajectories(
}

/** A command that goes from the start to the end and then finishes. */
public Command terminal(String name, HolonomicPose2d start, HolonomicPose2d end) {
public Command terminal(String name, WaypointSE2 start, WaypointSE2 end) {

/** Use the start course and ignore the start pose for now */
MoveAndHold f = new GoToPosePosition(
m_log, m_subsystem, start.course(), end, m_planner);
m_log, m_subsystem, start.course().toRotation(), end, m_planner);
return f
.until(f::isDone)
.withName(name);
}

/** A command that goes from the start to the end and then waits forever. */
public MoveAndHold endless(String name, HolonomicPose2d start, HolonomicPose2d end) {
public MoveAndHold endless(String name, WaypointSE2 start, WaypointSE2 end) {

/** Use the start course and ignore the start pose for now */
GoToPosePosition c = new GoToPosePosition(
m_log, m_subsystem, start.course(), end, m_planner);
m_log, m_subsystem, start.course().toRotation(), end, m_planner);
c.setName(name);
return c;

Expand Down
67 changes: 67 additions & 0 deletions comp/src/main/java/org/team100/frc2025/Swerve/Auto/BigLoop.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package org.team100.frc2025.Swerve.Auto;

import java.util.List;
import java.util.function.Function;

import org.team100.lib.geometry.DirectionSE2;
import org.team100.lib.geometry.WaypointSE2;
import org.team100.lib.logging.LoggerFactory;
import org.team100.lib.subsystems.swerve.kinodynamics.SwerveKinodynamics;
import org.team100.lib.trajectory.Trajectory100;
import org.team100.lib.trajectory.TrajectoryPlanner;
import org.team100.lib.trajectory.timing.TimingConstraintFactory;

import edu.wpi.first.math.geometry.Pose2d;

/** big looping trajectory for testing */
public class BigLoop implements Function<Pose2d, Trajectory100> {
private final TrajectoryPlanner m_planner;

public BigLoop(
LoggerFactory log,
SwerveKinodynamics kinodynamics) {
m_planner = new TrajectoryPlanner(
new TimingConstraintFactory(kinodynamics).auto(log.type(this)));
}

@Override
public Trajectory100 apply(Pose2d p0) {
// field-relative
Pose2d p1 = new Pose2d(
p0.getX() + 2,
p0.getY() - 2,
p0.getRotation());
Pose2d p2 = new Pose2d(
p0.getX() + 4,
p0.getY(),
p0.getRotation());
Pose2d p3 = new Pose2d(
p0.getX() + 2,
p0.getY() + 2,
p0.getRotation());
List<WaypointSE2> waypoints = List.of(
new WaypointSE2(
p0,
new DirectionSE2(1, 0, 0),
1),
new WaypointSE2(
p1,
new DirectionSE2(1, 0, 0),
1),
new WaypointSE2(
p2,
new DirectionSE2(0, 1, 0),
1),
new WaypointSE2(
p3,
new DirectionSE2(-1, 0, 0),
1),
new WaypointSE2(
p0,
new DirectionSE2(-1, 0, 0),
1)
//
);
return m_planner.restToRest(waypoints);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@

import org.team100.lib.field.FieldConstants;
import org.team100.lib.field.FieldConstants.CoralStation;
import org.team100.lib.geometry.HolonomicPose2d;
import org.team100.lib.geometry.DirectionSE2;
import org.team100.lib.geometry.WaypointSE2;
import org.team100.lib.logging.LoggerFactory;
import org.team100.lib.subsystems.swerve.kinodynamics.SwerveKinodynamics;
import org.team100.lib.trajectory.Trajectory100;
Expand Down Expand Up @@ -51,9 +52,9 @@ public Trajectory100 apply(Pose2d currentPose) {
Rotation2d newInitialSpline = FieldConstants.calculateDeltaSpline(
courseToGoal, courseToGoal.rotateBy(Rotation2d.fromDegrees(-90)), scaleAdjust);

List<HolonomicPose2d> waypoints = new ArrayList<>();
waypoints.add(new HolonomicPose2d(currTranslation, currentPose.getRotation(), newInitialSpline));
waypoints.add(new HolonomicPose2d(goal.getTranslation(), goal.getRotation(), courseToGoal));
List<WaypointSE2> waypoints = new ArrayList<>();
waypoints.add(new WaypointSE2(currentPose, DirectionSE2.irrotational(newInitialSpline), 1));
waypoints.add(new WaypointSE2(goal, DirectionSE2.irrotational(courseToGoal), 1));

return m_planner.restToRest(waypoints);
}
Expand Down
Loading