Skip to content

Adding a Drivetrain

A Drivetrain is a type of Attachment that defines Actions that can move Robots autonomously and tele-operated.

Volt provides many pre-built Drivetrain classes for many combinations of drivetrain types, localization methods, and backends. Using these pre-built classes is the simplest way to add a Drivetrain to your Robot.

Choosing a Drivetrain is a three-step process:

  1. Select a type of physical drivetrain (What drivetrain does your robot physically use?)
  2. Select a localization method (What localization hardware do you have?)
  3. Select a compatible backend (Which pathing backend/actions do you want to use?)

This table contains all of Volt’s pre-built Drivetrain classes:

DrivetrainLocalizationBackendClass
MecanumDrive EncoderPedroPathingDriveEncoderMecanumPedroPathingDrivetrain
MecanumDrive EncoderRoadRunnerDriveEncoderMecanumRoadRunnerDrivetrain
MecanumTwo WheelPedroPathingTwoWheelMecanumPedroPathingDrivetrain
MecanumTwo WheelRoadRunnerTwoWheelMecanumRoadRunnerDrivetrain
MecanumThree WheelPedroPathingThreeWheelMecanumPedroPathingDrivetrain
MecanumThree WheelRoadRunnerThreeWheelMecanumRoadRunnerDrivetrain
MecanumThree Wheel + IMUPedroPathingThreeWheelIMUMecanumPedroPathingDrivetrain
MecanumPinpointPedroPathingPinpointMecanumPedroPathingDrivetrain
MecanumPinpointRoadRunnerPinpointMecanumRoadRunnerDrivetrain
MecanumOTOSPedroPathingOTOSMecanumPedroPathingDrivetrain
MecanumOTOSRoadRunnerOTOSMecanumRoadRunnerDrivetrain
SwerveDrive EncoderPedroPathingDriveEncoderSwervePedroPathingDrivetrain
SwerveTwo WheelPedroPathingTwoWheelSwervePedroPathingDrivetrain
SwerveThree WheelPedroPathingThreeWheelSwervePedroPathingDrivetrain
SwerveThree Wheel + IMUPedroPathingThreeWheelIMUSwervePedroPathingDrivetrain
SwervePinpointPedroPathingPinpointSwervePedroPathingDrivetrain
SwerveOTOSPedroPathingOTOSSwervePedroPathingDrivetrain
TankDrive EncoderRoadRunnerDriveEncoderTankRoadRunnerDrivetrain
TankTwo WheelRoadRunnerTwoWheelTankRoadRunnerDrivetrain
TankThree WheelRoadRunnerThreeWheelTankRoadRunnerDrivetrain
TankPinpointRoadRunnerPinpointTankRoadRunnerDrivetrain
TankOTOSRoadRunnerOTOSTankRoadRunnerDrivetrain

Let’s use a mecanum drivetrain, drive encoder localization, and PedroPathing.

Make a Robot class that extends DrivetrainRobot. This gives your Robot access to a drivetrain instance.

class MyRobot(hardwareMap: HardwareMap) :
DrivetrainRobot(hardwareMap)

Pass a generic type parameter that inherits Drivetrain. This lets Volt know what type of Drivetrain class your Robot uses.

In this case we’ll use DriveEncoderMecanumPedroPathingDrivetrain:

class MyRobot(hardwareMap: HardwareMap) :
DrivetrainRobot<DriveEncoderMecanumPedroPathingDrivetrain>(hardwareMap)

4. Create and Configure Drivetrain Instance

Section titled “4. Create and Configure Drivetrain Instance”

Create a new instance of your Drivetrain type. This is where you define hardware and tune your Drivetrain.

For our DriveEncoderMecanumDrivetrain, we’ll supply simple FollowerConstants, DriveEncoderConstants, and MecanumConstants.

class MyRobot(hardwareMap: HardwareMap) :
DrivetrainRobot<DriveEncoderMecanumPedroPathingDrivetrain>(
hardwareMap,
DriveEncoderMecanumPedroPathingDrivetrain(
hardwareMap = hardwareMap,
followerConstants = FollowerConstants()
.mass(9.8)
.translationalPIDFCoefficients(PIDFCoefficients(0.02, 0.0, 0.0, 0.07)),
localizerConstants = DriveEncoderConstants()
.robotWidth(14.0)
.robotLength(9.0)
.forwardTicksToInches(0.0057725)
.strafeTicksToInches(0.0069642)
.turnTicksToInches(0.009961),
driveConstants = MecanumConstants()
.maxPower(0.8),
),
)

In this case, we would have calculated the Robot’s mass, driving base width, and driving base length; tuned translational PIDF coefficients, forward ticks per inch, strafe ticks per inch, and turn ticks per inch; and experimented with various maximum powers.

import com.pedropathing.control.PIDFCoefficients
import com.pedropathing.follower.FollowerConstants
import com.pedropathing.ftc.drivetrains.MecanumConstants
import com.pedropathing.ftc.localization.constants.DriveEncoderConstants
import com.pedropathing.geometry.Pose
import com.qualcomm.robotcore.hardware.HardwareMap
import dev.kingssack.volt.robot.DrivetrainRobot
import dev.kingssack.volt.attachment.drivetrain.pp.mecanum.DriveEncoderMecanumPedroPathingDrivetrain
class MyRobot(hardwareMap: HardwareMap) :
DrivetrainRobot<DriveEncoderMecanumPedroPathingDrivetrain>(
hardwareMap,
DriveEncoderMecanumPedroPathingDrivetrain(
hardwareMap = hardwareMap,
followerConstants = FollowerConstants()
.mass(9.8)
.translationalPIDFCoefficients(PIDFCoefficients(0.02, 0.0, 0.0, 0.07)),
localizerConstants = DriveEncoderConstants()
.robotWidth(14.0)
.robotLength(9.0)
.forwardTicksToInches(0.0057725)
.strafeTicksToInches(0.0069642)
.turnTicksToInches(0.009961),
driveConstants = MecanumConstants()
.maxPower(0.8),
),
)