Paso 2: Creación del modelo de la cadena de transmisión

Para determinar con precisión cómo responderá su tren motriz físico a las entradas de voltaje del motor dadas, se debe crear un modelo preciso de su tren motriz. Este modelo generalmente se crea midiendo varios parámetros físicos de su robot real. En WPILib, este modelo de simulación de transmisión está representado por la clase DifferentialDrivetrainSim.

Creación de un DifferentialDrivetrainSim a partir de mediciones físicas

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:

  • El tipo y número de motores en un lado de la cadena de transmisión

  • 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 masa de la cadena de transmisión(se recomienda utilizar la masa de todo el robot, ya que modelará con mayor precisión las características de aceleración de su robot para el seguimiento de la trayectoria).

  • El radio de las ruedas motrices

  • El ancho de la pista (distancia entre las ruedas izquierda y derecha).

  • Desviaciones estándar del ruido de medición: esto representa la cantidad de ruido de medición que espera de sus sensores reales. El ruido de medición es una matriz con 7 elementos, y cada elemento representa la desviación estándar del ruido de medición en x, y, rumbo, velocidad izquierda, velocidad derecha, posición izquierda y posición derecha, respectivamente. Esta opción puede omitirse en C++ o establecerse en null en Java si el ruido de medición no es deseable.

Puede calcular el ruido de medición de sus sensores tomando múltiples puntos de datos del estado que está tratando de medir y calculando la desviación estándar usando una herramienta como Python. Por ejemplo, para calcular la desviación estándar en la estimación de velocidad de sus codificadores, puede mover su robot a una velocidad constante, tomar varias medidas y calcular su desviación estándar de la media conocida. Si este proceso es demasiado tedioso, los valores usados ​​en el siguiente ejemplo deberían ser una buena representación del ruido promedio de los codificadores.

Nota

La desviación estándar del ruido para una medida tiene las mismas unidades que esa medida. Por ejemplo, la desviación estándar del ruido de velocidad tiene unidades de m / s.

Nota

Es muy importante utilizar las unidades del SI (es decir, metros y radianes) al pasar los parámetros en Java. En C++, la librería de unidades puede ser usada para especificar cualquier tipo de unidad.

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

Creating a DifferentialDrivetrainSim from 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.

Importante

You must need two sets of Kv and Ka gains from the identification tool – one from straight-line motion and the other from rotating in place. We will refer to these two sets of gains as linear and angular gains respectively.

Este constructor toma los siguientes parámetros:

  • A linear system representing the drivetrain – this can be created using the identification gains.

  • El ancho de la pista(distancia entre las ruedas izquierda y derecha).

  • El tipo y número de motores en un lado de la cadena de transmisión

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

  • El radio de las ruedas motrices

  • Desviaciones estándar del ruido de medición: esto representa la cantidad de ruido de medición que espera de sus sensores reales. El ruido de medición es una matriz con 7 elementos, y cada elemento representa la desviación estándar del ruido de medición en x, y, rumbo, velocidad izquierda, velocidad derecha, posición izquierda y posición derecha, respectivamente. Esta opción puede omitirse en C++ o establecerse en null en Java si el ruido de medición no es deseable.

Puede calcular el ruido de medición de sus sensores tomando múltiples puntos de datos del estado que está tratando de medir y calculando la desviación estándar usando una herramienta como Python. Por ejemplo, para calcular la desviación estándar en la estimación de velocidad de sus codificadores, puede mover su robot a una velocidad constante, tomar varias medidas y calcular su desviación estándar de la media conocida. Si este proceso es demasiado tedioso, los valores usados ​​en el siguiente ejemplo deberían ser una buena representación del ruido promedio de los codificadores.

Nota

La desviación estándar del ruido para una medida tiene las mismas unidades que esa medida. Por ejemplo, la desviación estándar del ruido de velocidad tiene unidades de m / s.

Nota

Es muy importante utilizar las unidades del SI (es decir, metros y radianes) al pasar los parámetros en Java. En C++, la librería de unidades puede ser usada para especificar cualquier tipo de unidad.

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

Crear un DifferentialDrivetrainSim del chasis KoP

La clase DifferentialDrivetrainSim también tiene un método estático createKitbotSim() (Java) / CreateKitbotSim() (C++) que puede crear una instancia del DifferentialDrivetrainSim utilizando los parámetros estándar del Kit de Piezas Chasis. Este método toma 5 argumentos, dos de los cuales son opcionales:

  • El tipo y número de motores en un lado de la cadena de transmisión

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

  • El diámetro de las ruedas instaladas en el chasís.

  • El momento de inercia de la base motriz (opcional).

  • Desviaciones estándar del ruido de medición: esto representa la cantidad de ruido de medición que espera de sus sensores reales. El ruido de medición es una matriz con 7 elementos, y cada elemento representa la desviación estándar del ruido de medición en x, y, rumbo, velocidad izquierda, velocidad derecha, posición izquierda y posición derecha, respectivamente. Esta opción puede omitirse en C++ o establecerse en null en Java si el ruido de medición no es deseable.

Puede calcular el ruido de medición de sus sensores tomando múltiples puntos de datos del estado que está tratando de medir y calculando la desviación estándar usando una herramienta como Python. Por ejemplo, para calcular la desviación estándar en la estimación de velocidad de sus codificadores, puede mover su robot a una velocidad constante, tomar varias medidas y calcular su desviación estándar de la media conocida. Si este proceso es demasiado tedioso, los valores usados ​​en el siguiente ejemplo deberían ser una buena representación del ruido promedio de los codificadores.

Nota

La desviación estándar del ruido para una medida tiene las mismas unidades que esa medida. Por ejemplo, la desviación estándar del ruido de velocidad tiene unidades de m / s.

Nota

Es muy importante utilizar las unidades del SI (es decir, metros y radianes) al pasar los parámetros en Java. En C++, la librería de unidades puede ser usada para especificar cualquier tipo de unidad.

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

Nota

Puedes utilizar los enum (Java) / struct (C++) KitbotMotor, KitbotGearing, y KitbotWheelSize para obtener las configuraciones más utilizadas del Kit de Piezas Chasis.

Importante

La construcción de su instancia DifferentialDrivetrainSim de esta manera es sólo una aproximación y está pensada para que los equipos se pongan en marcha rápidamente con la simulación. El uso de valores empíricos medidos a partir de su robot físico siempre dará resultados más precisos.