打表完成
This commit is contained in:
@@ -9,7 +9,7 @@ public final class Constants {
|
|||||||
public static final double conveyorSpeed = 20;
|
public static final double conveyorSpeed = 20;
|
||||||
public static final Slot0Configs flyWheelSlot0Configs = new Slot0Configs()
|
public static final Slot0Configs flyWheelSlot0Configs = new Slot0Configs()
|
||||||
.withKP(0.0).withKI(0).withKD(0)
|
.withKP(0.0).withKI(0).withKD(0)
|
||||||
.withKV(0.1).withKA(0.0).withKS(0.15);
|
.withKV(0.0088).withKA(0.0).withKS(0.0);
|
||||||
|
|
||||||
public static final Slot0Configs conveyorSlot0Configs = new Slot0Configs()
|
public static final Slot0Configs conveyorSlot0Configs = new Slot0Configs()
|
||||||
.withKP(0.0).withKI(0).withKD(0)
|
.withKP(0.0).withKI(0).withKD(0)
|
||||||
|
|||||||
@@ -102,12 +102,10 @@ public class RobotContainer {
|
|||||||
private void configueShooter(){
|
private void configueShooter(){
|
||||||
shooterSubsystem.setDefaultCommand(shooterControls.defaultShooterCommand());
|
shooterSubsystem.setDefaultCommand(shooterControls.defaultShooterCommand());
|
||||||
|
|
||||||
controller.povLeft().onTrue(Commands.runOnce(() -> shooterControls.adjustFlywheelSpeedOffset(-5)));
|
controller.povLeft().onTrue(Commands.runOnce(() -> shooterControls.adjustFlywheelSpeedOffset(-1)));
|
||||||
controller.povRight().onTrue(Commands.runOnce(() -> shooterControls.adjustFlywheelSpeedOffset(5)));
|
controller.povRight().onTrue(Commands.runOnce(() -> shooterControls.adjustFlywheelSpeedOffset(1)));
|
||||||
controller.povUp().onTrue(Commands.runOnce(() -> shooterControls.adjustBackboardRateOffset(500)));
|
controller.povUp().onTrue(Commands.runOnce(() -> shooterControls.adjustBackboardRateOffset(100)));
|
||||||
controller.povDown().onTrue(Commands.runOnce(() -> shooterControls.adjustBackboardRateOffset(-500)));
|
controller.povDown().onTrue(Commands.runOnce(() -> shooterControls.adjustBackboardRateOffset(-100)));
|
||||||
|
|
||||||
controller.b().onTrue(shooterControls.resetBackboardCommand());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ====================== */
|
/* ====================== */
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import edu.wpi.first.wpilibj2.command.Commands;
|
|||||||
import edu.wpi.first.wpilibj2.command.button.CommandXboxController;
|
import edu.wpi.first.wpilibj2.command.button.CommandXboxController;
|
||||||
import frc.robot.Constants;
|
import frc.robot.Constants;
|
||||||
import frc.robot.subsystems.ShooterSubsystem;
|
import frc.robot.subsystems.ShooterSubsystem;
|
||||||
import frc.robot.subsystems.ShooterSubsystem.Mode;
|
|
||||||
|
|
||||||
public class ShooterControls {
|
public class ShooterControls {
|
||||||
private final ShooterSubsystem shooterSubsystem;
|
private final ShooterSubsystem shooterSubsystem;
|
||||||
@@ -20,7 +19,7 @@ public class ShooterControls {
|
|||||||
this.shooterSubsystem = shooterSubsystem;
|
this.shooterSubsystem = shooterSubsystem;
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
|
|
||||||
shooterControlTable = NetworkTableInstance.getDefault().getTable("shooterControl");
|
shooterControlTable = NetworkTableInstance.getDefault().getTable("ShooterControl");
|
||||||
}
|
}
|
||||||
|
|
||||||
public Command defaultShooterCommand() {
|
public Command defaultShooterCommand() {
|
||||||
@@ -28,8 +27,12 @@ public class ShooterControls {
|
|||||||
double flywheelSpeed;
|
double flywheelSpeed;
|
||||||
double backboardPosition;
|
double backboardPosition;
|
||||||
double conveyorSpeed;
|
double conveyorSpeed;
|
||||||
flywheelSpeed = calculateFlywheelSpeedOnlywithOffset(30);
|
// flywheelSpeed = calculateFlywheelSpeedOnlywithOffset(60);
|
||||||
backboardPosition = calculateBackboardPositionOnlywithOffset(100);
|
var x = shooterSubsystem.getDistance();
|
||||||
|
flywheelSpeed = 0.6956596811733782*x*x*x*x*x*x*x-14.164408860183267*x*x*x*x*x*x+119.7115375240918*x*x*x*x*x-543.0984876677477*x*x*x*x+1425.1928543240738*x*x*x-2156.199296490315*x*x+1736.568139600292*x-516.097598057351;
|
||||||
|
flywheelSpeed += flywheelSpeedOffset;
|
||||||
|
backboardPosition = -122.11889023593778*x*x*x*x*x*x*x+2453.385583841308*x*x*x*x*x*x-20553.05413872581*x*x*x*x*x+92963.33175750206*x*x*x*x-244905.25916147238*x*x*x+375150.1363997868*x*x-308031.51715612336*x+104203.52690842684;
|
||||||
|
backboardPosition += backboardPositionOffset;
|
||||||
conveyorSpeed = Constants.Shooter.conveyorSpeed;
|
conveyorSpeed = Constants.Shooter.conveyorSpeed;
|
||||||
shooterControlTable.getEntry("flywheelTargetSpeed").setDouble(flywheelSpeed);
|
shooterControlTable.getEntry("flywheelTargetSpeed").setDouble(flywheelSpeed);
|
||||||
shooterControlTable.getEntry("conveyerTargetSpeed").setDouble(conveyorSpeed);
|
shooterControlTable.getEntry("conveyerTargetSpeed").setDouble(conveyorSpeed);
|
||||||
@@ -79,70 +82,71 @@ public class ShooterControls {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//打表参数
|
//打表参数
|
||||||
private static final double[][] FLYWHEEL_TABLE = {
|
// private static final double[][] FLYWHEEL_TABLE = {
|
||||||
{1.5, 0.42},
|
// {1.5, 0.42},
|
||||||
{2.0, 0.46},
|
// {2.0, 0.46},
|
||||||
{2.5, 0.51},
|
// {2.5, 0.51},
|
||||||
{3.0, 0.57},
|
// {3.0, 0.57},
|
||||||
{3.5, 0.64},
|
// {3.5, 0.64},
|
||||||
{4.0, 0.72}
|
// {4.0, 0.72}
|
||||||
};
|
// };
|
||||||
|
|
||||||
//线性插值函数
|
// //线性插值函数
|
||||||
private static double lerp(double x0, double y0, double x1, double y1, double x) {
|
// private static double lerp(double x0, double y0, double x1, double y1, double x) {
|
||||||
if (Math.abs(x1 - x0) < 1e-9) {
|
// if (Math.abs(x1 - x0) < 1e-9) {
|
||||||
return y0;
|
// return y0;
|
||||||
}
|
// }
|
||||||
double t = (x - x0) / (x1 - x0);
|
// double t = (x - x0) / (x1 - x0);
|
||||||
return y0 + t * (y1 - y0);
|
// return y0 + t * (y1 - y0);
|
||||||
}
|
// }
|
||||||
private double calculateFlywheelSpeedOnlywithOffset(double defaultSpeed) {
|
// private double calculateFlywheelSpeedOnlywithOffset(double defaultSpeed) {
|
||||||
return defaultSpeed + flywheelSpeedOffset;
|
// return defaultSpeed + flywheelSpeedOffset;
|
||||||
}
|
// }
|
||||||
private double calculateBackboardPositionOnlywithOffset(double defaultPosition) {
|
// private double calculateBackboardPositionOnlywithOffset(double defaultPosition) {
|
||||||
return defaultPosition + backboardPositionOffset;
|
// return defaultPosition + backboardPositionOffset;
|
||||||
}
|
// }
|
||||||
|
|
||||||
private double calculateFlywheelSpeed(double distance) {
|
|
||||||
// 小于最小距离:用第一个点
|
|
||||||
if (distance <= FLYWHEEL_TABLE[0][0]) {
|
|
||||||
return FLYWHEEL_TABLE[0][1] + flywheelSpeedOffset;
|
|
||||||
}
|
|
||||||
// 大于最大距离:用最后一个点
|
|
||||||
int last = FLYWHEEL_TABLE.length - 1;
|
|
||||||
if (distance >= FLYWHEEL_TABLE[last][0]) {
|
|
||||||
return FLYWHEEL_TABLE[last][1] + flywheelSpeedOffset;
|
|
||||||
}
|
|
||||||
// 查找区间并插值
|
|
||||||
for (int i = 0; i < FLYWHEEL_TABLE.length - 1; i++) {
|
|
||||||
double d0 = FLYWHEEL_TABLE[i][0];
|
|
||||||
double s0 = FLYWHEEL_TABLE[i][1];
|
|
||||||
double d1 = FLYWHEEL_TABLE[i + 1][0];
|
|
||||||
double s1 = FLYWHEEL_TABLE[i + 1][1];
|
|
||||||
if (distance >= d0 && distance <= d1) {
|
|
||||||
return lerp(d0, s0, d1, s1, distance) + flywheelSpeedOffset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private double calculateBackboardPosition(double distance) {
|
// private double calculateFlywheelSpeed(double distance) {
|
||||||
double BackboardPosition;
|
// // 小于最小距离:用第一个点
|
||||||
// 距离阈值(单位自己按distance进行修改)
|
// if (distance <= FLYWHEEL_TABLE[0][0]) {
|
||||||
final double DISTANCE_NEAR = 2.0; // 近距离阈值
|
// return FLYWHEEL_TABLE[0][1] + flywheelSpeedOffset;
|
||||||
final double DISTANCE_MID = 4.0; // 中距离阈值
|
// }
|
||||||
if (distance < DISTANCE_NEAR) {
|
// // 大于最大距离:用最后一个点
|
||||||
BackboardPosition = Constants.ShooterCalculation.positionNear;
|
// int last = FLYWHEEL_TABLE.length - 1;
|
||||||
}
|
// if (distance >= FLYWHEEL_TABLE[last][0]) {
|
||||||
else if (distance < DISTANCE_MID) {
|
// return FLYWHEEL_TABLE[last][1] + flywheelSpeedOffset;
|
||||||
BackboardPosition = Constants.ShooterCalculation.positionMid;
|
// }
|
||||||
}
|
// // 查找区间并插值
|
||||||
else {
|
// for (int i = 0; i < FLYWHEEL_TABLE.length - 1; i++) {
|
||||||
BackboardPosition = Constants.ShooterCalculation.postionFar;
|
// double d0 = FLYWHEEL_TABLE[i][0];
|
||||||
}
|
// double s0 = FLYWHEEL_TABLE[i][1];
|
||||||
BackboardPosition += backboardPositionOffset;
|
// double d1 = FLYWHEEL_TABLE[i + 1][0];
|
||||||
return BackboardPosition;
|
// double s1 = FLYWHEEL_TABLE[i + 1][1];
|
||||||
}
|
// if (distance >= d0 && distance <= d1) {
|
||||||
|
// return lerp(d0, s0, d1, s1, distance) + flywheelSpeedOffset;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private double calculateBackboardPosition(double distance) {
|
||||||
|
// double BackboardPosition;
|
||||||
|
// // 距离阈值(单位自己按distance进行修改)
|
||||||
|
// final double DISTANCE_NEAR = 2.0; // 近距离阈值
|
||||||
|
// final double DISTANCE_MID = 4.0; // 中距离阈值
|
||||||
|
// if (distance < DISTANCE_NEAR) {
|
||||||
|
// BackboardPosition = Constants.ShooterCalculation.positionNear;
|
||||||
|
// }
|
||||||
|
// else if (distance < DISTANCE_MID) {
|
||||||
|
// BackboardPosition = Constants.ShooterCalculation.positionMid;
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// BackboardPosition = Constants.ShooterCalculation.postionFar;
|
||||||
|
// }
|
||||||
|
// BackboardPosition += backboardPositionOffset;
|
||||||
|
// return BackboardPosition;
|
||||||
|
// }
|
||||||
|
|
||||||
public void adjustFlywheelSpeedOffset(double offset) {
|
public void adjustFlywheelSpeedOffset(double offset) {
|
||||||
flywheelSpeedOffset += offset;
|
flywheelSpeedOffset += offset;
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ public class ShooterSubsystem extends SubsystemBase {
|
|||||||
shooterNetworkTable.getEntry("InalyzeBackboardMode").setString(currentBackboardInalyzeMode.name());
|
shooterNetworkTable.getEntry("InalyzeBackboardMode").setString(currentBackboardInalyzeMode.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
private double getDistance(){
|
public double getDistance(){
|
||||||
//获得车子距离Hub的距离
|
//获得车子距离Hub的距离
|
||||||
return NetworkTableInstance.getDefault().getTable("AutoControl").getEntry("distanceToHub").getDouble(0.0);
|
return NetworkTableInstance.getDefault().getTable("AutoControl").getEntry("distanceToHub").getDouble(0.0);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user