2021的概览

2021年我们对FRC® Control System软件进行了大量改进。本文将描述并简要概述新的更改和特性,以及针对C++/Java WPILib的变更的更完整的日志。本文档只包含与终端用户最相关的更改,可以在各种 WPILib GitHub存储库中找到完整的变更明细。

重要

由于GradleRIO内部的变化,必须更新前几年的项目。:doc:`安装2021 WPILib </docs/zero-to-robot/step-2/wpilib-setup>`后,任何2020年项目都必须:doc:`导入 </docs/software/vscode-overview/importing-gradle-project>`以兼容。

主要特点

  • 硬件级别`WebSocket 接口 <https://github.com/wpilibsuite/allwpilib/blob/v2021.1.1/simulation/halsim_ws_core/doc/hardware_ws_api.md>`__ 已添加,以允许远程访问桌面环境中模拟的机器人代码。

  • 支持:doc:`Romi </docs/romi-robot/index>`机器人平台。Romi机器人代码在桌面模拟器环境中运行,并通过新的WebSocket接口与Romi对话。

  • 添加了新的机器人数据可视化工具 – Glass – 。 Glass 具有与模拟器 GUI 相似的 UI,并支持许多相同的功能;但是,Glass 可以用作独立的仪表板,并且与机器人程序无关。

  • WPILib安装程序已经过重写,以支持macOS和Linux系统并提高易用性。

    • macOS安装程序经过公证,无需使用Gatekeeper绕过。

    • 请参阅:ref:安装说明 <docs/zero-to-robot/step-2/wpilib-setup:WPILib Installation Guide> ,因为它与往年有所不同。

  • 增加了对基于模型的控制的支持,包括Kalman滤波法、扩展Kalman滤波法、U-Kalman滤波法和一次二次调节器。至:ref:`Introduction to State-Space Control <docs/software/advanced-controls/state-space/state-space-intro:Introduction to State-Space Control>`了解更多信息。

WPILib

重大变化

  • curvature_t的命名空间从frc移至units(C ++)

  • 轨迹约束方法现在在C++中是const。定义自己的自定义约束的团队应该标记MaxVelocity()和MinMaxAcceleration()方法为const。

  • Field2d 类(在 2020 赛季中期添加)已从模拟包(edu.wpi.first.wpilibj.simulation / frc/simulation/)移至 SmartDashboard 包( edu.wpi.first.wpilibj.smartdashboard / frc/SmartDashboard/)。这允许团队通过 NetworkTables 发送他们的机器人位置,以便在 Glass 中查看。 Field2d 实例可以使用``SmartDashboard.putData(“Field”, m_field2d)`` / frc::SmartDashboard::PutData("Field", &m_field2d) 或使用 :ref:` 之一发送Shuffleboard 方法 <docs/software/dashboards/shuffleboard/layouts-with-code/sending-data:Sending sensor, motor, etc>`。必须这样做才能在模拟器 GUI 中看到 Field2d。

  • PWM速度控制器get()方法已修改为返回与set()相同的值而不管反转。仍然需要考虑反转的值可以用getSpeed()方法。这会影响以下类::``DMC60’’,``Jaguar’’,``PWMSparkMax’’,``PWMTalonFX’’,``PWMTalonSRX’’,``PWMVenom’’,``PWMVictorSPX’’,``SD540’’ ‘’,``Spark’’,``Talon’’,``Victor’’和``VictorSP’’。

新的基于命令的库

  • Watchdog和epoch报告已添加到命令调度程序中。这将使团队确切地知道在发生循环溢出时哪个命令或子系统出现问题。

  • 为Java团队添加了一个withName()命令装饰器。这使得团队可以用一个名字命名特定的指令。使用 decorator pattern.

  • 添加了一个NetworkButton类,允许用户使用布尔值NetworkTableEntry作为触发命令的按钮。

  • 添加了一个simulationPeriodic()方法到子系统。除了常规的periodic()方法,此方法在模拟中周期性运行。

综合库

  • l  完整驱动控制器 -一种与完整传动系统(即转向和机械手)配合使用的控制器,可用于跟踪轨迹。这也支持自定义在完整传动系统中与轨迹分离的航向输入Rotation2d,由于航向动力学与平动运动解耦。

  • 增加了对调度功能的支持,比循环机器人via更常见addPeriodic()在TimedRobot中。以前,团队必须制作一个通知程序,以运行反馈控制器的频率超过20ms的TimedRobot循环周期(运行TimedRobot的频率高于不建议的次数)。现在,用户可以比主机器人循环更频繁地运行反馈控制器,但与TimedRobot周期函数同步,因此没有任何线程安全问题。 :ref:`这里 <docs/software/convenience-features/scheduling-functions:Scheduling Functions at Custom Frequencies>`有一个例子。

  • 为单双螺线管添加了一个 toggle() 功能。

  • 添加了一个SpeedControllerGroup构造std::vector<> (C++) / SpeedController[] (Java),允许动态构造列表。(团队不应该直接使用。这只适用于Python等语言的绑定。)

  • 添加方法(isOperatorControlEnabled() and isAutonomousEnabled())一起检查比赛和启用状态。

  • 添加了一个ScopedTracer类,使C++团队能够对代码段进行计时。只需实例化ScopedTracer在代码块的顶部,当实例超出范围时,时间将打印到控制台。

  • 添加了静态方法fromHSV(int h, int s, int v)从HSV值实例创建Color。

  • 在C++中,已将RT优先级构造函数添加到Notifier。这使得支持通知程序的线程以实时优先级运行,减少了时间抖动。

  • 添加了一个DriverStation.getInstance().isJoystickConnected(int) 方法,以检查操纵杆是否连接到Driver Station。

  • 添加了DriverStation.getInstance().silenceJoystickConnectionWarning(boolean)方法,在未连接操纵杆时使警告静音。当机器人连接到实际的FMS时,此设置无效(即警告将继续出现)。

  • 已将构造函数添加到Translation2d,这需要距离和角度的输入。这是从极坐标到笛卡尔坐标的有效转换。

  • 补充EllipticalRegionConstraint, RectangularRegionConstraint,  MaxVelocityConstraint允许在某一区域约束轨道速度。

  • 运算符equals()添加到Trajectory类中以比较两个或多个轨迹。

  • 将零参数构造函数 在 Java中添加到Trajectory类以创建一个空轨迹。

  • 添加了一个特殊的异常提示来捕获轨迹约束错误行为。当用户定义的约束行为不正常(即最小加速度大于最大加速度)时,它会通知用户。

  • 向Gyro接口添加了getRotation2d()方法。这种方法自动地处理从陀螺仪惯例到几何惯例的转换。

  • 为C++团队增加了角加速度单位。这些在<units/angular_acceleration.h>标头。

  • 添加了X和Y部件获取,在Java中为Pose2d - getX() 和 getY(),在C++中为X() 和 Y()。

  • 在C++中将隐式转换从degree_t移至Rotation2d。这允许团队使用角度值(例47_deg)无论Rotation2d是否被要求。

  • 修正了路径跟踪中的错误,例如里程表没有重置为轨迹的起始状态。

  • 修正了直接使用控制向量的高级用户的一些样条线生成错误。

  • 修正了转弯中θ控制器的连续输入。这改正了传动系旋转期间不使用最短路径的行为。

  • 已弃用units.h,使用个人单位标头替代它,可加快编译时间。

模拟

  • 增加了键盘虚拟操纵杆模拟支持。

  • 添加了Mechanism2D,用于在模拟中可视化机构。

  • 增加了通用机器人机构(DrivetrainSim、ElevatorSim、SingleJoinedArmSim和FlywheelSim)的模拟物理类。

Shuffleboard

  • 数字滑块现在显示文本值。

  • 图形小部件现在使用ChartFX,一个高性能的图形库。

  • 大数使用固定的十进制数字格式。

  • 大小和位置现在可以在Shuffleboard API中单独设置。

  • 现在可以用文本小部件查看模拟输入。

SmartDashboard

  • 可以在配置中指定主机IP。

PathWeaver

  • 增加了对反向样条曲线的支持

  • 导出的 JSON 中的坐标系已更改为与模拟器 GUI 兼容。有关更多信息,请参阅:ref:导入 PathWeaver JSON <docs/software/pathplanning/pathweaver/integrating-robot-program:Importing a PathWeaver JSON>

GradleRIO

  • 添加了vendordep任务用于下载供应商JSONs或从用户wpilib文件夹获取它们。

  • 添加了gradlerio.vendordep.folder.path属性以设置供应商JSON文件夹的非默认位置。

  • 重命名wpi任务(用于打印WPILib和工具的当前版本)为wpiVersions。

  • 增加了在模拟过程中设置环境变量的功能

    • 要设置用于HALSIMWS_HOST的环境变量:

      sim {
        envVar "HALSIMWS_HOST", "10.0.0.2"
      }
      

CSCore

  • 现在仅列出Linux平台上的流式设备。

Visual Studio Code扩展

  • Visual Studio Code已更新为1.52.1。

  • 更新了Java和C++语言扩展。

  • Driverstation sim扩展现在默认启用。

  • 项目导入器现在保留原始项目中使用的命令版本。

  • 规整了新项目和项目导入程序页面上的文本。

  • 修复了导入损坏二进制文件的问题。

  • 修复了C++中的build.gradle项目的链接顺序。

  • 更新了“更改选择默认模拟分机设置”命令以使用多个sim分机。

RobotBuilder

  • 更新后与新的基于命令的框架和PID控制器兼容。

    • 由于模板中的重大更改,RobotBuilder将不接受上一年的存档文件。必须重新生成yaml文件并导出到新目录。

    • 安装程序中包含了一个仍然导出到旧的基于命令的框架的RobotBuilder版本,名称为RobotBuilder-Old

  • C++:标头中对象使用统一初始化。

  • C++:修复了includes的大小写,以便在区分大小写的文件系统上编译代码。

  • 使用项目名称作为保存文件的默认名称。

  • 修复了布线文件的导出。

  • 修复了脚本的行尾,以便它们在MacOS/Linux上工作。

  • 添加Xbox控制器。

Robot Characterization

  • 增加LQR延迟补偿。

  • 对工具后端进行了改进,使开发人员更为便利。旧工具中的配置和JSON文件将不再适用于新版本。

  • 在新线程中部署代码以避免导致GUI挂起。