diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/DownsampledWriter.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/DownsampledWriter.java new file mode 100644 index 0000000..608e237 --- /dev/null +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/DownsampledWriter.java @@ -0,0 +1,20 @@ +package org.firstinspires.ftc.teamcode; + +import com.acmerobotics.roadrunner.ftc.FlightRecorder; + +public class DownsampledWriter { + public final String channel; + public final long maxPeriod; + private long nextWriteTimestamp = System.nanoTime(); + public DownsampledWriter(String channel, long maxPeriod) { + this.channel = channel; + this.maxPeriod = maxPeriod; + } + public void write(Object msg) { + long now = System.nanoTime(); + if (now >= nextWriteTimestamp) { + nextWriteTimestamp = now + maxPeriod; + FlightRecorder.write(channel, msg); + } + } +} diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/MecanumDrive.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/MecanumDrive.java index d9b93a0..a05c4f9 100644 --- a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/MecanumDrive.java +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/MecanumDrive.java @@ -38,6 +38,9 @@ import com.qualcomm.robotcore.hardware.IMU; import com.qualcomm.robotcore.hardware.VoltageSensor; import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit; +import org.firstinspires.ftc.teamcode.messages.DriveCommandMessage; +import org.firstinspires.ftc.teamcode.messages.MecanumEncodersMessage; +import org.firstinspires.ftc.teamcode.messages.PoseMessage; import java.lang.Math; import java.util.Arrays; @@ -47,6 +50,12 @@ import java.util.List; @Config public final class MecanumDrive { public static class Params { + // IMU orientation + public RevHubOrientationOnRobot.LogoFacingDirection logoFacingDirection = + RevHubOrientationOnRobot.LogoFacingDirection.UP; + public RevHubOrientationOnRobot.UsbFacingDirection usbFacingDirection = + RevHubOrientationOnRobot.UsbFacingDirection.FORWARD; + // drive model parameters public double inPerTick = 0; public double lateralInPerTick = 1; @@ -102,6 +111,10 @@ public final class MecanumDrive { private final LinkedList poseHistory = new LinkedList<>(); + private final DownsampledWriter estimatedPoseWriter = new DownsampledWriter("ESTIMATED_POSE", 50_000_000); + private final DownsampledWriter targetPoseWriter = new DownsampledWriter("TARGET_POSE", 50_000_000); + private final DownsampledWriter driveCommandWriter = new DownsampledWriter("DRIVE_COMMAND", 50_000_000); + public class DriveLocalizer implements Localizer { public final Encoder leftFront, leftBack, rightBack, rightFront; @@ -129,6 +142,9 @@ public final class MecanumDrive { PositionVelocityPair rightBackPosVel = rightBack.getPositionAndVelocity(); PositionVelocityPair rightFrontPosVel = rightFront.getPositionAndVelocity(); + FlightRecorder.write("MECANUM_ENCODERS", new MecanumEncodersMessage( + leftFrontPosVel, leftBackPosVel, rightBackPosVel, rightFrontPosVel)); + Rotation2d heading = Rotation2d.exp(imu.getRobotYawPitchRollAngles().getYaw(AngleUnit.RADIANS)); double headingDelta = heading.minus(lastHeading); @@ -186,8 +202,7 @@ public final class MecanumDrive { imu = hardwareMap.get(IMU.class, "imu"); IMU.Parameters parameters = new IMU.Parameters(new RevHubOrientationOnRobot( - RevHubOrientationOnRobot.LogoFacingDirection.UP, - RevHubOrientationOnRobot.UsbFacingDirection.FORWARD)); + PARAMS.logoFacingDirection, PARAMS.usbFacingDirection)); imu.initialize(parameters); voltageSensor = hardwareMap.voltageSensor.iterator().next(); @@ -261,6 +276,7 @@ public final class MecanumDrive { PARAMS.axialVelGain, PARAMS.lateralVelGain, PARAMS.headingVelGain ) .compute(txWorldTarget, pose, robotVelRobot); + driveCommandWriter.write(new DriveCommandMessage(command)); MecanumKinematics.WheelVelocities