Skip to content

Commit c62d143

Browse files
committed
feat: create simulated hardware interface for arm subsystem
Signed-off-by: Dasun Abeykoon <[email protected]>
1 parent ac6bc44 commit c62d143

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
// Copyright (c) 2025 FRC 6423 - Ward Melville Iron Patriots
2+
// https://github.com/wmironpatriots
3+
//
4+
// Open Source Software; you can modify and/or share it under the terms of
5+
// MIT license file in the root directory of this project
6+
7+
package org.frc6423.robot.subsystems.arm;
8+
9+
import static edu.wpi.first.units.Units.KilogramSquareMeters;
10+
import static edu.wpi.first.units.Units.Meters;
11+
import static edu.wpi.first.units.Units.Radians;
12+
import static org.frc6423.robot.subsystems.arm.Arm.*;
13+
14+
import edu.wpi.first.math.MathUtil;
15+
import edu.wpi.first.math.controller.ProfiledPIDController;
16+
import edu.wpi.first.math.controller.SimpleMotorFeedforward;
17+
import edu.wpi.first.math.system.plant.DCMotor;
18+
import edu.wpi.first.math.system.plant.LinearSystemId;
19+
import edu.wpi.first.math.trajectory.TrapezoidProfile;
20+
import edu.wpi.first.wpilibj.simulation.DCMotorSim;
21+
import edu.wpi.first.wpilibj.simulation.SingleJointedArmSim;
22+
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
23+
24+
public class ArmIOSim implements ArmIO {
25+
private final DCMotor pivotModel = DCMotor.getKrakenX60Foc(1);
26+
// TODO stddevs
27+
private final SingleJointedArmSim pivotSim =
28+
new SingleJointedArmSim(
29+
pivotModel,
30+
PIVOT_GEARING,
31+
MOI.in(KilogramSquareMeters),
32+
LENGTH.in(Meters),
33+
0,
34+
MAX_ANGLE.in(Radians),
35+
false,
36+
0);
37+
38+
private final DCMotor rollerModel = DCMotor.getKrakenX60(1);
39+
// TODO stddevs
40+
private final DCMotorSim rollerSim =
41+
new DCMotorSim(
42+
LinearSystemId.createDCMotorSystem(pivotModel, 0.01, ROLLER_GEARING), rollerModel);
43+
44+
private double pivotAppliedVolts;
45+
private double rollerAppliedVolts;
46+
47+
private final ProfiledPIDController pivotFeedback =
48+
new ProfiledPIDController(10, 0.0, 0.0, new TrapezoidProfile.Constraints(3.5, 3.5));
49+
50+
private final SimpleMotorFeedforward rollerFeedforward =
51+
new SimpleMotorFeedforward(0.0, 0.0, 0.0);
52+
53+
public ArmIOSim() {
54+
SmartDashboard.putData(pivotFeedback);
55+
}
56+
57+
@Override
58+
public void periodic() {
59+
pivotSim.setInputVoltage(pivotAppliedVolts);
60+
rollerSim.setInputVoltage(rollerAppliedVolts);
61+
62+
pivotSim.update(0.02);
63+
rollerSim.update(0.02);
64+
}
65+
66+
@Override
67+
public double getPivotAngleRads() {
68+
return pivotSim.getAngleRads();
69+
}
70+
71+
@Override
72+
public double getPivotSetpointAngleRads() {
73+
return pivotFeedback.getSetpoint().position;
74+
}
75+
76+
@Override
77+
public double getPivotStatorCurrentAmps() {
78+
return pivotSim.getCurrentDrawAmps();
79+
}
80+
81+
@Override
82+
public double getRollerSpeedRpm() {
83+
return rollerSim.getAngularVelocityRPM();
84+
}
85+
86+
@Override
87+
public double getRollerStatorCurrentAmps() {
88+
return rollerSim.getCurrentDrawAmps();
89+
}
90+
91+
@Override
92+
public void resetPivotEncoder(double poseRads) {}
93+
94+
@Override
95+
public void runPivotVolts(double volts) {
96+
pivotAppliedVolts = MathUtil.clamp(volts, -12.0, 12.0);
97+
}
98+
99+
@Override
100+
public void runPivotAngle(double angleRads) {
101+
// Clamp value within range
102+
angleRads = MathUtil.clamp(angleRads, 0.0, MAX_ANGLE.in(Radians));
103+
104+
// Calculate fb output
105+
var fbOut = pivotFeedback.calculate(getPivotAngleRads(), angleRads);
106+
107+
runPivotVolts(fbOut);
108+
}
109+
110+
@Override
111+
public void runRollerVolts(double volts) {
112+
rollerAppliedVolts = MathUtil.clamp(volts, -12.0, 12.0);
113+
}
114+
115+
@Override
116+
public void runRollerSpeed(double speedRpm) {
117+
var ffOut = rollerFeedforward.calculate(speedRpm);
118+
runRollerVolts(ffOut);
119+
}
120+
121+
@Override
122+
public void close() throws Exception {}
123+
}

0 commit comments

Comments
 (0)