Cinématique d’entraînement différentiel
La classe DifferentialDriveKinematics
est un outil utile qui convertit entre un objet ChassisSpeeds
et un objet DifferentialDriveWheelSpeeds
, qui contient des vitesses pour les côtés gauche et droit d’un robot à entraînement différentiel.
Construction de l’objet cinématique
L’objet DifferentialDriveKinematics
accepte un argument constructeur, qui est la largeur de piste du robot. Cela représente la distance entre les deux trains de roues sur un entraînement différentiel.
Note
En Java, la largeur de la piste doit être en mètres. En C ++, la librairie d’unités peut être utilisée pour transmettre la largeur de piste en utilisant n’importe quelle unité de longueur.
Conversion de Chassis Speeds vers Wheel Speeds
La méthode toWheelSpeeds(ChassisSpeeds speeds)
(Java) / ToWheelSpeeds(ChassisSpeeds speeds)
(C++) doit être utilisée pour convertir un objet ChassisSpeeds
en un objet DifferentialDriveWheelSpeeds
. Ceci est utile dans les situations où vous devez convertir une vitesse linéaire (vx
) et une vitesse angulaire (omega
) en vitesses de roue gauche et droite.
// Creating my kinematics object: track width of 27 inches
DifferentialDriveKinematics kinematics =
new DifferentialDriveKinematics(Units.inchesToMeters(27.0));
// Example chassis speeds: 2 meters per second linear velocity,
// 1 radian per second angular velocity.
var chassisSpeeds = new ChassisSpeeds(2.0, 0, 1.0);
// Convert to wheel speeds
DifferentialDriveWheelSpeeds wheelSpeeds = kinematics.toWheelSpeeds(chassisSpeeds);
// Left velocity
double leftVelocity = wheelSpeeds.leftMetersPerSecond;
// Right velocity
double rightVelocity = wheelSpeeds.rightMetersPerSecond;
// Creating my kinematics object: track width of 27 inches
frc::DifferentialDriveKinematics kinematics{27_in};
// Example chassis speeds: 2 meters per second linear velocity,
// 1 radian per second angular velocity.
frc::ChassisSpeeds chassisSpeeds{2_mps, 0_mps, 1_rad_per_s};
// Convert to wheel speeds. Here, we can use C++17's structured bindings
// feature to automatically split the DifferentialDriveWheelSpeeds
// struct into left and right velocities.
auto [left, right] = kinematics.ToWheelSpeeds(chassisSpeeds);
Conversion de Wheel Speeds vers Chassis Speeds
On peut également utiliser l’objet cinématique pour convertir les vitesses de roue individuelles (gauche et droite) en un objet ChassisSpeeds
unique. La méthode toChassisSpeeds(DifferentialDriveWheelSpeeds speeds)
(Java) / ToChassisSpeeds(DifferentialDriveWheelSpeeds speeds)
(C++) doit être utilisée pour y parvenir.
// Creating my kinematics object: track width of 27 inches
DifferentialDriveKinematics kinematics =
new DifferentialDriveKinematics(Units.inchesToMeters(27.0));
// Example differential drive wheel speeds: 2 meters per second
// for the left side, 3 meters per second for the right side.
var wheelSpeeds = new DifferentialDriveWheelSpeeds(2.0, 3.0);
// Convert to chassis speeds.
ChassisSpeeds chassisSpeeds = kinematics.toChassisSpeeds(wheelSpeeds);
// Linear velocity
double linearVelocity = chassisSpeeds.vxMetersPerSecond;
// Angular velocity
double angularVelocity = chassisSpeeds.omegaRadiansPerSecond;
// Creating my kinematics object: track width of 27 inches
frc::DifferentialDriveKinematics kinematics{27_in};
// Example differential drive wheel speeds: 2 meters per second
// for the left side, 3 meters per second for the right side.
frc::DifferentialDriveWheelSpeeds wheelSpeeds{2_mps, 3_mps};
// Convert to chassis speeds. Here we can use C++17's structured bindings
// feature to automatically split the ChassisSpeeds struct into its 3 components.
// Note that because a differential drive is non-holonomic, the vy variable
// will be equal to zero.
auto [linearVelocity, vy, angularVelocity] = kinematics.ToChassisSpeeds(wheelSpeeds);