Controlador ramsete

El controlador Ramsete es un rastreador de trayectoria integrado en WPILib. Este rastreador se puede utilizar para rastrear trayectorias con precisión con corrección de perturbaciones menores.

Construcción del objeto controlador Ramsete

El controlador Ramsete debe inicializarse con dos ganancias, a saber, b y zeta. Los valores más altos de b hacen que la convergencia sea más agresiva como un término proporcional, mientras que los valores más altos de zeta proporcionan más amortiguación en la respuesta. Estas ganancias del controlador solo dictan cómo el controlador generará velocidades ajustadas. NO afecta el seguimiento de la velocidad real del robot. Esto significa que estas ganancias del controlador son generalmente independientes del robot.

Nota

Las ganancias de 2.0 y 0.7``para ``b y zeta se han probado repetidamente para producir resultados deseables cuando todas las unidades estaban en metros. Como tal, existe un constructor de argumento cero para RamseteController con ganancias predeterminadas a estos valores.

// Using the default constructor of RamseteController. Here
// the gains are initialized to 2.0 and 0.7.
RamseteController controller1 = new RamseteController();

// Using the secondary constructor of RamseteController where
// the user can choose any other gains.
RamseteController controller2 = new RamseteController(2.1, 0.8);

Obtener velocidades ajustadas

El controlador Ramsete devuelve «velocidades ajustadas» de modo que cuando el robot rastrea estas velocidades, alcanza con precisión el punto objetivo. El controlador debe actualizarse periódicamente con el nuevo objetivo. El objetivo comprende una pose deseada, una velocidad lineal deseada y una velocidad angular deseada. Además, la posición actual del robot también debe actualizarse periódicamente. El controlador usa estos cuatro argumentos para devolver la velocidad lineal y angular ajustada. Los usuarios deben ordenar a su robot estas velocidades lineales y angulares para lograr un seguimiento de trayectoria óptimo.

Nota

La «pose del objetivo» representa la posición en la que el robot debe estar en un paso de tiempo particular al rastrear la trayectoria. NO representa el punto final de la trayectoria.

El controlador se puede actualizar utilizando el método Calculate (C++) / calculate (Java). Hay dos sobrecargas para este método. Ambas sobrecargas aceptan la posición actual del robot como primer parámetro. Para los otros parámetros, una de estas sobrecargas toma el objetivo como tres parámetros separados (pose, velocidad lineal y velocidad angular) mientras que la otra sobrecarga acepta un objeto Trajectory.State, que contiene información sobre la pose del objetivo. Por su facilidad, los usuarios deben utilizar el último método al rastrear trayectorias.

Trajectory.State goal = trajectory.sample(3.4); // sample the trajectory at 3.4 seconds from the beginning
ChassisSpeeds adjustedSpeeds = controller.calculate(currentRobotPose, goal);

Estos cálculos deben realizarse en cada iteración de bucle, con una posición y un objetivo actualizados del robot.

Usando las velocidades ajustadas

Las velocidades ajustadas son del tipo ChassisSpeeds, que contiene un vx (velocidad lineal en la dirección de avance), una vy (velocidad lineal en la dirección lateral) y un omega (velocidad angular alrededor del centro del marco del robot). Debido a que el controlador Ramsete es un controlador para robots no holonómicos (robots que no pueden moverse hacia los lados), el objeto de velocidades ajustadas tiene una vy de cero.

Las velocidades ajustadas de regreso pueden ser convertidas a velocidades para usar utilizando las clases cinemáticas para el tipo de chasis. Por ejemplo, las velocidades ajustadas pueden convertirse en velocidades de derecha e izquierda para un manejo diferencial usando el objeto DifferentialDriveKinematics.

ChassisSpeeds adjustedSpeeds = controller.calculate(currentRobotPose, goal);
DifferentialDriveWheelSpeeds wheelSpeeds = kinematics.toWheelSpeeds(adjustedSpeeds);
double left = wheelSpeeds.leftMetersPerSecond;
double right = wheelSpeeds.rightMetersPerSecond;

Debido a que estas nuevas velocidades izquierda y derecha siguen siendo velocidades y no tensiones, se pueden utilizar dos controladores PID, uno para cada lado, para seguir estas velocidades. Se puede utilizar el controlador PID de WPILib (C++, Java), o la función PID de velocidad de los controladores de motor inteligentes como el TalonSRX y el SPARK MAX.

Ramsete en el Framework con base comando

Con motivos de facilitar a los usuarios, la clase RamseteCommand está contruida en WPILab. PAra un tutorial completo en la implementación de un autónomo que siga un camino usando RamseteCommand, vea Tutorial de trayectoria.