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
Una manera de crear un ejemplo de DifferentialDrivetrainSim es utilizando las medidas físicas de la transmisión y del robot.–ya sea obtenido a través de software CAD o mediciones del mundo real (este último generalmente producirá mejores resultados ya que coincidirá más con la realidad). Este constructor tomará los siguientes parámetros:
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 momento de inercia del tren motriz(Este puede ser obtenido por el modelo del CAD del tren motriz. Usualmente, se encuentra entre 3 y 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
nullen 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
nullen 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
nullen 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.