É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

Une façon de créer une instance DifferentialDrivetrainSim consiste à utiliser des mesures physiques de la transmission et du robot - obtenues via un logiciel de CAO ou des mesures réelles (ces dernières donneront généralement de meilleurs résultats car elles correspondront plus étroitement à la réalité). Ce constructeur prend les paramètres suivants:

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

  • Le rapport d’engrenage entre les moteurs et les roues comme couple de sortie sur couple d’entrée (ce nombre est généralement supérieur à 1 pour les transmissions).

  • Le moment d’inertie de la transmission (il peut être obtenu à partir d’un modèle CAO de votre transmission. Habituellement, il est compris entre 3 et 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));

Création d’un DifferentialDrivetrainSim à partir des gains de caractérisation

Vous pouvez également utiliser les gains produits par caractérisation du robot, que vous avez pu effectuer dans le cadre de la mise en place du workflow de suivi de trajectoire souligné ici pour créer un modèle de simulation de votre transmission. Ceci produit des résultats plus proches du comportement du monde réel que la méthode ci-dessus.

Important

Vous devez avoir besoin de deux ensembles de gains Kv et Ka de l’outil de caractérisation - l’un du mouvement en ligne droite et l’autre de la rotation sur place. Nous appellerons ces deux ensembles de gains respectivement des gains linéaires et 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 de caractérisation.

  • 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.

  • Le rapport d’engrenage entre les moteurs et les roues comme couple de sortie sur couple d’entrée (ce nombre est généralement supérieur à 1 pour les transmissions).

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

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.

  • Le rapport d’engrenage entre les moteurs et les roues comme couple de sortie sur couple d’entrée (ce nombre est généralement supérieur à 1 pour les transmissions).

  • 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.SixInch,     // 6" diameter wheels.
  null                         // No measurement noise.
);

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.