Solución de problemas

Solución a fallas totales

Hay algunas cosas que pueden causar una falla total en tu robot. La lista inferior cubre algunos de estos errores comunes.

  • Mi robot no se mueve

    • ¿En verdad esta dando energía a sus motores?

    • Si a usted le esta apareciendo el mensaje MalformedSplineException en la driver station, vaya a la sección MalformedSplineException

    • ¿Su trayectoria es muy corta o está en unidades equivocadas?

  • Mi robot gira alrededor para conducir la trayectoria en la otra dirección

  • Mi robot simplemente conduce en línea recta aunque debería girar.

    • ¿Su giróscopo está configurado correctamente y devuelve buenos datos?

    • ¿Está pasando su giróscopo rumbo a su objeto de odometría con las unidades correctas?

    • ¿Es correcto el ancho de su ruta? ¿Está en las unidades correctas?

  • Apareció el mensaje MalformedSplineException impreso en la driver station y el robot no se mueve

  • Mi robot conduce demasiado lejos.

    • ¿Están configuradas correctamente las conversiones de unidades de codificador?

    • ¿Están tus enconders conectados?

  • Mi robot generalmente hace lo correcto, pero es un poco inexacto.

    • Diríjase a la siguiente sección

Solución de problemas de bajo rendimiento

Nota

Esta sección se ocupa principalmente de la resolución de problemas de rendimiento de seguimiento de trayectoria deficiente, como un metro de error, no fallas catastróficas como errores de compilación, robots que giran y van en la dirección incorrecta o MalformedSplineExceptions.

Nota

Esta sección está diseñada para robots de accionamiento diferencial, pero la mayoría de las ideas se pueden adaptar para desvío o mecanum.

El rendimiento deficiente del seguimiento de la trayectoria puede ser difícil de solucionar. Aunque el generador de trayectoria y el seguidor están pensados ​​para ser fáciles de usar y con un rendimiento inmediato, hay situaciones en las que su robot no termina donde debería. El generador de trayectoria y los seguidores tienen muchas perillas para sintonizar y muchas partes móviles, por lo que puede ser difícil saber por dónde empezar, especialmente porque es difícil localizar la fuente de los problemas de trayectoria a partir del comportamiento general del robot.

Debido a que puede ser muy difícil de localizar la capa de el generador de trayectoria y los siguientes que se están portando mal, se recomienda un enfoque sistemático capa por capa para un rendimiento de seguimiento deficiente en general (por ejemplo, el robot se aleja unos pocos pies o más de veinte grados ). Los pasos siguientes se enumeran en el orden en el que debe realizarlos; Es importante seguir este orden para poder aislar los efectos de los diferentes pasos entre sí.

Nota

The below examples put diagnostic values onto NetworkTables. The easiest way to graph these values is to use Shuffleboard’s graphing capabilities.

Verifique la odometría

Si su odometría es mala, entonces su controlador Ramsete puede comportarse mal, porque modifica las velocidades objetivo de su robot en función de dónde cree que la odometría está el robot.

  1. Configure su código para que registre la posición del robot cada vez que se actualice la odometría.

NetworkTableEntry m_xEntry = NetworkTableInstance.getDefault().getTable("troubleshooting").getEntry("X");
NetworkTableEntry m_yEntry = NetworkTableInstance.getDefault().getTable("troubleshooting").getEntry("Y");

@Override
public void periodic() {
    // Update the odometry in the periodic block
    m_odometry.update(Rotation2d.fromDegrees(getHeading()), m_leftEncoder.getDistance(),
        m_rightEncoder.getDistance());

    var translation = m_odometry.getPoseMeters().getTranslation();
    m_xEntry.setNumber(translation.getX());
    m_yEntry.setNumber(translation.getY());
}
  1. Coloque una cinta métrica paralela a su robot y empuje su robot aproximadamente un metro a lo largo de la cinta métrica. Coloque una cinta métrica a lo largo del eje Y y comience de nuevo, empujando su robot un metro a lo largo del eje X y un metro a lo largo del eje Y en un arco aproximado.

  2. Compare X e Y informados por el robot con X e Y reales. Si X tiene una diferencia de más de 5 centímetros en la primera prueba, debe verificar que midió el diámetro de la rueda correctamente y que las ruedas no están desgastadas. Si la segunda prueba tiene una diferencia de más de 5 centímetros en X o Y, entonces el ancho de la pista (distancia desde el centro de la rueda izquierda al centro de la rueda derecha) puede ser incorrecto; Si está seguro de haber medido correctamente el ancho de la pista con una cinta métrica, es posible que las ruedas de su robot se estén deslizando de una manera que no se tenga en cuenta por el ancho de la pista–si este es el caso, debe correr la caracterización del ancho de la pista y use ese ancho de pista en lugar del de su cinta métrica.

Highlights the trackwidth section of characterization.

Verificar Feedforward

Si sus feedforwards son malos, entonces los controladores P para cada lado del robot no seguirán tan bien, y su DifferentialDriveVoltageConstraint no limitará la aceleración de su robot con precisión. En general, queremos apagar los controladores P de la rueda para poder aislar y probar los feedforwards.

  1. Primero, debemos configurar la desactivación del controlador P para cada rueda. Poner la ganancia P a 0 para cada controlador. En el ejemplo de «Comando Ramsete», pondrías «kPDriveVel» a 0:

136
137
        new PIDController(DriveConstants.kPDriveVel, 0, 0),
        new PIDController(DriveConstants.kPDriveVel, 0, 0),
  1. (Solo Java) Después, queremos desactivar el controlador de Ramsete para facilitar el aislamiento de nuestro comportamiento problemático. Esto es un poco más complicado, porque no podemos poner las ganancias (b y zeta) a 0. Pasa lo siguiente a su «Comando Ramsete»:

// Paste this variable in
RamseteController disabledRamsete = new RamseteController() {
    @Override
    public ChassisSpeeds calculate(Pose2d currentPose, Pose2d poseRef, double linearVelocityRefMeters,
            double angularVelocityRefRadiansPerSecond) {
        return new ChassisSpeeds(linearVelocityRefMeters, 0.0, angularVelocityRefRadiansPerSecond);
    }
};

// Be sure to pass your new disabledRamsete variable
RamseteCommand ramseteCommand = new RamseteCommand(
    exampleTrajectory,
    m_robotDrive::getPose,
    disabledRamsete,
    ...
);
  1. Finalmente, necesitamos registrar la velocidad de la rueda deseada y la velocidad real de la rueda (deberías poner las velocidades real y deseada en el mismo gráfico si estás usando Shuffleboard, o si tu software de gráficos tiene esa capacidad):

var table = NetworkTableInstance.getDefault().getTable("troubleshooting");
var leftReference = table.getEntry("left_reference");
var leftMeasurement = table.getEntry("left_measurement");
var rightReference = table.getEntry("right_reference");
var rightMeasurement = table.getEntry("right_measurement");

var leftController = new PIDController(kPDriveVel, 0, 0);
var rightController = new PIDController(kPDriveVel, 0, 0);
RamseteCommand ramseteCommand = new RamseteCommand(
    exampleTrajectory,
    m_robotDrive::getPose,
    disabledRamsete, // Pass in disabledRamsete here
    new SimpleMotorFeedforward(ksVolts, kvVoltSecondsPerMeter, kaVoltSecondsSquaredPerMeter),
    kDriveKinematics,
    m_robotDrive::getWheelSpeeds,
    leftController,
    rightController,
    // RamseteCommand passes volts to the callback
    (leftVolts, rightVolts) -> {
        m_robotDrive.tankDriveVolts(leftVolts, rightVolts);

        leftMeasurement.setNumber(m_robotDrive.getWheelSpeeds().leftMetersPerSecond);
        leftReference.setNumber(leftController.getSetpoint());

        rightMeasurement.setNumber(m_robotDrive.getWheelSpeeds().rightMetersPerSecond);
        rightReference.setNumber(rightController.getSetpoint());
    },
    m_robotDrive
);
  1. Run the robot on a variety of trajectories (curved and straight line), and check to see if the actual velocity tracks the desired velocity by looking at graphs from NetworkTables.

  2. Si el deseado y el real están apagados por un montón entonces deberías comprobar si el diámetro de la rueda y el «codificadorEPR» que usaste para la caracterización eran correctos. Si has verificado que tus unidades y conversiones son correctas, entonces deberías intentar recaracterizar en el mismo piso en el que estás probando para ver si puedes obtener mejores datos.

Verificación de la Ganancia P

Si has completado el paso anterior y el problema ha desaparecido, entonces es probable que tu problema se encuentre en uno de los siguientes pasos. En este paso vamos a verificar que los controladores P de tu rueda están bien ajustados. Si estás usando Java entonces queremos que apague Ramsete para que podamos ver nuestros controladores PF por su cuenta.

  1. Debes reutilizar todo el código del paso anterior que registra la velocidad actual frente a la deseada (y el código que desactiva Ramsete, si usas Java), excepto que la ganancia P debe volver a su valor anterior distinto de cero.

  2. Conduzca de nuevo el robot en distintas trayectorias, y revise que las gráficas reales se vean bien en comparación a las gráficas deseadas.

  3. Si las gráficas no se ven bien (ej. la velocidad al momento es muy diferente a la deseada) entonces debería intentar afinar su ganancia P y re ejecutar sus trayectorias de prueba.

Compruebe las restricciones

Nota

Asegúrese de que su ganancia P sea distinta de cero en este paso y que aún tenga el código de registro añadido en los pasos anteriores. Si estás usando Java entonces deberías quitar el código para desactivar Ramsete.

Si su problema de exactitud persiste a través de todos los pasos anteriores, entonces podría tener un problema con sus limitaciones. A continuación hay una lista de síntomas que las diferentes restricciones disponibles exhibirán cuando no estén bien afinadas.

¡Prueba una restricción a la vez! Elimina las otras restricciones, ajusta la que te queda y repite el proceso para cada restricción que quieras usar. La siguiente lista de comprobación supone que sólo se utiliza una restricción a la vez.

  • DifferentialDriveVoltageConstraint:

    • Si tu robot acelera muy lentamente, entonces es posible que el voltaje máximo para esta restricción sea demasiado bajo.

    • Si su robot no llega al final del camino entonces sus datos de caracterización pueden ser problemáticos.

  • DifferentialDriveKinematicsConstraint:

    • Si tu robot termina en el rumbo equivocado, es posible que la velocidad máxima del lado de la transmisión sea demasiado baja, o que sea demasiado alta. La única manera de saberlo es ajustando la velocidad máxima y ver qué pasa.

  • CentripetalAccelerationConstraint:

    • Si su robot termina en la dirección equivocada, entonces este podría ser el culpable. Si su robot no parece girar lo suficiente, entonces debe aumentar la aceleración centrípeta máxima, pero si parece girar en giros cerrados demasiado rápido, entonces debe disminuir la aceleración centrípeta máxima.

Comprobación de los puntos de ruta de la trayectoria

Es posible que su trayectoria en sí no sea muy manejable. Intente mover las coordenadas (y rumbos en las coordenadas, si corresponde) para reducir los giros bruscos.