Juqiao タクタイル グローブ セットアップ ガイド
開梱からライブ圧力データとプラットフォーム統合までの完全なパス。 合計 30 分未満を計画してください。
手袋を着用して取得モジュールを接続します
Juqiao グローブは、手首にリボン ケーブル コネクタが付いた織布グローブとして出荷されます。 取得モジュールは、アナログからデジタルへの変換と USB 通信を処理する独立した小型 PCB エンクロージャです。
- 手袋を着用してください 標準的な手袋と同様に、FPC コネクタは手首に配置されます。
- リボン ケーブルを固定します。 グローブの手首コネクタからの FPC リボン ケーブルの位置を合わせて、取得モジュールのリボン レセプタクルにしっかりと押し込みます。 かすかなカチッという音は、シートが確実に固定されていることを示します。 ノードの読み取り値がゼロの場合は、リボンが完全に装着されていません。以下のトラブルシューティングを参照してください。
- モジュールをマウントします。 遠隔操作中の手首の動きを妨げないように、取得モジュールをリスト ストラップまたは前腕マウントにクリップまたはベルクロで固定します。
- USBを接続します: 付属の USB ケーブルを使用して、取得モジュールをホスト PC に接続します。
/dev/ttyUSB0 または /dev/ttyACM0; macOS上では /dev/tty.usbserial-*。 Windows では、デバイスが COM ポートとして自動的に列挙されない場合は、付属の CP210x または CH340 ドライバーをインストールします。
Python SDK (pyserial) をインストールする
独自のベンダー SDK は必要ありません。 取得モジュールは、フレーム化されたバイナリ パケットを標準シリアル ポート経由でストリーミングします。 pyserial が唯一の依存関係です。
pyserial をインストールします。
pip install pyserial
シリアル ポートが表示されていることを確認します。
# Linux ls /dev/ttyUSB* /dev/ttyACM* # macOS ls /dev/tty.usbserial-* # Or use pyserial's port listing tool python -m serial.tools.list_ports
ライブ ストリーミングを確認します (サニティ チェック):
# Replace /dev/ttyUSB0 with your port; 921600 is the default baud rate
python -m serial.tools.miniterm /dev/ttyUSB0 921600
取得モジュールの設定されたサンプル レートでバイナリ データのストリームが表示されるはずです。 端末が沈黙している場合は、USB 接続とモジュール LED を確認してください。サンプル レートで点滅しているはずです。
dialout グループ化してログアウトし、再度ログインします。 sudo usermod -aG dialout $USER
Python フレーム リーダーを実行する
取得モジュールは、固定長のバイナリ フレームを送信します。 各フレームは 2 バイトの開始デリミタで始まります 0xAA 0x55、その後に 1 バイトのチャネル数 N、N × 2 バイトのビッグエンディアン 16 ビット圧力値、および 2 バイトの CRC16 チェックサムが続きます。 フレームの合計長 = 5 + 2N バイト。
基本的なフレーム リーダー — フレームごとの圧力値のリストを出力します。
import serial, struct, time BAUD = 921600 PORT = "/dev/ttyUSB0" # /dev/tty.usbserial-* on macOS, COMx on Windows HEADER = b"\xaa\x55" def read_frame(ser: serial.Serial, n_channels: int) -> list[int] | None: # Sync to frame header buf = ser.read(2) if buf != HEADER: ser.read_until(HEADER[-1:]) return None raw = ser.read(1 + n_channels * 2 + 2) n = raw[0] if n != n_channels: return None pressures = list(struct.unpack_from(f">{n}H", raw, 1)) # CRC check omitted for brevity — validate in production return pressures with serial.Serial(PORT, BAUD, timeout=0.1) as ser: N = 64 # number of sensing nodes — confirm from spec doc while True: frame = read_frame(ser, N) if frame: print(frame) # list of N 16-bit pressure values
手袋のさまざまな部分を握り、ノード値が増減することを確認します。 64 ノードすべてが応答する必要があります。 領域に応答がない場合は、グローブ コネクタとモジュールの両方にリボン ケーブルが固定されていることを再確認してください。
ゼロ点校正
ファブリックセンサーは、温度変化や繰り返しの圧縮によるベースラインオフセットの影響を受けます。 正確な測定値を得るために、各セッションの開始時に調整してください。
- 手袋を緩めます 圧力を加えずに平らな面に置きます。手を完全に動かさずリラックスした状態で保持できる場合を除き、校正中は着用しないでください。
- Windows: Juqiao 構成ツールを開き、COM ポートを選択して、 接続するに移動し、 校正 → ゼロ。 すべてのノードのベースラインは、現在の静止値に設定されます。
- Linux / macOS: V2.3 プロトコル ドキュメントに従ってソフトウェア ゼロ コマンドを送信するか、Python ブリッジ スクリプトでベースライン減算を適用します (静止時に 50 フレームをキャプチャし、チャネルごとの平均を減算します)。
# Simple software baseline subtraction (Linux/macOS alternative)
import serial, struct, numpy as np
BAUD, PORT, N = 921600, "/dev/ttyUSB0", 64
HEADER = b"\xaa\x55"
def read_frame(ser):
ser.read_until(HEADER)
raw = ser.read(1 + N * 2 + 2)
return list(struct.unpack_from(f">{N}H", raw, 1))
with serial.Serial(PORT, BAUD, timeout=0.1) as ser:
ser.reset_input_buffer()
baseline = np.mean([read_frame(ser) for _ in range(50)], axis=0)
print("Baseline captured. Starting calibrated stream...")
while True:
frame = read_frame(ser)
if frame:
calibrated = np.maximum(0, np.array(frame) - baseline)
print(calibrated.astype(int).tolist())
プラットフォームの統合 — 恐れを知らないプラットフォーム
恐れを知らぬプラットフォーム platform.roboticscenter.ai Juqiao センサーを遠隔操作セッションの触覚ノードとしてサポートします。 圧力フレームは、ロボットの関節状態、カメラ ストリーム、その他のセンサー モダリティと並行して同期して記録されます。
登録シーケンス:
- テレオペセッションを開始するには、
POST /api/teleop/sessions/create-sdkとdevice_type: "juqiao_textile_skin". - プラットフォーム WebSocket を開きます。
/api/teleop/wsそして登録ハンドシェイクを送信します。role: "operator",device_type: "tactile_sensor",capabilities: ["tactile", "pressure_array", "telemetry"]. - 受信時
type: "ready"、シリアル リーダーからの JSONL テレメトリ フレームの転送を開始します。
プラットフォーム ブリッジの JSONL エミッター:
import serial, struct, time, json, sys
PORT = "/dev/ttyUSB0"
BAUD = 921600
N_CHANNELS = 64
HEADER = b"\xaa\x55"
def read_frame(ser):
buf = ser.read_until(HEADER)
if not buf.endswith(HEADER):
return None
raw = ser.read(1 + N_CHANNELS * 2 + 2)
pressures = list(struct.unpack_from(f">{N_CHANNELS}H", raw, 1))
return pressures
with serial.Serial(PORT, BAUD, timeout=0.05) as ser:
while True:
frame = read_frame(ser)
if frame:
record = {
"ts": int(time.time() * 1000),
"device": "juqiao_textile_skin",
"variant": "high_frequency_v2.3",
"pressures": frame, # flat list, N_CHANNELS values
"n_channels": N_CHANNELS
}
print(json.dumps(record), flush=True) # JSONL for platform bridge
プラットフォーム WebSocket に送信されるテレメトリ フレーム形式:
{
"type": "telemetry",
"member_id": "juqiao-glove-right",
"device": "juqiao_textile_skin",
"variant": "high_frequency_v2.3",
"pressures": [0, 512, 1024, ...], // flat array, N_CHANNELS 16-bit values
"n_channels": 64,
"ts": 1743680400123 // Unix millisecond timestamp
}
OpenArm または DK1 とのペアリング: 一般的な遠隔操作セットアップでは、3 つの別個のプロセスがホスト PC 上で実行され、それぞれが同じセッション ID で登録されます (ロボット アーム制御ブリッジ、Juqiao シリアル ブリッジ、手首ビューとシーン ビュー用のカメラ ブリッジ)。 プラットフォームは、 ts フィールドを作成し、デモンストレーションごとに 1 つのエピソードの JSONL ファイルをアーカイブします。 再生中、GloveWorkbench パネルは腕の関節の軌道に沿って触圧ヒートマップをレンダリングします。
member_id 値 — juqiao-glove-right そして juqiao-glove-left。 各グローブには独自の取得モジュールと USB 接続があります。 両方のグローブをティックごとに 1 つの JSON オブジェクトにバッチ処理して、200 Hz でのプラットフォーム メッセージ数を半減します。
セッションの作成、WebSocket ハンドシェイク、エピソードのダウンロードをカバーする完全な API リファレンスについては、 プラットフォーム SDK API リファレンス.
トラブルシューティング
- Linux にはシリアル デバイスがありません: 走る
sudo usermod -aG dialout $USERそしてログアウト/ログインします。 で確認してくださいlsusbモジュールが列挙するもの。 古いカーネルでは、modprobe cdc_acm必要になるかもしれません。 - すべての圧力測定値はゼロです。 USB を取り外し、FPC リボンの両端 (グローブ コネクタとモジュール) を取り付け直し、再接続します。 モジュールの LED を確認します。設定されたサンプル レートで点滅するはずです。
- アンロードされたノードでの大きなベースライン オフセット: セッションの前に室温でゼロ点校正を実行してください。 手袋をはめた後、1 ~ 2 分間安定させます。
- フレーム同期エラー/データ化け: ボーレートが 921600 であることを確認します。オープン時にシリアル バッファをフラッシュします。
ser.reset_input_buffer()。 使用read_until(HEADER)起動時に固定長読み取りではなく再同期します。 - センサー ノードの応答が遅い、または「粘着性」を感じます: セッションの前に、グローブを全可動域で数回ゆっくりと曲げます。 問題が解決しない場合は、ファイバーの疲労を示している可能性があります。交換については Juqiao Precision にお問い合わせください。
- プラットフォーム ブリッジは 200 Hz でフレームをドロップします。 シングルグローブセッションではサンプルレートを 100 Hz に下げます。 両手セットアップの場合は、両方のグローブをティックごとに 1 つの JSON オブジェクトにまとめて、メッセージ数を半分にします。
lsusb -v (Linux) またはデバイス マネージャー (Windows)、仕様バージョン (V2.3 または V1.0 バイリンガル)、および症状の簡単な説明。