Configuração de Software e Driver

Instale o SDK Paxini, transmita dados de pressão em Python, visualize mapas de calor de contato, adicione integração opcional com ROS2 e sincronize com seu braço robótico para pipelines completos de coleta de dados.

Passo 1 — Instalação

Instale o SDK Paxini

O Paxini Gen3 se comunica via USB HID — nenhum módulo de kernel ou drivers de fornecedor são necessários. O SDK Python envolve o protocolo HID de baixo nível e expõe uma API de streaming limpa.

Qualquer sistema operacional suportado O Gen3 é enumerado como um dispositivo USB HID padrão. Windows, macOS e Linux o suportam com drivers inbox. Python 3.10 ou posterior é necessário.
# 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]"

Verifique a instalação:

python -c "import paxini; print(paxini.__version__)" # Expected: 1.2.x or later
Passo 2 — Detecção de USB

Detectando o Sensor

Conecte o sensor Gen3 ao seu computador via USB-C. Use a ferramenta de descoberta de dispositivos do SDK para confirmar que ele foi reconhecido:

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

Para configurações de múltiplos sensores (por exemplo, cinco dedos em um 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) # ...
Permissões USB no Linux No Linux, pode ser necessário adicionar uma regra udev para acessar dispositivos HID sem root. Execute sudo python -m paxini.install_udev uma vez para instalar a regra, depois desconecte e reconecte o sensor.
Passo 3 — API de Streaming

API de streaming Python

A API principal é um fluxo baseado em callback. Cada quadro entrega um TactileFrame objeto contendo o array completo de pressão e metadados.

# 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 os métodos da API pública:

Método / Propriedade Descrição Retorna
sensor.start()Começar a transmissão; não bloqueanteNenhum
sensor.parar()Pare o fluxo de forma limpaNenhum
sensor.fluxo()Gerador produzindo objetos TactileFrame na frequência configurada em HzGerador[TactileFrame]
sensor.mais_recente()Retorna o quadro mais recente sem bloquearTactileFrame
sensor.definir_taxa(hz)Definir taxa de amostragem (50–500 Hz para USB-C, 50–200 Hz para BLE)Nenhum
sensor.calibrar()Calibração de zero-offset contra a carga de repouso atualNenhum
sensor.serialString do número de série do dispositivostr
sensor.variante"ponta do dedo" | "almofada do dedo" | "palma"str
Passo 4 — Formato de Dados

Formato de Dados Táctil

Cada TactileFrame contém:

Campo Tipo Descrição
frame.timestamp_nsintCarimbo de tempo em nanosegundos (monotônico, relógio do host)
frame.pressure_mapnp.ndarray (H, W) float32Pressão em kPa por taxel. A forma varia por variante: ponta do dedo é 8×8, palma é 16×12.
frame.contact_masknp.ndarray (H, W) boolVerdadeiro onde a pressão excede o limite de contato (padrão: 5 kPa)
frame.contact_area_mm2flutuanteSoma das áreas de taxel ativas em mm²
frame.total_force_nflutuanteForça normal integrada em todos os taxels, em Newtons
frame.contact_centroid(float, float)(linha, coluna) centróide da região de contato em coordenadas de taxel
frame.in_contactboolVerdadeiro se total_force_n excede o limite de contato (padrão: 0,05 N)
frame.seqintNúmero da sequência de quadro que aumenta monotonamente
Resolução espacial Variante da ponta do dedo: matriz de taxel 8×8 cobrindo 14×14 mm, espaçamento de 1,75 mm entre taxels. Variante da palma: matriz 16×12 cobrindo 48×36 mm, espaçamento de 3 mm. Cada taxel mede 0–600 kPa.
Passo 5 — Visualização

Visualização de Mapa de Calor ao Vivo

O SDK inclui um visualizador ao vivo pronto para uso. Execute diretamente da linha de comando:

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

Ou incorpore em seu próprio script usando o paxini.viz módulo:

importar paxini
Estágio 6 (Opcional) — ROS2

Interface ROS2

A ponte ROS2 publica um sensor_msgs/Image (mapa de pressão) e um paxini_msgs/TactileFrame tópico personalizado por sensor. Requer ROS2 Humble ou 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 configurações de múltiplos sensores, cada dispositivo publica sob seu número de série. Você pode remapear tópicos em seu arquivo de lançamento usando o remapeamento padrão do ROS2.

Etapa 7 — Integração com Braço Robótico

Integração de Braço Robótico

Para sincronizar os dados do Paxini com o estado das juntas do braço robótico, use o paxini.sync módulo. Ele marca todos os quadros do sensor em relação a um relógio compartilhado e fornece uma API bloqueante que gera pares sincronizados (arm_state, tactile_frame):

importar paxini # Initialize sensor and arm interface sensor = paxini.Sensor() # any arm with a get_joint_state() method sincronizar = MultiSourceSync( # reject pairs with >5ms timestamp gap )
Alinhamento de timestamp O Gen3 marca os quadros de timestamp com resolução de nanossegundos usando o relógio do host no tempo de interrupção USB. O jitter é tipicamente <0,5 ms. O MultiSourceSync classe lida com a interpolação quando as taxas do braço e do sensor diferem.
Solução de Problemas

3 principais problemas

paxini.discover() retorna lista vazia

O sensor não está sendo detectado. Verifique na ordem: (1) Tente um cabo USB-C diferente — alguns cabos são apenas para carga e não transmitem dados. (2) No Linux, execute sudo python -m paxini.install_udev em seguida, desconecte/reconecte o sensor. (3) Confirme que o LED do sensor está sólido (não piscando) — piscando significa que está no modo de atualização de firmware; mantenha o botão de reset pressionado por 5 segundos para sair.

pressure_map está todo zerado ao pressionar

O sensor precisa de calibração ou o limite está definido muito alto. Execute sensor.calibrate() com o sensor descarregado (sem contato). Se o problema persistir, verifique se a variante do sensor corresponde ao seu suporte — um sensor de palma instalado na ponta do dedo mostrará valores de pressão muito baixos devido à área maior do taxel. Também confirme a versão do firmware 1.2+ com python -m paxini.discover.

MultiSourceSync gera TimestampDriftError

O relógio da interface do braço e o timestamp do sensor estão divergindo em mais de max_dt_ms. Isso geralmente é causado pelo SDK do braço retornando um estado de junta desatualizado (por exemplo, armazenado em um ritmo mais baixo). Aumente max_dt_ms para 10.0 como primeiro teste, depois investigue por que a taxa de atualização do estado do braço é menor do que o esperado. Para braços USB, confirme que a taxa de polling USB não está sendo limitada pela gestão de energia (sudo powertop sem Linux).

Ainda preso? Poste no thread de perguntas do fórum com seu sistema operacional, versão do SDK (paxini.__version__), e a saída de erro exata.