Skip to content

Drivetrain Python

En esta guía crearás un drivetrain diferencial moderno utilizando Python y RobotPy, siguiendo el mismo flujo que la versión en Java pero adaptado a la sintaxis y herramientas de Python.

El objetivo es aprender:

  • Cómo crear un proyecto FRC con RobotPy
  • Cómo funciona un drivetrain diferencial
  • Cómo utilizar leaders y followers
  • Cómo controlar el robot con un control Xbox
  • Cómo configurar motores brushless
  • Cómo desplegar código al roboRIO
  • Cómo probar el robot desde Driver Station

Un Differential Drivetrain utiliza lados izquierdo y derecho independientes para mover el robot, igual que en la versión Java de esta guía.

La mayoría de robots FRC tipo tanque utilizan:

  • 2 motores izquierdos
  • 2 motores derechos
  • Leaders y followers
  • Control arcade con control Xbox
  • Motores brushless conectados por CAN

Asegúrate de tener:

  • Python y RobotPy instalados
  • VS Code configurado
  • roboRIO configurado
  • Driver Station funcionando
  • Control Xbox conectado
  • Motores y controladores correctamente cableados

Abre una terminal en la carpeta donde quieras crear el proyecto y ejecuta el comando de inicialización de RobotPy.

Terminal window
py -3 -m robotpy init

RobotPy genera dos archivos principales en la carpeta del proyecto:

  • robot.py
  • pyproject.toml

robot.py contiene la clase principal del robot. pyproject.toml define las dependencias del proyecto, incluyendo la versión de RobotPy y las librerías de fabricantes que agregues.


Crearemos un drivetrain con:

  • 4 motores brushless
  • Leaders y followers
  • Differential Drive
  • Control Xbox
  • Arcade Drive

La estructura será similar a esta:

Left Side
├── Left Leader
└── Left Follower
Right Side
├── Right Leader
└── Right Follower

Cada controlador de motor necesita un CAN ID único. En este ejemplo utilizaremos los mismos IDs que la versión Java:

MotorCAN ID
Left Leader10
Left Follower11
Right Leader12
Right Follower13

import wpilib
import rev
from wpilib.drive import DifferentialDrive

class MyRobot(wpilib.TimedRobot):
def robotInit(self):
# Left side motors
self.leftLeader = rev.SparkMax(
10, rev.SparkLowLevel.MotorType.kBrushless)
self.leftFollower = rev.SparkMax(
11, rev.SparkLowLevel.MotorType.kBrushless)
# Right side motors
self.rightLeader = rev.SparkMax(
12, rev.SparkLowLevel.MotorType.kBrushless)
self.rightFollower = rev.SparkMax(
13, rev.SparkLowLevel.MotorType.kBrushless)

En un drivetrain FRC moderno normalmente existen motores leaders y motores followers.

El motor leader recibe comandos directamente desde el código. El follower copia automáticamente el comportamiento del leader del mismo lado.

Esto permite:

  • Simplificar el código
  • Mantener sincronizados los motores
  • Reducir errores

self.controller = wpilib.XboxController(0)

self.drive = DifferentialDrive(self.leftLeader, self.rightLeader)

Dentro de robotInit(), después de crear los motores, se configuran con objetos SparkMaxConfig:

leftFollowerConfig = rev.SparkMaxConfig()
leftFollowerConfig.follow(self.leftLeader)
self.leftFollower.configure(
leftFollowerConfig,
rev.ResetMode.kResetSafeParameters,
rev.PersistMode.kPersistParameters)
rightFollowerConfig = rev.SparkMaxConfig()
rightFollowerConfig.follow(self.rightLeader)
self.rightFollower.configure(
rightFollowerConfig,
rev.ResetMode.kResetSafeParameters,
rev.PersistMode.kPersistParameters)
rightLeaderConfig = rev.SparkMaxConfig()
rightLeaderConfig.inverted(True)
self.rightLeader.configure(
rightLeaderConfig,
rev.ResetMode.kResetSafeParameters,
rev.PersistMode.kPersistParameters)

Ahora agregaremos control manual dentro de teleopPeriodic().

def teleopPeriodic(self):
speed = -self.controller.getLeftY()
rotation = self.controller.getRightX()
self.drive.arcadeDrive(speed, rotation)
  • -self.controller.getLeftY() lee el stick izquierdo para avanzar y retroceder.
  • self.controller.getRightX() lee el stick derecho para girar.
  • self.drive.arcadeDrive(speed, rotation) convierte ambos valores en movimiento para el drivetrain.

Con este sistema:

  • Stick izquierdo → adelante y atrás
  • Stick derecho → giro o pivote

Si avanzas y giras al mismo tiempo, el robot girará suavemente mientras avanza. Este es uno de los métodos de control más utilizados en FRC.


import wpilib
import rev
from wpilib.drive import DifferentialDrive
class MyRobot(wpilib.TimedRobot):
def robotInit(self):
# Left side motors
self.leftLeader = rev.SparkMax(
10, rev.SparkLowLevel.MotorType.kBrushless)
self.leftFollower = rev.SparkMax(
11, rev.SparkLowLevel.MotorType.kBrushless)
# Right side motors
self.rightLeader = rev.SparkMax(
12, rev.SparkLowLevel.MotorType.kBrushless)
self.rightFollower = rev.SparkMax(
13, rev.SparkLowLevel.MotorType.kBrushless)
# Followers
leftFollowerConfig = rev.SparkMaxConfig()
leftFollowerConfig.follow(self.leftLeader)
self.leftFollower.configure(
leftFollowerConfig,
rev.ResetMode.kResetSafeParameters,
rev.PersistMode.kPersistParameters)
rightFollowerConfig = rev.SparkMaxConfig()
rightFollowerConfig.follow(self.rightLeader)
self.rightFollower.configure(
rightFollowerConfig,
rev.ResetMode.kResetSafeParameters,
rev.PersistMode.kPersistParameters)
# Invert right side
rightLeaderConfig = rev.SparkMaxConfig()
rightLeaderConfig.inverted(True)
self.rightLeader.configure(
rightLeaderConfig,
rev.ResetMode.kResetSafeParameters,
rev.PersistMode.kPersistParameters)
# Xbox controller
self.controller = wpilib.XboxController(0)
# Differential drivetrain
self.drive = DifferentialDrive(self.leftLeader, self.rightLeader)
def teleopPeriodic(self):
# Forward and backward
speed = -self.controller.getLeftY()
# Rotation
rotation = self.controller.getRightX()
# Drive robot
self.drive.arcadeDrive(speed, rotation)

Se ejecuta una sola vez cuando el programa del robot inicia. Se utiliza para preparar el robot antes de comenzar a operar, inicializando motores, sensores, controles y cualquier configuración necesaria para el resto del código.


  1. Conecta el roboRIO por Ethernet o USB.
  2. Abre una terminal en la carpeta del proyecto.
  3. Ejecuta el comando de deploy.
Terminal window
python -m robotpy deploy

Abre Driver Station y verifica:

  • Communications = verde
  • Robot Code = verde
  • Joysticks = verde

  1. Selecciona Teleoperated
  2. Presiona Enable
  3. Mueve el joystick

El robot debería responder inmediatamente.


  • Verifica conexión al roboRIO
  • Revisa el Team Number en pyproject.toml
  • Ejecuta py -3 -m robotpy sync antes de reintentar
  • Verifica firewall de Windows

Ahora puedes continuar con:

  • Corriendo el programa
  • Driver Station
  • Command-Based Programming
  • Sensores
  • Autonomous
  • Dashboards
RobotPy