Limelight Lib Python
limelightlib-python es la forma más fácil de interactuar con dispositivos Limelight. Funciona en todos los sistemas operativos (MacOS, Windows, Linux) y arquitecturas (x86, ARM).
- https://github.com/LimelightVision/limelightlib-python
- https://pypi.org/project/limelightlib-python/
Instalación
pip install limelightlib-python
Uso
import limelight
import limelightresults
import json
import time
discovered_limelights = limelight.discover_limelights(debug=True)
print("limelights descubiertos:", discovered_limelights)
if discovered_limelights:
limelight_address = discovered_limelights[0]
ll = limelight.Limelight(limelight_address)
results = ll.get_results()
status = ll.get_status()
print("-----")
print("resultados de apuntado:", results)
print("-----")
print("estado:", status)
print("-----")
print("temperatura:", ll.get_temp())
print("-----")
print("nombre:", ll.get_name())
print("-----")
print("fps:", ll.get_fps())
print("-----")
print("informe de hardware:", ll.hw_report())
ll.enable_websocket()
# imprimir la configuración actual del pipeline
print(ll.get_pipeline_atindex(0))
# actualizar el pipeline actual y guardar en disco
pipeline_update = {
'area_max': 98.7,
'area_min': 1.98778
}
ll.update_pipeline(json.dumps(pipeline_update),flush=1)
print(ll.get_pipeline_atindex(0))
# cambiar al pipeline 1
ll.pipeline_switch(1)
# actualizar datos de usuario personalizados
ll.update_python_inputs([4.2,0.1,9.87])
try:
while True:
result = ll.get_latest_results()
parsed_result = limelightresults.parse_results(result)
if parsed_result is not None:
print("objetivos válidos: ", parsed_result.validity, ", índice de pipeline: ", parsed_result.pipeline_id,", Latencia de apuntado: ", parsed_result.targeting_latency)
#for tag in parsed_result.fiducialResults:
# print(tag.robot_pose_target_space, tag.fiducial_id)
time.sleep(1) # Establecer a 0 para máximo fps
except KeyboardInterrupt:
print("Programa interrumpido por el usuario, cerrando.")
finally:
ll.disable_websocket()
Métodos
Basados en REST
- get_results(): Obtiene los últimos resultados mediante HTTP GET.
- capture_snapshot(snapname): Captura una instantánea con un nombre dado.
- upload_snapshot(snapname, image_path): Sube una instantánea con un nombre y archivo de imagen dados.
- snapshot_manifest(): Recupera el manifiesto de instantáneas mediante HTTP GET.
- delete_snapshots(): Elimina todas las instantáneas mediante HTTP GET.
- upload_neural_network(nn_type, file_path): Sube un archivo de red neuronal con un tipo especificado.
- hw_report(): Obtiene el informe de hardware mediante HTTP GET.
- cal_default(): Obtiene los datos de calibración predeterminados mediante HTTP GET.
- cal_file(): Obtiene los datos de calibración del archivo mediante HTTP GET.
- cal_eeprom(): Obtiene los datos de calibración de la EEPROM mediante HTTP GET.
- cal_latest(): Obtiene los datos de calibración más recientes mediante HTTP GET.
- update_cal_eeprom(cal_data): Actualiza los datos de calibración en la EEPROM mediante HTTP POST.
- update_cal_file(cal_data): Actualiza los datos de calibración en el archivo mediante HTTP POST.
- delete_cal_latest(): Elimina los datos de calibración más recientes mediante HTTP DELETE.
- delete_cal_eeprom(): Elimina los datos de calibración de la EEPROM mediante HTTP DELETE.
- delete_cal_file(): Elimina los datos de calibración del archivo mediante HTTP DELETE.
Basados en WebSocket
- enable_websocket(): Inicializa y comienza una conexión WebSocket en otro hilo.
- disable_websocket(): Cierra la conexión WebSocket y une el hilo.
- get_latest_results(): Devuelve los últimos resultados recibidos del WebSocket.
Análisis
- limelightresults.parse_results(): Analiza los resultados y devuelve un objeto GeneralResult
Especificación de la Clase Result
class GeneralResult:
def __init__(self, results):
self.barcode = results.get("Barcode", [])
self.classifierResults = [ClassifierResult(item) for item in results.get("Classifier", [])]
self.detectorResults = [DetectorResult(item) for item in results.get("Detector", [])]
self.fiducialResults = [FiducialResult(item) for item in results.get("Fiducial", [])]
self.retroResults = [RetroreflectiveResult(item) for item in results.get("Retro", [])]
self.botpose = results.get("botpose", [])
self.botpose_wpiblue = results.get("botpose_wpiblue", [])
self.botpose_wpired = results.get("botpose_wpired", [])
self.capture_latency = results.get("cl", 0)
self.pipeline_id = results.get("pID", 0)
self.robot_pose_target_space = results.get("t6c_rs", [])
self.targeting_latency = results.get("tl", 0)
self.timestamp = results.get("ts", 0)
self.validity = results.get("v", 0)
self.parse_latency = 0.0
class RetroreflectiveResult:
def __init__(self, retro_data):
self.points = retro_data["pts"]
self.camera_pose_target_space = retro_data["t6c_ts"]
self.robot_pose_field_space = retro_data["t6r_fs"]
self.robot_pose_target_space = retro_data["t6r_ts"]
self.target_pose_camera_space = retro_data["t6t_cs"]
self.target_pose_robot_space = retro_data["t6t_rs"]
self.target_area = retro_data["ta"]
self.target_x_degrees = retro_data["tx"]
self.target_x_pixels = retro_data["txp"]
self.target_y_degrees = retro_data["ty"]
self.target_y_pixels = retro_data["typ"]
class FiducialResult:
def __init__(self, fiducial_data):
self.fiducial_id = fiducial_data["fID"]
self.family = fiducial_data["fam"]
self.points = fiducial_data["pts"]
self.skew = fiducial_data["skew"]
self.camera_pose_target_space = fiducial_data["t6c_ts"]
self.robot_pose_field_space = fiducial_data["t6r_fs"]
self.robot_pose_target_space = fiducial_data["t6r_ts"]
self.target_pose_camera_space = fiducial_data["t6t_cs"]
self.target_pose_robot_space = fiducial_data["t6t_rs"]
self.target_area = fiducial_data["ta"]
self.target_x_degrees = fiducial_data["tx"]
self.target_x_pixels = fiducial_data["txp"]
self.target_y_degrees = fiducial_data["ty"]
self.target_y_pixels = fiducial_data["typ"]
class DetectorResult:
def __init__(self, detector_data):
self.class_name = detector_data["class"]
self.class_id = detector_data["classID"]
self.confidence = detector_data["conf"]
self.points = detector_data["pts"]
self.target_area = detector_data["ta"]
self.target_x_degrees = detector_data["tx"]
self.target_x_pixels = detector_data["txp"]
self.target_y_degrees = detector_data["ty"]
self.target_y_pixels = detector_data["typ"]
class ClassifierResult:
def __init__(self, classifier_data):
self.class_name = classifier_data["class"]
self.class_id = classifier_data["classID"]
self.confidence = classifier_data["conf"]