Odometría de mando diferencial

Un usuario puede utilizar las clases de cinemática de accionamiento diferencial para realizar: ref:odometría <docs/software/kinematics-and-odometry/intro-and-chassis-speeds:What is odometry?>. WPILib contiene una clase DifferentialDriveOdometry que se puede utilizar para rastrear la posición de un robot de accionamiento diferencial en el campo.

Nota

Debido a que este método solo usa codificadores y un giróscopo, la estimación de la posición del robot en el campo variará con el tiempo, especialmente cuando tu robot entre en contacto con otros robots durante el juego. Sin embargo, la odometría suele ser muy precisa durante el período autónomo.

Creación del objeto de odometría

La clase DifferentialDriveOdometry requiere un argumento obligatorio y un argumento opcional. El argumento obligatorio es el ángulo informado por su giroscopio (como Rotation2d). El argumento opcional es la pose inicial de su robot en el campo (como una Pose2d). De forma predeterminada, el robot comenzará en x = 0, y = 0, theta = 0.

Nota

0 grados / radianes representa el ángulo del robot cuando el robot está mirando directamente hacia la estación de alianza de tu oponente. A medida que su robot gira hacia la izquierda, el ángulo de su giroscopio debería aumentar. Por defecto, los giroscopios WPILib exhiben el comportamiento opuesto, por lo que debe negar el ángulo del giroscopio.

Importante

Las posiciones del codificador deben restablecerse a cero antes de construir la clase DifferentialDriveOdometry.

// Creating my odometry object. Here,
// our starting pose is 5 meters along the long end of the field and in the
// center of the field along the short end, facing forward.
DifferentialDriveOdometry m_odometry = new DifferentialDriveOdometry(
  getGyroHeading(), new Pose2d(5.0, 13.5, new Rotation2d()));

Actualización de la postura del robot

El método de actualización se puede utilizar para actualizar la posición del robot en el campo. Este método debe ser llamado periódicamente, preferiblemente en el método periodic() de un Subsistema. El método de actualización devuelve la nueva pose actualizada del robot. Este método tiene en cuenta el ángulo de giro del robot, junto con la distancia del codificador izquierdo y la distancia del codificador derecho.

Nota

Las distancias del codificador en Java deben estar en metros. En C++, la biblioteca de unidades se puede usar para representar la distancia usando cualquier unidad de distancia lineal. Si el robot avanza en línea recta, ambas distancias (izquierda y derecha) deben ser positivas.

@Override
public void periodic() {
// Get my gyro angle. We are negating the value because gyros return positive
// values as the robot turns clockwise. This is not standard convention that is
// used by the WPILib classes.
var gyroAngle = Rotation2d.fromDegrees(-m_gyro.getAngle());

// Update the pose
m_pose = m_odometry.update(gyroAngle, m_leftEncoder.getDistance(), m_rightEncoder.getDistance());

Restablecer la postura del robot

La pose del robot se puede restablecer mediante el método resetPose. Este método acepta dos argumentos: la nueva pose relativa al campo y el ángulo de giro actual.

Importante

Si en algún momento, decide restablecer su giroscopio, se DEBE llamar al método resetPose con el nuevo ángulo de giro. Además, los codificadores también deben restablecerse a cero al restablecer la pose.

Nota

Un ejemplo completo de un robot de accionamiento diferencial con odometría está disponible aquí: C++ / Java.

Además, los métodos GetPose (C ++) / getPoseMeters (Java) se pueden utilizar para recuperar la pose actual del robot sin una actualización.