Configuración de Software y Controlador

Instale el SDK de Paxini, transmita datos de presión en Python, visualice mapas de calor de contacto, agregue integración opcional con ROS2 y sincronice con su brazo robótico para flujos de recopilación de datos completos.

Paso 1 — Instalación

Instale el SDK de Paxini

El Paxini Gen3 se comunica a través de USB HID — no se requieren módulos del kernel ni controladores de proveedor. El SDK de Python envuelve el protocolo HID de bajo nivel y expone una API de transmisión limpia.

Cualquier sistema operativo soportado El Gen3 se enumera como un dispositivo USB HID estándar. Windows, macOS y Linux lo soportan con controladores integrados. Se requiere Python 3.10 o posterior.
# Python 3.10+ required pip install paxini-sdk # With visualization extras (matplotlib, numpy) pip install "paxini-sdk[viz]" # With ROS2 bridge (requires ROS2 Humble or Jazzy) pip install "paxini-sdk[ros2]"

Verifica la instalación:

python -c "import paxini; print(paxini.__version__)" # Expected: 1.2.x or later
Paso 2 — Detección de USB

Detectando el sensor

Conecta el sensor Gen3 a tu computadora a través de USB-C. Usa la utilidad de descubrimiento de dispositivos del SDK para confirmar que es reconocido:

python -m paxini.discover # Example output: # Found 1 Paxini device(s): # [0] PX-6AX-GEN3 serial=PX3A0042 firmware=1.2.4 variant=fingertip

Para configuraciones de múltiples sensores (por ejemplo, cinco dedos en un hub USB):

python -m paxini.discover --all # Found 5 Paxini device(s): # [0] PX-6AX-GEN3 serial=PX3A0042 variant=fingertip (index 0) # [1] PX-6AX-GEN3 serial=PX3A0043 variant=fingertip (index 1) # ...
Permisos de USB en Linux En Linux, es posible que necesites agregar una regla de udev para acceder a dispositivos HID sin root. Ejecuta sudo python -m paxini.install_udev una vez para instalar la regla, luego desconecta y vuelve a conectar el sensor.
Paso 3 — API de Streaming

API de transmisión de Python

La API principal es un flujo basado en callbacks. Cada cuadro entrega un TactileFrame objeto que contiene el arreglo completo de presión y metadatos.

# Minimal streaming example — 5 lines importar paxini # connects to first detected device sensor.start() # 2D numpy array, shape (rows, cols) print(frame.total_force_n) # float, total normal force in Newtons

Todos los métodos públicos de la API:

Método / Propiedad Descripción Devuelve
sensor.start()Comienza a transmitir; no bloqueanteNinguno
sensor.detener()Detener el flujo de manera limpiaNinguno
sensor.flujo()Generador que produce objetos TactileFrame a la frecuencia configuradaGenerador[TactileFrame]
sensor.último()Devuelve el marco más reciente sin bloquearTactileFrame
sensor.establecer_tasa(hz)Establecer la tasa de muestreo (50–500 Hz para USB-C, 50–200 Hz para BLE)Ninguno
sensor.calibrar()Calibración de compensación cero contra la carga de reposo actualNinguno
sensor.serialCadena del número de serie del dispositivostr
variante.sensor"punta del dedo" | "pad del dedo" | "palma"str
Paso 4 — Formato de Datos

Formato de Datos Táctiles

Cada TactileFrame contiene:

campo Tipo Descripción
frame.timestamp_nsintMarca de tiempo en nanosegundos (monotónica, reloj del host)
frame.pressure_mapnp.ndarray (H, W) float32Presión en kPa por taxel. La forma varía según la variante: la yema del dedo es 8×8, la palma es 16×12.
marco.contact_masknp.ndarray (H, W) boolVerdadero donde la presión excede el umbral de contacto (predeterminado: 5 kPa)
frame.contact_area_mm2flotanteSuma de áreas de taxeles activos en mm²
frame.total_force_nflotanteFuerza normal integrada a través de todos los taxeles, en Newtons
frame.contact_centroid(float, float)(fila, col) centroide de la región de contacto en coordenadas de taxel
frame.in_contactboolVerdadero si total_force_n excede el umbral de contacto (predeterminado: 0.05 N)
frame.seqintNúmero de secuencia de marco que aumenta monotonamente
Resolución espacial Variante de yema del dedo: matriz de taxeles 8×8 que cubre 14×14 mm, separación de taxel de 1.75 mm. Variante de palma: matriz 16×12 que cubre 48×36 mm, separación de 3 mm. Cada taxel mide 0–600 kPa.
Paso 5 — Visualización

Visualización de Mapa de Calor en Vivo

El SDK incluye un visualizador en vivo listo para usar. Ejecútalo directamente desde la línea de comandos:

# Launch live heatmap — press Q to quit python -m paxini.visualize # Multi-sensor visualization (e.g., 5-finger setup) python -m paxini.visualize --all

O intégralo en tu propio script usando el paxini.viz módulo:

importar paxini
Paso 6 (Opcional) — ROS2

Interfaz ROS2

El puente ROS2 publica un sensor_msgs/Image (mapa de presión) y un paxini_msgs/TactileFrame tema personalizado por sensor. Requiere ROS2 Humble o Jazzy.

# Install the ROS2 extras and launch the node pip install "paxini-sdk[ros2]" # Published topics (per sensor): # /paxini/PX3A0042/pressure_image sensor_msgs/Image # /paxini/PX3A0042/tactile_frame paxini_msgs/TactileFrame # /paxini/PX3A0042/contact_event std_msgs/Bool

Para configuraciones de múltiples sensores, cada dispositivo publica bajo su número de serie. Puedes reasignar temas en tu archivo de lanzamiento usando la reasignación estándar de ROS2.

Paso 7 — Integración de Brazo

Integración de Brazo Robótico

Para sincronizar los datos de Paxini con el estado de las articulaciones del brazo robótico, utiliza el paxini.sync módulo. Marca todas las tramas de sensor contra un reloj compartido y proporciona una API bloqueante que genera pares sincronizados (arm_state, tactile_frame):

importar paxini # Initialize sensor and arm interface sensor = paxini.Sensor() # any arm with a get_joint_state() method sincronización = MultiSourceSync( # reject pairs with >5ms timestamp gap )
Alineación de marcas de tiempo El Gen3 marca las franjas de tiempo con resolución de nanosegundos utilizando el reloj del host en el momento de la interrupción USB. La MultiSourceSync clase maneja la interpolación cuando las tasas del brazo y del sensor difieren.
Solución de problemas

Principales 3 problemas

paxini.discover() devuelve una lista vacía

El sensor no está siendo detectado. Verifica en el siguiente orden: (1) Prueba un cable USB-C diferente; algunos cables son solo de carga y no transmiten datos. (2) En Linux, ejecuta sudo python -m paxini.install_udev luego desconecta/vuelve a conectar el sensor. (3) Confirma que el LED del sensor esté fijo (no parpadeando); parpadeando significa que está en modo de actualización de firmware; mantén presionado el botón de reinicio durante 5 segundos para salir.

pressure_map son todos ceros al presionar

El sensor necesita calibración o el umbral está configurado demasiado alto. Ejecuta sensor.calibrate() con el sensor descargado (sin contacto). Si el problema persiste, verifica que la variante del sensor coincida con tu soporte; un sensor de palma instalado en una yema de dedo mostrará valores de presión muy bajos debido al área de taxel más grande. También confirma la versión del firmware 1.2+ con python -m paxini.discover.

MultiSourceSync genera TimestampDriftError

El reloj de la interfaz del brazo y la marca de tiempo del sensor están divergiendo en más de max_dt_ms. Esto suele ser causado por el SDK del brazo que devuelve un estado de articulación obsoleto (por ejemplo, almacenado en un búfer a una tasa más baja). Aumenta max_dt_ms a 10.0 como primera prueba, luego investiga por qué la tasa de actualización del estado del brazo es más baja de lo esperado. Para brazos USB, confirma que la tasa de sondeo USB no esté siendo limitada por la gestión de energía (sudo powertop y Linux).

¿Aún atascado? Publica en el hilo de preguntas del foro con tu sistema operativo, versión del SDK (paxini.__version__), y la salida de error exacta.