Step2: 创建一个动力传统系统模型

为了精确的确定你的真实的物理传动装置在马达收到不同的电压的反应情况,一个精确的动力传动装置的模型必须被创建。这个模型常常用来衡量你的机器的各种物理数据。在WPILib里,这个传动系统的仿真模型是用‘DifferentialDrivetrainSim’类来表示的。

通过物理测量来创建一个DifferentialDrivetrainSim

一个创建DifferentialDrivetrainSim的方法实例就是传动系统和机器的物理参数 - 既不是来自于CAD软件或者真实世界的测量(后者通常会好一些因为它更接近现实)。这个构造器通常会需要传入以下几个参数:

  • 动力传动装置一侧的马达的种类和数量

  • 电动机和车轮之间的齿轮比,即输出转矩超过输入转矩(对于传动系统,该数字通常大于1)。

  • 传统装置瞬时的惯性(这个数字可以通过你的动力传动装置的CAD模型获得。通常来说,这个数字在3到8kgm^2之间)

  • 动力传动装置的重量(这可以用你的动力传动装置的CAD模型来获得,因为他可以更加精确的你机器的轨迹追踪到加速度特征)

  • The radius of the drive wheels.

  • The track width (distance between left and right wheels).

  • 干扰的标准差:这是在真实的情况下你会预期的干扰。这个干扰是一个带有7个元素的列表,每个元素分别代表着x, y, 朝向,左速度,右速度,左位置和右位置的干扰。他的选项可以在c++中省略,或者在Java中设置为’ ‘ null ‘ ‘,如果测量干扰是不可取的。

你可以通过用python这样的工具并使用不同状态的数据点来计算或者衡量标准差。比方说,为了计算你的编码器的估计速度的标准差,你可以让你的机器以平均速度运动,采用不同的测量标准,并且通过已知的平均数计算标准差。如果这个过程过于枯燥的话,下边这个例子里的数据应该是一个很好的平均编码器干扰的例子。

注解

Note:衡量标准差的单位采用国际制单位,比方说对于速度干扰的标准差应取m/s作为单位。

注解

Note:在Java中,当传参的时候,应采用SI单位(比方说米和半径)。在C++,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));

 从characterization 中 创建 一个 differentialdrivetrainsim

您还可以使用 robot characterization的增益,这些增益可以使您在设置轨迹追踪工作时创建drivetrain的自动模型,这会通常更加接近真实世界的行为。

重要

重要: 您必须需要从characterization tool 中 获取的 KV 和 KA。 其中一个是直线动力的参数, 另外一个则是旋转的参数。 我们将会参考 linear 和 angular 两个参数。

该建设遵循以下的参数:

  • 一个代表drivetrain的linear system,这可以在 characterization gains中创建。

  • 履带宽度(左右轮之间)

  • 动力传动装置一侧的马达的种类和数量

  • 电动机和车轮之间的齿轮比,即输出转矩超过输入转矩(对于传动系统,该数字通常大于1)。

  • The radius of the drive wheels.

  • 干扰的标准差:这是在真实的情况下你会预期的干扰。这个干扰是一个带有7个元素的列表,每个元素分别代表着x, y, 朝向,左速度,右速度,左位置和右位置的干扰。他的选项可以在c++中省略,或者在Java中设置为’ ‘ null ‘ ‘,如果测量干扰是不可取的。

你可以通过用python这样的工具并使用不同状态的数据点来计算或者衡量标准差。比方说,为了计算你的编码器的估计速度的标准差,你可以让你的机器以平均速度运动,采用不同的测量标准,并且通过已知的平均数计算标准差。如果这个过程过于枯燥的话,下边这个例子里的数据应该是一个很好的平均编码器干扰的例子。

注解

Note:衡量标准差的单位采用国际制单位,比方说对于速度干扰的标准差应取m/s作为单位。

注解

Note:在Java中,当传参的时候,应采用SI单位(比方说米和半径)。在C++,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));

创建KoP底盘的“差分驱动trainsim”

differaldrivetrainsim ‘ ‘类也有一个静态的’ createKitbotSim() ‘ ‘ (Java) / ‘ createKitbotSim() ‘ ‘ (c++)方法,可以创建一个实例的’ ‘ differaldrivetrainsim ‘ ‘使用标准套件的部件底盘参数。这个方法有5个参数,其中两个是可选的:

  • 动力传动装置一侧的马达的种类和数量

  • 电动机和车轮之间的齿轮比,即输出转矩超过输入转矩(对于传动系统,该数字通常大于1)。

  • 安装在动力传动系统上的车轮的直径

  • 驱动座的转动惯量(可选)

  • 干扰的标准差:这是在真实的情况下你会预期的干扰。这个干扰是一个带有7个元素的列表,每个元素分别代表着x, y, 朝向,左速度,右速度,左位置和右位置的干扰。他的选项可以在c++中省略,或者在Java中设置为’ ‘ null ‘ ‘,如果测量干扰是不可取的。

你可以通过用python这样的工具并使用不同状态的数据点来计算或者衡量标准差。比方说,为了计算你的编码器的估计速度的标准差,你可以让你的机器以平均速度运动,采用不同的测量标准,并且通过已知的平均数计算标准差。如果这个过程过于枯燥的话,下边这个例子里的数据应该是一个很好的平均编码器干扰的例子。

注解

Note:衡量标准差的单位采用国际制单位,比方说对于速度干扰的标准差应取m/s作为单位。

注解

Note:在Java中,当传参的时候,应采用SI单位(比方说米和半径)。在C++,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.
);

注解

你可以使用’ ‘ KitbotMotor ‘ ‘, ‘ ‘ KitbotGearing ‘ ‘,和’ ‘ KitbotWheelSize ‘ ‘ enum (Java) / struct (c++)来获得零件底盘套件的常用配置。

重要

以这种方式构建你的‘differaldrivetrainsim’实例只是一种近似,目的是让团队快速启动并运行模拟。使用从物理机器人测量的经验值总是会产生更精确的结果