Mecanum Sürüş Odometrisi

Bir kullanıcı, aşağıdakileri gerçekleştirmek için mecanum drive kinematics - mecanum sürücü kinematik sınıflarını kullanabilir odometry. WPILib, sahada bir mecanum tahrik robotunun konumunu izlemek için kullanılabilecek bir MecanumDriveOdometry sınıfı içerir.

Not

Bu yöntemde yalnızca kodlayıcılar ve bir jiroskop kullanıldığı için, robotun sahadaki konumunun tahmini, özellikle oyun sırasında diğer robotlarla temas kurduğunda zamanla kayacaktır. Bununla birlikte, odometri genellikle bağımsız dönemde çok doğrudur.

Odometri nesnesini oluşturma

MecanumDriveOdometry sınıfı, iki zorunlu bağımsız değişken ve bir isteğe bağlı bağımsız değişken gerektirir. Zorunlu argümanlar, mecanum sürücünüzü (bir MecanumDriveKinematics sınıfı biçiminde) ve jiroskopunuz tarafından bildirilen açı (Rotation2d olarak) temsil eden kinematik nesnesidir. Üçüncü isteğe bağlı argüman, robotunuzun sahadaki başlangıç pozudur (Pose2d olarak). Varsayılan olarak, robot ` x = 0, y = 0, theta = 0`` ile başlayacaktır.

Not

0 derece / radyan, robot doğrudan rakibinizin ittifak istasyonuna bakarken robot açısını temsil eder. Robotunuz sola döndükçe jiroskop açınız artmalıdır. Varsayılan olarak, WPILib jiroskopları zıt davranış sergiler, bu nedenle jiroskop açısını geçersiz kılmalısınız.

// Locations of the wheels relative to the robot center.
Translation2d m_frontLeftLocation = new Translation2d(0.381, 0.381);
Translation2d m_frontRightLocation = new Translation2d(0.381, -0.381);
Translation2d m_backLeftLocation = new Translation2d(-0.381, 0.381);
Translation2d m_backRightLocation = new Translation2d(-0.381, -0.381);

// Creating my kinematics object using the wheel locations.
MecanumDriveKinematics m_kinematics = new MecanumDriveKinematics(
  m_frontLeftLocation, m_frontRightLocation, m_backLeftLocation, m_backRightLocation
);

// Creating my odometry object from the kinematics 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.
MecanumDriveOdometry m_odometry = new MecanumDriveOdometry(m_kinematics,
  getGyroHeading(), new Pose2d(5.0, 13.5, new Rotation2d()));

Robot duruşunu güncelleme

Odometri sınıfının güncelleme yöntemi, robotun sahadaki konumunu günceller. Güncelleme yöntemi, robot üzerindeki 4 tekerleğin her birinin hızını temsil eden bir MecanumDriveWheelSpeeds nesnesi ile birlikte robotun cayro açısını alır. Bu update yöntemi periyodik olarak, tercihen periodic() yönteminde Subsystem ile çağrılmalıdır. Güncelleme yöntemi, robotun yeni güncellenmiş pozunu döndürür.

Not

Java’daki MecanumDriveWheelSpeeds sınıfı, saniyede metre cinsinden her tekerlek hızından oluşturulmalıdır. C++ ‘da, unit-birim kitaplığı tekerlek hızlarınızı temsil etmek için kullanılmalıdır.

@Override
public void periodic() {
  // Get my wheel speeds
  var wheelSpeeds = new MecanumDriveWheelSpeeds(
      m_frontLeftEncoder.getRate(), m_frontRightEncoder.getRate(),
      m_backLeftEncoder.getRate(), m_backRightEncoder.getRate());

  // 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, wheelSpeeds);
}

Robot Duruşunu Sıfırlama

Robot duruşu, resetPose yöntemiyle sıfırlanabilir. Bu yöntem iki argümanı kabul eder - yeni sahaya bağlı poz ve mevcut jiroskop açısı.

Önemli

Herhangi bir zamanda jiroskopunuzu sıfırlamaya karar verirseniz, yeni jiroskop açısı ile resetPose yöntemi ÇAĞIRILMALIDIR.

Not

Odometriye sahip bir mecanum sürücü robotunun tam bir örneğini burada bulabilirsiniz: C ++ <https://github.com/wpilibsuite/allwpilib/tree/main/wpilibcExamples/src/main/cpp/examples/MecanumBot> _ / Java <https://github.com/wpilibsuite/allwpilib/tree/main/wpilibjExamples/src/main/java/edu/wpi/first/wpilibj/examples/mecanumbot> _.

Ek olarak, mevcut robot pozunu güncelleme olmadan almak için GetPose (C++) / getPoseMeters (Java) yöntemleri kullanılabilir.