# # 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 math import commands2 import wpilib import romi class Drivetrain(commands2.Subsystem): kCountsPerRevolution = 1440.0 kWheelDiameterInch = 2.75591 def __init__(self) -> None: # The Romi has the left and right motors set to # PWM channels 0 and 1 respectively self.leftMotor = wpilib.Spark(0) self.rightMotor = wpilib.Spark(1) # We need to invert one side of the drivetrain so that positive voltages # result in both sides moving forward. Depending on how your robot's # gearbox is constructed, you might have to invert the left side instead. self.rightMotor.setInverted(True) # The Romi has onboard encoders that are hardcoded # to use DIO pins 4/5 and 6/7 for the left and right self.leftEncoder = wpilib.Encoder(4, 5) self.rightEncoder = wpilib.Encoder(6, 7) # Set up the differential drive controller self.drive = wpilib.DifferentialDrive(self.leftMotor, self.rightMotor) # Set up the RomiGyro self.gyro = romi.RomiGyro() # Use inches as unit for encoder distances self.leftEncoder.setDistancePerPulse( (math.pi * self.kWheelDiameterInch) / self.kCountsPerRevolution ) self.rightEncoder.setDistancePerPulse( (math.pi * self.kWheelDiameterInch) / self.kCountsPerRevolution ) self.resetEncoders() def arcadeDrive(self, fwd: float, rot: float) -> None: """ Drives the robot using arcade controls. :param fwd: the commanded forward movement :param rot: the commanded rotation """ self.drive.arcadeDrive(fwd, rot) def resetEncoders(self) -> None: """Resets the drive encoders to currently read a position of 0.""" self.leftEncoder.reset() self.rightEncoder.reset() def getLeftEncoderCount(self) -> int: return self.leftEncoder.get() def getRightEncoderCount(self) -> int: return self.rightEncoder.get() def getLeftDistanceInch(self) -> float: return self.leftEncoder.getDistance() def getRightDistanceInch(self) -> float: return self.rightEncoder.getDistance() def getAverageDistanceInch(self) -> float: """Gets the average distance of the TWO encoders.""" return (self.getLeftDistanceInch() + self.getRightDistanceInch()) / 2.0 def getGyroAngleX(self) -> float: """Current angle of the Romi around the X-axis. :returns: The current angle of the Romi in degrees """ return self.gyro.getAngleX() def getGyroAngleY(self) -> float: """Current angle of the Romi around the Y-axis. :returns: The current angle of the Romi in degrees """ return self.gyro.getAngleY() def getGyroAngleZ(self) -> float: """Current angle of the Romi around the Z-axis. :returns: The current angle of the Romi in degrees """ return self.gyro.getAngleZ() def resetGyro(self) -> None: """Reset the gyro""" self.gyro.reset()