¿Qué es la programación a base de comandos?

Importante

Esta documentación describe el uso de la biblioteca heredada de base de comandos. Si bien esta documentación se ha conservado para ayudar a los equipos que aún no lo han hecho, se recomienda encarecidamente a los equipos que migren a new command-based library.

WPILib admite un método de escritura de programas llamado «Programación basada en comandos». La programación basada en comandos es un patrón de diseño que le ayuda a organizar sus programas de robot. Algunas de las características de los programas de robots que pueden ser diferentes de otros programas de escritorio son:

  • Las actividades suceden con el tiempo, por ejemplo, una secuencia de pasos para disparar un Frisbee o subir un elevador y colocar un tubo en una portería.

  • Estas actividades ocurren al mismo tiempo, es decir, podría ser deseable que un elevador, muñeca y pinza se muevan a una posición para recoger al mismo tiempo para aumentar el rendimiento del robot.

  • Es deseable probar los mecanismos y actividades del robot de forma individual para ayudar a depurar su robot.

  • A menudo, el programa debe ampliarse con programas autónomos adicionales en el último minuto, tal vez en competencias, por lo que es importante un código fácilmente extensible.

La programación a base de comandos admite todos estos objetivos fácilmente para hacer que el programa del robot sea mucho más simple que al usar alguna técnica menos estructurada.

Comandos y Subsistemas

Subsystems and Commands clouds with examples.

Los programas basados en la plantilla de comandos WPILib se organizan en torno a dos conceptos fundamentales: ** Subsistemas ** y ** Comandos **.

** Subsistemas **: define las capacidades de cada parte del robot y son subclases de Subsystem.

** Comandos **: define el funcionamiento del robot incorporando las capacidades definidas en los subsistemas. Los comandos son subclases de Command o CommandGroup. Los comandos se ejecutan cuando están programados o en respuesta a botones que se presionan o botones virtuales del SmartDashboard.

Cómo funcionan los comandos

Flow of how an example command works.

Los comandos le permiten dividir las tareas de operar el robot en pequeños bloques. Cada comando tiene un método execute() que hace algún trabajo y un método isFinished() que establece si está hecho. Esto sucede en cada actualización de la driver station o aproximadamente cada 20 ms. Los comandos se pueden agrupar y ejecutar secuencialmente, comenzando el siguiente en el grupo a medida que termina el anterior.

Concurrencia

Show a concurrency example with two commands running simultaneously.

A veces se desea tener varias operaciones ejecutandose al mismo tiempo. En el ejemplo pasado usted podría querer configurar la posición de la muñeca mientras el elevador se mueve hacia arriba. En este caso, un grupo de comandos puede hacer que un comando paralelo ( o grupo de comandos) comience a ejecutarse.

Cómo funciona: programación de comandos

The scheduling process for how commands are executed.

Hay tres formas principales de programar los comandos:

  1. Manualmente, llamando al método `` start() “” en el comando (: doc: usado para autónomo <../commands/running-commands-autonomous>)

  2. Automáticamente por el scheduler o planificador basado en button/trigger actions especificadas en el código (normalmente definido en la clase OI pero verificado por el planificador).

  3. Automáticamente cuando se completa un comando anterior (: doc: comandos predeterminados <../commands/default-commands> y: doc: grupos de comandos <../commands/creating-groups-commands>).

Cada vez que la driver station obtiene nuevos datos se llama al método periódico del programa de su robot. Ejecuta un Programador que verifica las condiciones de activación para ver si es necesario programar o cancelar algún comando.

Cuando se programa un comando, el Programador verifica que ningún otro comando esté usando los mismos subsistemas que requiere el nuevo comando. Si uno o más de los subsistemas están actualmente en uso, y el comando actual es interrumpible, se interrumpirá y se programará el nuevo comando. Si el comando actual no se puede interrumpir, el nuevo comando no se programará.

Cómo funciona: ejecución de comandos

Después de comprobar si hay nuevos comandos, el programador procede a través de la lista de comandos activos y llama a los métodos `` execute() “” e `` isFinished() “” en cada comando. Observe que la aparente ejecución concurrente se realiza sin el uso de subprocesos o tareas que agregarían complejidad al programa. Cada comando simplemente tiene algún código para ejecutar (método de ejecución) para avanzar más hacia su objetivo y un método (isFinished) que determina si el comando ha alcanzado el objetivo. Los métodos execute e isFinished simplemente son llamados repetidamente.

Grupos de comandos

Se pueden construir comandos más complejos a partir de comandos más simples. Por ejemplo, lanzar un disco implica una larga secuencia de comandos que se ejecutan uno tras otro. Quizás algunos de estos comandos en la secuencia se puedan ejecutar al mismo tiempo. Los grupos de comandos son comandos, pero en lugar de tener los métodos isFinished y execute, tienen una lista de otros comandos para ejecutar. Esto permite construir operaciones más complejas a partir de operaciones más simples, un principio básico en programación. Cada uno de los comandos individuales más pequeños se puede probar primero fácilmente, luego se puede probar el grupo. Puede encontrar más información sobre los grupos de comandos en el :doc: Artículo sobre creación de grupos de comandos <../commands/creating-groups-commands>.