Mecanum Drive Kinematik

MecanumDriveKinematics sınıfı, bir ChassisSpeeds nesnesi ile bir mecanum sürücüsündeki dört tekerleğin her biri için hızları içeren bir MecanumDriveWheelSpeeds nesnesi arasında dönüşüm sağlayan kullanışlı bir araçtır.

Kinematik Nesnesinin Oluşturulması

MecanumDriveKinematics sınıfı dört constructor argümanı kabul eder, her argüman robot merkezine göre bir tekerleğin konumu olur (Translation2d olarak). Argümanların sırası sol ön, sağ ön, sol arka ve sağ arka şeklindedir. Tekerleklerin yerleri, robotun merkezine göre olmalıdır. Pozitif x değerleri robotun önüne doğru hareket etmeyi temsil ederken, pozitif y değerleri robotun soluna doğru hareket etmeyi temsil eder.

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

Şasi Hızlarını Tekerlek Hızlarına Dönüştürme

Bir ChassisSpeeds nesnesini MecanumDriveWheelSpeeds nesnesine dönüştürmek için toWheelSpeeds(ChassisSpeeds speeds) (Java) / ToWheelSpeeds(ChassisSpeeds speeds) (C++) yöntemi kullanılmalıdır. Bu, ileri hız, yan hız ve açısal hızı ayrı tekerlek hızlarına dönüştürmeniz gereken durumlarda kullanışlıdır.

// Example chassis speeds: 1 meter per second forward, 3 meters
// per second to the left, and rotation at 1.5 radians per second
// counterclockwise.
ChassisSpeeds speeds = new ChassisSpeeds(1.0, 3.0, 1.5);

// Convert to wheel speeds
MecanumDriveWheelSpeeds wheelSpeeds = kinematics.toWheelSpeeds(speeds);

// Get the individual wheel speeds
double frontLeft = wheelSpeeds.frontLeftMetersPerSecond
double frontRight = wheelSpeeds.frontRightMetersPerSecond
double backLeft = wheelSpeeds.rearLeftMetersPerSecond
double backRight = wheelSpeeds.rearRightMetersPerSecond

Field-oriented / Saha-odaklı sürüş

Recall bir ChassisSpeeds nesnesinin istenen saha odaklı hızlardan oluşturulabileceğini hatırlayın. Bu özellik, istenen saha odaklı hızlardan tekerlek hızları elde etmek için kullanılabilir.

// The desired field relative speed here is 2 meters per second
// toward the opponent's alliance station wall, and 2 meters per
// second toward the left field boundary. The desired rotation
// is a quarter of a rotation per second counterclockwise. The current
// robot angle is 45 degrees.
ChassisSpeeds speeds = ChassisSpeeds.fromFieldRelativeSpeeds(
  2.0, 2.0, Math.PI / 2.0, Rotation2d.fromDegrees(45.0));

// Now use this in our kinematics
MecanumDriveWheelSpeeds wheelSpeeds = kinematics.toWheelSpeeds(speeds);

Özel döndürme merkezlerini kullanma

Bazen, belirli bir kaçamak manevraları için belirli bir köşenin etrafında dönmek istenebilir. Bu tür davranış, WPILib sınıfları tarafından da desteklenir. Aynı ToWheelSpeeds()'' yöntemi, dönüş merkezi için ikinci bir parametre kabul eder (``Translation2d olarak). Tıpkı tekerlek konumları gibi, dönme merkezini temsil eden Translation2d de robot merkezine göre olmalıdır.

Not

Tüm robotlar sabit bir çerçeve olduğundan, ChassisSpeeds nesnesinden sağlanan vx ve vy hızları, robotun tamamı için geçerli olmaya devam edecektir. Bununla birlikte, ChassisSpeeds nesnesindeki omega, dönüş merkezinden ölçülecektir.

Örneğin, belirli bir tekerlek üzerinde dönme merkezi ayarlanabilir ve sağlanan ChassisSpeeds nesnesi sıfır olan bir vx ve vy ye ve sıfır olmayan bir omega ya sahipse, robot, o tekerleğin etrafında dönüyormuş gibi görünecektir.

Tekerlek hızlarını şasi hızlarına dönüştürme

Bir MecanumDriveWheelSpeeds nesnesini tekil bir ChassisSpeeds nesnesine dönüştürmek için kinematik nesnesi de kullanılabilir. Bunu sağlamak için toChassisSpeeds(MecanumDriveWheelSpeeds speeds)` (Java) / ToChassisSpeeds(MecanumDriveWheelSpeeds speeds) (C++) yöntemi kullanılabilir.

// Example wheel speeds
var wheelSpeeds = new MecanumDriveWheelSpeeds(-17.67, 20.51, -13.44, 16.26);

// Convert to chassis speeds
ChassisSpeeds chassisSpeeds = kinematics.toChassisSpeeds(wheelSpeeds);

// Getting individual speeds
double forward = chassisSpeeds.vxMetersPerSecond;
double sideways = chassisSpeeds.vyMetersPerSecond;
double angular = chassisSpeeds.omegaRadiansPerSecond;