Configuration du logiciel et du pilote

Installez le SDK Paxini, diffusez des données de pression en Python, visualisez des cartes thermiques de contact, ajoutez l'intégration ROS2 en option et synchronisez avec votre bras robotique pour des pipelines complets de collecte de données.

Étape 1 — Installation

Installez le SDK Paxini

Le Paxini Gen3 communique via USB HID — aucun module de noyau ou pilote de fournisseur n'est requis. Le SDK Python enveloppe le protocole HID de bas niveau et expose une API de streaming propre.

Tout système d'exploitation pris en charge Le Gen3 est considéré comme un périphérique USB HID standard. Windows, macOS et Linux le prennent tous en charge avec les pilotes de la boîte de réception. Python 3.10 ou version ultérieure est requis.
# Python 3.10+ required installateur pip paxini-sdk # With visualization extras (matplotlib, numpy) pip install "paxini-sdk[viz]" # With ROS2 bridge (requires ROS2 Humble or Jazzy) pip installe "paxini-sdk[ros2]"

Vérifiez l'installation :

python -c "importer paxini; print(paxini.__version__)" # Expected: 1.2.x or later
Étape 2 — Détection USB

Détection du capteur

Branchez le capteur Gen3 sur votre ordinateur via USB-C. Utilisez l'utilitaire de découverte de périphérique du SDK pour confirmer qu'il est reconnu :

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

Pour les configurations multi-capteurs (par exemple, cinq doigts sur 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) # ...
Autorisations USB Linux Sous Linux, vous devrez peut-être ajouter une règle udev pour accéder aux périphériques HID sans root. Courir sudo python -m paxini.install_udev une fois pour installer la règle, puis débranchez et rebranchez le capteur.
Étape 3 — API de diffusion en continu

API de diffusion Python

L'API principale est un flux basé sur le rappel. Chaque image délivre un Cadre Tactile objet contenant le tableau de pression complet et les métadonnées.

# Minimal streaming example — 5 lines importer des paxini capteur = paxini.Sensor() # connects to first detected device capteur.start() pour le cadre dans sensor.stream() : imprimer(frame.pression_map) # 2D numpy array, shape (rows, cols) imprimer(frame.total_force_n) # float, total normal force in Newtons

Toutes les méthodes API publiques :

Méthode / Propriété Description Retours
capteur.start()Commencez la diffusion ; non bloquantAucune
capteur.stop()Arrêtez le flux proprementAucune
capteur.stream()Générateur produisant des objets TactileFrame à Hz configuréGénérateur[TactileFrame]
capteur.dernier()Renvoie la trame la plus récente sans blocageCadre Tactile
capteur.set_rate(hz)Définir la fréquence d'échantillonnage (50 à 500 Hz pour USB-C, 50 à 200 Hz pour BLE)Aucune
capteur.calibrer()Étalonnage du décalage zéro par rapport à la charge de repos actuelleAucune
capteur.sérieChaîne du numéro de série de l'appareilstr
capteur.variante"bout du doigt" | "doigt" | "palmier"str
Étape 4 — Format des données

Format de données tactiles

Chaque Cadre Tactile contient:

Championne Cône Description
frame.timestamp_nsintHorodatage nanoseconde (monotone, horloge hôte)
frame.pression_mapnp.ndarray (H, W) float32Pression en kPa par taxel. La forme varie selon la variante : le bout du doigt est de 8 × 8, la paume est de 16 × 12.
cadre.contact_maskcombinateur np.ndarray (H, W).Vrai lorsque la pression dépasse le seuil de contact (par défaut : 5 kPa)
frame.contact_area_mm2flotterSomme des surfaces de taxels actifs en mm²
frame.total_force_nflotterForce normale intégrée sur tous les taxels, en Newtons
cadre.contact_centroid(super, super)(ligne, col) centroïde de la région de contact en coordonnées taxel
cadre.in_contactbouffonneVrai si total_force_n dépasse le seuil de contact (par défaut : 0,05 N)
cadre.seqintNuméro de séquence de trame croissant de manière monotone
Résolution spatiale Variante du bout des doigts : réseau de taxels 8 × 8 couvrant 14 × 14 mm, pas de taxel de 1,75 mm. Variante Palm : matrice 16×12 couvrant 48×36 mm, pas de 3 mm. Chaque taxel mesure 0 à 600 kPa.
Étape 5 — Visualisation

Visualisation de la carte thermique en direct

Le SDK est livré avec un visualiseur en direct prêt à l'emploi. Exécutez-le directement depuis la ligne de commande :

# 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 intégrez-le dans votre propre script en utilisant le paxini.viz module:

importer des paxini à partir de paxini.viz importer HeatmapWindow capteur = paxini.Sensor() capteur.start() window = HeatmapWindow(title="Paxini Gen3 — Fingertip") pour le cadre dans sensor.stream() : window.update(frame.pression_map) si window.should_close() : pause capteur.stop()
Étape 6 (Facultatif) — ROS2

Interface ROS2

Le pont ROS2 publie un sensor_msgs/Image (carte de pression) et un personnalisé paxini_msgs/TactileFrame sujet par capteur. Nécessite ROS2 Humble ou Jazzy.

# Install the ROS2 extras and launch the node pip installe "paxini-sdk[ros2]" ros2 exécute paxini_ros2 sensor_node # 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

Pour les configurations multi-capteurs, chaque appareil publie sous son numéro de série. Vous pouvez remapper les sujets dans votre fichier de lancement à l'aide du remappage ROS2 standard.

Étape 7 — Intégration du bras

Intégration du bras robot

Pour synchroniser les données Paxini avec l'état de l'articulation du bras du robot, utilisez le paxini.sync module. Il horodatage toutes les images du capteur par rapport à une horloge partagée et fournit une API de blocage qui génère des paires synchronisées (arm_state, tactile_frame) :

importer des paxini à partir de paxini.sync importer MultiSourceSync # Initialize sensor and arm interface capteur = paxini.Sensor() bras = VotreArmInterface() # any arm with a get_joint_state() method synchronisation = MultiSourceSync ( capteur = capteur, bras = bras, max_dt_ms=5.0 # reject pairs with >5ms timestamp gap ) pour arm_state, tactile dans sync.stream() : print(arm_state.joint_positions) imprimer(tactile.total_force_n) print(tactile.pression_map)
Alignement de l'horodatage Le Gen3 horodatage les images avec une résolution nanoseconde en utilisant l'horloge hôte au moment de l'interruption USB. La gigue est généralement <0,5 ms. Le MultiSourceSync la classe gère l’interpolation lorsque les taux du bras et du capteur diffèrent.
Dépannage

Les 3 principaux problèmes

paxini.discover() renvoie une liste vide

Le capteur n'est pas détecté. Vérifiez dans l'ordre : (1) Essayez un autre câble USB-C : certains câbles sont uniquement destinés à la charge et ne transportent pas de données. (2) Sous Linux, exécutez sudo python -m paxini.install_udev puis débranchez/rebranchez le capteur. (3) Vérifiez que la LED du capteur est fixe (ne clignote pas) – un clignotement signifie qu'il est en mode de mise à jour du micrologiciel ; maintenez le bouton de réinitialisation enfoncé pendant 5 secondes pour quitter.

Pressure_map est entièrement à zéro lorsque vous appuyez sur

Le capteur a besoin d'être calibré ou le seuil est réglé trop haut. Courir sensor.calibrate() avec le capteur déchargé (pas de contact). Si le problème persiste, vérifiez que la variante du capteur correspond à votre monture : un capteur palmaire installé sur le bout du doigt affichera des valeurs de pression très faibles en raison de la plus grande zone de taxel. Confirmez également la version 1.2+ du firmware avec python -m paxini.discover.

MultiSourceSync génère TimestampDriftError

L'horloge de l'interface du bras et l'horodatage du capteur divergent de plus de max_dt_ms. Cela est généralement dû au fait que le SDK du bras renvoie un état commun obsolète (par exemple, mis en mémoire tampon à un débit inférieur). Augmenter max_dt_ms à 10,0 comme premier test, puis étudiez pourquoi le taux de rafraîchissement de l'état d'armement est inférieur à celui prévu. Pour les bras USB, vérifiez que le taux d'interrogation USB n'est pas limité par la gestion de l'alimentation (sudo powertop sous Linux).

Toujours bloqué ? Publier dans le fil de questions du forum avec votre système d'exploitation, version du SDK (paxini.__version__), et la sortie d'erreur exacte.