ソフトウェアとドライバーのセットアップ

Paxini SDK をインストールし、Python で圧力データをストリーミングし、接触ヒートマップを視覚化し、オプションの ROS2 統合を追加し、完全なデータ収集パイプラインのためにロボット アームと同期します。

ステップ 1 — インストール

Paxini SDK をインストールする

Paxini Gen3 は USB HID 経由で通信します。カーネル モジュールやベンダー ドライバーは必要ありません。 Python SDK は、低レベルの HID プロトコルをラップし、クリーンなストリーミング API を公開します。

あらゆるOSをサポート Gen3 は、標準の USB HID デバイスとして列挙されます。 Windows、macOS、Linux はすべて、インボックス ドライバーでサポートされています。 Python 3.10以降が必要です。
# Python 3.10+ required pip インストール paxini-sdk # With visualization extras (matplotlib, numpy) pip インストール「paxini-sdk[viz]」 # With ROS2 bridge (requires ROS2 Humble or Jazzy) pip インストール「paxini-sdk[ros2]」

インストールを確認します。

python -c "p​​axini をインポート; print(paxini.__version__)" # Expected: 1.2.x or later
ステップ 2 — USB の検出

センサーの検出

Gen3 センサーを USB-C 経由でコンピュータに接続します。 SDK のデバイス検出ユーティリティを使用して、デバイスが認識されていることを確認します。

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

マルチセンサー設定の場合 (例: USB ハブ上の 5 本の指):

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 権限 Linux では、root なしで HID デバイスにアクセスするには、udev ルールを追加する必要がある場合があります。 走る sudo python -m paxini.install_udev 一度ルールをインストールしてから、センサーを取り外して再度接続します。
ステップ 3 — ストリーミング API

Python ストリーミング API

コア API はコールバックベースのストリームです。 各フレームは、 触覚フレーム 全圧力配列とメタデータを含むオブジェクト。

# Minimal streaming example — 5 lines パキシーニを輸入する センサー = paxini.Sensor() # connects to first detected device センサー.スタート() sensor.stream() のフレームの場合: print(frame.pressure_map) # 2D numpy array, shape (rows, cols) print(frame.total_force_n) # float, total normal force in Newtons

すべてのパブリック API メソッド:

メソッド/プロパティ 説明 返品
センサー.スタート()ストリーミングを開始します。 ノンブロッキングなし
センサー.ストップ()ストリームをきれいに停止するなし
センサー.ストリーム()設定された Hz で TactileFrame オブジェクトを生成するジェネレータージェネレーター[TactileFrame]
センサー.最新()ブロックせずに最新のフレームを返します。触覚フレーム
センサー.set_rate(hz)サンプルレートの設定 (USB-C の場合は 50 ~ 500 Hz、BLE の場合は 50 ~ 200 Hz)なし
センサー.キャリブレーション()現在の静止荷重に対するゼロオフセット校正なし
センサー.シリアルデバイスのシリアル番号文字列str
センサーのバリアント「指先」 | 「指パッド」 | 「ヤシ」str
ステップ 4 — データ形式

触覚データフォーマット

それぞれ 触覚フレーム 含まれるもの:

分野 タイプ 説明
フレーム.タイムスタンプ_ns整数ナノ秒タイムスタンプ (単調、ホストクロック)
フレーム.圧力マップnp.ndarray (H, W) float32タクセルあたりの圧力 (kPa)。 形状はバリエーションによって異なります。指先は 8×8、手のひらは 16×12 です。
フレーム.コンタクトマスクnp.ndarray (H, W) ブール値圧力が接触閾値を超えた場合に True (デフォルト: 5 kPa)
フレーム.接触面積_mm2フロート活性タクセル面積の合計 (mm²)
フレーム.total_force_nフロートすべてのタクセルにわたる統合垂直抗力 (ニュートン単位)
フレーム.コンタクトセントロイド(フロート、フロート)(行、列) タクセル座標における接触領域の重心
フレーム.in_contactブールtotal_force_n が接触しきい値を超えた場合は True (デフォルト: 0.05 N)
フレームシーケンス整数単調増加するフレームシーケンス番号
空間解像度 フィンガーチップのバリエーション: 14×14 mm、1.75 mm のタクセル ピッチをカバーする 8×8 タクセル アレイ。 パーム バージョン: 48×36 mm、3 mm ピッチをカバーする 16×12 アレイ。 各タクセルの測定値は 0 ~ 600 kPa です。
ステップ 5 — 視覚化

ライブヒートマップ視覚化

SDK には、すぐに実行できるライブ ビジュアライザーが同梱されています。 コマンドラインから直接実行します。

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

または、次のコマンドを使用して独自のスクリプトに埋め込みます。 paxini.viz モジュール:

パキシーニを輸入する paxini.viz から HeatmapWindow をインポート センサー = paxini.Sensor() センサー.スタート() window = HeatmapWindow(title="Paxini Gen3 — 指先") sensor.stream() のフレームの場合: window.update(frame.pressure_map) window. should_close() の場合: 休憩 センサー.ストップ()
ステップ 6 (オプション) — ROS2

ROS2インターフェース

ROS2 ブリッジは、 センサーメッセージ/画像 (圧力マップ) とカスタム paxini_msgs/TactileFrame センサーごとのトピック。 ROS2 Humble または Jazzy が必要です。

# Install the ROS2 extras and launch the node pip インストール「paxini-sdk[ros2]」 ros2 実行 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

マルチセンサー設定の場合、各デバイスはシリアル番号で発行されます。 標準の ROS2 再マッピングを使用して、起動ファイル内のトピックを再マッピングできます。

ステップ 7 — アームの統合

ロボットアームの統合

Paxini データをロボット アームの関節状態と同期するには、 paxini.sync モジュール。 すべてのセンサー フレームに共有クロックに対してタイムスタンプを付け、同期された (arm_state、tactile_frame) ペアを生成するブロッキング API を提供します。

パキシーニを輸入する paxini.sync から MultiSourceSync をインポート # Initialize sensor and arm interface センサー = paxini.Sensor() arm = YourArmInterface() # any arm with a get_joint_state() method 同期 = マルチソース同期( センサー=センサー、 腕=腕、 max_dt_ms=5.0 # reject pairs with >5ms timestamp gap ) arm_state の場合、sync.stream() の触覚: print(arm_state.joint_positions) print(tactile.total_force_n) print(tactile.pressure_map)
タイムスタンプの調整 Gen3 タイムスタンプは、USB 割り込み時にホスト クロックを使用してナノ秒の解像度でフレームにスタンプします。 ジッターは通常 0.5 ミリ秒未満です。 の MultiSourceSync このクラスは、アームとセンサーのレートが異なる場合に補間を処理します。
トラブルシューティング

トップ 3 の問題

paxini.discover() は空のリストを返します

センサーが検出されていません。 順番に確認してください: (1) 別の USB-C ケーブルを試します。一部のケーブルは充電専用で、データを伝送できません。 (2) Linux の場合は、次を実行します。 sudo python -m paxini.install_udev 次にセンサーを抜き差しします。 (3) センサー LED が点灯 (点滅していない) ことを確認します。点滅はファームウェア更新モードであることを意味します。 終了するには、リセットボタンを 5 秒間押し続けます。

を押すと、pressure_map はすべて 0 になります。

センサーの校正が必要か、しきい値の設定が高すぎます。 走る sensor.calibrate() センサーがアンロードされた状態(接触なし)。 問題が解決しない場合は、センサーの種類がマウントと一致していることを確認してください。指先に取り付けられた手のひらセンサーは、タクセル領域が大きいため、非常に低い圧力値を示します。 ファームウェアのバージョン 1.2+ も確認してください。 python -m paxini.discover.

MultiSourceSync が TimestampDriftError を発生させる

アーム インターフェイスのクロックとセンサーのタイムスタンプが、 max_dt_ms。 これは通常、アーム SDK が古いジョイント状態 (たとえば、より低いレートでバッファリングされた状態) を返すことが原因で発生します。 増加 max_dt_ms 最初のテストとして 10.0 に設定し、アーム状態のリフレッシュ レートが予想よりも低い理由を調査します。 USB アームの場合は、USB ポーリング レートが電源管理によって抑制されていないことを確認します (sudo powertop Linux の場合)。

まだ行き詰まっていますか? に投稿してください フォーラムの質問スレッド お使いの OS、SDK バージョン (paxini.__version__)、および正確なエラー出力。