Nuevo para 2021

Se han realizado varias mejoras en el software del Sistema de Control de FRC® para 2021. Este artículo describirá y proporcionará una breve descripción general de los nuevos cambios y características, así como un registro de cambios más completo para los cambios de C++/Java WPILib. Este documento solo incluye los cambios más relevantes para los usuarios finales, la lista completa de cambios se puede ver en los distintos repositorios de GitHub WPILib

Importante

Debido a cambios internos de GradleRIO, es necesario actualizar los proyectos de años anteriores. Después de Installing WPILib for 2021, cualquier proyecto de 2020 debe de ser imported para ser compatible.

Características Principales

  • Se ha añadido una interfaz WebSocket a nivel de hardware para permitir el acceso remoto al código del robot que se está simulando en un entorno de escritorio.

  • Soporte para la plataforma de robots Romi . El código del robot Romi se ejecuta en el entorno del simulador de escritorio y habla con el Romi a través de la nueva interfaz WebSocket.

  • Un nuevo visualizador de datos de robots – Glass – ha sido añadido. Glass tiene una interfaz de usuario similar a la del simulador y soporta muchas de las mismas características; sin embargo, Glass puede ser usado como un dashboard de mandos autónomo y no está ligado al programa del robot.

  • El instalador de WPILib ha sido reescrito para que sea compatible con macOS y Linux y para mejorar la facilidad de uso.

    • El instalador de macOS está notarizado, lo que elimina la necesidad del Gatekeeper.

    • Por favor, consulte las instrucciones de instalación ya que difiere de años anteriores.

  • Se agregó soporte para el control basado en modelos con filtros Kalman, filtros Kalman extendidos, filtros Kalman sin aroma y reguladores lineales-cuadráticos. Vea Introducción al Control de Estado-Espacio para más información.

WPILib

Cambios Importantes

  • curvature_t cambió de espacio de nombres de frc a units (C++)

  • Métodos de restricción de trayectoria son ahora const en C++. Los equipos que definen sus propias restricciones deben marcar los métodos MaxVelocity() y MinMaxAcceleration() como const.

  • La clase Field2d (añadida a mediados de la temporada 2020) fue trasladada del paquete de simulación (edu.wpi.first.wpilibj.simulation / frc/simulation/) al paquete SmartDashboard (edu.wpi.first.wpilibj.smartdashboard / frc/SmartDashboard/). Esto permite que los equipos envíen la posición de su robot a través de NetworkTables para ser visualizada en Glass. La instancia Field2d puede enviarse utilizando SmartDashboard.putData("Field", m_field2d) / frc::SmartDashboard::PutData("Field", &m_field2d) o utilizando uno de los métodos Shuffleboard. Esto debe hacerse para poder ver el Field2d en la GUI del Simulador.

  • El método get() de los controladores de velocidad PWM ha sido modificado para devolver el mismo valor que tenía set() independientemente de la inversión. El valor que todavía tiene en cuenta la inversión puede ser recuperado con el método getSpeed(). Esto afecta a las clases DMC60, Jaguar, PWMSparkMax, PWMTalonFX, PWMTalonSRX, PWMVenom, PWMVictorSPX, SD540, Spark, Talon, Victor y VictorSP.

Nueva Librería Basada en Comandos

  • Se han agregado informes de vigilancia y época al programador de comandos. Esto permitirá a los equipos saber exactamente qué comando o subsistema es responsable de un bucle desbordado si ocurre uno.

  • Se ha añadido un decorador de comandos withName() para los equipos Java. Esto permite a los equipos establecer el nombre de un comando en particular utilizando el patrón decorador.

  • Se añadió una clase NetworkButton, permitiendo a los usuarios usar un booleano NetworkTableEntry como un botón para activar comandos.

  • Se añadió el método simulationPeriodic() al Subsistema. Este método corre periódicamente durante la simulación, en adición al método regular periodic().

Librería General

  • Controlador de Impulsión Holonómico - Un controlador que los equipos con chasises de impulsión holonómicos (es decir, swerve y mecanum) pueden usar para seguir trayectorias. Esto también admite entradas de rumbo personalizadas Rotation2d que están separadas de la trayectoria porque la dinámica de rumbo está desacoplada del movimiento de traslación en las transmisiones holonómicas.

  • Se agregó soporte para programar funciones con más frecuencia que el ciclo del robot a través de addPeriodic() en TimedRobot. Anteriormente, los equipos tenían que hacer un Notificador para ejecutar controladores de retroalimentación con más frecuencia que el período de ciclo de TimedRobot de 20ms (no se recomienda ejecutar TimedRobot con más frecuencia que esto). Ahora, los usuarios pueden ejecutar controladores de retroalimentación con más frecuencia que el bucle principal del robot, pero de forma sincrónica con las funciones periódicas de TimedRobot para que no haya problemas de seguridad de subprocesos. Vea un ejemplo aquí.

  • Se agregó una función toggle() a Solenoid y DoubleSolenoid.

  • Se agregó un constructor SpeedControllerGroup que toma un std::vector<> (C++) / SpeedController[] (Java), permitiendo que la lista se construya dinámicamente. (Los equipos no deben usar esto directamente. Esto solo está destinado a enlaces en lenguajes como Python.)

  • Se añadieron métodos (isOperatorControlEnabled() y isAutonomousEnabled()) para comprobar el juego y el estado habilitado juntos.

  • Se agregó una clase ScopedTracer para que los equipos de C++ puedan cronometrar fragmentos de código. Simplemente cree una instancia de ScopedTracer en la parte superior de un bloque de código y la hora se imprimirá en la consola cuando la instancia salga del alcance.

  • Se añadió un método estático fromHSV(int h, int s, int v) para crear una instancia Color desde valores HSV.

  • Se añadió un constructor de prioridad RT a Notifier en C++. Esto hace que el subproceso que respalda al Notificador se ejecute con prioridad en tiempo real, lo que reduce la fluctuación de tiempo.

  • Se añadió un método DriverStation.getInstance().isJoystickConnected(int)  para comprobar si un joystick está conectado a la Driver Station.

  • Se añadió un método DriverStation.getInstance().silenceJoystickConnectionWarning(boolean) para silenciar la advertencia cuando un joystick no está conectado. Esta configuración no tiene ningún efecto (es decir, las advertencias seguirán imprimiéndose) cuando el robot está conectado a un FMS real.

  • Se añadió un constructor a Translation2d que toma una distancia y un ángulo. Esto está convirtiendo efectivamente de coordenadas polares a coordenadas Cartesianas.

  • Se añadió EllipticalRegionConstraint, RectangularRegionConstraint, and MaxVelocityConstraint para permitir velocidad de trayectoria limitante en una cierta región de la cancha.

  • Se añadió un operador equals() a la clase Trajectory para comparar dos o más trayectorias.

  • Se añadió el constructor zero-arg a la clase Trajectory en Java que crea una trayectoria vacía.

  • Se agregó una excepción especial para detectar el mal comportamiento de la restricción de trayectoria. Esto notifica a los usuarios cuando las restricciones definidas por el usuario se comportan mal (por ejemplo, la aceleración mínima es mayor que la aceleración máxima).

  • Se añadió un método getRotation2d() a la interfaz Gyro. Este método se encarga automáticamente de convertir las convenciones de giroscopios en convenciones de geometría.

  • Se añadieron unidades de aceleración angular para equipos C++. Estos están disponibles en el título <units/angular_acceleration.h>.

  • Se añadieron captadores de componentes X y Y en Pose2d - getX() y getY() en Java, X() y Y() en C++.

  • Se añadió la conversión implícita de degree_t a Rotation2d en C++. Esto permite a los equipos usar valores en grados (por ejemplo, 47_deg) donde se requiera Rotation2d.

  • Se corrigió un error en la trayectoria siguiendo ejemplos donde la odometría no estaba siendo reajustada a la posición inicial de la trayectoria.

  • Se corrigieron algunos errores de generación de splines para usuarios avanzados que usaban vectores de control directamente.

  • Se corrigió la entrada continua del controlador theta en ejemplos de desvíos. Esto corrige el comportamiento en el que no se usa la ruta más corta durante la rotación del tren motriz.

  • Se ha obviado units.h, utilice las cabeceras individuales de units en su lugar, lo que acelera los tiempos de compilación.

Simulación

  • Se ha añadido soporte de simulación de joystick virtual con teclado.

  • Se ha añadido Mechanism2D para visualizar los mecanismos en la simulación.

  • Se agregaron clases de física de simulación para mecanismos de robot comunes (DrivetrainSim, ElevatorSim, SingleJointedArmSim y FlywheelSim)

Shuffleboard

  • El control deslizante numérico ahora muestra el valor del texto

  • Graphing Widget ahora usa ChartFX, una biblioteca de gráficos de alto rendimiento

  • Se corrigió el formato de los dígitos decimales con números grandes

  • El tamaño y la posición ahora se pueden configurar por separado en la API de Shuffleboard

  • La entrada analógica ahora se puede ver con un Widget de texto

SmartDashboard

  • La IP del Host se puede especificar en la configuración.

PathWeaver

  • Soporte agregado para splines invertidos

  • El sistema de coordenadas en el JSON exportado ha cambiado para ser compatible con la GUI del simulador. Consulte Importación de un JSON PathWeaver para obtener más información.

GradleRIO

  • Se añadieron tareas vendordep para descaargar el venededor de JSON o obteniéndolos de la carpeta de usuario wpilib

  • Se añadió una propiedad gradlerio.vendordep.folder.path para ajustar una locación que no está por default por la carpeta del vendedor JSON

  • Se renombró la tarea wpi (que muestra las versiones actuales de WPILib y herramientas) a wpiVersions

  • Se ha añadido la posibilidad de establecer variables de entorno durante la simulación

    • Para establecer la variable de entorno HALSIMWS_HOST utilice:

      sim {
        envVar "HALSIMWS_HOST", "10.0.0.2"
      }
      

CSCore

  • Ahora solo enumera los dispositivos que se pueden transmitir en plataformas Linux.

Visual Studio Code Extension

  • Visual Studio Code ha sido actualizado a 1.52.1

  • Se actualizó las extensiones de los lenguajes Java y C++

  • La extensión Driverstation sim está ahora activada por defecto

  • El importador de proyectos ahora conserva la versión de los comandos utilizados en el proyecto original

  • Se ha aclarado el texto de las pantallas del nuevo proyecto y del importador de proyectos

  • Se corrigió la importación que corrompía los archivos binarios

  • Se ha corregido el orden de los enlaces en los proyectos C++ build.gradle.

  • Se ha actualizado el comando «Change Select Default Simulate Extension Setting» para que funcione con varias extensiones de sim.

RobotBuilder

  • Actualizado para ser compatible con el nuevo marco basado en comandos y el controlador PID.

    • Debido a los grandes cambios en las plantillas, RobotBuilder no aceptará un archivo guardado de un año anterior. Debe regenerar el archivo de guardado yaml y exportarlo a un nuevo directorio.

    • Con el instalador se ha incluido una versión de RobotBuilder que todavía exporta al antiguo marco de trabajo basado en comandos y que se llama RobotBuilder-Old

  • C++: utilice la inicialización uniforme de los objetos en el encabezado

  • C++: se han corregido las mayúsculas y minúsculas de los includes para que el código compile en sistemas de archivos que distinguen entre mayúsculas y minúsculas.

  • Usar el nombre del proyecto como predeterminado para guardar el archivo

  • Se corrigió la exportación del archivo de cableado

  • Se corrigieron los finales de línea de los scripts para que funcionen en MacOS/Linux

  • Se agregó un XboxController

Caracterización de Robot

  • Se añadió compensación de latencia LQR

  • Se mejoró la herramienta backend para que fuera más accesible para los desarrolladores. La configuración y los archivos JSON de la antigua herramienta ya no funcionarán con la nueva versión.

  • Desplegar el código en un nuevo hilo para evitar que se cuelgue la interfaz gráfica de usuario.