mirror of
https://github.com/TimeCrafters/FTC_2022
synced 2025-12-16 17:02:34 +00:00
Compare commits
10 Commits
fbb0645283
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad83dc5e0c | ||
|
|
151c866ade | ||
| fd3d6cb44d | |||
| 1b148ad75b | |||
| c5484131bb | |||
|
|
2d1f930593 | ||
| 647568b406 | |||
| c36a8e0312 | |||
| fa54f5f209 | |||
|
|
d59e7a54f7 |
@@ -8,7 +8,7 @@ apply plugin: 'com.android.library'
|
|||||||
android {
|
android {
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 23
|
minSdkVersion 24
|
||||||
//noinspection ExpiredTargetSdkVersion
|
//noinspection ExpiredTargetSdkVersion
|
||||||
targetSdkVersion 28
|
targetSdkVersion 28
|
||||||
buildConfigField "String", "APP_BUILD_TIME", '"' + (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.ROOT).format(new Date())) + '"'
|
buildConfigField "String", "APP_BUILD_TIME", '"' + (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.ROOT).format(new Date())) + '"'
|
||||||
|
|||||||
@@ -1,20 +1,19 @@
|
|||||||
package org.timecrafters.Autonomous.Engines;
|
package org.timecrafters.Phoenix.Autonomous.Engines;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.timecrafters.Autonomous.States.BottomArm;
|
import org.timecrafters.Phoenix.Autonomous.States.BottomArm;
|
||||||
import org.timecrafters.Autonomous.States.CollectorDistanceState;
|
import org.timecrafters.Phoenix.Autonomous.States.CollectorDistanceState;
|
||||||
import org.timecrafters.Autonomous.States.CollectorState;
|
import org.timecrafters.Phoenix.Autonomous.States.CollectorState;
|
||||||
import org.timecrafters.Autonomous.States.ConeIdentification;
|
import org.timecrafters.Phoenix.Autonomous.States.ConeIdentification;
|
||||||
import org.timecrafters.Autonomous.States.DriverParkPlaceState;
|
import org.timecrafters.Phoenix.Autonomous.States.DriverParkPlaceState;
|
||||||
import org.timecrafters.Autonomous.States.DriverState;
|
import org.timecrafters.Phoenix.Autonomous.States.DriverState;
|
||||||
import org.timecrafters.Autonomous.States.PathDecision;
|
import org.timecrafters.Phoenix.Autonomous.States.PathDecision;
|
||||||
import org.timecrafters.Autonomous.States.RotationState;
|
import org.timecrafters.Phoenix.Autonomous.States.RotationState;
|
||||||
import org.timecrafters.Autonomous.States.ServoCameraRotate;
|
import org.timecrafters.Phoenix.Autonomous.States.ServoCameraRotate;
|
||||||
import org.timecrafters.Autonomous.States.TopArm;
|
import org.timecrafters.Phoenix.Autonomous.States.TopArm;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
//@Autonomous (name = "Left Side")
|
//@Autonomous (name = "Left Side")
|
||||||
@Disabled
|
@Disabled
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package org.timecrafters.Autonomous.Engines;
|
package org.timecrafters.Phoenix.Autonomous.Engines;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
|
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
@Autonomous(name = "Left Side", group = "A Phoenix", preselectTeleOp = "APhoenixTeleOP")
|
@Autonomous(name = "Left Side", group = "A Phoenix", preselectTeleOp = "APhoenixTeleOP")
|
||||||
public class LeftStateAutoEngine extends CyberarmEngine {
|
public class LeftStateAutoEngine extends CyberarmEngine {
|
||||||
@@ -1,21 +1,19 @@
|
|||||||
package org.timecrafters.Autonomous.Engines;
|
package org.timecrafters.Phoenix.Autonomous.Engines;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
|
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.timecrafters.Autonomous.States.BottomArm;
|
import org.timecrafters.Phoenix.Autonomous.States.BottomArm;
|
||||||
import org.timecrafters.Autonomous.States.CollectorDistanceState;
|
import org.timecrafters.Phoenix.Autonomous.States.CollectorDistanceState;
|
||||||
import org.timecrafters.Autonomous.States.CollectorState;
|
import org.timecrafters.Phoenix.Autonomous.States.CollectorState;
|
||||||
import org.timecrafters.Autonomous.States.ConeIdentification;
|
import org.timecrafters.Phoenix.Autonomous.States.ConeIdentification;
|
||||||
import org.timecrafters.Autonomous.States.DriverParkPlaceState;
|
import org.timecrafters.Phoenix.Autonomous.States.DriverParkPlaceState;
|
||||||
import org.timecrafters.Autonomous.States.DriverStateWithOdometer;
|
import org.timecrafters.Phoenix.Autonomous.States.DriverStateWithOdometer;
|
||||||
import org.timecrafters.Autonomous.States.JunctionAllignmentAngleState;
|
import org.timecrafters.Phoenix.Autonomous.States.JunctionAllignmentAngleState;
|
||||||
import org.timecrafters.Autonomous.States.JunctionAllignmentDistanceState;
|
import org.timecrafters.Phoenix.Autonomous.States.JunctionAllignmentDistanceState;
|
||||||
import org.timecrafters.Autonomous.States.PathDecision;
|
import org.timecrafters.Phoenix.Autonomous.States.PathDecision;
|
||||||
import org.timecrafters.Autonomous.States.RotationState;
|
import org.timecrafters.Phoenix.Autonomous.States.RotationState;
|
||||||
import org.timecrafters.Autonomous.States.ServoCameraRotate;
|
import org.timecrafters.Phoenix.Autonomous.States.ServoCameraRotate;
|
||||||
import org.timecrafters.Autonomous.States.TopArm;
|
import org.timecrafters.Phoenix.Autonomous.States.TopArm;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
//@Autonomous (name = "left 2 cone auto")
|
//@Autonomous (name = "left 2 cone auto")
|
||||||
|
|
||||||
@@ -1,19 +1,19 @@
|
|||||||
package org.timecrafters.Autonomous.Engines;
|
package org.timecrafters.Phoenix.Autonomous.Engines;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
|
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.timecrafters.Autonomous.States.CollectorDistanceState;
|
import org.timecrafters.Phoenix.Autonomous.States.CollectorDistanceState;
|
||||||
import org.timecrafters.Autonomous.States.CollectorState;
|
import org.timecrafters.Phoenix.Autonomous.States.CollectorState;
|
||||||
import org.timecrafters.Autonomous.States.DriverParkPlaceState;
|
import org.timecrafters.Phoenix.Autonomous.States.DriverParkPlaceState;
|
||||||
import org.timecrafters.Autonomous.States.DriverState;
|
import org.timecrafters.Phoenix.Autonomous.States.DriverState;
|
||||||
import org.timecrafters.Autonomous.States.BottomArm;
|
import org.timecrafters.Phoenix.Autonomous.States.BottomArm;
|
||||||
import org.timecrafters.Autonomous.States.PathDecision;
|
import org.timecrafters.Phoenix.Autonomous.States.PathDecision;
|
||||||
import org.timecrafters.Autonomous.States.RotationState;
|
import org.timecrafters.Phoenix.Autonomous.States.RotationState;
|
||||||
import org.timecrafters.Autonomous.States.ServoCameraRotate;
|
import org.timecrafters.Phoenix.Autonomous.States.ServoCameraRotate;
|
||||||
import org.timecrafters.Autonomous.States.TopArm;
|
import org.timecrafters.Phoenix.Autonomous.States.TopArm;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
@Autonomous (name = "Right ")
|
@Autonomous (name = "Right ")
|
||||||
@Disabled
|
@Disabled
|
||||||
@@ -1,14 +1,9 @@
|
|||||||
package org.timecrafters.Autonomous.Engines;
|
package org.timecrafters.Phoenix.Autonomous.Engines;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
|
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.timecrafters.Autonomous.States.DriverParkPlaceState;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
import org.timecrafters.Autonomous.States.DriverStateWithOdometer;
|
|
||||||
import org.timecrafters.Autonomous.States.PathDecision;
|
|
||||||
import org.timecrafters.Autonomous.States.RotationState;
|
|
||||||
import org.timecrafters.Autonomous.States.TopArmv2;
|
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
|
||||||
|
|
||||||
@Autonomous(name = "Right Side", group = "A Phoenix", preselectTeleOp = "APhoenixTeleOP")
|
@Autonomous(name = "Right Side", group = "A Phoenix", preselectTeleOp = "APhoenixTeleOP")
|
||||||
public class RightStateAutoEngine extends CyberarmEngine {
|
public class RightStateAutoEngine extends CyberarmEngine {
|
||||||
@@ -1,21 +1,19 @@
|
|||||||
package org.timecrafters.Autonomous.Engines;
|
package org.timecrafters.Phoenix.Autonomous.Engines;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
|
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.timecrafters.Autonomous.States.BottomArm;
|
import org.timecrafters.Phoenix.Autonomous.States.BottomArm;
|
||||||
import org.timecrafters.Autonomous.States.CollectorDistanceState;
|
import org.timecrafters.Phoenix.Autonomous.States.CollectorDistanceState;
|
||||||
import org.timecrafters.Autonomous.States.CollectorState;
|
import org.timecrafters.Phoenix.Autonomous.States.CollectorState;
|
||||||
import org.timecrafters.Autonomous.States.ConeIdentification;
|
import org.timecrafters.Phoenix.Autonomous.States.ConeIdentification;
|
||||||
import org.timecrafters.Autonomous.States.DriverParkPlaceState;
|
import org.timecrafters.Phoenix.Autonomous.States.DriverParkPlaceState;
|
||||||
import org.timecrafters.Autonomous.States.DriverStateWithOdometer;
|
import org.timecrafters.Phoenix.Autonomous.States.DriverStateWithOdometer;
|
||||||
import org.timecrafters.Autonomous.States.JunctionAllignmentAngleState;
|
import org.timecrafters.Phoenix.Autonomous.States.JunctionAllignmentAngleState;
|
||||||
import org.timecrafters.Autonomous.States.JunctionAllignmentDistanceState;
|
import org.timecrafters.Phoenix.Autonomous.States.JunctionAllignmentDistanceState;
|
||||||
import org.timecrafters.Autonomous.States.PathDecision;
|
import org.timecrafters.Phoenix.Autonomous.States.PathDecision;
|
||||||
import org.timecrafters.Autonomous.States.RotationState;
|
import org.timecrafters.Phoenix.Autonomous.States.RotationState;
|
||||||
import org.timecrafters.Autonomous.States.ServoCameraRotate;
|
import org.timecrafters.Phoenix.Autonomous.States.ServoCameraRotate;
|
||||||
import org.timecrafters.Autonomous.States.TopArm;
|
import org.timecrafters.Phoenix.Autonomous.States.TopArm;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
//@Autonomous (name = "Right 2 cone auto")
|
//@Autonomous (name = "Right 2 cone auto")
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class BottomArm extends CyberarmState {
|
public class BottomArm extends CyberarmState {
|
||||||
|
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class CollectorDistanceState extends CyberarmState {
|
public class CollectorDistanceState extends CyberarmState {
|
||||||
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class CollectorState extends CyberarmState {
|
public class CollectorState extends CyberarmState {
|
||||||
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.firstinspires.ftc.robotcore.external.tfod.Recognition;
|
import org.firstinspires.ftc.robotcore.external.tfod.Recognition;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class DriverParkPlaceState extends CyberarmState {
|
public class DriverParkPlaceState extends CyberarmState {
|
||||||
private final boolean stateDisabled;
|
private final boolean stateDisabled;
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class DriverState extends CyberarmState {
|
public class DriverState extends CyberarmState {
|
||||||
private final boolean stateDisabled;
|
private final boolean stateDisabled;
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class DriverStateWithOdometer extends CyberarmState {
|
public class DriverStateWithOdometer extends CyberarmState {
|
||||||
private final boolean stateDisabled;
|
private final boolean stateDisabled;
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class JunctionAllignmentAngleState extends CyberarmState {
|
public class JunctionAllignmentAngleState extends CyberarmState {
|
||||||
private final boolean stateDisabled;
|
private final boolean stateDisabled;
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class JunctionAllignmentDistanceState extends CyberarmState {
|
public class JunctionAllignmentDistanceState extends CyberarmState {
|
||||||
private final boolean stateDisabled;
|
private final boolean stateDisabled;
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class PathDecision extends CyberarmState {
|
public class PathDecision extends CyberarmState {
|
||||||
PhoenixBot1 robot;
|
PhoenixBot1 robot;
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class RotationState extends CyberarmState {
|
public class RotationState extends CyberarmState {
|
||||||
private final boolean stateDisabled;
|
private final boolean stateDisabled;
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class ServoCameraRotate extends CyberarmState {
|
public class ServoCameraRotate extends CyberarmState {
|
||||||
private final boolean stateDisabled;
|
private final boolean stateDisabled;
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class TopArm extends CyberarmState {
|
public class TopArm extends CyberarmState {
|
||||||
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class TopArmResetState extends CyberarmState {
|
public class TopArmResetState extends CyberarmState {
|
||||||
private final PhoenixBot1 robot;
|
private final PhoenixBot1 robot;
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package org.timecrafters.Autonomous.States;
|
package org.timecrafters.Phoenix.Autonomous.States;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class TopArmv2 extends CyberarmState {
|
public class TopArmv2 extends CyberarmState {
|
||||||
private final PhoenixBot1 robot;
|
private final PhoenixBot1 robot;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix;
|
||||||
|
|
||||||
import com.qualcomm.hardware.adafruit.AdafruitI2cColorSensor;
|
import com.qualcomm.hardware.adafruit.AdafruitI2cColorSensor;
|
||||||
import com.qualcomm.hardware.bosch.BNO055IMU;
|
import com.qualcomm.hardware.bosch.BNO055IMU;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.engine;
|
package org.timecrafters.Phoenix.TeleOp.engine;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.engine;
|
package org.timecrafters.Phoenix.TeleOp.engine;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class DriveDebugEngine extends CyberarmEngine {
|
public class DriveDebugEngine extends CyberarmEngine {
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.engine;
|
package org.timecrafters.Phoenix.TeleOp.engine;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.engine;
|
package org.timecrafters.Phoenix.TeleOp.engine;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.TeleOPTankDriver;
|
import org.timecrafters.Phoenix.TeleOp.states.TeleOPArmDriver;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.TeleOPArmDriver;
|
import org.timecrafters.Phoenix.TeleOp.states.TeleOPTankDriver;
|
||||||
|
|
||||||
@TeleOp (name = "APhoenixTeleOP")
|
@TeleOp (name = "APhoenixTeleOP")
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.engine;
|
package org.timecrafters.Phoenix.TeleOp.engine;
|
||||||
|
|
||||||
import com.qualcomm.hardware.bosch.BNO055IMU;
|
import com.qualcomm.hardware.bosch.BNO055IMU;
|
||||||
import com.qualcomm.robotcore.hardware.CRServo;
|
import com.qualcomm.robotcore.hardware.CRServo;
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.engine;
|
package org.timecrafters.Phoenix.TeleOp.engine;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.LaserState;
|
import org.timecrafters.Phoenix.TeleOp.states.LaserState;
|
||||||
|
|
||||||
@Disabled
|
@Disabled
|
||||||
@TeleOp(name = "Wheel")
|
@TeleOp(name = "Wheel")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.engine;
|
package org.timecrafters.Phoenix.TeleOp.engine;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
||||||
@@ -6,9 +6,9 @@ import com.qualcomm.robotcore.hardware.Gamepad;
|
|||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.cyberarm.engine.V2.GamepadChecker;
|
import org.cyberarm.engine.V2.GamepadChecker;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.TeleOp.states.TeleOPSpeedrunState;
|
||||||
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersConfiguration;
|
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersConfiguration;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.TeleOPSpeedrunState;
|
|
||||||
|
|
||||||
@Disabled
|
@Disabled
|
||||||
@TeleOp (name = "Speedrun Engine")
|
@TeleOp (name = "Speedrun Engine")
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.engine;
|
package org.timecrafters.Phoenix.TeleOp.engine;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
|
||||||
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.PhoenixBot1;
|
import org.timecrafters.Phoenix.TeleOp.states.SteeringDriveExperiment;
|
||||||
import org.timecrafters.Autonomous.TeleOp.states.SteeringDriveExperiment;
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
@Disabled
|
@Disabled
|
||||||
@TeleOp(name = "Steering Drive Test")
|
@TeleOp(name = "Steering Drive Test")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmEngine;
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
import org.firstinspires.ftc.robotcore.external.tfod.Recognition;
|
import org.firstinspires.ftc.robotcore.external.tfod.Recognition;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.timecrafters.Autonomous.TeleOp.engine.DynamicSetupEngine;
|
import org.timecrafters.Phoenix.TeleOp.engine.DynamicSetupEngine;
|
||||||
|
|
||||||
public class DynamicSetupState extends CyberarmState {
|
public class DynamicSetupState extends CyberarmState {
|
||||||
private long delay;
|
private long delay;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import com.qualcomm.hardware.rev.Rev2mDistanceSensor;
|
import com.qualcomm.hardware.rev.Rev2mDistanceSensor;
|
||||||
import com.qualcomm.robotcore.hardware.Servo;
|
import com.qualcomm.robotcore.hardware.Servo;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import com.qualcomm.hardware.rev.Rev2mDistanceSensor;
|
import com.qualcomm.hardware.rev.Rev2mDistanceSensor;
|
||||||
import com.qualcomm.hardware.rev.RevBlinkinLedDriver;
|
import com.qualcomm.hardware.rev.RevBlinkinLedDriver;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
|
||||||
@@ -10,6 +10,7 @@ import org.cyberarm.engine.V2.CyberarmState;
|
|||||||
import org.cyberarm.engine.V2.GamepadChecker;
|
import org.cyberarm.engine.V2.GamepadChecker;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
||||||
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class PhoenixTeleOPState extends CyberarmState {
|
public class PhoenixTeleOPState extends CyberarmState {
|
||||||
|
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class PhoenixTeleOPv2 extends CyberarmState {
|
public class PhoenixTeleOPv2 extends CyberarmState {
|
||||||
private double drivePower = 1;
|
private double drivePower = 1;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import com.qualcomm.hardware.rev.RevBlinkinLedDriver;
|
import com.qualcomm.hardware.rev.RevBlinkinLedDriver;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.CRServo;
|
import com.qualcomm.robotcore.hardware.CRServo;
|
||||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
|
|
||||||
public class SteeringDriveExperiment extends CyberarmState {
|
public class SteeringDriveExperiment extends CyberarmState {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
import com.qualcomm.robotcore.hardware.Gamepad;
|
import com.qualcomm.robotcore.hardware.Gamepad;
|
||||||
@@ -6,6 +6,7 @@ import com.qualcomm.robotcore.hardware.Servo;
|
|||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.cyberarm.engine.V2.GamepadChecker;
|
import org.cyberarm.engine.V2.GamepadChecker;
|
||||||
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class TeleOPArmDriver extends CyberarmState {
|
public class TeleOPArmDriver extends CyberarmState {
|
||||||
private final PhoenixBot1 robot;
|
private final PhoenixBot1 robot;
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersConfiguration;
|
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersConfiguration;
|
||||||
|
|
||||||
public class TeleOPSpeedrunState extends CyberarmState {
|
public class TeleOPSpeedrunState extends CyberarmState {
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
package org.timecrafters.Autonomous.TeleOp.states;
|
package org.timecrafters.Phoenix.TeleOp.states;
|
||||||
|
|
||||||
import com.qualcomm.robotcore.hardware.Gamepad;
|
import com.qualcomm.robotcore.hardware.Gamepad;
|
||||||
|
|
||||||
import org.cyberarm.engine.V2.CyberarmState;
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
import org.cyberarm.engine.V2.GamepadChecker;
|
import org.cyberarm.engine.V2.GamepadChecker;
|
||||||
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
||||||
|
import org.timecrafters.Phoenix.PhoenixBot1;
|
||||||
|
|
||||||
public class TeleOPTankDriver extends CyberarmState {
|
public class TeleOPTankDriver extends CyberarmState {
|
||||||
|
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
package org.timecrafters.minibots.cyberarm.phoenix;
|
||||||
|
|
||||||
|
import com.qualcomm.robotcore.hardware.Servo;
|
||||||
|
|
||||||
|
public class PositionalServoController {
|
||||||
|
final private Servo servo;
|
||||||
|
final private double targetDegreesPerSecond, servoDegreesPerSecond, servoRangeInDegrees;
|
||||||
|
|
||||||
|
private double lastEstimatedPosition, estimatedPosition, workingPosition, targetPosition;
|
||||||
|
private long lastUpdatedAt;
|
||||||
|
private boolean travelling = false;
|
||||||
|
|
||||||
|
public PositionalServoController(Servo servo, double targetDegreesPerSecond, double servoDegreesPerSecond, double servoRangeInDegrees) {
|
||||||
|
this.servo = servo;
|
||||||
|
this.targetDegreesPerSecond = targetDegreesPerSecond;
|
||||||
|
this.servoDegreesPerSecond = servoDegreesPerSecond;
|
||||||
|
this.servoRangeInDegrees = servoRangeInDegrees;
|
||||||
|
|
||||||
|
this.workingPosition = servo.getPosition();
|
||||||
|
this.estimatedPosition = workingPosition;
|
||||||
|
this.lastEstimatedPosition = estimatedPosition;
|
||||||
|
this.lastUpdatedAt = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Servo getServo() {
|
||||||
|
return servo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update() {
|
||||||
|
double error = targetPosition - estimatedPosition;
|
||||||
|
double delta = (System.currentTimeMillis() - lastUpdatedAt) / 1000.0;
|
||||||
|
double estimatedTravel = servoDegreesPerSecond * delta;
|
||||||
|
double targetTravel = targetDegreesPerSecond * delta;
|
||||||
|
|
||||||
|
if (targetTravel < estimatedTravel) {
|
||||||
|
estimatedTravel = targetTravel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (travelling) {
|
||||||
|
this.lastEstimatedPosition = estimatedPosition;
|
||||||
|
|
||||||
|
if (error < 0.0) {
|
||||||
|
this.estimatedPosition -= estimatedTravel;
|
||||||
|
} else {
|
||||||
|
this.estimatedPosition += estimatedTravel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error < 0.0 - estimatedTravel) {
|
||||||
|
workingPosition -= estimatedTravel;
|
||||||
|
travelling = true;
|
||||||
|
} else if (error > 0.0 + estimatedTravel) {
|
||||||
|
workingPosition += estimatedTravel;
|
||||||
|
travelling = true;
|
||||||
|
} else {
|
||||||
|
workingPosition = targetPosition;
|
||||||
|
travelling = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
servo.setPosition(workingPosition);
|
||||||
|
this.lastUpdatedAt = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTargetPosition(double targetPosition) {
|
||||||
|
this.targetPosition = targetPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getEstimatedPosition() {
|
||||||
|
return estimatedPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getWorkingPosition() { return workingPosition; }
|
||||||
|
|
||||||
|
public double getTargetPosition() { return targetPosition; }
|
||||||
|
|
||||||
|
public double getEstimatedAngle() {
|
||||||
|
return estimatedPosition * servoRangeInDegrees;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getError() { return targetPosition - estimatedPosition; }
|
||||||
|
|
||||||
|
private double lerp(double min, double max, double t)
|
||||||
|
{
|
||||||
|
return min + (max - min) * t;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,724 @@
|
|||||||
|
package org.timecrafters.minibots.cyberarm.phoenix;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.qualcomm.hardware.lynx.LynxModule;
|
||||||
|
import com.qualcomm.hardware.rev.RevHubOrientationOnRobot;
|
||||||
|
import com.qualcomm.robotcore.hardware.Blinker;
|
||||||
|
import com.qualcomm.robotcore.hardware.CRServo;
|
||||||
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
import com.qualcomm.robotcore.hardware.DcMotorEx;
|
||||||
|
import com.qualcomm.robotcore.hardware.DcMotorSimple;
|
||||||
|
import com.qualcomm.robotcore.hardware.IMU;
|
||||||
|
import com.qualcomm.robotcore.hardware.Servo;
|
||||||
|
|
||||||
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
|
import org.firstinspires.ftc.robotcore.external.ClassFactory;
|
||||||
|
import org.firstinspires.ftc.robotcore.external.hardware.camera.WebcamName;
|
||||||
|
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
|
||||||
|
import org.firstinspires.ftc.robotcore.external.navigation.CurrentUnit;
|
||||||
|
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
||||||
|
import org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer;
|
||||||
|
import org.firstinspires.ftc.robotcore.external.tfod.TFObjectDetector;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersConfiguration;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.library.backend.config.Action;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.library.backend.config.Variable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
public class Robot {
|
||||||
|
private static final String TAG = "Phoenix | Robot";
|
||||||
|
public final DcMotorEx backLeftDrive, frontRightDrive, frontLeftDrive, backRightDrive, arm;
|
||||||
|
public final PositionalServoController leftRiserServoController, rightRiserServoController;
|
||||||
|
public final Servo cameraServo;
|
||||||
|
public final CRServo collectorLeftServo, collectorRightServo;
|
||||||
|
// public final ServoImplEx gripper;
|
||||||
|
public final IMU imu;
|
||||||
|
public LynxModule expansionHub;
|
||||||
|
|
||||||
|
public final double imuAngleOffset, initialFacing;
|
||||||
|
public boolean armManuallyControlled = false;
|
||||||
|
public boolean automaticAntiTipActive = false;
|
||||||
|
public boolean hardwareFault = false;
|
||||||
|
public String hardwareFaultMessage = "";
|
||||||
|
|
||||||
|
private Status status = Status.OKAY, lastStatus = Status.OKAY;
|
||||||
|
private final CopyOnWriteArrayList<Status> reportedStatuses = new CopyOnWriteArrayList<>();
|
||||||
|
private final ConcurrentHashMap<String, Double> motorVelocityError = new ConcurrentHashMap<>();
|
||||||
|
private final ConcurrentHashMap<String, Double> motorVelocityLastTiming = new ConcurrentHashMap<>();
|
||||||
|
private final ConcurrentHashMap<String, Double> motorTargetVelocity = new ConcurrentHashMap<>();
|
||||||
|
private ArmPosition armTargetPosition;
|
||||||
|
|
||||||
|
public enum ArmPosition {
|
||||||
|
COLLECT,
|
||||||
|
GROUND,
|
||||||
|
LOW,
|
||||||
|
MEDIUM,
|
||||||
|
HIGH
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Status {
|
||||||
|
OKAY,
|
||||||
|
MONITORING,
|
||||||
|
WARNING,
|
||||||
|
DANGER
|
||||||
|
}
|
||||||
|
|
||||||
|
private final CyberarmEngine engine;
|
||||||
|
private TimeCraftersConfiguration configuration;
|
||||||
|
private final double radius, diameter;
|
||||||
|
|
||||||
|
private final double wheelRadius, wheelGearRatio, armGearRatio;
|
||||||
|
private final int wheelTicksPerRevolution, armTicksPerRevolution;
|
||||||
|
|
||||||
|
private final VuforiaLocalizer vuforia;
|
||||||
|
private final TFObjectDetector tfod;
|
||||||
|
|
||||||
|
private boolean LEDStatusToggle = false;
|
||||||
|
private double lastLEDStatusAnimationTime = 0;
|
||||||
|
|
||||||
|
public Robot(CyberarmEngine engine, TimeCraftersConfiguration configuration) {
|
||||||
|
this.engine = engine;
|
||||||
|
this.configuration = configuration;
|
||||||
|
|
||||||
|
radius = tuningConfig("field_localizer_robot_radius").value();
|
||||||
|
diameter = radius * 2;
|
||||||
|
|
||||||
|
imuAngleOffset = hardwareConfig("imu_angle_offset").value();
|
||||||
|
|
||||||
|
wheelRadius = tuningConfig("wheel_radius").value();
|
||||||
|
wheelGearRatio = tuningConfig("wheel_gear_ratio").value();
|
||||||
|
wheelTicksPerRevolution = tuningConfig("wheel_ticks_per_revolution").value();
|
||||||
|
|
||||||
|
armGearRatio = tuningConfig("arm_gear_ratio").value();
|
||||||
|
armTicksPerRevolution = tuningConfig("arm_ticks_per_revolution").value();
|
||||||
|
|
||||||
|
// FIXME: Rename motors in configuration
|
||||||
|
// Define hardware
|
||||||
|
backLeftDrive = engine.hardwareMap.get(DcMotorEx.class, "Back Left"); // MOTOR PORT: 2 - CONTROL HUB
|
||||||
|
frontRightDrive = engine.hardwareMap.get(DcMotorEx.class, "Front Right"); // MOTOR PORT: 1 - CONTROL HUB
|
||||||
|
|
||||||
|
frontLeftDrive = engine.hardwareMap.get(DcMotorEx.class, "Front Left"); // MOTOR PORT: 3 - CONTROL HUB
|
||||||
|
backRightDrive = engine.hardwareMap.get(DcMotorEx.class, "Back Right"); // MOTOR PORT: 0 - CONTROL HUB
|
||||||
|
|
||||||
|
// FIXME: Rename lift_drive to arm in hardware config
|
||||||
|
arm = engine.hardwareMap.get(DcMotorEx.class, "ArmMotor"); // MOTOR PORT: 2 - EXPANSION HUB
|
||||||
|
|
||||||
|
// gripper = engine.hardwareMap.get(ServoImplEx.class, "gripper"); // SERVO PORT: ?
|
||||||
|
|
||||||
|
imu = engine.hardwareMap.get(IMU.class, "imu");
|
||||||
|
|
||||||
|
|
||||||
|
// Configure hardware
|
||||||
|
// MOTORS
|
||||||
|
// DIRECTION
|
||||||
|
frontLeftDrive.setDirection(hardwareConfig("front_left_drive_direction_forward").value() ? DcMotorSimple.Direction.FORWARD : DcMotorSimple.Direction.REVERSE);
|
||||||
|
frontRightDrive.setDirection(hardwareConfig("front_right_drive_direction_forward").value() ? DcMotorSimple.Direction.FORWARD : DcMotorSimple.Direction.REVERSE);
|
||||||
|
|
||||||
|
backLeftDrive.setDirection(hardwareConfig("back_left_drive_direction_forward").value() ? DcMotorSimple.Direction.FORWARD : DcMotorSimple.Direction.REVERSE);
|
||||||
|
backRightDrive.setDirection(hardwareConfig("back_right_drive_direction_forward").value() ? DcMotorSimple.Direction.FORWARD : DcMotorSimple.Direction.REVERSE);
|
||||||
|
|
||||||
|
arm.setDirection(hardwareConfig("arm_direction_forward").value() ? DcMotorSimple.Direction.FORWARD : DcMotorSimple.Direction.REVERSE);
|
||||||
|
|
||||||
|
// RUNMODE
|
||||||
|
frontLeftDrive.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER); frontLeftDrive.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
|
||||||
|
frontRightDrive.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER); frontRightDrive.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
|
||||||
|
|
||||||
|
backLeftDrive.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER); backLeftDrive.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
|
||||||
|
backRightDrive.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER); backRightDrive.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
|
||||||
|
|
||||||
|
arm.setTargetPosition(0);
|
||||||
|
arm.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER); arm.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
|
||||||
|
armTargetPosition = ArmPosition.COLLECT;
|
||||||
|
|
||||||
|
// ZERO POWER BEHAVIOR
|
||||||
|
frontLeftDrive.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.BRAKE);
|
||||||
|
frontRightDrive.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.BRAKE);
|
||||||
|
|
||||||
|
backLeftDrive.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.BRAKE);
|
||||||
|
backRightDrive.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.BRAKE);
|
||||||
|
|
||||||
|
arm.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.BRAKE);
|
||||||
|
|
||||||
|
// MOTOR POWER
|
||||||
|
arm.setPower(tuningConfig("arm_automatic_power").value());
|
||||||
|
|
||||||
|
// SERVOS
|
||||||
|
Servo leftRiser = engine.hardwareMap.servo.get("LowRiserLeft");
|
||||||
|
leftRiser.setDirection(Servo.Direction.FORWARD);
|
||||||
|
Servo rightRiser = engine.hardwareMap.servo.get("LowRiserRight");
|
||||||
|
rightRiser.setDirection(Servo.Direction.REVERSE);
|
||||||
|
|
||||||
|
// NOTES: 428.57142858° per second = no load speed of 60° per 0.14s at 6V, see: https://docs.revrobotics.com/duo-build/actuators/servos/smart-robot-servo#mechanical-specifications
|
||||||
|
leftRiserServoController = new PositionalServoController(
|
||||||
|
leftRiser,
|
||||||
|
5.0,
|
||||||
|
428.57142858,
|
||||||
|
270.0
|
||||||
|
); // SERVER PORT: ? - ? HUB
|
||||||
|
|
||||||
|
rightRiserServoController = new PositionalServoController(
|
||||||
|
rightRiser,
|
||||||
|
5.0,
|
||||||
|
428.57142858,
|
||||||
|
270.0
|
||||||
|
); // SERVER PORT: ? - ? HUB
|
||||||
|
|
||||||
|
cameraServo = engine.hardwareMap.servo.get("Camera Servo"); // SERVER PORT: ? - ? HUB
|
||||||
|
|
||||||
|
collectorLeftServo = engine.hardwareMap.crservo.get("Collector Left"); // SERVER PORT: ? - ? HUB
|
||||||
|
collectorRightServo = engine.hardwareMap.crservo.get("Collector Right"); // SERVER PORT: ? - ? HUB
|
||||||
|
|
||||||
|
// SERVO DIRECTIONS
|
||||||
|
cameraServo.setDirection(Servo.Direction.REVERSE);
|
||||||
|
collectorLeftServo.setDirection(DcMotorSimple.Direction.REVERSE);
|
||||||
|
collectorRightServo.setDirection(DcMotorSimple.Direction.FORWARD);
|
||||||
|
|
||||||
|
// SENSORS
|
||||||
|
// IMU
|
||||||
|
IMU.Parameters parameters = new IMU.Parameters(
|
||||||
|
new RevHubOrientationOnRobot(
|
||||||
|
RevHubOrientationOnRobot.LogoFacingDirection.BACKWARD,
|
||||||
|
RevHubOrientationOnRobot.UsbFacingDirection.UP
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
imu.initialize(parameters);
|
||||||
|
|
||||||
|
// Preserve our "initial" facing, since we transform it from zero.
|
||||||
|
initialFacing = facing();
|
||||||
|
|
||||||
|
// BulkRead from Hubs
|
||||||
|
for (LynxModule hub : engine.hardwareMap.getAll(LynxModule.class)) {
|
||||||
|
hub.setBulkCachingMode(LynxModule.BulkCachingMode.MANUAL);
|
||||||
|
|
||||||
|
if (!hub.isParent() && expansionHub == null) {
|
||||||
|
expansionHub = hub;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set LED pattern
|
||||||
|
if (expansionHub != null) {
|
||||||
|
expansionHub.setPattern(ledPatternOkay());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Webcam
|
||||||
|
vuforia = initVuforia();
|
||||||
|
tfod = initTfod();
|
||||||
|
|
||||||
|
// Drive Encoder Error Setup
|
||||||
|
engine.blackboardSet("left_drive_error", 0);
|
||||||
|
engine.blackboardSet("right_drive_error", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private VuforiaLocalizer initVuforia() {
|
||||||
|
VuforiaLocalizer.Parameters parameters = new VuforiaLocalizer.Parameters();
|
||||||
|
|
||||||
|
parameters.vuforiaLicenseKey = hardwareConfig("vuforia_license_key").value();
|
||||||
|
parameters.cameraName = engine.hardwareMap.get(WebcamName.class, "Webcam 1");
|
||||||
|
|
||||||
|
return ClassFactory.getInstance().createVuforia(parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
private TFObjectDetector initTfod() {
|
||||||
|
int tfodMonitorViewId = engine.hardwareMap.appContext.getResources().getIdentifier(
|
||||||
|
"tfodMonitorViewId", "id", engine.hardwareMap.appContext.getPackageName());
|
||||||
|
TFObjectDetector.Parameters tfodParameters = new TFObjectDetector.Parameters(tfodMonitorViewId);
|
||||||
|
tfodParameters.minResultConfidence = 0.75f;
|
||||||
|
tfodParameters.isModelTensorFlow2 = true;
|
||||||
|
tfodParameters.inputSize = 300;
|
||||||
|
TFObjectDetector tfod = ClassFactory.getInstance().createTFObjectDetector(tfodParameters, vuforia);
|
||||||
|
|
||||||
|
tfod.loadModelFromAsset("PowerPlay.tflite", "1 Bolt", "2 Bulb", "3 Panel");
|
||||||
|
|
||||||
|
return tfod;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reloadConfig() {
|
||||||
|
String name = configuration.getConfig().getName();
|
||||||
|
configuration = new TimeCraftersConfiguration(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void standardTelemetry() {
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// STATUS
|
||||||
|
engine.telemetry.addLine("DATA");
|
||||||
|
engine.telemetry.addData(" Robot Status", status);
|
||||||
|
engine.telemetry.addData(" Hardware Fault", hardwareFault);
|
||||||
|
engine.telemetry.addData(" Hardware Fault Message", hardwareFaultMessage);
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// Motor Powers
|
||||||
|
engine.telemetry.addLine("Motor Powers");
|
||||||
|
engine.telemetry.addData(" Front Left Drive", frontLeftDrive.getPower());
|
||||||
|
engine.telemetry.addData(" Front Right Drive", frontRightDrive.getPower());
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Back Left Drive", backLeftDrive.getPower());
|
||||||
|
engine.telemetry.addData(" Back Right Drive", backRightDrive.getPower());
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Arm", arm.getPower());
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// Motor Positions
|
||||||
|
engine.telemetry.addLine("Motor Positions");
|
||||||
|
engine.telemetry.addData(" Front Left Drive", "%d (%8.2f in)", frontLeftDrive.getCurrentPosition(), ticksToUnit(DistanceUnit.INCH, frontLeftDrive.getCurrentPosition()));
|
||||||
|
engine.telemetry.addData(" Front Right Drive", "%d (%8.2f in)", frontRightDrive.getCurrentPosition(), ticksToUnit(DistanceUnit.INCH, frontRightDrive.getCurrentPosition()));
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Back Left Drive", "%d (%8.2f in)", backLeftDrive.getCurrentPosition(), ticksToUnit(DistanceUnit.INCH, backLeftDrive.getCurrentPosition()));
|
||||||
|
engine.telemetry.addData(" Back Right Drive", "%d (%8.2f in)", backRightDrive.getCurrentPosition(), ticksToUnit(DistanceUnit.INCH, backRightDrive.getCurrentPosition()));
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Arm", "%d (%8.2f degrees)", arm.getCurrentPosition(), ticksToAngle(arm.getCurrentPosition()));
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// Motor Target Positions
|
||||||
|
engine.telemetry.addLine("Motor Target Positions");
|
||||||
|
engine.telemetry.addData(" Front Left Drive", "%d (%8.2f in)", frontLeftDrive.getTargetPosition(), ticksToUnit(DistanceUnit.INCH, frontLeftDrive.getTargetPosition()));
|
||||||
|
engine.telemetry.addData(" Front Right Drive", "%d (%8.2f in)", frontRightDrive.getTargetPosition(), ticksToUnit(DistanceUnit.INCH, frontRightDrive.getTargetPosition()));
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Back Left Drive", "%d (%8.2f in)", backLeftDrive.getTargetPosition(), ticksToUnit(DistanceUnit.INCH, backLeftDrive.getTargetPosition()));
|
||||||
|
engine.telemetry.addData(" Back Right Drive", "%d (%8.2f in)", backRightDrive.getTargetPosition(), ticksToUnit(DistanceUnit.INCH, backRightDrive.getTargetPosition()));
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Arm", "%d (%8.2f degrees)", arm.getTargetPosition(), ticksToAngle(arm.getTargetPosition()));
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// Motor Velocity
|
||||||
|
engine.telemetry.addLine("Motor Velocity");
|
||||||
|
engine.telemetry.addData(" Front Left Drive", "%8.2f (%8.2f in)", frontLeftDrive.getVelocity(), ticksToUnit(DistanceUnit.INCH, (int) frontLeftDrive.getVelocity()));
|
||||||
|
engine.telemetry.addData(" Front Right Drive", "%8.2f (%8.2f in)", frontRightDrive.getVelocity(), ticksToUnit(DistanceUnit.INCH, (int) frontRightDrive.getVelocity()));
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Back Left Drive", "%8.2f (%8.2f in)", backLeftDrive.getVelocity(), ticksToUnit(DistanceUnit.INCH, (int) backLeftDrive.getVelocity()));
|
||||||
|
engine.telemetry.addData(" Back Right Drive", "%8.2f (%8.2f in)", backRightDrive.getVelocity(), ticksToUnit(DistanceUnit.INCH, (int) backRightDrive.getVelocity()));
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Arm", "%8.2f (%8.2f degrees)", arm.getVelocity(), ticksToAngle((int)arm.getVelocity()));
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// Motor Currents
|
||||||
|
engine.telemetry.addLine("Motor Currents (AMPS)");
|
||||||
|
engine.telemetry.addData(" Front Left Drive", frontLeftDrive.getCurrent(CurrentUnit.AMPS));
|
||||||
|
engine.telemetry.addData(" Front Right Drive", frontRightDrive.getCurrent(CurrentUnit.AMPS));
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Back Left Drive", backLeftDrive.getCurrent(CurrentUnit.AMPS));
|
||||||
|
engine.telemetry.addData(" Back Right Drive", backRightDrive.getCurrent(CurrentUnit.AMPS));
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Arm", arm.getCurrent(CurrentUnit.AMPS));
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// Motor Directions
|
||||||
|
engine.telemetry.addLine("Motor Directions");
|
||||||
|
engine.telemetry.addData(" Front Left Drive", frontLeftDrive.getDirection());
|
||||||
|
engine.telemetry.addData(" Front Right Drive", frontRightDrive.getDirection());
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Back Left Drive", backLeftDrive.getDirection());
|
||||||
|
engine.telemetry.addData(" Back Right Drive", backRightDrive.getDirection());
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
engine.telemetry.addData(" Arm", arm.getDirection());
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// Servo Positions
|
||||||
|
engine.telemetry.addLine("Servo Positions");
|
||||||
|
engine.telemetry.addData(" Left Riser (Est)/(Target)/(Blind)", "%.4f [error: %.4f] / %.4f / %.4f", leftRiserServoController.getEstimatedPosition(), leftRiserServoController.getError(), leftRiserServoController.getTargetPosition(), leftRiserServoController.getServo().getPosition());
|
||||||
|
engine.telemetry.addData(" Right Riser (Est)/(Target)/(Blind)", "%.4f [error: %.4f] / %.4f / %.4f", rightRiserServoController.getEstimatedPosition(), rightRiserServoController.getError(), rightRiserServoController.getTargetPosition(), rightRiserServoController.getServo().getPosition());
|
||||||
|
engine.telemetry.addData(" Camera (Blind)", cameraServo.getPosition());
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// Continuous Servo Powers
|
||||||
|
engine.telemetry.addLine("Servo Powers");
|
||||||
|
engine.telemetry.addData(" Collector Left", collectorLeftServo.getPower());
|
||||||
|
engine.telemetry.addData(" Collector Right", collectorRightServo.getPower());
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// Servo Directions
|
||||||
|
engine.telemetry.addLine("Servo Directions");
|
||||||
|
engine.telemetry.addData(" Left Riser", leftRiserServoController.getServo().getDirection());
|
||||||
|
engine.telemetry.addData(" Right Riser", rightRiserServoController.getServo().getDirection());
|
||||||
|
engine.telemetry.addData(" Camera", cameraServo.getDirection());
|
||||||
|
engine.telemetry.addData(" Collector Left", collectorLeftServo.getDirection());
|
||||||
|
engine.telemetry.addData(" Collector Right", collectorRightServo.getDirection());
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
|
||||||
|
// Sensors / IMU
|
||||||
|
engine.telemetry.addLine("IMU");
|
||||||
|
engine.telemetry.addData(" Facing (Degrees)", facing());
|
||||||
|
engine.telemetry.addData(" Heading (Radians)", heading());
|
||||||
|
engine.telemetry.addData(" Turn Rate", turnRate());
|
||||||
|
engine.telemetry.addData(" Angle Offset (Degrees)", imuAngleOffset);
|
||||||
|
|
||||||
|
engine.telemetry.addLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<Blinker.Step> ledPatternStandby() {
|
||||||
|
final ArrayList<Blinker.Step> steps = new ArrayList<>();
|
||||||
|
|
||||||
|
steps.add(new Blinker.Step(0x008000, 750, TimeUnit.MILLISECONDS));
|
||||||
|
steps.add(new Blinker.Step(0x005000, 750, TimeUnit.MILLISECONDS));
|
||||||
|
steps.add(new Blinker.Step(0x002000, 750, TimeUnit.MILLISECONDS));
|
||||||
|
steps.add(new Blinker.Step(0x001000, 250, TimeUnit.MILLISECONDS));
|
||||||
|
|
||||||
|
return steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<Blinker.Step> ledPatternOkay() {
|
||||||
|
final ArrayList<Blinker.Step> steps = new ArrayList<>();
|
||||||
|
|
||||||
|
steps.add(new Blinker.Step(0x00aa00, 500, TimeUnit.MILLISECONDS));
|
||||||
|
steps.add(new Blinker.Step(0x00aa44, 500, TimeUnit.MILLISECONDS));
|
||||||
|
|
||||||
|
return steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<Blinker.Step> ledPatternMonitoring() {
|
||||||
|
final ArrayList<Blinker.Step> steps = new ArrayList<>();
|
||||||
|
|
||||||
|
steps.add(new Blinker.Step(0xaaaaaa, 500, TimeUnit.MILLISECONDS));
|
||||||
|
steps.add(new Blinker.Step(0x000000, 250, TimeUnit.MILLISECONDS));
|
||||||
|
|
||||||
|
return steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<Blinker.Step> ledPatternWarning() {
|
||||||
|
final ArrayList<Blinker.Step> steps = new ArrayList<>();
|
||||||
|
|
||||||
|
steps.add(new Blinker.Step(0xffff00, 500, TimeUnit.MILLISECONDS));
|
||||||
|
steps.add(new Blinker.Step(0xff8800, 500, TimeUnit.MILLISECONDS));
|
||||||
|
|
||||||
|
return steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<Blinker.Step> ledPatternDanger() {
|
||||||
|
final ArrayList<Blinker.Step> steps = new ArrayList<>();
|
||||||
|
|
||||||
|
steps.add(new Blinker.Step(0xff0000, 250, TimeUnit.MILLISECONDS));
|
||||||
|
steps.add(new Blinker.Step(0x000000, 100, TimeUnit.MILLISECONDS));
|
||||||
|
|
||||||
|
return steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reportStatus(Status status) {
|
||||||
|
reportedStatuses.add(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update() {
|
||||||
|
for (LynxModule hub : engine.hardwareMap.getAll(LynxModule.class)) {
|
||||||
|
hub.clearBulkCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
double voltage = getVoltage();
|
||||||
|
if (voltage < 9.75) {
|
||||||
|
reportStatus(Status.DANGER);
|
||||||
|
hardwareFaultMessage = "Battery voltage to low! (" + voltage + " volts)";
|
||||||
|
|
||||||
|
hardwareFault = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = Status.OKAY;
|
||||||
|
for (Status s : reportedStatuses) {
|
||||||
|
if (s.ordinal() > status.ordinal()) {
|
||||||
|
status = s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reportedStatuses.clear();
|
||||||
|
|
||||||
|
if (status != lastStatus) {
|
||||||
|
lastStatus = status;
|
||||||
|
|
||||||
|
if (expansionHub != null) {
|
||||||
|
if (lastStatus == Status.OKAY) { expansionHub.setPattern(ledPatternOkay()); }
|
||||||
|
if (lastStatus == Status.MONITORING) { expansionHub.setPattern(ledPatternMonitoring()); }
|
||||||
|
if (lastStatus == Status.WARNING) { expansionHub.setPattern(ledPatternWarning()); }
|
||||||
|
if (lastStatus == Status.DANGER) { expansionHub.setPattern(ledPatternDanger()); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
manageArmAndRiserServos();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
if (expansionHub != null) {
|
||||||
|
expansionHub.setPattern(ledPatternStandby());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void armPosition(ArmPosition position) {
|
||||||
|
if (hardwareFault) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
armTargetPosition = position;
|
||||||
|
|
||||||
|
reportStatus(Status.WARNING);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void manageArmAndRiserServos() {
|
||||||
|
boolean lowerServos = true;
|
||||||
|
|
||||||
|
switch (armTargetPosition) {
|
||||||
|
case COLLECT:
|
||||||
|
if (areRiserServosInLoweredPosition()) {
|
||||||
|
arm.setTargetPosition(angleToTicks(tuningConfig("arm_position_angle_collect").value()));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// case GROUND:
|
||||||
|
// if (areRiserServosInLoweredPosition()) {
|
||||||
|
// arm.setTargetPosition(angleToTicks(tuningConfig("arm_position_angle_ground").value()));
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
|
||||||
|
case GROUND: // DISABLE GROUND JUNCTION SUPPORT FOR NOW
|
||||||
|
case LOW:
|
||||||
|
if (areRiserServosInLoweredPosition()) {
|
||||||
|
arm.setTargetPosition(angleToTicks(tuningConfig("arm_position_angle_low").value()));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MEDIUM:
|
||||||
|
if (areRiserServosInLoweredPosition()) {
|
||||||
|
arm.setTargetPosition(angleToTicks(tuningConfig("arm_position_angle_medium").value()));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HIGH:
|
||||||
|
double angleHigh = tuningConfig("arm_position_angle_high").value();
|
||||||
|
arm.setTargetPosition(angleToTicks(angleHigh));
|
||||||
|
|
||||||
|
if (arm.getCurrentPosition() >= angleToTicks(angleHigh - 10.0)) {
|
||||||
|
lowerServos = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new RuntimeException("Unexpected arm position!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lowerServos) {
|
||||||
|
leftRiserServoController.setTargetPosition(0.45);
|
||||||
|
rightRiserServoController.setTargetPosition(0.45);
|
||||||
|
} else {
|
||||||
|
leftRiserServoController.setTargetPosition(0.8);
|
||||||
|
rightRiserServoController.setTargetPosition(0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
leftRiserServoController.update();
|
||||||
|
rightRiserServoController.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean areRiserServosInLoweredPosition() {
|
||||||
|
return leftRiserServoController.getEstimatedPosition() < 0.5 && rightRiserServoController.getEstimatedPosition() < 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adapted from: https://github.com/gosu/gosu/blob/980d64de2ce52e4b16fdd5cb9c9e11c8bbb80671/src/Math.cpp#L38
|
||||||
|
public double angleDiff(double from, double to) {
|
||||||
|
double value = (to - from + 180);
|
||||||
|
|
||||||
|
double fmod = (value - 0.0) % (360.0 - 0.0);
|
||||||
|
|
||||||
|
return (fmod < 0 ? fmod + 360.0 : fmod + 0.0) - 180;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double lerp(double min, double max, double t)
|
||||||
|
{
|
||||||
|
return min + (max - min) * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Status getStatus() { return status; }
|
||||||
|
|
||||||
|
public double getRadius() { return radius; }
|
||||||
|
|
||||||
|
public double getDiameter() { return diameter; }
|
||||||
|
|
||||||
|
public double getVoltage() {
|
||||||
|
return engine.hardwareMap.voltageSensor.iterator().next().getVoltage();
|
||||||
|
}
|
||||||
|
|
||||||
|
public TFObjectDetector getTfod() { return tfod; }
|
||||||
|
|
||||||
|
public VuforiaLocalizer getVuforia() { return vuforia; }
|
||||||
|
|
||||||
|
public TimeCraftersConfiguration getConfiguration() { return configuration; }
|
||||||
|
|
||||||
|
// For: Drive Wheels
|
||||||
|
public int unitToTicks(DistanceUnit unit, double distance) {
|
||||||
|
double fI = (wheelGearRatio * wheelTicksPerRevolution) / (wheelRadius * 2 * Math.PI * (wheelGearRatio * wheelTicksPerRevolution) / (wheelGearRatio * wheelTicksPerRevolution));
|
||||||
|
|
||||||
|
double inches = unit.toInches(unit.fromUnit(unit, distance));
|
||||||
|
|
||||||
|
double ticks = fI * inches;
|
||||||
|
|
||||||
|
return (int)ticks;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For: Drive Wheels
|
||||||
|
public double ticksToUnit(DistanceUnit unit, int ticks) {
|
||||||
|
// Convert to inches, then to unit.
|
||||||
|
double inches = wheelRadius * 2 * Math.PI * ticks / (wheelGearRatio * wheelTicksPerRevolution);
|
||||||
|
|
||||||
|
return unit.fromUnit(DistanceUnit.INCH, inches);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For: Arm
|
||||||
|
public int angleToTicks(double angle) {
|
||||||
|
double d = (armGearRatio * armTicksPerRevolution) / 360.0;
|
||||||
|
|
||||||
|
// Casting to float so that the int version of Math.round is used.
|
||||||
|
return Math.round((float)d * (float)angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For: Arm
|
||||||
|
public double ticksToAngle(int ticks) {
|
||||||
|
double oneDegree = 360.0 / (armGearRatio * armTicksPerRevolution);
|
||||||
|
|
||||||
|
return oneDegree * ticks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Variable hardwareConfig(String variableName) {
|
||||||
|
Action hardwareConfiguration = configuration.action("Robot", "Hardware");
|
||||||
|
|
||||||
|
for (Variable v : hardwareConfiguration.getVariables()) {
|
||||||
|
if (variableName.trim().equals(v.name)) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new RuntimeException("Failed to find variable with name: " + variableName + " in group: Robot, action: Hardware");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Variable tuningConfig(String variableName) {
|
||||||
|
Action action = configuration.action("Robot", "Tuning");
|
||||||
|
|
||||||
|
for (Variable v : action.getVariables()) {
|
||||||
|
if (variableName.trim().equals(v.name)) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new RuntimeException("Failed to find variable with name: " + variableName + " in group: Robot, action: Tuning");
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
public void controlMotorPIDF(DcMotorEx motor, String motorName, double targetVelocity, double feedForward) {
|
||||||
|
Action action = configuration.action("Robot", "Tuning_PIDF_" + motorName);
|
||||||
|
double proportional = 0, integral = 0, derivative = 0;
|
||||||
|
|
||||||
|
for (Variable v : action.getVariables()) {
|
||||||
|
switch (v.name.trim()) {
|
||||||
|
case "proportional":
|
||||||
|
proportional = v.value();
|
||||||
|
break;
|
||||||
|
case "integral":
|
||||||
|
integral = v.value();
|
||||||
|
break;
|
||||||
|
case "derivative":
|
||||||
|
derivative = v.value();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double interval = (engine.getRuntime() - motorVelocityLastTiming.getOrDefault(motorName, 0.0));
|
||||||
|
|
||||||
|
double distance = motor.getTargetPosition() - motor.getCurrentPosition();
|
||||||
|
|
||||||
|
if (Math.abs(distance) < Math.abs(targetVelocity)) {
|
||||||
|
if ((targetVelocity < 0 && distance > 0) || (targetVelocity > 0 && distance < 0)) {
|
||||||
|
targetVelocity = -distance;
|
||||||
|
} else {
|
||||||
|
targetVelocity = distance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double error = targetVelocity - motor.getVelocity();
|
||||||
|
double deltaError = error - motorVelocityError.getOrDefault(motorName, 0.0);
|
||||||
|
|
||||||
|
double kIntegral = error * interval;
|
||||||
|
double kDerivative = deltaError / interval;
|
||||||
|
|
||||||
|
double kp = proportional * error;
|
||||||
|
double ki = integral * kIntegral;
|
||||||
|
double kd = derivative * kDerivative;
|
||||||
|
|
||||||
|
motorVelocityError.put(motorName, error);
|
||||||
|
motorVelocityLastTiming.put(motorName, engine.getRuntime());
|
||||||
|
|
||||||
|
double newTargetVelocity = kp + ki + kd + targetVelocity;
|
||||||
|
|
||||||
|
motor.setVelocity(newTargetVelocity);
|
||||||
|
|
||||||
|
Log.d(TAG, "Interval: " + interval + "ms, Error: " + error + " ticks, deltaError: " + deltaError + " ticks, distance: " +
|
||||||
|
distance + " ticks, kIntegral: " + kIntegral + ", kDerivative: " + kDerivative + ", proportional: " + proportional +
|
||||||
|
", integral: " + integral + ", derivative: " + derivative + ", kp: " + kp + ", ki: " + ki + ", kd: " + kd +
|
||||||
|
", targetVelocity: " + targetVelocity + " ticks, new Target Velocity: " + newTargetVelocity + " ticks, + motorVelocity: " + motor.getVelocity() + " ticks.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
public void controlArmMotor(double targetVelocity) {
|
||||||
|
// double time = System.currentTimeMillis();
|
||||||
|
// double newTargetVelocity = motorTargetVelocity.getOrDefault("Arm", targetVelocity);
|
||||||
|
// double lastTiming = motorVelocityLastTiming.getOrDefault("Arm", time);
|
||||||
|
// double deltaTime = (time - lastTiming) * 0.001;
|
||||||
|
//
|
||||||
|
// double distanceToTarget = arm.getTargetPosition() - arm.getCurrentPosition();
|
||||||
|
// double adjustedTargetVelocity = Math.abs(distanceToTarget) < targetVelocity ? Math.abs(distanceToTarget) : targetVelocity;
|
||||||
|
//
|
||||||
|
// double error = adjustedTargetVelocity - arm.getVelocity();
|
||||||
|
// double kp = 0.9;
|
||||||
|
//
|
||||||
|
// newTargetVelocity += error * kp * deltaTime;
|
||||||
|
//
|
||||||
|
// motorTargetVelocity.put("Arm", newTargetVelocity);
|
||||||
|
// motorVelocityLastTiming.put("Arm", time);
|
||||||
|
|
||||||
|
// arm.setVelocity(newTargetVelocity);
|
||||||
|
|
||||||
|
arm.setPower(tuningConfig("arm_automatic_power").value());
|
||||||
|
}
|
||||||
|
|
||||||
|
public double initialFacing() {
|
||||||
|
return initialFacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double facing() {
|
||||||
|
double imuDegrees = -imu.getRobotYawPitchRollAngles().getYaw(AngleUnit.DEGREES);
|
||||||
|
|
||||||
|
return (((imuDegrees + 360.0) % 360.0) + imuAngleOffset) % 360.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double heading() {
|
||||||
|
return AngleUnit.normalizeRadians(-facing() * Math.PI / 180.0);
|
||||||
|
// return imu.getRobotYawPitchRollAngles().getYaw(AngleUnit.RADIANS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double turnRate() {
|
||||||
|
return imu.getRobotAngularVelocity(AngleUnit.DEGREES).yRotationRate; // NOTE: UNTESTED
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBetween(double value, double min, double max) {
|
||||||
|
return value >= min && value <= max;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package org.timecrafters.minibots.cyberarm.phoenix.engines;
|
||||||
|
|
||||||
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersConfiguration;
|
||||||
|
import org.timecrafters.minibots.cyberarm.phoenix.Robot;
|
||||||
|
|
||||||
|
@com.qualcomm.robotcore.eventloop.opmode.TeleOp(name = "Mentor Phoenix | TeleOp", group = "Mentor Phoenix")
|
||||||
|
public class TeleOp extends CyberarmEngine {
|
||||||
|
private Robot robot;
|
||||||
|
private TimeCraftersConfiguration configuration;
|
||||||
|
final private String configurationName = "MentorPhoenix", actionsGroupName = "TeleOpStates";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() {
|
||||||
|
configuration = new TimeCraftersConfiguration(configurationName);
|
||||||
|
|
||||||
|
robot = new Robot(
|
||||||
|
this,
|
||||||
|
configuration
|
||||||
|
);
|
||||||
|
|
||||||
|
robot.imu.resetYaw();
|
||||||
|
|
||||||
|
setupFromConfig(
|
||||||
|
robot.getConfiguration(),
|
||||||
|
"org.timecrafters.minibots.cyberarm.phoenix.states.teleop",
|
||||||
|
robot,
|
||||||
|
Robot.class,
|
||||||
|
actionsGroupName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loop() {
|
||||||
|
robot.update();
|
||||||
|
|
||||||
|
super.loop();
|
||||||
|
|
||||||
|
robot.standardTelemetry();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop() {
|
||||||
|
robot.stop();
|
||||||
|
|
||||||
|
super.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
package org.timecrafters.minibots.cyberarm.phoenix.states.teleop;
|
||||||
|
|
||||||
|
import com.arcrobotics.ftclib.controller.PIDController;
|
||||||
|
import com.qualcomm.robotcore.hardware.Gamepad;
|
||||||
|
|
||||||
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.library.backend.config.Action;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.library.backend.config.Variable;
|
||||||
|
import org.timecrafters.minibots.cyberarm.phoenix.Robot;
|
||||||
|
|
||||||
|
public class ArmController extends CyberarmState {
|
||||||
|
private final Robot robot;
|
||||||
|
private final String groupName, actionName;
|
||||||
|
private final Gamepad controller;
|
||||||
|
private PIDController pidController;
|
||||||
|
private double p = 0, i = 0, d = 0, f = 0;
|
||||||
|
private final double ticksInDegree = 700 / 180;
|
||||||
|
|
||||||
|
public ArmController(Robot robot, String groupName, String actionName) {
|
||||||
|
this.robot = robot;
|
||||||
|
this.groupName = groupName;
|
||||||
|
this.actionName = actionName;
|
||||||
|
|
||||||
|
this.controller = engine.gamepad1;
|
||||||
|
|
||||||
|
pidController = new PIDController(p, i, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exec() {
|
||||||
|
Action action = robot.getConfiguration().action("Robot", "Tuning_PIDF_Arm");
|
||||||
|
|
||||||
|
for (Variable v : action.getVariables()) {
|
||||||
|
switch (v.name.trim()) {
|
||||||
|
case "proportional":
|
||||||
|
p = v.value();
|
||||||
|
break;
|
||||||
|
case "integral":
|
||||||
|
i = v.value();
|
||||||
|
break;
|
||||||
|
case "derivative":
|
||||||
|
d = v.value();
|
||||||
|
break;
|
||||||
|
case "feed": // feedback
|
||||||
|
f = v.value();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pidController.setPID(p, i, d);
|
||||||
|
int armPos = robot.arm.getCurrentPosition();
|
||||||
|
double pid = pidController.calculate(armPos, robot.arm.getTargetPosition());
|
||||||
|
double ff = Math.cos(Math.toRadians(robot.arm.getTargetPosition() / ticksInDegree)) * f;
|
||||||
|
|
||||||
|
double power = pid + ff;
|
||||||
|
|
||||||
|
robot.arm.setPower(power);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void buttonDown(Gamepad gamepad, String button) {
|
||||||
|
if (gamepad != controller) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (button) {
|
||||||
|
case "guide":
|
||||||
|
robot.reloadConfig();
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Arm control
|
||||||
|
case "a":
|
||||||
|
robot.armPosition(Robot.ArmPosition.COLLECT);
|
||||||
|
break;
|
||||||
|
case "x":
|
||||||
|
robot.armPosition(Robot.ArmPosition.LOW); // DISABLED GROUND JUNCTION
|
||||||
|
break;
|
||||||
|
case "b":
|
||||||
|
robot.armPosition(Robot.ArmPosition.MEDIUM);
|
||||||
|
break;
|
||||||
|
case "y":
|
||||||
|
robot.armPosition(Robot.ArmPosition.HIGH);
|
||||||
|
break;
|
||||||
|
// Manual stepping arm
|
||||||
|
case "left_bumper":
|
||||||
|
robot.arm.setTargetPosition(
|
||||||
|
robot.arm.getCurrentPosition() - robot.angleToTicks(5.0)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case "right_bumper":
|
||||||
|
robot.arm.setTargetPosition(
|
||||||
|
robot.arm.getCurrentPosition() + robot.angleToTicks(5.0)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Collector control
|
||||||
|
case "dpad_up":
|
||||||
|
robot.collectorLeftServo.setPower(-1);
|
||||||
|
robot.collectorRightServo.setPower(-1);
|
||||||
|
break;
|
||||||
|
case "dpad_down":
|
||||||
|
robot.collectorLeftServo.setPower(1);
|
||||||
|
robot.collectorRightServo.setPower(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void buttonUp(Gamepad gamepad, String button) {
|
||||||
|
if (gamepad != controller) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (button) {
|
||||||
|
// Collector control
|
||||||
|
case "dpad_up":
|
||||||
|
case "dpad_down":
|
||||||
|
robot.collectorLeftServo.setPower(0);
|
||||||
|
robot.collectorRightServo.setPower(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
package org.timecrafters.minibots.cyberarm.phoenix.states.teleop;
|
||||||
|
|
||||||
|
import com.qualcomm.robotcore.hardware.Gamepad;
|
||||||
|
|
||||||
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
|
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
|
||||||
|
import org.timecrafters.minibots.cyberarm.phoenix.Robot;
|
||||||
|
|
||||||
|
public class DriveController extends CyberarmState {
|
||||||
|
private final Robot robot;
|
||||||
|
private final String groupName, actionName;
|
||||||
|
|
||||||
|
private final Gamepad controller;
|
||||||
|
private boolean robotSlowMode;
|
||||||
|
|
||||||
|
public DriveController(Robot robot, String groupName, String actionName) {
|
||||||
|
this.robot = robot;
|
||||||
|
this.groupName = groupName;
|
||||||
|
this.actionName = actionName;
|
||||||
|
|
||||||
|
this.controller = engine.gamepad1;
|
||||||
|
|
||||||
|
this.robotSlowMode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exec() {
|
||||||
|
move();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop() {
|
||||||
|
stopDrive();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void buttonDown(Gamepad gamepad, String button) {
|
||||||
|
if (gamepad != controller) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DEBUG: Toggle hardware fault
|
||||||
|
if (button.equals("guide")) {
|
||||||
|
robot.hardwareFault = !robot.hardwareFault;
|
||||||
|
|
||||||
|
if (robot.hardwareFault) {
|
||||||
|
robot.hardwareFaultMessage = "Manually triggered.";
|
||||||
|
} else {
|
||||||
|
robot.hardwareFaultMessage = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (button.equals("right_stick_button")) {
|
||||||
|
robotSlowMode = !robotSlowMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (button.equals("left_stick_button") && robot.hardwareFault) {
|
||||||
|
robot.imu.resetYaw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// REF: https://gm0.org/en/latest/docs/software/tutorials/mecanum-drive.html
|
||||||
|
private void move() {
|
||||||
|
if (robot.automaticAntiTipActive || robot.hardwareFault) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
double x = controller.left_stick_x;
|
||||||
|
double y = -controller.left_stick_y;
|
||||||
|
|
||||||
|
// Improve control?
|
||||||
|
if (y < 0) {
|
||||||
|
y = -Math.sqrt(-y);
|
||||||
|
} else {
|
||||||
|
y = Math.sqrt(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x < 0) {
|
||||||
|
x = -Math.sqrt(-x) * 1.1; // Counteract imperfect strafing;
|
||||||
|
} else {
|
||||||
|
x = Math.sqrt(x) * 1.1; // Counteract imperfect strafing;
|
||||||
|
}
|
||||||
|
|
||||||
|
double rx = -controller.right_stick_x;
|
||||||
|
double denominator = Math.max(Math.abs(y) + Math.abs(x) + Math.abs(rx), 1);
|
||||||
|
|
||||||
|
|
||||||
|
double frontLeftPower = 0, frontRightPower = 0, backLeftPower = 0 , backRightPower = 0;
|
||||||
|
|
||||||
|
double heading = robot.heading();
|
||||||
|
double rotX = x * Math.cos(heading) - y * Math.sin(heading);
|
||||||
|
double rotY = x * Math.sin(heading) + y * Math.cos(heading);
|
||||||
|
|
||||||
|
frontLeftPower = (rotY + rotX + rx) / denominator;
|
||||||
|
backLeftPower = (rotY - rotX - rx) / denominator;
|
||||||
|
frontRightPower = (rotY - rotX + rx) / denominator;
|
||||||
|
backRightPower = (rotY + rotX - rx) / denominator;
|
||||||
|
|
||||||
|
double maxVelocity = robot.unitToTicks(DistanceUnit.INCH, robot.tuningConfig("drivetrain_max_velocity_in_inches").value());
|
||||||
|
double slowVelocity = robot.unitToTicks(DistanceUnit.INCH, robot.tuningConfig("drivetrain_slow_velocity_in_inches").value());
|
||||||
|
double velocity = robotSlowMode ? slowVelocity : maxVelocity;
|
||||||
|
|
||||||
|
// Power is treated as a ratio here
|
||||||
|
robot.frontLeftDrive.setVelocity(frontLeftPower * velocity);
|
||||||
|
robot.frontRightDrive.setVelocity(frontRightPower * velocity);
|
||||||
|
|
||||||
|
robot.backLeftDrive.setVelocity(backLeftPower * velocity);
|
||||||
|
robot.backRightDrive.setVelocity(backRightPower * velocity);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopDrive() {
|
||||||
|
robot.backLeftDrive.setVelocity(0); robot.backLeftDrive.setPower(0);
|
||||||
|
robot.frontRightDrive.setVelocity(0); robot.frontRightDrive.setPower(0);
|
||||||
|
|
||||||
|
robot.frontLeftDrive.setVelocity(0); robot.frontLeftDrive.setPower(0);
|
||||||
|
robot.backRightDrive.setVelocity(0); robot.backRightDrive.setPower(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package org.timecrafters.minibots.engines;
|
||||||
|
|
||||||
|
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
|
||||||
|
|
||||||
|
import org.cyberarm.engine.V2.CyberarmEngine;
|
||||||
|
import org.timecrafters.minibots.states.Mini2023Bot;
|
||||||
|
import org.timecrafters.minibots.states.Mini2023State;
|
||||||
|
|
||||||
|
@TeleOp (name= "2023Mini")
|
||||||
|
|
||||||
|
public class Mini2023Engine extends CyberarmEngine {
|
||||||
|
|
||||||
|
Mini2023Bot robot;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() {
|
||||||
|
|
||||||
|
robot = new Mini2023Bot(this);
|
||||||
|
addState(new Mini2023State(robot));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package org.timecrafters.minibots.states;
|
||||||
|
|
||||||
|
import com.qualcomm.hardware.modernrobotics.ModernRoboticsI2cRangeSensor;
|
||||||
|
import com.qualcomm.hardware.rev.RevHubOrientationOnRobot;
|
||||||
|
import com.qualcomm.robotcore.hardware.CRServo;
|
||||||
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
import com.qualcomm.robotcore.hardware.IMU;
|
||||||
|
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersConfiguration;
|
||||||
|
import org.timecrafters.minibots.engines.Mini2023Engine;
|
||||||
|
|
||||||
|
public class Mini2023Bot {
|
||||||
|
|
||||||
|
private final Mini2023Engine engine;
|
||||||
|
public TimeCraftersConfiguration configuration;
|
||||||
|
|
||||||
|
public DcMotor Opportunity, Spirit; //Don't ask. Just don't.
|
||||||
|
public CRServo servoA, servoB, servoC; //Just be thankful the servos have 'normal' names.
|
||||||
|
public IMU imu;
|
||||||
|
public ModernRoboticsI2cRangeSensor hazcam;
|
||||||
|
|
||||||
|
public Mini2023Bot(Mini2023Engine engine) {
|
||||||
|
this.engine = engine;
|
||||||
|
setupRobot();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupRobot() {
|
||||||
|
|
||||||
|
Spirit = engine.hardwareMap.get(DcMotor.class, "Left Wheel");
|
||||||
|
Opportunity = engine.hardwareMap.get(DcMotor.class, "Right Wheel");
|
||||||
|
|
||||||
|
servoA = engine.hardwareMap.get(CRServo.class, "Servo 1");
|
||||||
|
servoB = engine.hardwareMap.get(CRServo.class, "Servo 2");
|
||||||
|
servoC = engine.hardwareMap.get(CRServo.class, "Servo 3");
|
||||||
|
|
||||||
|
IMU.Parameters parameters = new IMU.Parameters(new RevHubOrientationOnRobot(
|
||||||
|
RevHubOrientationOnRobot.LogoFacingDirection.BACKWARD,
|
||||||
|
RevHubOrientationOnRobot.UsbFacingDirection.UP
|
||||||
|
));
|
||||||
|
|
||||||
|
this.imu = engine.hardwareMap.get(IMU.class, "imu");
|
||||||
|
imu.initialize(parameters);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// configuration = new TimeCraftersConfiguration("2023 Mini");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
package org.timecrafters.minibots.states;
|
||||||
|
|
||||||
|
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||||
|
|
||||||
|
import org.cyberarm.engine.V2.CyberarmState;
|
||||||
|
|
||||||
|
public class Mini2023State extends CyberarmState {
|
||||||
|
private final Mini2023Bot robot;
|
||||||
|
|
||||||
|
public double lThrust, rThrust, orbitSpeed;
|
||||||
|
|
||||||
|
public double deltaServo;
|
||||||
|
|
||||||
|
public Mini2023State(Mini2023Bot robot) {this.robot = robot;}
|
||||||
|
|
||||||
|
public double getDeltaServo() {
|
||||||
|
|
||||||
|
return deltaServo;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public void telemetry() {
|
||||||
|
engine.telemetry.addData("Right Drive Power", robot.Opportunity.getPower());
|
||||||
|
engine.telemetry.addData("Left Drive Power", robot.Spirit.getPower());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init() {
|
||||||
|
lThrust = 0;
|
||||||
|
rThrust = 0;
|
||||||
|
orbitSpeed = 0;
|
||||||
|
robot.servoA.setPower(orbitSpeed);
|
||||||
|
robot.servoB.setPower(orbitSpeed);
|
||||||
|
robot.servoC.setPower(orbitSpeed);
|
||||||
|
robot.Spirit.setPower(lThrust);
|
||||||
|
robot.Opportunity.setPower(rThrust);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exec() {
|
||||||
|
|
||||||
|
if (Math.abs(engine.gamepad1.left_stick_y) > 0.1) {
|
||||||
|
lThrust = engine.gamepad1.left_stick_y * 0.5;
|
||||||
|
robot.Spirit.setPower(lThrust);
|
||||||
|
} else {
|
||||||
|
lThrust = 0;
|
||||||
|
robot.Spirit.setPower(lThrust);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Math.abs(engine.gamepad1.right_stick_y) > 0.1) {
|
||||||
|
rThrust = engine.gamepad1.right_stick_y * 0.5;
|
||||||
|
robot.Opportunity.setPower(rThrust);
|
||||||
|
} else {
|
||||||
|
rThrust = 0;
|
||||||
|
robot.Opportunity.setPower(rThrust);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (engine.gamepad1.right_trigger > 0.1) {
|
||||||
|
orbitSpeed = engine.gamepad1.right_trigger * 0.5;
|
||||||
|
robot.servoA.setPower(orbitSpeed);
|
||||||
|
robot.servoB.setPower(orbitSpeed);
|
||||||
|
robot.servoC.setPower(orbitSpeed);
|
||||||
|
} else if (engine.gamepad1.left_trigger > 0.1) {
|
||||||
|
orbitSpeed = engine.gamepad1.left_trigger * 0.5;
|
||||||
|
robot.servoA.setPower(orbitSpeed);
|
||||||
|
robot.servoB.setPower(orbitSpeed);
|
||||||
|
robot.servoC.setPower(orbitSpeed);
|
||||||
|
} else {
|
||||||
|
orbitSpeed = 0;
|
||||||
|
robot.servoA.setPower(orbitSpeed);
|
||||||
|
robot.servoB.setPower(orbitSpeed);
|
||||||
|
robot.servoC.setPower(orbitSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -51,7 +51,7 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
signingConfig signingConfigs.debug
|
signingConfig signingConfigs.debug
|
||||||
applicationId 'com.qualcomm.ftcrobotcontroller'
|
applicationId 'com.qualcomm.ftcrobotcontroller'
|
||||||
minSdkVersion 23
|
minSdkVersion 24
|
||||||
//noinspection ExpiredTargetSdkVersion
|
//noinspection ExpiredTargetSdkVersion
|
||||||
targetSdkVersion 28
|
targetSdkVersion 28
|
||||||
|
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ dependencies {
|
|||||||
implementation 'org.apache.commons:commons-math3:3.6.1'
|
implementation 'org.apache.commons:commons-math3:3.6.1'
|
||||||
implementation 'com.acmerobotics.roadrunner:core:0.5.6'
|
implementation 'com.acmerobotics.roadrunner:core:0.5.6'
|
||||||
implementation 'com.acmerobotics.dashboard:dashboard:0.4.8'
|
implementation 'com.acmerobotics.dashboard:dashboard:0.4.8'
|
||||||
|
implementation 'org.ftclib.ftclib:core:2.1.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user