Software- und Treiber-Setup

Installieren Sie das Paxini SDK, streamen Sie Druckdaten in Python, visualisieren Sie Kontakt-Heatmaps, fügen Sie eine optionale ROS2-Integration hinzu und synchronisieren Sie mit Ihrem Roboterarm für vollständige Datenerfassungspipelines.

Schritt 1 – Installation

Installieren Sie das Paxini SDK

Der Paxini Gen3 kommuniziert über USB HID – es sind keine Kernel-Module oder Herstellertreiber erforderlich. Das Python SDK umschließt das Low-Level-HID-Protokoll und stellt eine saubere Streaming-API bereit.

Jedes Betriebssystem wird unterstützt Das Gen3 gilt als Standard-USB-HID-Gerät. Windows, macOS und Linux unterstützen es alle mit Inbox-Treibern. Python 3.10 oder höher ist erforderlich.
# Python 3.10+ required pip installiere 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]“

Überprüfen Sie die Installation:

python -c "paxini importieren; print(paxini.__version__)" # Expected: 1.2.x or later
Schritt 2 – USB-Erkennung

Den Sensor erkennen

Schließen Sie den Gen3-Sensor über USB-C an Ihren Computer an. Verwenden Sie das Geräteerkennungsdienstprogramm des SDK, um zu bestätigen, dass es erkannt wurde:

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

Für Multisensor-Setups (z. B. fünf Finger an einem USB-Hub):

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) # ...
Linux-USB-Berechtigungen Unter Linux müssen Sie möglicherweise eine udev-Regel hinzufügen, um ohne Root auf HID-Geräte zugreifen zu können. Laufen sudo python -m paxini.install_udev einmal, um den Maßstab zu installieren, dann den Sensor abziehen und wieder einstecken.
Schritt 3 – Streaming-API

Python-Streaming-API

Die Kern-API ist ein Callback-basierter Stream. Jeder Rahmen liefert eine Taktiler Rahmen Objekt, das das vollständige Druckarray und die Metadaten enthält.

# Minimal streaming example — 5 lines Paxini importieren sensor = paxini.Sensor() # connects to first detected device sensor.start() für Frame in sensor.stream(): print(frame.Pressure_map) # 2D numpy array, shape (rows, cols) print(frame.total_force_n) # float, total normal force in Newtons

Alle öffentlichen API-Methoden:

Methode / Eigenschaft Beschreibung Rückgaben
sensor.start()Beginnen Sie mit dem Streaming. nicht blockierendKeiner
sensor.stop()Stoppen Sie den Stream sauberKeiner
sensor.stream()Generator, der TactileFrame-Objekte mit konfigurierten Hz liefertGenerator[TactileFrame]
sensor.latest()Gibt den aktuellsten Frame ohne Blockierung zurückTaktiler Rahmen
sensor.set_rate(hz)Abtastrate einstellen (50–500 Hz für USB-C, 50–200 Hz für BLE)Keiner
sensor.kalibrieren()Nullpunktkalibrierung gegenüber der aktuellen RuhelastKeiner
sensor.seriellZeichenfolge mit der Seriennummer des Gerätsstr
Sensorvariante„Fingerspitze“ | „Finger-Pad“ | „Palme“str
Schritt 4 – Datenformat

Taktiles Datenformat

Jede Taktiler Rahmen enthält:

Feld Typ Beschreibung
Frame.timestamp_nsintNanosekunden-Zeitstempel (monoton, Host-Uhr)
Frame.Pressure_Mapnp.ndarray (H, W) float32Druck in kPa pro Taxel. Die Form variiert je nach Variante: Fingerspitze ist 8×8, Handfläche ist 16×12.
frame.contact_masknp.ndarray (H, W) boolWahr, wenn der Druck den Kontaktschwellenwert überschreitet (Standard: 5 kPa)
frame.contact_area_mm2schwebenSumme der aktiven Taxelflächen in mm²
Frame.total_force_nschwebenIntegrierte Normalkraft über alle Taxel, in Newton
frame.contact_centroid(schweben, schweben)(Zeile, Spalte) Schwerpunkt der Kontaktregion in Taxelkoordinaten
frame.in_contactboolTrue, wenn total_force_n den Kontaktschwellenwert überschreitet (Standard: 0,05 N)
Frame.seqintMonoton steigende Frame-Sequenznummer
Räumliche Auflösung Fingertip-Variante: 8×8-Taxel-Array mit 14×14 mm, 1,75 mm Taxel-Abstand. Palm-Variante: 16×12-Array mit einer Fläche von 48×36 mm, 3 mm Rastermaß. Jedes Taxel misst 0–600 kPa.
Schritt 5 – Visualisierung

Live-Heatmap-Visualisierung

Das SDK liefert einen betriebsbereiten Live-Visualizer. Führen Sie es direkt über die Befehlszeile aus:

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

Oder betten Sie es mit in Ihr eigenes Skript ein paxini.viz Modul:

Paxini importieren aus paxini.viz HeatmapWindow importieren sensor = paxini.Sensor() sensor.start() window = HeatmapWindow(title="Paxini Gen3 — Fingertip") für Frame in sensor.stream(): window.update(frame.Pressure_map) if window.should_close(): Pause sensor.stop()
Schritt 6 (optional) – ROS2

ROS2-Schnittstelle

Die ROS2-Brücke veröffentlicht a sensor_msgs/Image (Druckkarte) und ein Brauch paxini_msgs/TactileFrame Thema pro Sensor. Erfordert ROS2 Humble oder Jazzy.

# Install the ROS2 extras and launch the node pip install „paxini-sdk[ros2]“ ros2 führt paxini_ros2 sensor_node aus # 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

Bei Multisensor-Setups veröffentlicht jedes Gerät seine Seriennummer. Sie können Themen in Ihrer Startdatei mithilfe der standardmäßigen ROS2-Neuzuordnung neu zuordnen.

Schritt 7 – Armintegration

Roboterarmintegration

Um Paxini-Daten mit dem Gelenkstatus des Roboterarms zu synchronisieren, verwenden Sie die paxini.sync Modul. Es versieht alle Sensorframes mit einem Zeitstempel mit einer gemeinsamen Uhr und stellt eine blockierende API bereit, die synchronisierte Paare (arm_state, tactile_frame) liefert:

Paxini importieren aus paxini.sync MultiSourceSync importieren # Initialize sensor and arm interface sensor = paxini.Sensor() arm = YourArmInterface() # any arm with a get_joint_state() method sync = MultiSourceSync( sensor=sensor, Arm=Arm, max_dt_ms=5.0 # reject pairs with >5ms timestamp gap ) für arm_state, taktil in sync.stream(): print(arm_state.joint_positions) print(tactile.total_force_n) print(tactile.pression_map)
Zeitstempelausrichtung Die Gen3 versieht Frames mit Nanosekunden-Auflösung unter Verwendung der Host-Uhr zur USB-Interrupt-Zeit mit einem Zeitstempel. Der Jitter beträgt typischerweise <0,5 ms. Der MultiSourceSync Die Klasse übernimmt die Interpolation, wenn sich Arm- und Sensorraten unterscheiden.
Fehlerbehebung

Top 3 Probleme

paxini.discover() gibt eine leere Liste zurück

Der Sensor wird nicht erkannt. Überprüfen Sie die Reihenfolge: (1) Versuchen Sie es mit einem anderen USB-C-Kabel – einige Kabel dienen nur zum Aufladen und übertragen keine Daten. (2) Unter Linux ausführen sudo python -m paxini.install_udev Ziehen Sie dann den Sensor ab bzw. stecken Sie ihn wieder ein. (3) Stellen Sie sicher, dass die Sensor-LED dauerhaft leuchtet (nicht blinkt). Blinken bedeutet, dass sie sich im Firmware-Aktualisierungsmodus befindet. Halten Sie die Reset-Taste 5 Sekunden lang gedrückt, um den Vorgang zu beenden.

Pressure_map besteht beim Drücken nur aus Nullen

Der Sensor muss kalibriert werden oder der Schwellenwert ist zu hoch eingestellt. Laufen sensor.calibrate() bei unbelastetem Sensor (kein Kontakt). Wenn das Problem weiterhin besteht, prüfen Sie, ob die Sensorvariante zu Ihrer Halterung passt – ein an einer Fingerspitze installierter Handflächensensor zeigt aufgrund der größeren Taxelfläche sehr niedrige Druckwerte an. Bestätigen Sie auch die Firmware-Version 1.2+ mit python -m paxini.discover.

MultiSourceSync hat TimestampDriftError aus behoben

Die Armschnittstellenuhr und der Sensorzeitstempel weichen um mehr als ab max_dt_ms. Dies wird normalerweise dadurch verursacht, dass das Arm-SDK einen veralteten Gelenkzustand zurückgibt (z. B. mit einer niedrigeren Rate gepuffert). Zunahme max_dt_ms Stellen Sie den Computer als ersten Test auf 10,0 ein und untersuchen Sie dann, warum die Aktualisierungsrate des Armzustands niedriger als erwartet ist. Stellen Sie bei USB-Armen sicher, dass die USB-Abfragerate nicht durch die Energieverwaltung gedrosselt wird (sudo powertop unter Linux).

Stecken Sie immer noch fest? Beitrag im Forum-Fragen-Thread mit Ihrem Betriebssystem, SDK-Version (paxini.__version__) und die genaue Fehlerausgabe.