Files
PJ Reiniger dca59147e1 [robotpy][examples] Split examples and snippets (#8944)
This also updates the bazel scripts to behave more like the C++ and Java
examples, and updates the copybara scripts to be able to sync up
`mostrobotpy`
2026-06-03 19:43:16 -07:00

104 lines
3.2 KiB
Python

#
# 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()