Volver a Paxini Gen3 Path

Comprender los datos táctiles

Aprenda la estructura de la matriz de presión, calibre los umbrales de detección de contacto, implemente la lógica de detección de agarre y visualice los eventos de contacto con el tiempo con el Paxini Gen3.

Unidad 2 de 5 · Comprender los datos · ~ 1,5 horas

En esta unidad aprenderá la estructura espacial de la matriz de presión, calibrará los umbrales de detección de contacto para su agarre, implementará la lógica de detección de agarre y visualizará eventos de contacto con el tiempo.

Concepto Estructura de la serie de presión

El mapa de la presión espacial

El campo frame.pressure_map es una matriz 2D NumPy donde cada elemento representa un taxel (pixel táctil). Para la variante de punta del dedo, la matriz es 8×8, cubriendo el área de detección de 14×14 mm en un tono de 1,75 mm. Cada valor es en kilopascals (kPa).

Presión (kPa)

Fuerza por unidad de área. Rango: 0600 kPa.

Área de contacto (mm2)

Sumada de las zonas de la cabina donde la presión excede el umbral.

Fuerza total (N)

Integral de presión sobre el área de contacto. Proporcional a la fuerza de cierre del agarre.

Centroid (fila, columna)

Centro de masa de la región de contacto en las coordenadas de taxel.

# Explore la estructura de mapa de presión importa paxini importa numpy como np sensor = paxini.Sensor() sensor.start.() sensor.calibrate() # zero-offset sin marco de contacto = sensor.latest() print("Array shape:", frame.pressure_map.shape) # (8, 8) "Max pressure:", frame.pressure_map.max(), "kPa") print("Total force:", frame.total_force_n, "N") print("Contact area:", frame.contact_area_mm2, "mm2") print"Centroid:", frame.contact_cent) # (row,) float

Paso 1 Calibración del umbral

El límite de contacto frente al límite de no contacto

El umbral de contacto predeterminado es de 5 kPa por cabina y fuerza total de 0,05 N. Estos valores predeterminados funcionan para la mayoría de las configuraciones, pero pueden necesitar ajuste basado en la carga previa de su agarre y la tensión del cable en el sensor.

Ejecutar este guión de calibración para medir el nivel de ruido en reposo de su sensor y establecer un umbral apropiado:

Importar paxini importar numpy como np sensor = paxini.Sensor() sensor.start.sensor.calibrate() # cero-offset primero # Muestra de 100 cuadros sin línea de contacto base_forces = [] para i, marco en enumerar(sensor.stream()): línea de referencia_forces.append(frame.total_force_n) si i >= 99: breaking_floor = np.max.bas\_forces) recomendado_threshold = noise_floor * 3.0(f"Noise floor print: {noise_floor4f} N") printf"Remended contact threshold: {recomended_setthreshold4f} N) # Apply the threshold.\\\concomm_sensor:.\threshold4f}

Valores típicos El nivel de ruido es generalmente de 0,0050,02 N. Un umbral de 0,050,06 N proporciona una detección fiable de contactos sin falsos positivos del movimiento del cable.

Paso 2 Detección de la sujeción

Logia de detección de la captura

Un detector de agarre simple pero robusto utiliza tres condiciones simultáneas: bandera de contacto verdadera, área de contacto por encima del mínimo y centroide estable (centroide no se mueve rápidamente).

Importar paxini importar numpy como np de las colecciones importar sensor deque = paxini.Sensor.((() sensor.start.() sensor.calibrate() centroid_history = deque(maxlen=10) # últimos 10 cuadros def es_stable_grasp(frame): si no es marco.en_contact: regresar Falso si marco.contact_area_mm2 < 8.0: # al menos ~3 taxels regresar Falso centroid_history.appendframe.contact_centroid) si lencentroid_history) < 5: regresar centroides = np.ay_centroid\history) centroides_std = centro.std.std.

Paso 3 Visualización de eventos de contacto

Visualizar los eventos de contacto con el tiempo

En el plano de la fuerza total y el estado de contacto durante una grabación de 10 segundos para comprender la estructura temporal de un ciclo de captura y liberación:

Importar paxini importar numpy como np importar matplotlib.pyplot como plt sensor = paxini.Sensor) sensor.start.() sensor.calibrate() fuerzas = [\] contactos = [\] timestamps = [] print("Registro de 10 segundos agarre y libere el sensor...") para el marco en sensor.stream((): fuerzas.append(frame.total_force_n) contactos.append(((at contactframe.in_contact)) timestamps.append(frame.timestamp_time_ns / 1e9) si timestamp[-1] - timestamp >[0] break= 10.0: ttt =setset timestamps) -txtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxt

Para la terminología de torsión de fuerza utilizada en el campo, véase el glosario de robótica.

Unidad 2 completa cuando...

Puede imprimir la forma del mapa de presión y confirmar que es (8, 8) para la variante de punta de los dedos. Su umbral de contacto calibrado no produce falsos positivos cuando sacude el cable del sensor suavemente. El detector de agarre imprime "STABLE GRASP" dentro de los 0,5 segundos de agarrarse firmemente a la superficie del sensor. Su gráfico de eventos de contacto muestra bordes de aumento y caída claros en la agarre y liberación.

[← Regreso a la visión general del camino]