Exemple #1
0
 def run(self):
     while True:
         if self.enabled:
             err = self.error()
             power = self.target_speed / self.max_speed
             power += self.kP * err
             self.output(power)
         robot_time.sleep(millis=10)
Exemple #2
0
def _update_estimator(pose_estimator: PoseEstimator, sleep_sec=(10/1000)):
    ct = 0
    while True:
        pose_estimator.update(dt=sleep_sec)
        ct += sleep_sec
        if ct > 1:
            print(get_current_pose())
            ct = 0
        robot_time.sleep(seconds=sleep_sec)
Exemple #3
0
    def disabled(self):
        # Init
        while self.isDisabled():
            # Loop
            self.current_state = MyRobot.State.DISABLED

            self.periodic()
            robot_time.sleep(millis=self.delay_millis)

        for cmd in self.current_commands:
            cmd.cancel()
Exemple #4
0
 def _update_model(self):
     while True:
         print("Model!")
         now = robot_time.millis()
         dt = (now - self._model_last_time) / 1000
         self._model_last_time = now
         if self._mode == SmartDrivetrain.Mode.PercentVbus:
             factor = 1
         elif self._mode == SmartDrivetrain.Mode.Voltage:
             factor = 1/12
         else:
             print("Can't update model outside of PercentVBus")
             continue
         self._model_left_dist += self._left_motor.get() * self.max_speed * dt * factor
         self._model_right_dist += self._right_motor.get() * self.max_speed * dt * factor
         robot_time.sleep(millis=20)
Exemple #5
0
    def operatorControl(self):
        # Init
        if self.current_state != self.State.TELEOP:
            self.cmd_queue.append(OpDriveCommand(self))
            self.cmd_queue.append(OpFuelTankCommand(self))
            self.cmd_queue.append(OpShooterCommand(self))
            self.cmd_queue.append(OpClimberCommand(self))
            self.cmd_queue.append(OpGearCommand(self))

        while self.isOperatorControl():
            # Loop
            self.current_state = MyRobot.State.TELEOP
            self.periodic()
            robot_time.sleep(millis=self.delay_millis)

        for cmd in self.current_commands:
            cmd.cancel()
Exemple #6
0
    def robotInit(self):
        if wpilib.hal.isSimulation():
            basedir = ""
        else:
            basedir = "/home/lvuser/py"
        dashboard2.run(basedir)
        wpilib.CameraServer.launch()

        dashboard2.chooser("Autonomous", [
            "None", "Drive MotionMagic", "Align Shoot", "Pure Pursuit 1",
            "Pure Pursuit 2", "Pure Pursuit 3", "Gear Center", "Gear Left",
            "Gear Right", "Hopper/Boiler Blue", "Hopper/Boiler Red",
            "Boiler/Mobility Blue", "Boiler/Mobility Red"
        ],
                           default="None")

        self.talon_left_front = ctre.CANTalon(0)
        self.talon_left_rear = ctre.CANTalon(1)
        self.talon_right_rear = ctre.CANTalon(2)
        self.talon_right_front = ctre.CANTalon(3)
        self.talon_shooter = ctre.CANTalon(4)
        self.victor_intake = PWMMotor(wpilib.VictorSP, pwm_port=1, pdp_port=5)
        self.victor_blender = PWMMotor(wpilib.VictorSP, pwm_port=0, pdp_port=4)
        self.talon_climber = PWMMotor(wpilib.Talon, pwm_port=2, pdp_port=14)

        self.talon_shooter.setFeedbackDevice(
            ctre.CANTalon.FeedbackDevice.CtreMagEncoder_Relative)
        self.talon_shooter.reverseSensor(True)

        self.talon_left_rear.setControlMode(ctre.CANTalon.ControlMode.Follower)
        self.talon_left_rear.set(0)
        self.talon_right_rear.setControlMode(
            ctre.CANTalon.ControlMode.Follower)
        self.talon_right_rear.set(3)

        self.talon_left = self.talon_left_front
        self.talon_right = self.talon_right_front

        self.talon_left.setFeedbackDevice(
            ctre.CANTalon.FeedbackDevice.CtreMagEncoder_Relative)
        self.talon_right.setFeedbackDevice(
            ctre.CANTalon.FeedbackDevice.CtreMagEncoder_Relative)
        self.talon_left.reverseSensor(True)
        f_l = 0.1808
        p_l = 1.28
        i_l = 0.005
        d_l = 12.8

        f_r = 0.1724
        p_r = 1.28
        i_r = 0.005
        d_r = 12.8

        self.talon_left.setP(p_l)
        self.talon_left.setI(i_l)
        self.talon_left.setD(d_l)
        self.talon_left.setF(f_l)

        self.talon_right.setP(p_r)
        self.talon_right.setI(i_r)
        self.talon_right.setD(d_r)
        self.talon_right.setF(f_r)

        volt_ramp_time = 1 / 5
        volt_ramp = 12 / volt_ramp_time
        self.talon_left.setVoltageRampRate(volt_ramp)
        self.talon_right.setVoltageRampRate(volt_ramp)

        dashboard2.number_input("Turn Kp", 0.005)
        dashboard2.number_input("Lookahead", 1)
        dashboard2.number_input("Cruise speed", 0.3)

        dashboard2.graph("Blender Current", self.victor_blender.get_current)
        dashboard2.graph("Climber Current", self.talon_climber.get_current)
        dashboard2.graph("Drive Current", self.talon_left.getOutputCurrent)

        sensor_type = ctre.CANTalon.FeedbackDevice.CtreMagEncoder_Relative
        sensor_present = ctre.CANTalon.FeedbackDeviceStatus.Present
        dashboard2.indicator(
            "Left Encoder", lambda: self.talon_left.isSensorPresent(
                sensor_type) == sensor_present)
        dashboard2.indicator(
            "Right Encoder", lambda: self.talon_right.isSensorPresent(
                sensor_type) == sensor_present)

        self._drive = SmartDrivetrain(self.talon_left, self.talon_right)

        self._fueltank = FuelTank(self, self.victor_intake,
                                  self.victor_blender)
        self._shooter = Shooter(self, self.talon_shooter)
        self._climber = Climber(self, self.talon_climber)
        self._gear_lifter = GearLifter(self)

        dashboard2.number_input("Drive Vel", 10)
        dashboard2.number_input("Drive Acc", 10)
        dashboard2.number_input("Drive Dist", 10)

        self.systems = {
            "drive": self._drive,
            "climber": self._climber,
            "intake": self._fueltank,
            "shooter": self._shooter,
            "gear_lifter": self._gear_lifter
        }

        self.js_left = wpilib.Joystick(0)
        self.js_right = wpilib.Joystick(1)
        self.gamepad = wpilib.XboxController(2)

        if not wpilib.hal.isSimulation():
            t_wait = 30
            print("Waiting for vision... ({}s max)".format(t_wait))
            _vision_table = NetworkTables.getTable("vision")
            t_begin = time.time()

            # Wait until either vision is ready or 30s has passed
            while not _vision_table.getBoolean(
                    "ready", False) and not (time.time() - t_begin) > t_wait:
                robot_time.sleep(seconds=1)
        print("Robot ready!")
Exemple #7
0
    def autonomous(self):
        if self.current_state != self.State.AUTO:
            mode = dashboard2.get_chooser("Autonomous")

            self.talon_left.setPosition(0)
            self.talon_right.setPosition(0)
            vel = float(dashboard2.number_inputs["Drive Vel"])
            acc = float(dashboard2.number_inputs["Drive Acc"])
            dist = float(dashboard2.number_inputs["Drive Dist"])

            drive_vel = 0.02
            drive_acc = 0.01

            def gear_side(is_right=True):
                cmds = []
                cmds.append(AutoGearCommand(self, AutoGearCommand.State.up))
                cmds.append(
                    MotionProfileDriveCommand(self,
                                              (108 - 15.5 - 10 + 5 +
                                               (0 if is_right else 5)) / 12,
                                              drive_vel, drive_acc))
                cmds.append(
                    TurnToAngleCommand(self, (1 if is_right else -1) * 12))
                cmds.append(
                    MotionProfileDriveCommand(self, (44 - 4 - 5) / 12,
                                              drive_vel, drive_acc))
                cmds.append(AutoGearCommand(self, AutoGearCommand.State.down))
                cmds.append(
                    MotionProfileDriveCommand(self, -30 / 12, drive_vel,
                                              drive_acc))
                return cmds

            def align_shoot(is_right=True):
                cmds = []
                cmds.append(
                    TurnToAngleCommand(self, (1 if is_right else -1) * 90))
                cmds.append(TurnToBoilerCommand(self))
                cmds.append(AutoShooterCommand(self, 10, 3750))
                return cmds

            if mode == "Drive MotionMagic":
                cmds = []
                cmds.append(MotionProfileDriveCommand(self, dist, vel, acc))
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Align Shoot":
                cmds = []
                cmds += align_shoot(True)
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Gear Center":
                cmds = []
                cmds.append(AutoGearCommand(self, AutoGearCommand.State.up))
                cmds.append(
                    MotionProfileDriveCommand(self, (110 - 15.5 - 4 - 10) / 12,
                                              drive_vel, drive_acc))
                cmds.append(AutoGearCommand(self, AutoGearCommand.State.down))
                cmds.append(
                    MotionProfileDriveCommand(self, -40 / 12, drive_vel,
                                              drive_acc))
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Gear Left":
                cmds = gear_side(False)
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Gear Right":
                cmds = gear_side(True)
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Gear Left + Shoot":
                cmds = gear_side(False)
                cmds += align_shoot(False)
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Gear Right + Shoot":
                cmds = gear_side(True)
                cmds += align_shoot(True)
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Hopper/Boiler Blue":
                cmds = []
                cmds.append(DistanceDriveCommand(self, 93.5, 0.6))
                cmds.append(TurnToAngleCommand(self, 90))
                cmds.append(TimeDriveCommand(self, 2, 0.6))
                cmds.append(AutoShooterCommand(self, 10, 3700))
                cmds.append(AutoFuelTankCommand(self, 10))
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Hopper/Boiler Red":
                cmds = []
                cmds.append(DistanceDriveCommand(self, 93.5, 0.6))
                cmds.append(TurnToAngleCommand(self, 90))
                cmds.append(TimeDriveCommand(self, 2, -0.6))
                cmds.append(AutoShooterCommand(self, 10, 3700))
                cmds.append(AutoFuelTankCommand(self, 10))
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Boiler/Mobility Red":
                cmds = []
                cmds.append(AutoShooterCommand(self, 10, 3650))
                #cmds.append(AutoFuelTankCommand(self, 10))
                cmds.append(DistanceDriveCommand(self, 100, -0.6))
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Boiler/Mobility Blue":
                cmds = []
                cmds.append(AutoShooterCommand(self, 10, 3650))
                #cmds.append(AutoFuelTankCommand(self, 10))
                cmds.append(DistanceDriveCommand(self, 100, 0.6))
                self.cmd_queue.append(CommandSequence(self, cmds))

            lookahead = float(dashboard2.number_inputs["Lookahead"])
            cruise = float(dashboard2.number_inputs["Cruise speed"])
            if mode == "Pure Pursuit 1":
                cmds = []
                cmds.append(
                    PursuitDriveCommand(
                        self, [Vector2(0, 0), Vector2(7, 0)],
                        cruise_vel=0.4,
                        acc=0.1,
                        lookahead=lookahead))
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Pure Pursuit 2":
                cmds = []
                cmds.append(
                    PursuitDriveCommand(
                        self, [Vector2(0, 0),
                               Vector2(6, 0),
                               Vector2(9, -4)],
                        cruise_vel=0.3,
                        acc=0.15,
                        lookahead=lookahead))
                self.cmd_queue.append(CommandSequence(self, cmds))
            if mode == "Pure Pursuit 3":
                cmds = []
                cmds.append(
                    PursuitDriveCommand(
                        self, [Vector2(0, 0),
                               Vector2(6, -4),
                               Vector2(9, -4)],
                        cruise_vel=0.3,
                        acc=0.15,
                        lookahead=lookahead))
                self.cmd_queue.append(CommandSequence(self, cmds))

        # Init
        while self.isAutonomous():
            # Loop
            self.current_state = MyRobot.State.AUTO

            self.periodic()
            robot_time.sleep(millis=self.delay_millis)

        for cmd in self.current_commands:
            cmd.cancel()