第4步:更新里程测量和机器人位置可视化

现在,模拟编码器的位置,速度和陀螺角度被精确的信息定期更新,这个数据可以用来在一个周期循环中更新机器人的姿态(如’ ‘子系统’ ‘中的’ ‘ periodic() ‘ ‘方法)。在模拟中,周期循环将使用模拟编码器和陀螺读数来更新里程计,而在真实的机器人上,相同的代码将使用来自物理硬件的真实读数。

注解

Note:如果要了解更多关于里程计的信息,请参见this document

机器人姿势视觉化

机器人姿态可以在模拟器GUI(在模拟过程中)或仪表板(如玻璃)上可视化(在一个真实的机器人上),通过发送一个’ ‘ Field2d ‘ ‘ ‘对象的里程计姿态。一个’ ‘ Field2d ‘ ‘可以在没有任何构造函数参数的情况下简单地构造:

private Field2d m_field = new Field2d();

这个’ ‘ Field2d ‘ ‘实例必须通过NetworkTables发送。最好的位置是在子系统的构造函数中。

public Drivetrain() {
  ...
  SmartDashboard.putData("Field", m_field);
}

注解

‘ ‘ Field2d ‘ ‘实例也可以使用低级的NetworkTables API发送,或者使用:ref: ‘ Shuffleboard API <docs/software/wpilib-tools/ Shuffleboard /get -started/ Shuffleboard - Displaying -data:Displaying data from your robot> ‘。

最后,你的里程计的姿势必须定期更新到’ ‘ Field2d ‘ ‘对象。记住,这应该是一个通用的’ ‘ periodic() ‘ ‘方法,即在模拟和实际机器人操作期间运行。

public void periodic() {
  ...
  // This will get the simulated sensor readings that we set
  // in the previous article while in simulation, but will use
  // real values on the robot itself.
  m_odometry.update(m_gyro.getRotation2d(),
                    m_leftEncoder.getDistance(),
                    m_rightEncoder.getDistance());
  m_field.setRobotPose(m_odometry.getPoseMeters());
}

重要

重要的是,这段代码被放置在一个常规的’ ‘ periodic() ‘ ‘方法中——无论操作模式如何,都会定期调用该方法。如果您正在使用基于命令的库,则此方法已经存在。如果没有,你有责任定期从“机器人”类调用这个方法。

注解

至此,我们已经介绍了运行代码所需的所有代码更改。你应该去:ref: ‘模拟用户界面页面<docs/software/wpilib-tools/robot- Simulation / Simulation - GUI:Simulation Specific User Interface Elements> ‘获取更多关于如何运行模拟的信息,并添加你的模拟机器人将在GUI上运行的字段。