Lecturas masivas#

Las lecturas masivas son un LynxCommand que lee todos los valores de los sensores (excepto I2C) en un hub a la vez. Esto toma la misma cantidad de tiempo para ejecutarse como cualquier otro LynxCommand, y por lo tanto puede ahorrar mucho tiempo en el bucle de ejecución; con una lectura masiva, la lectura de diez sensores toma tanto tiempo como la lectura de un sensor (si no son I2C y están en el mismo hub).

Esto se hizo mucho más sencillo de hacer con las versiones 5.4 y superiores del SDK, con una forma incorporada para acceder fácilmente a ella. Aquí está el ejemplo oficial sobre cómo utilizar las lecturas masivas.

Modo apagado#

Esta es la opción por defecto, y la más aburrida; significa que las lecturas masivas no son utilizadas por el SDK al llamar a los métodos normales de acceso al hardware.

Nota

Todavía se puede acceder a las lecturas masivas llamando al método LynxModule.getBulkInputData(), sin embargo si se desea utilizar lecturas masivas (lo cual recomendamos encarecidamente) es más sencillo utilizar los modos AUTO o MANUAL.

Para configurar manualmente el modo OFF, debe ejecutar

List<LynxModule> allHubs = hardwareMap.getAll(LynxModule.class);

for (LynxModule hub : allHubs) {
   hub.setBulkCachingMode(LynxModule.BulkCachingMode.OFF);
}

Modo automático#

Este es el modo más sencillo de utilizar que utiliza lecturas masivas; se realiza una nueva lectura masiva cuando se repite una lectura de hardware. Como ejemplo de esto

List<LynxModule> allHubs = hardwareMap.getAll(LynxModule.class);

for (LynxModule hub : allHubs) {
   hub.setBulkCachingMode(LynxModule.BulkCachingMode.AUTO);
}

while (opModeIsActive()) {
   // Will run one bulk read per cycle; however, if e.g.
   // frontLeftMotor.getCurrentPosition() was called again,
   // a new bulk read would be issued
   int frontLeftEncoderPos = frontLeftMotor.getCurrentPosition();
   int frontRightEncoderPos = frontRightMotor.getCurrentPosition();
   int backLeftEncoderPos = backLeftMotor.getCurrentPosition();
   int backRightEncoderPos = backRightMotor.getCurrentPosition();
}

Sin embargo, esto puede ser problemático, si la misma lectura de hardware se llama más de una vez en un bucle dado; un ejemplo de esto

List<LynxModule> allHubs = hardwareMap.getAll(LynxModule.class);

for (LynxModule hub : allHubs) {
   hub.setBulkCachingMode(LynxModule.BulkCachingMode.AUTO);
}

while (opModeIsActive()) {
   // Will run two bulk read per cycles,
   // as frontLeftMotor.getCurrentPosition() is called twice
   int frontLeftEncoderPos = frontLeftMotor.getCurrentPosition();
   int frontLeftEncoderPos2 = frontLeftMotor.getCurrentPosition();
}

En general, esto es recomendable, ya que es muy poco probable que estropee nada y puede dar mejoras significativas de rendimiento por poco esfuerzo. Por parte del usuario, no es necesario vaciar manualmente la caché de lectura masiva; sin embargo, esto significa que se pierde algo de control.

Modo manual#

En el modo manual, la caché para las lecturas masivas sólo se restablece una vez restablecida manualmente. Esto puede ser útil, ya que es la forma de minimizar absolutamente las lecturas extrañas, sin embargo, si la caché no se restablece, se devolverán valores obsoletos. Dicho esto, aquí hay una implementación adecuada del modo MANUAL

List<LynxModule> allHubs = hardwareMap.getAll(LynxModule.class);

for (LynxModule hub : allHubs) {
   hub.setBulkCachingMode(LynxModule.BulkCachingMode.MANUAL);
}

while (opModeIsActive()) {
   // Will run one bulk read per cycle,
   // even as frontLeftMotor.getCurrentPosition() is called twice
   // because the caches are being handled manually and cleared
   // once a loop
   for (LynxModule hub : allHubs) {
      hub.clearBulkCache();
   }

   int frontLeftEncoderPos = frontLeftMotor.getCurrentPosition();
   int frontLeftEncoderPos2 = frontLeftMotor.getCurrentPosition();
}

Advertencia

En modo MANUAL, si la caché no se limpia adecuadamente, se devolverán valores obsoletos. Por esa razón, si no está muy seguro de lo que está haciendo, le recomendamos el modo AUTO; aunque el modo MANUAL puede tener algunas mejoras de rendimiento si el modo AUTO no se utiliza de forma óptima, tiene menos margen para errores catastróficos.

Truco

Las lecturas masivas se emiten por hub, por lo que no es necesario realizar una lectura masiva de ambos hubs al mismo tiempo o en cada bucle.