- Superstructure 增加 INDEXING/HOLDING_NOTE 状态,实现完整状态流转: DEPLOYING_INTAKE -> INTAKING -> INDEXING -> HOLDING_NOTE -> SPINNING_UP -> AIMING -> READY_TO_SHOOT -> SHOOTING -> CLEANUP - canShoot 门控补全:atSpeed && isAimed && rotaterAtGoal && hasNote && 底盘近静止 (hasNote/静止门控均可在 Constants 中旁路) - 无传感器持球跟踪:INDEXING 完成置位、射击/EJECT 后清空, 未归零被拦下的 intake 不会误置持球 - DriveControls 在既有 hub 方位角计算处同步 setTargetHeading, 使 isAimed 门控与 AutoAimming 实际瞄准同源;自动阶段经 pushDistanceData 保持更新 - 移除 Superstructure 基于 limelight tx 的瞄准更新(符号错误且无目标时滞留旧值) - 背板回零命令下沉到 ShooterSubsystem,OperatorControls 不再直接操作电机 - ShooterSubsystem 清理旧别名与闭环遗留接口,背板独立控制请求 - 射表改为 InterpolatingDoubleTreeMap(Constants.Shooter.flywheelRpsByDistance) - IntakeRotater:未归零时 atGoal 一律 false,新增 blockedByNotZeroed 遥测; atGoal 容差改为非零占位值 - 修复 gradlew 缺少可执行权限 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YTEBmjtkz1ouCmn5yytFti
89 lines
2.3 KiB
Java
89 lines
2.3 KiB
Java
// 版权所有 (c) FIRST 和其他 WPILib 贡献者。
|
|
// 本项目为开源软件;你可以依据项目根目录中的 WPILib BSD license 文件
|
|
// 修改和/或分享本代码。
|
|
|
|
package frc.robot;
|
|
import edu.wpi.first.wpilibj.TimedRobot;
|
|
import edu.wpi.first.wpilibj2.command.Command;
|
|
import edu.wpi.first.wpilibj2.command.CommandScheduler;
|
|
|
|
public class Robot extends TimedRobot {
|
|
private Command m_autonomousCommand;
|
|
|
|
private final RobotContainer m_robotContainer;
|
|
|
|
public Robot() {
|
|
m_robotContainer = new RobotContainer();
|
|
}
|
|
|
|
@Override
|
|
public void robotPeriodic() {
|
|
CommandScheduler.getInstance().run();
|
|
m_robotContainer.tunerPeriodic();
|
|
m_robotContainer.dashboardPeriodic();
|
|
|
|
}
|
|
|
|
@Override
|
|
public void disabledInit() {
|
|
System.out.println("Robot disabledInit called");
|
|
// 进入 disabled 时强制所有重构后的机构回到安全状态,
|
|
// 即使上一周期还有手动或自动请求也不能继续动作。
|
|
m_robotContainer.superstructure.requestIdle();
|
|
m_robotContainer.shooterSubsystem.stopAll();
|
|
m_robotContainer.intakeRollerSubsystem.stop();
|
|
m_robotContainer.intakeRotaterSubsystem.stop();
|
|
m_robotContainer.conveyorSubsystem.stop();
|
|
}
|
|
|
|
@Override
|
|
public void disabledPeriodic() {}
|
|
|
|
@Override
|
|
public void disabledExit() {}
|
|
|
|
@Override
|
|
public void autonomousInit() {
|
|
m_autonomousCommand = m_robotContainer.getAutonomousCommand();
|
|
|
|
if (m_autonomousCommand != null) {
|
|
CommandScheduler.getInstance().schedule(m_autonomousCommand);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void autonomousPeriodic() {
|
|
m_robotContainer.driveControls.pushDistanceData();
|
|
}
|
|
|
|
@Override
|
|
public void autonomousExit() {}
|
|
|
|
@Override
|
|
public void teleopInit() {
|
|
if (m_autonomousCommand != null) {
|
|
CommandScheduler.getInstance().cancel(m_autonomousCommand);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void teleopPeriodic() {}
|
|
|
|
@Override
|
|
public void teleopExit() {}
|
|
|
|
@Override
|
|
public void testInit() {
|
|
CommandScheduler.getInstance().cancelAll();
|
|
}
|
|
|
|
@Override
|
|
public void testPeriodic() {}
|
|
|
|
@Override
|
|
public void testExit() {}
|
|
|
|
@Override
|
|
public void simulationPeriodic() {}
|
|
}
|