From b89106198ef6a8e89bc858b2b3aae4f8beab17a1 Mon Sep 17 00:00:00 2001 From: BenG49 <64862590+BenG49@users.noreply.github.com> Date: Tue, 9 Apr 2024 16:00:23 -0400 Subject: [PATCH] New Top Ferry Auton (#104) * added HGFED Ferry auton * FERRY PATHS AUTON FERRY PATHS * Actually finished ferry autons * Add CHGFEDJerk.java * move to ferry folder * CHGFEDJerk working in sim * Edit ferry path auton to not shoot every shot * Remove uppercase To * Delete unused new path * Rename paths in robot container * Revert CShoot to H path * Jerk and Ferry path fixed * revert intake to blue * update jerk name (doesnt score C) * Made F to Ferry Shot not hit stage * wrote bottom ferry auton (not sure where its shooting) * intake is solid now * BottomFerry now aligns to amp zone * revert intake color change * Remove navgrid * add paths to prep for TopFerry Co-authored-by: Richie Xue * Moved ferry shot positions closer to wing line; added a new path for F to Shoot that goes under stage and between B + C. * TopFerry * adding the shoot to alignment * Clean up + organize paths * Add new top ferry auton paths * Change starting pose of NTF, change path folders * Write Top Ferry auton * Rename top ferry auton for merge * Make robot not stop to shoot * Delete a ton of stuff, remove everything but top ferry autos from this branch * Remove auton configs * Remove autos, fix F to Shoot, separate non-moving and moving shot ferry commands * Revert linked F pose * Delete amp zone align command * Lower shooter speeds --------- Co-authored-by: BrianZ60 Co-authored-by: Edgar Ganahl Co-authored-by: Keobkeig Co-authored-by: Awang70 <148587179+Awang70@users.noreply.github.com> Co-authored-by: hahafoot Co-authored-by: Ivan Chen Co-authored-by: Prog694 --- .pathplanner/settings.json | 3 +- .../deploy/pathplanner/autos/4.5 ADEF.auto | 55 ---- .../autos/{3 ADE.auto => DEF Ferry.auto} | 16 +- .../pathplanner/autos/{2 DE.auto => NTF.auto} | 16 +- src/main/deploy/pathplanner/navgrid.json | 2 +- .../pathplanner/paths/D to Ferry Shot.path | 10 +- .../pathplanner/paths/E to Ferry Shot.path | 52 ++++ .../pathplanner/paths/F to Shoot (HGF).path | 2 +- ...(ADEF).path => F to Shoot (TopFerry).path} | 33 +- .../pathplanner/paths/Ferry Shot to E.path | 10 +- ...Shoot (ADEF).path => Ferry Shot to F.path} | 26 +- .../pathplanner/paths/GShoot to F (HGF).path | 2 +- .../deploy/pathplanner/paths/NTF D To E.path | 86 ++++++ .../deploy/pathplanner/paths/NTF E To F.path | 86 ++++++ .../pathplanner/paths/NTF F To Shoot.path | 52 ++++ .../pathplanner/paths/NTF Start To D.path | 86 ++++++ .../paths/Top Start Ferry Path.path | 229 ++++++++++++++ .../com/stuypulse/robot/RobotContainer.java | 23 +- .../commands/auton/ADE/ThreePieceADE.java | 52 ---- .../TwoPieceDE.java => Ferry/TopFerry.java} | 39 ++- .../TopFerryMovingShot.java} | 34 +- .../commands/auton/FollowPathFerryIntake.java | 42 +++ .../stuypulse/robot/constants/Settings.java | 3 +- .../subsystems/leds/instructions/LED694.java | 2 - .../util/FollowPathPointAmpZoneCommand.java | 291 ++++++++++++++++++ .../robot/util/IntakeVisualizer.java | 1 - 26 files changed, 1048 insertions(+), 205 deletions(-) delete mode 100644 src/main/deploy/pathplanner/autos/4.5 ADEF.auto rename src/main/deploy/pathplanner/autos/{3 ADE.auto => DEF Ferry.auto} (72%) rename src/main/deploy/pathplanner/autos/{2 DE.auto => NTF.auto} (61%) create mode 100644 src/main/deploy/pathplanner/paths/E to Ferry Shot.path rename src/main/deploy/pathplanner/paths/{Shoot to F (ADEF).path => F to Shoot (TopFerry).path} (54%) rename src/main/deploy/pathplanner/paths/{F to Shoot (ADEF).path => Ferry Shot to F.path} (62%) create mode 100644 src/main/deploy/pathplanner/paths/NTF D To E.path create mode 100644 src/main/deploy/pathplanner/paths/NTF E To F.path create mode 100644 src/main/deploy/pathplanner/paths/NTF F To Shoot.path create mode 100644 src/main/deploy/pathplanner/paths/NTF Start To D.path create mode 100644 src/main/deploy/pathplanner/paths/Top Start Ferry Path.path delete mode 100644 src/main/java/com/stuypulse/robot/commands/auton/ADE/ThreePieceADE.java rename src/main/java/com/stuypulse/robot/commands/auton/{DE/TwoPieceDE.java => Ferry/TopFerry.java} (52%) rename src/main/java/com/stuypulse/robot/commands/auton/{ADEF/FourPieceADEF.java => Ferry/TopFerryMovingShot.java} (54%) create mode 100644 src/main/java/com/stuypulse/robot/commands/auton/FollowPathFerryIntake.java create mode 100644 src/main/java/com/stuypulse/robot/util/FollowPathPointAmpZoneCommand.java diff --git a/.pathplanner/settings.json b/.pathplanner/settings.json index 9813a67b..55e9b3f1 100644 --- a/.pathplanner/settings.json +++ b/.pathplanner/settings.json @@ -5,7 +5,8 @@ "pathFolders": [ "ABCDE", "HGF", - "Tests" + "Tests", + "Top Ferry" ], "autoFolders": [], "defaultMaxVel": 4.5, diff --git a/src/main/deploy/pathplanner/autos/4.5 ADEF.auto b/src/main/deploy/pathplanner/autos/4.5 ADEF.auto deleted file mode 100644 index 7d9d6c98..00000000 --- a/src/main/deploy/pathplanner/autos/4.5 ADEF.auto +++ /dev/null @@ -1,55 +0,0 @@ -{ - "version": 1.0, - "startingPose": null, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "Preload to A" - } - }, - { - "type": "path", - "data": { - "pathName": "A to D" - } - }, - { - "type": "path", - "data": { - "pathName": "D to Shoot" - } - }, - { - "type": "path", - "data": { - "pathName": "Shoot to E" - } - }, - { - "type": "path", - "data": { - "pathName": "E to Shoot" - } - }, - { - "type": "path", - "data": { - "pathName": "Shoot to F (ADEF)" - } - }, - { - "type": "path", - "data": { - "pathName": "F to Shoot (ADEF)" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/autos/3 ADE.auto b/src/main/deploy/pathplanner/autos/DEF Ferry.auto similarity index 72% rename from src/main/deploy/pathplanner/autos/3 ADE.auto rename to src/main/deploy/pathplanner/autos/DEF Ferry.auto index 5d155fe6..37a921d7 100644 --- a/src/main/deploy/pathplanner/autos/3 ADE.auto +++ b/src/main/deploy/pathplanner/autos/DEF Ferry.auto @@ -8,31 +8,37 @@ { "type": "path", "data": { - "pathName": "Preload to A" + "pathName": "NTF Start To D" } }, { "type": "path", "data": { - "pathName": "A to D" + "pathName": "D to Ferry Shot" } }, { "type": "path", "data": { - "pathName": "D to Ferry Shot" + "pathName": "Ferry Shot to E" } }, { "type": "path", "data": { - "pathName": "Ferry Shot to E" + "pathName": "E to Ferry Shot" + } + }, + { + "type": "path", + "data": { + "pathName": "Ferry Shot to F" } }, { "type": "path", "data": { - "pathName": "E to Shoot" + "pathName": "F to Shoot (TopFerry)" } } ] diff --git a/src/main/deploy/pathplanner/autos/2 DE.auto b/src/main/deploy/pathplanner/autos/NTF.auto similarity index 61% rename from src/main/deploy/pathplanner/autos/2 DE.auto rename to src/main/deploy/pathplanner/autos/NTF.auto index 4e9f9c72..7b6036a4 100644 --- a/src/main/deploy/pathplanner/autos/2 DE.auto +++ b/src/main/deploy/pathplanner/autos/NTF.auto @@ -1,6 +1,12 @@ { "version": 1.0, - "startingPose": null, + "startingPose": { + "position": { + "x": 2.157525588199325, + "y": 7.431149973519566 + }, + "rotation": 40.419189934887385 + }, "command": { "type": "sequential", "data": { @@ -8,25 +14,25 @@ { "type": "path", "data": { - "pathName": "Preload Shot to D" + "pathName": "NTF Start To D" } }, { "type": "path", "data": { - "pathName": "D to Ferry Shot" + "pathName": "NTF D To E" } }, { "type": "path", "data": { - "pathName": "Ferry Shot to E" + "pathName": "NTF E To F" } }, { "type": "path", "data": { - "pathName": "E to Shoot" + "pathName": "NTF F To Shoot" } } ] diff --git a/src/main/deploy/pathplanner/navgrid.json b/src/main/deploy/pathplanner/navgrid.json index ffac15ee..bab0da93 100644 --- a/src/main/deploy/pathplanner/navgrid.json +++ b/src/main/deploy/pathplanner/navgrid.json @@ -1 +1 @@ -{"field_size":{"x":16.54,"y":8.21},"nodeSizeMeters":0.1,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true],[true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file +{"field_size":{"x":16.54,"y":8.21},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/D to Ferry Shot.path b/src/main/deploy/pathplanner/paths/D to Ferry Shot.path index 88ce0d4f..dc539c9c 100644 --- a/src/main/deploy/pathplanner/paths/D to Ferry Shot.path +++ b/src/main/deploy/pathplanner/paths/D to Ferry Shot.path @@ -16,12 +16,12 @@ }, { "anchor": { - "x": 5.135414608792181, - "y": 6.653128792368697 + "x": 5.499492913428859, + "y": 6.563657142562062 }, "prevControl": { - "x": 5.5734337811268215, - "y": 6.740245674935794 + "x": 5.937512085763499, + "y": 6.650774025129159 }, "nextControl": null, "isLocked": false, @@ -43,7 +43,7 @@ "rotateFast": false }, "reversed": false, - "folder": "ABCDE", + "folder": "Top Ferry", "previewStartingState": { "rotation": 0, "velocity": 0 diff --git a/src/main/deploy/pathplanner/paths/E to Ferry Shot.path b/src/main/deploy/pathplanner/paths/E to Ferry Shot.path new file mode 100644 index 00000000..c868f566 --- /dev/null +++ b/src/main/deploy/pathplanner/paths/E to Ferry Shot.path @@ -0,0 +1,52 @@ +{ + "version": 1.0, + "waypoints": [ + { + "anchor": { + "x": 8.17, + "y": 5.84 + }, + "prevControl": null, + "nextControl": { + "x": 7.901123246690937, + "y": 5.852924298441191 + }, + "isLocked": false, + "linkedName": "E" + }, + { + "anchor": { + "x": 5.499492913428859, + "y": 6.563657142562062 + }, + "prevControl": { + "x": 5.767026853498151, + "y": 6.480854711709423 + }, + "nextControl": null, + "isLocked": false, + "linkedName": "Ferry Shot" + } + ], + "rotationTargets": [], + "constraintZones": [], + "eventMarkers": [], + "globalConstraints": { + "maxVelocity": 5.0, + "maxAcceleration": 4.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + }, + "goalEndState": { + "velocity": 0, + "rotation": -4.860211087167981, + "rotateFast": false + }, + "reversed": false, + "folder": "Top Ferry", + "previewStartingState": { + "rotation": 0, + "velocity": 0 + }, + "useDefaultConstraints": true +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/F to Shoot (HGF).path b/src/main/deploy/pathplanner/paths/F to Shoot (HGF).path index 6daea284..c33ca1af 100644 --- a/src/main/deploy/pathplanner/paths/F to Shoot (HGF).path +++ b/src/main/deploy/pathplanner/paths/F to Shoot (HGF).path @@ -9,7 +9,7 @@ "prevControl": null, "nextControl": { "x": 4.984199142187458, - "y": 5.4377818157345725 + "y": 5.437781815734572 }, "isLocked": false, "linkedName": "F" diff --git a/src/main/deploy/pathplanner/paths/Shoot to F (ADEF).path b/src/main/deploy/pathplanner/paths/F to Shoot (TopFerry).path similarity index 54% rename from src/main/deploy/pathplanner/paths/Shoot to F (ADEF).path rename to src/main/deploy/pathplanner/paths/F to Shoot (TopFerry).path index 68f36b13..53f52d98 100644 --- a/src/main/deploy/pathplanner/paths/Shoot to F (ADEF).path +++ b/src/main/deploy/pathplanner/paths/F to Shoot (TopFerry).path @@ -3,25 +3,25 @@ "waypoints": [ { "anchor": { - "x": 2.729397148609112, - "y": 6.342607879660204 + "x": 8.098576303634088, + "y": 4.038315859039126 }, "prevControl": null, "nextControl": { - "x": 6.23533205862708, - "y": 6.780508283238789 + "x": 5.1332173868051445, + "y": 3.478499327369026 }, "isLocked": false, - "linkedName": "Top Side Shoot" + "linkedName": null }, { "anchor": { - "x": 8.166630800854193, - "y": 4.34729277791889 + "x": 3.0013182155993943, + "y": 5.17790207339674 }, "prevControl": { - "x": 6.841112098890864, - "y": 6.429546609093219 + "x": 4.795439044581793, + "y": 5.480762401339618 }, "nextControl": null, "isLocked": false, @@ -32,18 +32,21 @@ "constraintZones": [], "eventMarkers": [], "globalConstraints": { - "maxVelocity": 5.55, - "maxAcceleration": 5.5, + "maxVelocity": 4.5, + "maxAcceleration": 4.0, "maxAngularVelocity": 540.0, "maxAngularAcceleration": 720.0 }, "goalEndState": { "velocity": 0, - "rotation": -66.116446904775, + "rotation": 0, "rotateFast": false }, "reversed": false, - "folder": "ABCDE", - "previewStartingState": null, - "useDefaultConstraints": false + "folder": "Top Ferry", + "previewStartingState": { + "rotation": 0, + "velocity": 0 + }, + "useDefaultConstraints": true } \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/Ferry Shot to E.path b/src/main/deploy/pathplanner/paths/Ferry Shot to E.path index 40d4906c..5579c457 100644 --- a/src/main/deploy/pathplanner/paths/Ferry Shot to E.path +++ b/src/main/deploy/pathplanner/paths/Ferry Shot to E.path @@ -3,13 +3,13 @@ "waypoints": [ { "anchor": { - "x": 5.135414608792181, - "y": 6.653128792368697 + "x": 5.499492913428859, + "y": 6.563657142562062 }, "prevControl": null, "nextControl": { - "x": 5.815009430944788, - "y": 6.526818220303108 + "x": 6.179087735581466, + "y": 6.437346570496473 }, "isLocked": false, "linkedName": "Ferry Shot" @@ -43,7 +43,7 @@ "rotateFast": false }, "reversed": false, - "folder": "ABCDE", + "folder": "Top Ferry", "previewStartingState": { "rotation": 0, "velocity": 0 diff --git a/src/main/deploy/pathplanner/paths/F to Shoot (ADEF).path b/src/main/deploy/pathplanner/paths/Ferry Shot to F.path similarity index 62% rename from src/main/deploy/pathplanner/paths/F to Shoot (ADEF).path rename to src/main/deploy/pathplanner/paths/Ferry Shot to F.path index 2aba7b75..9e7f1abf 100644 --- a/src/main/deploy/pathplanner/paths/F to Shoot (ADEF).path +++ b/src/main/deploy/pathplanner/paths/Ferry Shot to F.path @@ -3,37 +3,37 @@ "waypoints": [ { "anchor": { - "x": 8.054038020113078, - "y": 4.244082728906199 + "x": 5.499492913428859, + "y": 6.563657142562062 }, "prevControl": null, "nextControl": { - "x": 7.772039976857732, - "y": 6.730308751728615 + "x": 6.7801243426560935, + "y": 6.476519652113379 }, "isLocked": false, - "linkedName": null + "linkedName": "Ferry Shot" }, { "anchor": { - "x": 2.729397148609112, - "y": 6.342607879660204 + "x": 8.153314996088682, + "y": 3.8006001937929805 }, "prevControl": { - "x": 5.268376231196907, - "y": 7.065196991505094 + "x": 8.13811259531351, + "y": 3.7853977930178084 }, "nextControl": null, "isLocked": false, - "linkedName": "Top Side Shoot" + "linkedName": "F" } ], "rotationTargets": [], "constraintZones": [], "eventMarkers": [], "globalConstraints": { - "maxVelocity": 5.55, - "maxAcceleration": 5.5, + "maxVelocity": 4.5, + "maxAcceleration": 4.0, "maxAngularVelocity": 540.0, "maxAngularAcceleration": 720.0 }, @@ -43,7 +43,7 @@ "rotateFast": false }, "reversed": false, - "folder": "ABCDE", + "folder": "Top Ferry", "previewStartingState": null, "useDefaultConstraints": false } \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/GShoot to F (HGF).path b/src/main/deploy/pathplanner/paths/GShoot to F (HGF).path index 0d0c9fa3..24d5e4f3 100644 --- a/src/main/deploy/pathplanner/paths/GShoot to F (HGF).path +++ b/src/main/deploy/pathplanner/paths/GShoot to F (HGF).path @@ -21,7 +21,7 @@ }, "prevControl": { "x": 5.819658184786454, - "y": 5.066378211460128 + "y": 5.066378211460127 }, "nextControl": null, "isLocked": false, diff --git a/src/main/deploy/pathplanner/paths/NTF D To E.path b/src/main/deploy/pathplanner/paths/NTF D To E.path new file mode 100644 index 00000000..d2872017 --- /dev/null +++ b/src/main/deploy/pathplanner/paths/NTF D To E.path @@ -0,0 +1,86 @@ +{ + "version": 1.0, + "waypoints": [ + { + "anchor": { + "x": 8.2, + "y": 7.431149973519566 + }, + "prevControl": null, + "nextControl": { + "x": 6.950220644035909, + "y": 7.454635318013179 + }, + "isLocked": false, + "linkedName": "D" + }, + { + "anchor": { + "x": 5.704309839609262, + "y": 6.646215229821953 + }, + "prevControl": { + "x": 5.704309839609262, + "y": 7.396215229821953 + }, + "nextControl": { + "x": 5.704309839609262, + "y": 5.896215229821953 + }, + "isLocked": false, + "linkedName": "Top Ferry Shoot" + }, + { + "anchor": { + "x": 8.17, + "y": 5.84 + }, + "prevControl": { + "x": 6.920699524719652, + "y": 5.881812946132679 + }, + "nextControl": null, + "isLocked": false, + "linkedName": "E" + } + ], + "rotationTargets": [ + { + "waypointRelativePos": 1, + "rotationDegrees": -5.0, + "rotateFast": false + } + ], + "constraintZones": [ + { + "name": "Shoot Slow Down", + "minWaypointRelativePos": 0.5, + "maxWaypointRelativePos": 1.5, + "constraints": { + "maxVelocity": 2.0, + "maxAcceleration": 2.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + } + } + ], + "eventMarkers": [], + "globalConstraints": { + "maxVelocity": 4.5, + "maxAcceleration": 5.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + }, + "goalEndState": { + "velocity": 0, + "rotation": 0, + "rotateFast": false + }, + "reversed": false, + "folder": "Top Ferry", + "previewStartingState": { + "rotation": 0, + "velocity": 0 + }, + "useDefaultConstraints": false +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/NTF E To F.path b/src/main/deploy/pathplanner/paths/NTF E To F.path new file mode 100644 index 00000000..03cb01d0 --- /dev/null +++ b/src/main/deploy/pathplanner/paths/NTF E To F.path @@ -0,0 +1,86 @@ +{ + "version": 1.0, + "waypoints": [ + { + "anchor": { + "x": 8.17, + "y": 5.84 + }, + "prevControl": null, + "nextControl": { + "x": 6.621010550777611, + "y": 6.341337932241838 + }, + "isLocked": false, + "linkedName": "E" + }, + { + "anchor": { + "x": 5.704309839609262, + "y": 6.646215229821953 + }, + "prevControl": { + "x": 5.704309839609262, + "y": 7.201555871573595 + }, + "nextControl": { + "x": 5.704309839609262, + "y": 6.274418986876841 + }, + "isLocked": false, + "linkedName": "Top Ferry Shoot" + }, + { + "anchor": { + "x": 8.153314996088682, + "y": 3.8006001937929805 + }, + "prevControl": { + "x": 7.424255376791419, + "y": 4.810087379302906 + }, + "nextControl": null, + "isLocked": false, + "linkedName": "F" + } + ], + "rotationTargets": [ + { + "waypointRelativePos": 1.0, + "rotationDegrees": -5.0, + "rotateFast": false + } + ], + "constraintZones": [ + { + "name": "Shoot Slow Down", + "minWaypointRelativePos": 0.5, + "maxWaypointRelativePos": 1.4, + "constraints": { + "maxVelocity": 2.0, + "maxAcceleration": 2.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + } + } + ], + "eventMarkers": [], + "globalConstraints": { + "maxVelocity": 4.5, + "maxAcceleration": 4.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + }, + "goalEndState": { + "velocity": 0, + "rotation": -42.70101202011713, + "rotateFast": false + }, + "reversed": false, + "folder": "Top Ferry", + "previewStartingState": { + "rotation": 0, + "velocity": 0 + }, + "useDefaultConstraints": true +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/NTF F To Shoot.path b/src/main/deploy/pathplanner/paths/NTF F To Shoot.path new file mode 100644 index 00000000..e89558af --- /dev/null +++ b/src/main/deploy/pathplanner/paths/NTF F To Shoot.path @@ -0,0 +1,52 @@ +{ + "version": 1.0, + "waypoints": [ + { + "anchor": { + "x": 8.153314996088682, + "y": 3.8006001937929805 + }, + "prevControl": null, + "nextControl": { + "x": 6.359904421451601, + "y": 3.8006001937929805 + }, + "isLocked": false, + "linkedName": "F" + }, + { + "anchor": { + "x": 3.797990853156728, + "y": 5.5742556229307345 + }, + "prevControl": { + "x": 4.748197053902788, + "y": 4.396886976553901 + }, + "nextControl": null, + "isLocked": false, + "linkedName": null + } + ], + "rotationTargets": [], + "constraintZones": [], + "eventMarkers": [], + "globalConstraints": { + "maxVelocity": 4.5, + "maxAcceleration": 4.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + }, + "goalEndState": { + "velocity": 0, + "rotation": 0, + "rotateFast": false + }, + "reversed": false, + "folder": "Top Ferry", + "previewStartingState": { + "rotation": 0, + "velocity": 0 + }, + "useDefaultConstraints": true +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/NTF Start To D.path b/src/main/deploy/pathplanner/paths/NTF Start To D.path new file mode 100644 index 00000000..26c9c6d0 --- /dev/null +++ b/src/main/deploy/pathplanner/paths/NTF Start To D.path @@ -0,0 +1,86 @@ +{ + "version": 1.0, + "waypoints": [ + { + "anchor": { + "x": 2.157525588199325, + "y": 7.431149973519566 + }, + "prevControl": null, + "nextControl": { + "x": 2.454150556449261, + "y": 7.669611191074234 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 3.2894512177913247, + "y": 7.63772178007319 + }, + "prevControl": { + "x": 2.4811110640739797, + "y": 7.650905111995409 + }, + "nextControl": { + "x": 5.2891852828270185, + "y": 7.6051078392534786 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 8.2, + "y": 7.431149973519566 + }, + "prevControl": { + "x": 6.422230165687514, + "y": 7.5866846803802686 + }, + "nextControl": null, + "isLocked": false, + "linkedName": "D" + } + ], + "rotationTargets": [ + { + "waypointRelativePos": 1.0, + "rotationDegrees": 0.0, + "rotateFast": true + } + ], + "constraintZones": [ + { + "name": "Speed Up", + "minWaypointRelativePos": 1.0, + "maxWaypointRelativePos": 2.0, + "constraints": { + "maxVelocity": 4.5, + "maxAcceleration": 9.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + } + } + ], + "eventMarkers": [], + "globalConstraints": { + "maxVelocity": 4.5, + "maxAcceleration": 4.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + }, + "goalEndState": { + "velocity": 0, + "rotation": 0, + "rotateFast": false + }, + "reversed": false, + "folder": "Top Ferry", + "previewStartingState": { + "rotation": 47.48005904226506, + "velocity": 0 + }, + "useDefaultConstraints": true +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/Top Start Ferry Path.path b/src/main/deploy/pathplanner/paths/Top Start Ferry Path.path new file mode 100644 index 00000000..329bac15 --- /dev/null +++ b/src/main/deploy/pathplanner/paths/Top Start Ferry Path.path @@ -0,0 +1,229 @@ +{ + "version": 1.0, + "waypoints": [ + { + "anchor": { + "x": 1.3753858316568086, + "y": 6.987029802781394 + }, + "prevControl": null, + "nextControl": { + "x": 2.005066029073302, + "y": 7.562005176500588 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 2.8952677319281506, + "y": 7.761108236517688 + }, + "prevControl": { + "x": 2.2361546727081083, + "y": 7.7554181891607605 + }, + "nextControl": { + "x": 3.817873261226672, + "y": 7.7690729841130155 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 5.7249094112610255, + "y": 7.602713767951063 + }, + "prevControl": { + "x": 4.864639470302935, + "y": 7.659415530718085 + }, + "nextControl": { + "x": 6.516674798486316, + "y": 7.550527249491999 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 8.301730260866266, + "y": 7.445789150577014 + }, + "prevControl": { + "x": 8.313678145775345, + "y": 7.63623837784378 + }, + "nextControl": { + "x": 8.24637517237317, + "y": 6.563429309565925 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 5.7249094112610255, + "y": 6.805002483406168 + }, + "prevControl": { + "x": 5.69343476302527, + "y": 7.59883800279017 + }, + "nextControl": { + "x": 5.753003382922036, + "y": 6.096432448944511 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 8.301730260866266, + "y": 5.734503009672178 + }, + "prevControl": { + "x": 8.219952635760011, + "y": 6.151203185066669 + }, + "nextControl": { + "x": 8.435694456295597, + "y": 5.051884705955827 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 5.7249094112610255, + "y": 6.352379915998908 + }, + "prevControl": { + "x": 5.477035374184321, + "y": 6.99279289296221 + }, + "nextControl": { + "x": 5.899479212831038, + "y": 5.901357422357314 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 8.301730260866266, + "y": 4.119936902988549 + }, + "prevControl": { + "x": 8.285035442491555, + "y": 4.925564163371074 + }, + "nextControl": { + "x": 8.32397507446382, + "y": 3.046488373385819 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 3.970845859036553, + "y": 5.0810852558933846 + }, + "prevControl": { + "x": 4.811471944704811, + "y": 4.954986120092756 + }, + "nextControl": null, + "isLocked": false, + "linkedName": null + } + ], + "rotationTargets": [ + { + "waypointRelativePos": 2, + "rotationDegrees": 0, + "rotateFast": true + }, + { + "waypointRelativePos": 3, + "rotationDegrees": -15.0, + "rotateFast": true + }, + { + "waypointRelativePos": 4, + "rotationDegrees": 0, + "rotateFast": false + }, + { + "waypointRelativePos": 5, + "rotationDegrees": -20.0, + "rotateFast": false + }, + { + "waypointRelativePos": 6, + "rotationDegrees": -9.321846212057034, + "rotateFast": false + }, + { + "waypointRelativePos": 7, + "rotationDegrees": -61.384789390643405, + "rotateFast": false + } + ], + "constraintZones": [ + { + "name": "Initial Speed Up", + "minWaypointRelativePos": 1.0, + "maxWaypointRelativePos": 3.0, + "constraints": { + "maxVelocity": 5.0, + "maxAcceleration": 9.0, + "maxAngularVelocity": 720.0, + "maxAngularAcceleration": 1080.0 + } + }, + { + "name": "First Shoot Slow Down", + "minWaypointRelativePos": 3.6, + "maxWaypointRelativePos": 4.3999999999999995, + "constraints": { + "maxVelocity": 3.0, + "maxAcceleration": 2.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + } + }, + { + "name": "Second Shoot Slow Down", + "minWaypointRelativePos": 5.6, + "maxWaypointRelativePos": 6.3, + "constraints": { + "maxVelocity": 3.0, + "maxAcceleration": 2.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + } + } + ], + "eventMarkers": [], + "globalConstraints": { + "maxVelocity": 4.5, + "maxAcceleration": 4.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0 + }, + "goalEndState": { + "velocity": 0, + "rotation": -5.995773332403001, + "rotateFast": false + }, + "reversed": false, + "folder": "Top Ferry", + "previewStartingState": { + "rotation": 36.15609727734272, + "velocity": 0 + }, + "useDefaultConstraints": true +} \ No newline at end of file diff --git a/src/main/java/com/stuypulse/robot/RobotContainer.java b/src/main/java/com/stuypulse/robot/RobotContainer.java index 89bfb4d0..7cc50054 100644 --- a/src/main/java/com/stuypulse/robot/RobotContainer.java +++ b/src/main/java/com/stuypulse/robot/RobotContainer.java @@ -11,10 +11,9 @@ import com.stuypulse.robot.commands.*; import com.stuypulse.robot.commands.amper.*; import com.stuypulse.robot.commands.auton.*; -import com.stuypulse.robot.commands.auton.ADE.*; import com.stuypulse.robot.commands.auton.CBADE.*; import com.stuypulse.robot.commands.auton.CHFG.FivePieceCHGF; -import com.stuypulse.robot.commands.auton.DE.*; +import com.stuypulse.robot.commands.auton.Ferry.*; import com.stuypulse.robot.commands.auton.HGF.*; import com.stuypulse.robot.commands.auton.tests.*; import com.stuypulse.robot.commands.climber.*; @@ -304,9 +303,8 @@ private void configureOperatorBindings() { public void configureAutons() { autonChooser.addOption("Do Nothing", new DoNothingAuton()); - autonChooser.addOption("Mobility", new Mobility()); - + AutonConfig HGF = new AutonConfig("4 HGF", FourPieceHGF::new, "Start to H (HGF)", "H to HShoot (HGF)", "HShoot to G (HGF)", "G to Shoot (HGF)", "GShoot to F (HGF)", "F to Shoot (HGF)"); AutonConfig HGF_RED = new AutonConfig("4 HGF", FourPieceHGF::new, @@ -325,15 +323,16 @@ public void configureAutons() { AutonConfig CHGF = new AutonConfig("4.5 Piece CHGF", FivePieceCHGF::new, "Preload to C", "CShoot To H (CHGF)", "H to HShoot (HGF)", "HShoot to G (HGF)", "G to Shoot (HGF)", "GShoot to F (HGF)"); - // AutonConfig ADEF = new AutonConfig("4.5 Piece ADEF", FourPieceADEF::new, - // "Preload to A", "A to D", "D to Shoot", "Shoot to E", "E to Shoot", "Shoot To F (ADEF)", "F To Shoot (ADEF)"); + AutonConfig TopFerryMovingShot = new AutonConfig("Top Ferry", TopFerryMovingShot::new, + "NTF Start To D", "NTF D To E", "NTF E To F", "NTF F To Shoot"); + + AutonConfig TopFerry = new AutonConfig("Top Ferry", TopFerry::new, + "NTF Start To D", "D to Ferry Shot", "Ferry Shot to E", "E to Ferry Shot", "Ferry Shot to F", "F to Shoot (TopFerry)"); + + TopFerryMovingShot + .registerBlue(autonChooser) + .registerRed(autonChooser); - // AutonConfig ADE = new AutonConfig("3 ADE", ThreePieceADE::new, - // "Preload to A", "A to D", "D to Ferry Shot", "Ferry Shot to E", "E to Shoot"); - - // AutonConfig DE = new AutonConfig("2 DE", TwoPieceDE::new, - // "Preload Shot to D", "D to Ferry Shot", "Ferry Shot to E", "E to Shoot"); - // TODO: automatically choose red/blue HGF.registerDefaultBlue(autonChooser); HGF_RED.registerRed(autonChooser); diff --git a/src/main/java/com/stuypulse/robot/commands/auton/ADE/ThreePieceADE.java b/src/main/java/com/stuypulse/robot/commands/auton/ADE/ThreePieceADE.java deleted file mode 100644 index 3d33592b..00000000 --- a/src/main/java/com/stuypulse/robot/commands/auton/ADE/ThreePieceADE.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.stuypulse.robot.commands.auton.ADE; - -import com.pathplanner.lib.path.PathPlannerPath; -import com.stuypulse.robot.commands.DoNothingCommand; -import com.stuypulse.robot.commands.auton.FollowPathAlignAndShoot; -import com.stuypulse.robot.commands.auton.FollowPathAndIntake; -import com.stuypulse.robot.commands.conveyor.ConveyorShootRoutine; -import com.stuypulse.robot.commands.shooter.ShooterPodiumShot; -import com.stuypulse.robot.commands.swerve.SwerveDriveToPose; -import com.stuypulse.robot.commands.swerve.SwerveDriveToShoot; -import com.stuypulse.robot.constants.Settings.Auton; - -import edu.wpi.first.wpilibj2.command.ParallelCommandGroup; -import edu.wpi.first.wpilibj2.command.PrintCommand; -import edu.wpi.first.wpilibj2.command.SequentialCommandGroup; -import edu.wpi.first.wpilibj2.command.WaitCommand; - -public class ThreePieceADE extends SequentialCommandGroup { - - public ThreePieceADE(PathPlannerPath... paths) { - addCommands( - new ParallelCommandGroup( - new WaitCommand(Auton.SHOOTER_STARTUP_DELAY) - .andThen(new ShooterPodiumShot()), - - SwerveDriveToPose.speakerRelative(18) - ), - - // shoot preload - new ConveyorShootRoutine(), - - // intake A - new FollowPathAndIntake(paths[0]), - // shoot A - new SwerveDriveToShoot(), - new ConveyorShootRoutine(), - - // intake D - new FollowPathAndIntake(paths[1]), - // ferry D - new PrintCommand("Ferry D"), - new FollowPathAlignAndShoot(paths[2], new DoNothingCommand()), - - new PrintCommand("Intake E"), - // intake E - new FollowPathAndIntake(paths[3]), - // shoot E - new FollowPathAlignAndShoot(paths[4], SwerveDriveToShoot.withHigherDebounce()) - ); - } - -} diff --git a/src/main/java/com/stuypulse/robot/commands/auton/DE/TwoPieceDE.java b/src/main/java/com/stuypulse/robot/commands/auton/Ferry/TopFerry.java similarity index 52% rename from src/main/java/com/stuypulse/robot/commands/auton/DE/TwoPieceDE.java rename to src/main/java/com/stuypulse/robot/commands/auton/Ferry/TopFerry.java index eb03b48e..6ff7a855 100644 --- a/src/main/java/com/stuypulse/robot/commands/auton/DE/TwoPieceDE.java +++ b/src/main/java/com/stuypulse/robot/commands/auton/Ferry/TopFerry.java @@ -1,43 +1,52 @@ -package com.stuypulse.robot.commands.auton.DE; +package com.stuypulse.robot.commands.auton.Ferry; import com.pathplanner.lib.path.PathPlannerPath; -import com.stuypulse.robot.commands.DoNothingCommand; import com.stuypulse.robot.commands.auton.FollowPathAlignAndShoot; import com.stuypulse.robot.commands.auton.FollowPathAndIntake; import com.stuypulse.robot.commands.conveyor.ConveyorShootRoutine; import com.stuypulse.robot.commands.shooter.ShooterPodiumShot; +import com.stuypulse.robot.commands.shooter.ShooterSetRPM; import com.stuypulse.robot.commands.swerve.SwerveDriveToPose; import com.stuypulse.robot.commands.swerve.SwerveDriveToShoot; +import com.stuypulse.robot.constants.Settings; import com.stuypulse.robot.constants.Settings.Auton; +import com.stuypulse.robot.subsystems.swerve.SwerveDrive; import edu.wpi.first.wpilibj2.command.ParallelCommandGroup; import edu.wpi.first.wpilibj2.command.SequentialCommandGroup; import edu.wpi.first.wpilibj2.command.WaitCommand; -public class TwoPieceDE extends SequentialCommandGroup { - - public TwoPieceDE(PathPlannerPath... paths) { - addCommands( +public class TopFerry extends SequentialCommandGroup { + public TopFerry(PathPlannerPath... paths) { + addCommands ( new ParallelCommandGroup( new WaitCommand(Auton.SHOOTER_STARTUP_DELAY) .andThen(new ShooterPodiumShot()), - - SwerveDriveToPose.speakerRelative(18) + + SwerveDriveToPose.speakerRelative(45) ), - // shoot preload new ConveyorShootRoutine(), + new ShooterSetRPM(Settings.Shooter.WING_FERRY), + // intake D new FollowPathAndIntake(paths[0]), - // ferry D - new FollowPathAlignAndShoot(paths[1], new DoNothingCommand()), - // intake E + // shoot D, intake E + SwerveDrive.getInstance().followPathCommand(paths[1]), + new ConveyorShootRoutine(), new FollowPathAndIntake(paths[2]), - // shoot E - new FollowPathAlignAndShoot(paths[3], SwerveDriveToShoot.withHigherDebounce()) + + // shoot E, intake F + SwerveDrive.getInstance().followPathCommand(paths[3]), + new ConveyorShootRoutine(), + new ShooterPodiumShot(), + + new FollowPathAndIntake(paths[4]), + + // shoot F + new FollowPathAlignAndShoot(paths[5], new SwerveDriveToShoot()) ); } - } diff --git a/src/main/java/com/stuypulse/robot/commands/auton/ADEF/FourPieceADEF.java b/src/main/java/com/stuypulse/robot/commands/auton/Ferry/TopFerryMovingShot.java similarity index 54% rename from src/main/java/com/stuypulse/robot/commands/auton/ADEF/FourPieceADEF.java rename to src/main/java/com/stuypulse/robot/commands/auton/Ferry/TopFerryMovingShot.java index 1fba8209..972ffc61 100644 --- a/src/main/java/com/stuypulse/robot/commands/auton/ADEF/FourPieceADEF.java +++ b/src/main/java/com/stuypulse/robot/commands/auton/Ferry/TopFerryMovingShot.java @@ -1,44 +1,48 @@ -package com.stuypulse.robot.commands.auton.ADEF; +package com.stuypulse.robot.commands.auton.Ferry; import com.pathplanner.lib.path.PathPlannerPath; import com.stuypulse.robot.commands.auton.FollowPathAlignAndShoot; import com.stuypulse.robot.commands.auton.FollowPathAndIntake; +import com.stuypulse.robot.commands.auton.FollowPathFerryIntake; import com.stuypulse.robot.commands.conveyor.ConveyorShootRoutine; import com.stuypulse.robot.commands.shooter.ShooterPodiumShot; +import com.stuypulse.robot.commands.shooter.ShooterSetRPM; import com.stuypulse.robot.commands.swerve.SwerveDriveToPose; import com.stuypulse.robot.commands.swerve.SwerveDriveToShoot; +import com.stuypulse.robot.constants.Settings; import com.stuypulse.robot.constants.Settings.Auton; import edu.wpi.first.wpilibj2.command.ParallelCommandGroup; import edu.wpi.first.wpilibj2.command.SequentialCommandGroup; import edu.wpi.first.wpilibj2.command.WaitCommand; -public class FourPieceADEF extends SequentialCommandGroup{ - - public FourPieceADEF(PathPlannerPath... paths) { - addCommands( +public class TopFerryMovingShot extends SequentialCommandGroup { + public TopFerryMovingShot(PathPlannerPath... paths) { + addCommands ( new ParallelCommandGroup( new WaitCommand(Auton.SHOOTER_STARTUP_DELAY) .andThen(new ShooterPodiumShot()), - SwerveDriveToPose.speakerRelative(18) + SwerveDriveToPose.speakerRelative(45) ), new ConveyorShootRoutine(), + new ShooterSetRPM(Settings.Shooter.WING_FERRY), + + // intake D new FollowPathAndIntake(paths[0]), - new SwerveDriveToShoot(), - new ConveyorShootRoutine(), - new FollowPathAndIntake(paths[1]), - new FollowPathAlignAndShoot(paths[2], new SwerveDriveToShoot()), + // shoot D, intake E + new FollowPathFerryIntake(paths[1], 0.25), + + // shoot E, intake F + new FollowPathFerryIntake(paths[2], 0.25), - new FollowPathAndIntake(paths[3]), - new FollowPathAlignAndShoot(paths[4], new SwerveDriveToShoot()), + new ShooterPodiumShot(), - new FollowPathAndIntake(paths[5]), - new FollowPathAlignAndShoot(paths[6], new SwerveDriveToShoot()) + // shoot F + new FollowPathAlignAndShoot(paths[3], new SwerveDriveToShoot()) ); } - } diff --git a/src/main/java/com/stuypulse/robot/commands/auton/FollowPathFerryIntake.java b/src/main/java/com/stuypulse/robot/commands/auton/FollowPathFerryIntake.java new file mode 100644 index 00000000..f3ad87fa --- /dev/null +++ b/src/main/java/com/stuypulse/robot/commands/auton/FollowPathFerryIntake.java @@ -0,0 +1,42 @@ +package com.stuypulse.robot.commands.auton; + +import com.pathplanner.lib.path.PathPlannerPath; +import com.stuypulse.robot.commands.conveyor.ConveyorShoot; +import com.stuypulse.robot.commands.conveyor.ConveyorStop; +import com.stuypulse.robot.commands.intake.IntakeAcquire; +import com.stuypulse.robot.subsystems.swerve.SwerveDrive; + +import edu.wpi.first.math.MathUtil; +import edu.wpi.first.math.kinematics.ChassisSpeeds; +import edu.wpi.first.wpilibj2.command.SequentialCommandGroup; +import edu.wpi.first.wpilibj2.command.WaitCommand; + +public class FollowPathFerryIntake extends SequentialCommandGroup { + + public double getPathTime(PathPlannerPath path) { + return path.getTrajectory(new ChassisSpeeds(), path.getStartingDifferentialPose().getRotation()) + .getTotalTimeSeconds(); + } + + public FollowPathFerryIntake(PathPlannerPath path, double shootTimePercent) { + shootTimePercent = MathUtil.clamp(shootTimePercent, 0, 1); + + double pathTime = getPathTime(path); + double shootTime = pathTime * shootTimePercent; + + // make deadline group on intake if we need time + addCommands( + SwerveDrive.getInstance().followPathCommand(path), + + new SequentialCommandGroup( + new WaitCommand(shootTime), + new ConveyorShoot(), + // longer b/c current draw from driving? + new WaitCommand(0.6), + new ConveyorStop(), + new IntakeAcquire() + ) + ); + } + +} diff --git a/src/main/java/com/stuypulse/robot/constants/Settings.java b/src/main/java/com/stuypulse/robot/constants/Settings.java index 65845b36..7ac5bd48 100644 --- a/src/main/java/com/stuypulse/robot/constants/Settings.java +++ b/src/main/java/com/stuypulse/robot/constants/Settings.java @@ -325,12 +325,13 @@ public interface Shooter { ShooterSpeeds REVERSE = new ShooterSpeeds(-3000, -3000); - // xxx: determine ShooterSpeeds FERRY = new ShooterSpeeds( new SmartNumber("Shooter/Ferry Shooter RPM", 5500), 500, new SmartNumber("Shooter/Ferry Feeder RPM", 3000)); + ShooterSpeeds WING_FERRY = new ShooterSpeeds(4000, 3000); + double AT_RPM_EPSILON = 200; SmartNumber RPM_CHANGE_RC = new SmartNumber("Shooter/RPM Change RC", 0.2); diff --git a/src/main/java/com/stuypulse/robot/subsystems/leds/instructions/LED694.java b/src/main/java/com/stuypulse/robot/subsystems/leds/instructions/LED694.java index c54bd4b2..87b10b70 100644 --- a/src/main/java/com/stuypulse/robot/subsystems/leds/instructions/LED694.java +++ b/src/main/java/com/stuypulse/robot/subsystems/leds/instructions/LED694.java @@ -8,8 +8,6 @@ import java.util.ArrayList; - -import com.stuypulse.robot.constants.Settings; import com.stuypulse.robot.util.SLColor; import com.stuypulse.stuylib.util.StopWatch; diff --git a/src/main/java/com/stuypulse/robot/util/FollowPathPointAmpZoneCommand.java b/src/main/java/com/stuypulse/robot/util/FollowPathPointAmpZoneCommand.java new file mode 100644 index 00000000..72397606 --- /dev/null +++ b/src/main/java/com/stuypulse/robot/util/FollowPathPointAmpZoneCommand.java @@ -0,0 +1,291 @@ +package com.stuypulse.robot.util; + +import com.pathplanner.lib.controllers.PathFollowingController; +import com.pathplanner.lib.path.EventMarker; +import com.pathplanner.lib.path.PathPlannerPath; +import com.pathplanner.lib.path.PathPlannerTrajectory; +import com.pathplanner.lib.util.PPLibTelemetry; +import com.pathplanner.lib.util.PathPlannerLogging; +import com.pathplanner.lib.util.ReplanningConfig; +import com.stuypulse.robot.constants.Field; +import com.stuypulse.robot.constants.Settings.Swerve.Assist; +import com.stuypulse.stuylib.control.angle.AngleController; +import com.stuypulse.stuylib.control.angle.feedback.AnglePIDController; +import com.stuypulse.stuylib.math.Angle; +import com.stuypulse.stuylib.streams.numbers.IStream; +import com.stuypulse.stuylib.streams.numbers.filters.LowPassFilter; +import com.stuypulse.stuylib.util.AngleVelocity; + +import edu.wpi.first.math.Pair; +import edu.wpi.first.math.geometry.Pose2d; +import edu.wpi.first.math.geometry.Rotation2d; +import edu.wpi.first.math.geometry.Translation2d; +import edu.wpi.first.math.kinematics.ChassisSpeeds; +import edu.wpi.first.wpilibj.Timer; +import edu.wpi.first.wpilibj2.command.Command; +import edu.wpi.first.wpilibj2.command.Subsystem; +import java.util.*; +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** Base command for following a path */ +public class FollowPathPointAmpZoneCommand extends Command { + private final Timer timer = new Timer(); + private final PathPlannerPath originalPath; + private final Supplier poseSupplier; + private final Supplier speedsSupplier; + private final Consumer output; + private final PathFollowingController controller; + private final ReplanningConfig replanningConfig; + private final BooleanSupplier shouldFlipPath; + + // For event markers + private final Map currentEventCommands = new HashMap<>(); + private final List> untriggeredEvents = new ArrayList<>(); + + private PathPlannerPath path; + private PathPlannerTrajectory generatedTrajectory; + + // Heading Controller + + private final AngleController headingController; + private final IStream angleVelocity; + + /** + * Construct a base path following command + * + * @param path The path to follow + * @param poseSupplier Function that supplies the current field-relative pose of the robot + * @param speedsSupplier Function that supplies the current robot-relative chassis speeds + * @param outputRobotRelative Function that will apply the robot-relative output speeds of this + * command + * @param controller Path following controller that will be used to follow the path + * @param replanningConfig Path replanning configuration + * @param shouldFlipPath Should the path be flipped to the other side of the field? This will + * maintain a global blue alliance origin. + * @param requirements Subsystems required by this command, usually just the drive subsystem + */ + public FollowPathPointAmpZoneCommand( + PathPlannerPath path, + Supplier poseSupplier, + Supplier speedsSupplier, + Consumer outputRobotRelative, + PathFollowingController controller, + ReplanningConfig replanningConfig, + BooleanSupplier shouldFlipPath, + Subsystem... requirements) { + this.originalPath = path; + this.poseSupplier = poseSupplier; + this.speedsSupplier = speedsSupplier; + this.output = outputRobotRelative; + this.controller = controller; + this.replanningConfig = replanningConfig; + this.shouldFlipPath = shouldFlipPath; + + + headingController = new AnglePIDController(Assist.kP, Assist.kI, Assist.kD) + .setOutputFilter(x -> -x); + + AngleVelocity derivative = new AngleVelocity(); + + angleVelocity = IStream.create(() -> derivative.get(Angle.fromRotation2d(getTargetAngle()))) + .filtered(new LowPassFilter(Assist.ANGLE_DERIV_RC)) + // make angleVelocity contribute less once distance is less than REDUCED_FF_DIST + // so that angular velocity doesn't oscillate + .filtered(x -> x * Math.min(1, getDistanceToTarget() / Assist.REDUCED_FF_DIST)) + .filtered(x -> -x); + + Set driveRequirements = Set.of(requirements); + m_requirements.addAll(driveRequirements); + + for (EventMarker marker : this.originalPath.getEventMarkers()) { + var reqs = marker.getCommand().getRequirements(); + + if (!Collections.disjoint(driveRequirements, reqs)) { + throw new IllegalArgumentException( + "Events that are triggered during path following cannot require the drive subsystem"); + } + + m_requirements.addAll(reqs); + } + } + + public Rotation2d getTargetAngle() { + Translation2d robotPose = poseSupplier.get().getTranslation(); + Translation2d ampPose = Field.getAllianceAmpPose().getTranslation(); + return ampPose.minus(robotPose).getAngle() + .plus(Rotation2d.fromDegrees(180)); + } + + public double getDistanceToTarget() { + Translation2d robotPose = poseSupplier.get().getTranslation(); + Translation2d ampPose = Field.getAllianceSpeakerPose().getTranslation(); + return ampPose.getDistance(robotPose); + } + + @Override + public void initialize() { + if (shouldFlipPath.getAsBoolean() && !originalPath.preventFlipping) { + path = originalPath.flipPath(); + } else { + path = originalPath; + } + + Pose2d currentPose = poseSupplier.get(); + ChassisSpeeds currentSpeeds = speedsSupplier.get(); + + controller.reset(currentPose, currentSpeeds); + + ChassisSpeeds fieldSpeeds = + ChassisSpeeds.fromRobotRelativeSpeeds(currentSpeeds, currentPose.getRotation()); + Rotation2d currentHeading = + new Rotation2d(fieldSpeeds.vxMetersPerSecond, fieldSpeeds.vyMetersPerSecond); + Rotation2d targetHeading = + path.getPoint(1).position.minus(path.getPoint(0).position).getAngle(); + Rotation2d headingError = currentHeading.minus(targetHeading); + boolean onHeading = + Math.hypot(currentSpeeds.vxMetersPerSecond, currentSpeeds.vyMetersPerSecond) < 0.25 + || Math.abs(headingError.getDegrees()) < 30; + + if (!path.isChoreoPath() + && replanningConfig.enableInitialReplanning + && (currentPose.getTranslation().getDistance(path.getPoint(0).position) > 0.25 + || !onHeading)) { + replanPath(currentPose, currentSpeeds); + } else { + generatedTrajectory = path.getTrajectory(currentSpeeds, currentPose.getRotation()); + PathPlannerLogging.logActivePath(path); + PPLibTelemetry.setCurrentPath(path); + } + + // Initialize marker stuff + currentEventCommands.clear(); + untriggeredEvents.clear(); + untriggeredEvents.addAll(generatedTrajectory.getEventCommands()); + + timer.reset(); + timer.start(); + } + + @Override + public void execute() { + double currentTime = timer.get(); + PathPlannerTrajectory.State targetState = generatedTrajectory.sample(currentTime); + if (!controller.isHolonomic() && path.isReversed()) { + targetState = targetState.reverse(); + } + + Pose2d currentPose = poseSupplier.get(); + ChassisSpeeds currentSpeeds = speedsSupplier.get(); + + if (!path.isChoreoPath() && replanningConfig.enableDynamicReplanning) { + double previousError = Math.abs(controller.getPositionalError()); + double currentError = currentPose.getTranslation().getDistance(targetState.positionMeters); + + if (currentError >= replanningConfig.dynamicReplanningTotalErrorThreshold + || currentError - previousError + >= replanningConfig.dynamicReplanningErrorSpikeThreshold) { + replanPath(currentPose, currentSpeeds); + timer.reset(); + targetState = generatedTrajectory.sample(0); + } + } + + ChassisSpeeds targetSpeeds = controller.calculateRobotRelativeSpeeds(currentPose, targetState); + + targetSpeeds.omegaRadiansPerSecond += angleVelocity.get() + + headingController.update( + Angle.fromRotation2d(getTargetAngle()), + Angle.fromRotation2d(currentPose.getRotation())); + + double currentVel = + Math.hypot(currentSpeeds.vxMetersPerSecond, currentSpeeds.vyMetersPerSecond); + + PPLibTelemetry.setCurrentPose(currentPose); + PathPlannerLogging.logCurrentPose(currentPose); + + if (controller.isHolonomic()) { + PPLibTelemetry.setTargetPose(targetState.getTargetHolonomicPose()); + PathPlannerLogging.logTargetPose(targetState.getTargetHolonomicPose()); + } else { + PPLibTelemetry.setTargetPose(targetState.getDifferentialPose()); + PathPlannerLogging.logTargetPose(targetState.getDifferentialPose()); + } + + PPLibTelemetry.setVelocities( + currentVel, + targetState.velocityMps, + currentSpeeds.omegaRadiansPerSecond, + targetSpeeds.omegaRadiansPerSecond); + PPLibTelemetry.setPathInaccuracy(controller.getPositionalError()); + + output.accept(targetSpeeds); + + if (!untriggeredEvents.isEmpty() && timer.hasElapsed(untriggeredEvents.get(0).getFirst())) { + // Time to trigger this event command + Pair event = untriggeredEvents.remove(0); + + for (var runningCommand : currentEventCommands.entrySet()) { + if (!runningCommand.getValue()) { + continue; + } + + if (!Collections.disjoint( + runningCommand.getKey().getRequirements(), event.getSecond().getRequirements())) { + runningCommand.getKey().end(true); + runningCommand.setValue(false); + } + } + + event.getSecond().initialize(); + currentEventCommands.put(event.getSecond(), true); + } + + // Run event marker commands + for (Map.Entry runningCommand : currentEventCommands.entrySet()) { + if (!runningCommand.getValue()) { + continue; + } + + runningCommand.getKey().execute(); + + if (runningCommand.getKey().isFinished()) { + runningCommand.getKey().end(false); + runningCommand.setValue(false); + } + } + } + + @Override + public boolean isFinished() { + return timer.hasElapsed(generatedTrajectory.getTotalTimeSeconds()); + } + + @Override + public void end(boolean interrupted) { + timer.stop(); + + // Only output 0 speeds when ending a path that is supposed to stop, this allows interrupting + // the command to smoothly transition into some auto-alignment routine + if (!interrupted && path.getGoalEndState().getVelocity() < 0.1) { + output.accept(new ChassisSpeeds()); + } + + PathPlannerLogging.logActivePath(null); + + // End markers + for (Map.Entry runningCommand : currentEventCommands.entrySet()) { + if (runningCommand.getValue()) { + runningCommand.getKey().end(true); + } + } + } + + private void replanPath(Pose2d currentPose, ChassisSpeeds currentSpeeds) { + PathPlannerPath replanned = path.replan(currentPose, currentSpeeds); + generatedTrajectory = replanned.getTrajectory(currentSpeeds, currentPose.getRotation()); + PathPlannerLogging.logActivePath(replanned); + PPLibTelemetry.setCurrentPath(replanned); + } +} diff --git a/src/main/java/com/stuypulse/robot/util/IntakeVisualizer.java b/src/main/java/com/stuypulse/robot/util/IntakeVisualizer.java index 011efcc2..dc3b54c3 100644 --- a/src/main/java/com/stuypulse/robot/util/IntakeVisualizer.java +++ b/src/main/java/com/stuypulse/robot/util/IntakeVisualizer.java @@ -17,7 +17,6 @@ public class IntakeVisualizer { private double intakeAngle = 0.0; private double gandalfAngle = 0.0; private double shooterFeederAngle = 0.0; - private final double WINDOW_WIDTH = 20; private final double WINDOW_HEIGHT = 20; private final int LINE_WIDTH = 10;