#!/usr/bin/env python3 # # Copyright (c) FIRST and other WPILib contributors. # Open Source Software; you can modify and/or share it under the terms of # the WPILib BSD license file in the root directory of this project. # import wpimath import wpilib from drivetrain import Drivetrain class MyRobot(wpilib.TimedRobot): def __init__(self) -> None: super().__init__() self.controller = wpilib.NiDsXboxController(0) self.mecanum = Drivetrain() # Slew rate limiters to make joystick inputs more gentle; 1/3 sec from 0 to 1. self.xspeedLimiter = wpimath.SlewRateLimiter(3) self.yspeedLimiter = wpimath.SlewRateLimiter(3) self.rotLimiter = wpimath.SlewRateLimiter(3) def autonomousPeriodic(self) -> None: self.driveWithJoystick(False) self.mecanum.updateOdometry() def teleopPeriodic(self) -> None: self.driveWithJoystick(True) def driveWithJoystick(self, fieldRelative: bool) -> None: # Get the x speed. We are inverting this because Xbox controllers return # negative values when we push forward. xSpeed = ( -self.xspeedLimiter.calculate(self.controller.getLeftY()) * Drivetrain.kMaxSpeed ) # Get the y speed or sideways/strafe speed. We are inverting this because # we want a positive value when we pull to the left. Xbox controllers # return positive values when you pull to the right by default. ySpeed = ( -self.yspeedLimiter.calculate(self.controller.getLeftX()) * Drivetrain.kMaxSpeed ) # Get the rate of angular rotation. We are inverting this because we want a # positive value when we pull to the left (remember, CCW is positive in # mathematics). Xbox controllers return positive values when you pull to # the right by default. rot = ( -self.rotLimiter.calculate(self.controller.getRightX()) * Drivetrain.kMaxAngularSpeed ) self.mecanum.drive(xSpeed, ySpeed, rot, fieldRelative, self.getPeriod())