Étape 2: Création d’un modèle de transmission pour une base pilotable

Afin de déterminer avec précision comment votre transmission physique répondra à des entrées de tension moteur données, un modèle précis de votre transmission doit être créé. Ce modèle est généralement créé en mesurant divers paramètres physiques de votre vrai robot. Dans WPILib, ce modèle de simulation de transmission est représenté par la classe DifferentialDrivetrainSim.

Création d’un DifferentialDrivetrainSim à partir de mesures physiques

One way to creating a DifferentialDrivetrainSim instance is by using physical measurements of the drivetrain and robot – either obtained through CAD software or real-world measurements (the latter will usually yield better results as it will more closely match reality). This constructor takes the following parameters:

  • Le type et le nombre de moteurs d’un côté de la transmission.

  • The gear ratio between the motors and the wheels as output torque over input torque (this number is usually greater than 1 for drivetrains).

  • The moment of inertia of the drivetrain (this can be obtained from a CAD model of your drivetrain. Usually, this is between 3 and 8 \(kg m^2\)).

  • La masse de la transmission (il est recommandé d’utiliser la masse de l’ensemble du robot lui-même, car elle modélisera plus précisément les caractéristiques d’accélération de votre robot pour le suivi de trajectoire).

  • Le rayon des roues motrices.

  • La largeur de voie (distance entre les roues gauche et droite).

  • Les écarts types du bruit de mesure: cela représente le bruit de mesure que vous attendez de vos capteurs réels. Le bruit de mesure est un tableau avec 7 éléments, chaque élément représentant l’écart type du bruit de mesure en x, y, cap, vitesse gauche, vitesse droite, position gauche et position droite respectivement. Cette option peut être omise en C ++ ou définie sur null en Java si le bruit de mesure n’est pas souhaitable.

Vous pouvez calculer le bruit de mesure de vos capteurs en prenant plusieurs points de données de l’état que vous essayez de mesurer et en calculant l’écart type à l’aide d’un outil comme Python. Par exemple, pour calculer l’écart type dans l’estimation de la vitesse de vos encodeurs, vous pouvez déplacer votre robot à une vitesse constante, prendre plusieurs mesures et calculer leur écart type par rapport à la moyenne connue. Si ce processus est trop fastidieux, les valeurs utilisées dans l’exemple ci-dessous doivent être une bonne représentation du bruit moyen des codeurs.

Note

L’écart type du bruit pour une mesure a les mêmes unités que cette mesure. Par exemple, l’écart type du bruit de vitesse a des unités de m

Note

Il est très important d’utiliser des unités SI (c’est-à-dire des mètres et des radians) lors du passage de paramètres en Java. En C ++, la librairie d’unités peut être utilisée pour spécifier n’importe quel type d’unité.

// Create the simulation model of our drivetrain.
DifferentialDrivetrainSim m_driveSim = new DifferentialDrivetrainSim(
  DCMotor.getNEO(2),       // 2 NEO motors on each side of the drivetrain.
  7.29,                    // 7.29:1 gearing reduction.
  7.5,                     // MOI of 7.5 kg m^2 (from CAD model).
  60.0,                    // The mass of the robot is 60 kg.
  Units.inchesToMeters(3), // The robot uses 3" radius wheels.
  0.7112,                  // The track width is 0.7112 meters.

  // The standard deviations for measurement noise:
  // x and y:          0.001 m
  // heading:          0.001 rad
  // l and r velocity: 0.1   m/s
  // l and r position: 0.005 m
  VecBuilder.fill(0.001, 0.001, 0.001, 0.1, 0.1, 0.005, 0.005));
#include <frc/simulation/DifferentialDrivetrainSim.h>

...

// Create the simulation model of our drivetrain.
frc::sim::DifferentialDrivetrainSim m_driveSim{
  frc::DCMotor::GetNEO(2), // 2 NEO motors on each side of the drivetrain.
  7.29,               // 7.29:1 gearing reduction.
  7.5_kg_sq_m,        // MOI of 7.5 kg m^2 (from CAD model).
  60_kg,              // The mass of the robot is 60 kg.
  3_in,               // The robot uses 3" radius wheels.
  0.7112_m,           // The track width is 0.7112 meters.

  // The standard deviations for measurement noise:
  // x and y:          0.001 m
  // heading:          0.001 rad
  // l and r velocity: 0.1   m/s
  // l and r position: 0.005 m
  {0.001, 0.001, 0.001, 0.1, 0.1, 0.005, 0.005}};

Création d’un DifferentialDrivetrainSim à partir de SysId Gains

You can also use the gains produced by System Identification, which you may have performed as part of setting up the trajectory tracking workflow outlined here to create a simulation model of your drivetrain and often yield results closer to real-world behavior than the method above.

Important

Vous devez avoir besoin de deux ensembles de gains Kv et Ka de l’outil d’identification - l’un provenant du mouvement en ligne droite et l’autre de la rotation sur place. Nous appellerons respectivement ces deux ensembles de gains gains linéaires et gains angulaires.

Ce constructeur prend les paramètres suivants:

  • Un système linéaire représentant la transmission - cela peut être créé en utilisant les gains d’identification.

  • La largeur de voie (distance entre les roues gauche et droite).

  • Le type et le nombre de moteurs d’un côté de la transmission.

  • The gear ratio between the motors and the wheels as output torque over input torque (this number is usually greater than 1 for drivetrains).

  • Le rayon des roues motrices.

  • Les écarts types du bruit de mesure: cela représente le bruit de mesure que vous attendez de vos capteurs réels. Le bruit de mesure est un tableau avec 7 éléments, chaque élément représentant l’écart type du bruit de mesure en x, y, cap, vitesse gauche, vitesse droite, position gauche et position droite respectivement. Cette option peut être omise en C ++ ou définie sur null en Java si le bruit de mesure n’est pas souhaitable.

Vous pouvez calculer le bruit de mesure de vos capteurs en prenant plusieurs points de données de l’état que vous essayez de mesurer et en calculant l’écart type à l’aide d’un outil comme Python. Par exemple, pour calculer l’écart type dans l’estimation de la vitesse de vos encodeurs, vous pouvez déplacer votre robot à une vitesse constante, prendre plusieurs mesures et calculer leur écart type par rapport à la moyenne connue. Si ce processus est trop fastidieux, les valeurs utilisées dans l’exemple ci-dessous doivent être une bonne représentation du bruit moyen des codeurs.

Note

L’écart type du bruit pour une mesure a les mêmes unités que cette mesure. Par exemple, l’écart type du bruit de vitesse a des unités de m

Note

Il est très important d’utiliser des unités SI (c’est-à-dire des mètres et des radians) lors du passage de paramètres en Java. En C ++, la librairie d’unités peut être utilisée pour spécifier n’importe quel type d’unité.

// Create our feedforward gain constants (from the identification
// tool)
static final double KvLinear = 1.98;
static final double KaLinear = 0.2;
static final double KvAngular = 1.5;
static final double KaAngular = 0.3;

// Create the simulation model of our drivetrain.
private DifferentialDrivetrainSim m_driveSim = new DifferentialDrivetrainSim(
  // Create a linear system from our identification gains.
  LinearSystemId.identifyDrivetrainSystem(KvLinear, KaLinear, KvAngular, KaAngular),
  DCMotor.getNEO(2),       // 2 NEO motors on each side of the drivetrain.
  7.29,                    // 7.29:1 gearing reduction.
  0.7112,                  // The track width is 0.7112 meters.
  Units.inchesToMeters(3), // The robot uses 3" radius wheels.

  // The standard deviations for measurement noise:
  // x and y:          0.001 m
  // heading:          0.001 rad
  // l and r velocity: 0.1   m/s
  // l and r position: 0.005 m
  VecBuilder.fill(0.001, 0.001, 0.001, 0.1, 0.1, 0.005, 0.005));
#include <frc/simulation/DifferentialDrivetrainSim.h>
#include <frc/system/plant/LinearSystemId.h>
#include <units/acceleration.h>
#include <units/angular_acceleration.h>
#include <units/angular_velocity.h>
#include <units/voltage.h>
#include <units/velocity.h>

...

// Create our feedforward gain constants (from the identification
// tool). Note that these need to have correct units.
static constexpr auto KvLinear = 1.98_V / 1_mps;
static constexpr auto KaLinear = 0.2_V / 1_mps_sq;
static constexpr auto KvAngular = 1.5_V / 1_rad_per_s;
static constexpr auto KaAngular = 0.3_V / 1_rad_per_s_sq;
// The track width is 0.7112 meters.
static constexpr auto kTrackwidth = 0.7112_m;

// Create the simulation model of our drivetrain.
frc::sim::DifferentialDrivetrainSim m_driveSim{
  // Create a linear system from our identification gains.
  frc::LinearSystemId::IdentifyDrivetrainSystem(
    KvLinear, KaLinear, KvAngular, KaAngular, kTrackWidth),
  kTrackWidth,
  frc::DCMotor::GetNEO(2), // 2 NEO motors on each side of the drivetrain.
  7.29,               // 7.29:1 gearing reduction.
  3_in,               // The robot uses 3" radius wheels.

  // The standard deviations for measurement noise:
  // x and y:          0.001 m
  // heading:          0.001 rad
  // l and r velocity: 0.1   m/s
  // l and r position: 0.005 m
  {0.001, 0.001, 0.001, 0.1, 0.1, 0.005, 0.005}};

Création d’un DifferentialDrivetrainSim du châssis KoP

La classe DifferentialDrivetrainSim renferme également une méthode statique createKitbotSim() (Java) / CreateKitbotSim() (C++) qui peut créer une instance du DifferentialDrivetrainSim en utilisant les paramètres standard du châssis du kit de pièces. Cette méthode accepte 5 arguments, dont deux sont facultatifs :

  • Le type et le nombre de moteurs d’un côté de la transmission.

  • The gear ratio between the motors and the wheels as output torque over input torque (this number is usually greater than 1 for drivetrains).

  • Le diamètre des roues installées sur la base pilotable.

  • Le moment d’inertie de la base d’entraînement (facultatif).

  • Les écarts types du bruit de mesure: cela représente le bruit de mesure que vous attendez de vos capteurs réels. Le bruit de mesure est un tableau avec 7 éléments, chaque élément représentant l’écart type du bruit de mesure en x, y, cap, vitesse gauche, vitesse droite, position gauche et position droite respectivement. Cette option peut être omise en C ++ ou définie sur null en Java si le bruit de mesure n’est pas souhaitable.

Vous pouvez calculer le bruit de mesure de vos capteurs en prenant plusieurs points de données de l’état que vous essayez de mesurer et en calculant l’écart type à l’aide d’un outil comme Python. Par exemple, pour calculer l’écart type dans l’estimation de la vitesse de vos encodeurs, vous pouvez déplacer votre robot à une vitesse constante, prendre plusieurs mesures et calculer leur écart type par rapport à la moyenne connue. Si ce processus est trop fastidieux, les valeurs utilisées dans l’exemple ci-dessous doivent être une bonne représentation du bruit moyen des codeurs.

Note

L’écart type du bruit pour une mesure a les mêmes unités que cette mesure. Par exemple, l’écart type du bruit de vitesse a des unités de m

Note

Il est très important d’utiliser des unités SI (c’est-à-dire des mètres et des radians) lors du passage de paramètres en Java. En C ++, la librairie d’unités peut être utilisée pour spécifier n’importe quel type d’unité.

private DifferentialDrivetrainSim m_driveSim = DifferentialDrivetrainSim.createKitbotSim(
  KitbotMotor.kDualCIMPerSide, // 2 CIMs per side.
  KitbotGearing.k10p71,        // 10.71:1
  KitbotWheelSize.kSixInch,    // 6" diameter wheels.
  null                         // No measurement noise.
);
#include <frc/simulation/DifferentialDrivetrainSim.h>

...

frc::sim::DifferentialDrivetrainSim m_driveSim =
  frc::sim::DifferentialDrivetrainSim::CreateKitbotSim(
    frc::sim::DifferentialDrivetrainSim::KitbotMotor::DualCIMPerSide, // 2 CIMs per side.
    frc::sim::DifferentialDrivetrainSim::KitbotGearing::k10p71,       // 10.71:1
    frc::sim::DifferentialDrivetrainSim::KitbotWheelSize::kSixInch    // 6" diameter wheels.
);

Note

Vous pouvez utiliser l’enum (Java) / struct (C++) KitbotMotor, KitbotGearing, et KitbotWheelSize pour obtenir des configurations couramment utilisées du châssis fourni dans le kit de pièces.

Important

Construire votre instance DifferentialDrivetrainSim de cette façon n’est qu’une approximation et vise à permettre aux équipes de mettre en place et d’exécuter des simulations. L’utilisation de valeurs empiriques mesurées à partir de votre robot physique donnera toujours des résultats plus précis.