Differential Drive Odometrisi

Bir kullanıcı, odometry gerçekleştirmek için diferansiyel sürücü kinematik sınıflarını kullanabilir . WPILib, sahada diferansiyel tahrik robotunun konumunu izlemek için kullanılabilecek bir DifferentialDriveOdometry 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

DifferentialDriveOdometry sınıfı, bir zorunlu bağımsız değişken ve bir isteğe bağlı bağımsız değişken gerektirir. Zorunlu argüman jiroskopunuz tarafından bildirilen açıdır (Rotation2d olarak). İsteğ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.

Önemli

DifferentialDriveOdometry sınıfını oluşturmadan önce enkoder konumları sıfırlanmalıdır.

// 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()));

Robot Duruşunu Güncelleme

Robotun sahadaki konumunu güncellemek için update yöntemi kullanılabilir. Bu yöntem periyodik olarak, tercihen periodic() yönteminde Subsystem ile çağrılmalıdır. update yöntemi, robotun yeni güncellenmiş konumunu döndürür. Bu yöntem, sol kodlayıcı mesafesi ve sağ kodlayıcı mesafesi ile birlikte robotun cayro açısını alır.

Not

Java’daki kodlayıcı mesafeleri metre cinsinden olmalıdır. C++ ‘da, units kitaplığı, herhangi bir doğrusal uzaklık birimi kullanılarak mesafeyi temsil etmek için kullanılabilir. Robot düz bir çizgide ilerliyorsa, her iki mesafe (sol ve sağ) pozitif olmalıdır.

@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());

Robot Duruşunu Sıfırlama

Robot konumu, resetPose yöntemiyle sıfırlanabilir. Bu yöntem iki bağımsız değişkeni kabul eder - yeni alana bağlı konum ve mevcut jiroskop açısı.

Önemli

Herhangi bir zamanda jiroskopunuzu sıfırlamaya karar verirseniz, yeni jiroskop açısıyla resetPose yöntemi ÇAĞIRILMALIDIR. Ayrıca konum sıfırlanırken kodlayıcılar da sıfırlanmalıdır.

Not

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

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