diff --git a/README.md b/README.md new file mode 100644 index 0000000..82411cc --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# FRC 6494 · 2026 Regional Offseason + +FRC 6494 的 2026 季后赛机器人 Java 项目。代码包含 Phoenix 6 Swerve 底盘、PathPlanner 自动程序、Limelight 定位,以及射击、进球、输送和灯带控制。 + +## 当前版本与分支 + +- 默认工作分支:`7.4`。 +- Gitea 地址:。 +- 原 GitHub 仓库:。 +- `main`、`1`、`季后赛季后赛季后赛` 和 `手搓` 保留为原有历史分支。当前季后赛开发以 `7.4` 为准。 +- 本次整理保留原提交历史,并纳入本地已有的 `New Auto.auto` 与 `New Path.path`。 + +## 开发环境 + +| 项目 | 配置版本 | +| --- | --- | +| Java 源码与目标版本 | 17 | +| WPILib / GradleRIO | 2026.2.1 | +| Gradle Wrapper | 8.11 | +| CTRE Phoenix 6 | 26.1.1 | +| PathPlannerLib | 2026.1.2 | +| 队号 | 6494 | + +建议使用 WPILib 2026 开发环境。第三方依赖由 `vendordeps/` 中的 JSON 定义,首次构建需要取得 Gradle 与相关依赖。队号保存在 `.wpilib/wpilib_preferences.json`。 + +## 获取与构建 + +```powershell +git clone --branch 7.4 https://git.6494.team/admin6494/FRC6494_2026Regional-offseason.git +cd FRC6494_2026Regional-offseason +.\gradlew.bat build +``` + +Linux/macOS 构建命令为 `./gradlew build`。 + +在具备桌面仿真依赖的 WPILib 环境中,可以运行: + +```powershell +.\gradlew.bat simulateJava +``` + +连接队伍机器人并确认队号、网络和机构参数后,可以通过 WPILib VS Code 的部署命令部署,或手动运行 `.\gradlew.bat deploy`。仿真不能替代真实传感器、机构动作和射击参数的实机验证。 + +## 代码结构 + +| 位置 | 用途 | +| --- | --- | +| `src/main/java/frc/robot/Robot.java` | 机器人模式切换与周期调度 | +| `src/main/java/frc/robot/RobotContainer.java` | 子系统组装、手柄绑定、自动程序选择 | +| `src/main/java/frc/robot/Constants.java` | CAN ID、机构参数、场地坐标和状态机阈值 | +| `src/main/java/frc/robot/controls/` | 驾驶控制、操作员意图和自动命令注册 | +| `src/main/java/frc/robot/subsystems/Superstructure.java` | 协调射击、进球、输送等机构的状态机 | +| `src/main/java/frc/robot/subsystems/` | 底盘、机构、Limelight 和 LED 子系统 | +| `src/main/java/frc/robot/generated/TunerConstants.java` | Phoenix Tuner X 底盘配置 | +| `src/main/java/frc/robot/tuning/` | 仪表盘调参入口 | +| `src/main/deploy/pathplanner/` | 自动程序、路径、导航网格和机器人配置 | +| `vendordeps/` | 第三方库版本与依赖描述 | +| `elastic-layout*.json` | Elastic 仪表盘布局 | +| `tuner-project.json` | Phoenix Tuner 项目配置 | + +自动程序通过 `Auto Chooser` 选择。PathPlanner NamedCommands 在 `controls/Autocommand.java` 中注册。`New Auto` 会引用 `New Path`;它们是已有的本地自动程序资源,使用前应检查路径与起始位姿。 + +## 当前手柄绑定 + +代码使用 0 号端口的单个 Xbox 手柄。以下绑定以 `RobotContainer.java` 为准: + +| 输入 | 动作 | +| --- | --- | +| 左摇杆 | 底盘平移 | +| 右摇杆 X | 底盘旋转输入 | +| Back | 重置场地坐标驾驶角度 | +| 右扳机 | 请求向 Hub 射击 | +| 右肩键 | 启用驾驶加速模式 | +| 左扳机 | 请求传球 | +| 左肩键 | 请求进球 | +| B | 请求反转排球 | +| Y / A | 手动抬起 / 放下进球机构 | +| 十字键左 / 右 | 飞轮目标速度偏移 -1 / +1 | +| 十字键上 / 下 | 背板目标位置偏移 +100 / -100 | +| Start | 运行背板复位命令 | + +主要射击和进球按钮受 Teleop 模式门控。射击准备、喂球及超时回退逻辑位于 `Superstructure.java`,相关阈值位于 `Constants.Superstructure`,应结合实机检查这些行为。 + +## 仓库维护 + +源码、自动路径、硬件配置、Gradle Wrapper 和仪表盘布局应提交到 Git。`.gitignore` 已排除 `build/`、`.gradle/`、`bin/`、`ctre_sim/` 等生成文件和缓存。 + +新克隆的仓库可以通过以下命令提交更新: + +```powershell +git status +git add <需要提交的文件> +git commit -m "说明本次修改" +git push origin 7.4 +``` + +原本连接 GitHub 的本地副本另加了名为 `gitea` 的远程地址,上传到 Gitea 时使用 `git push gitea 7.4`。公开仓库允许匿名浏览和克隆,推送需要具有写入权限的账号或访问令牌。 + +## 验证范围与许可 + +本次仓库整理检查了文件、Git 历史和上传内容,并验证远程仓库的分支与匿名克隆;未执行编译、桌面仿真或机器人部署。构建命令是开发使用说明,不代表本次已通过构建或实机测试。 + +保留项目中的 WPILib 声明与 `WPILib-License.md`。第三方库及外部代码应遵循各自原有的许可说明。 diff --git a/src/main/deploy/pathplanner/autos/New Auto.auto b/src/main/deploy/pathplanner/autos/New Auto.auto new file mode 100644 index 0000000..05e2d64 --- /dev/null +++ b/src/main/deploy/pathplanner/autos/New Auto.auto @@ -0,0 +1,31 @@ +{ + "version": "2025.0", + "command": { + "type": "sequential", + "data": { + "commands": [ + { + "type": "wait", + "data": { + "waitTime": 0.0 + } + }, + { + "type": "path", + "data": { + "pathName": "New Path" + } + }, + { + "type": "named", + "data": { + "name": "intaker_down" + } + } + ] + } + }, + "resetOdom": true, + "folder": null, + "choreoAuto": false +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/New Path.path b/src/main/deploy/pathplanner/paths/New Path.path new file mode 100644 index 0000000..6f7f3a8 --- /dev/null +++ b/src/main/deploy/pathplanner/paths/New Path.path @@ -0,0 +1,54 @@ +{ + "version": "2025.0", + "waypoints": [ + { + "anchor": { + "x": 3.5467141162514837, + "y": 4.051138790035587 + }, + "prevControl": null, + "nextControl": { + "x": 4.255399988299603, + "y": 4.013414379701552 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 2.944199288256229, + "y": 4.051138790035587 + }, + "prevControl": { + "x": 2.694910022767602, + "y": 4.069976574197767 + }, + "nextControl": null, + "isLocked": false, + "linkedName": null + } + ], + "rotationTargets": [], + "constraintZones": [], + "pointTowardsZones": [], + "eventMarkers": [], + "globalConstraints": { + "maxVelocity": 2.0, + "maxAcceleration": 4.0, + "maxAngularVelocity": 360.0, + "maxAngularAcceleration": 720.0, + "nominalVoltage": 12.0, + "unlimited": false + }, + "goalEndState": { + "velocity": 0, + "rotation": 0.0 + }, + "reversed": false, + "folder": null, + "idealStartingState": { + "velocity": 0, + "rotation": 0.0 + }, + "useDefaultConstraints": true +} \ No newline at end of file