Learnに戻る

RC G1タクチルグローブ <unk> Linux セットアップ

Ubuntu,Debian,または最新のLinuxでRC G1タクチルグローブを使用します.ベンダーGUIはWindows/macOSのみです.このガイドは udevルール,文書化されたシリアルプロトコル,60行パイトンリーダーを通行します.

関連GUIはWindowsとmacOSのみで提供されます.Linuxでは,ドキュメント化された二重プロトコルを使用し,USBシリーズで直接手袋に話しかけます. 独自のドライバは必要ありません. CH340モジュールは,すべての近代ディストロに搭載されている内核のT17 ドライバによってサポートされています. このガイドでは162チャンネル圧力を166軸IMUを100Hzでストリームし,UdevルールとシステムDサービスを提供します

タクシールセンサー 合計時間:約45分 困難:中間更新 2026年5月

** Ubuntu 22.04, Ubuntu 24.04, Debian 12, Fedora 40 でテストされました. Kernel 5.4 またはそれ以降は, T18 ドライバを内蔵しています. DKMSは必要ありません.

達成する事

このガイドの終わりまでに Linux のパイプラインが機能する. USB シリーズまたは Bluetooth を介して手袋が安定した T19 デバイスに流れ, Python プロセスは 100 Hz で2パケットフレームプロトコルを解読し, systemd ユニットはリブートを通して実行し続けます.同じ読者はデータセットの記録のために RC データプラットフォームにきれいに流れます.

必須条件

  • ハードウェア: RC G1 タクチルグローブ,データ取得モジュール (充電),USB-A ブルーツドングル _または_USB-AからUSB-Cのワイヤ付きシリアルケーブル.
  • OS: カーネル5.4またはそれ以降のLinuxディストリビューション.このガイドはUbuntu 22.04 / 24.04,Debian 12およびFedora 40に対して書かれています.
  • シェルで快適で T20 短文字 Pythonを読み取れる

ステップ

  1. カーネルドライバが存在していることを確認する

現代のLinuxカーネル (5.4+) は,データ取得モジュールで使用されるCH340USBシリアルチップの Bundle T21を接続します. USB-A Bluetooth dongleまたは USB-AからUSB-Cシリアルケーブルをホストに接続して実行します.

```bash
dmesg | tail -20
```

こんな文章を見ればいいでしょう

```bash
[ 1234.567890] usb 1-2: ch341-uart converter now attached to ttyUSB0
```

追加モジュールパッケージをインストールする

```bash
# Ubuntu / Debian
sudo apt install -y linux-modules-extra-$(uname -r)

# Fedora
sudo dnf install kernel-modules-extra
```

接続を切り開き 再接続して T22をチェックします CH340は地球上で最も広く展開されている USB シリアルチップです

  1. 自分をディオロググループに追加する

DebianとUbuntuでは,シリアルデバイスは T23が所有している.

```bash
sudo usermod -aG dialout $USER
```

シャッフルで,このユーザスペースリーダーが失敗します.

```bash
serial.serialutil.SerialException: [Errno 13] Permission denied: '/dev/ttyUSB0'
```

Fedoraでは同等グループがT25であり,ArchではT26である.

  1. 決定的な udev ルールをインストールする (オプションだが推奨)

udev ルールなしでは,カーネルは初対子で T28 を割り当てます.これは複数の手袋を接続した場合や,ドングルは別のUSBポートに移行した場合に脆弱です.

```bash
sudo tee /etc/udev/rules.d/99-rc-g1-glove.rules >/dev/null <<'EOF'
# RC G1 Tactile Glove — CH340 serial (WCH 1a86:7523)
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0660", GROUP="dialout", SYMLINK+="rc-g1-glove-%n"
EOF
```

規則を再加上する

```bash
sudo udevadm control --reload-rules && sudo udevadm trigger
```

プラグインの順序に関係なく,複数の手袋は,数値順序に基づいて,T30,T31,T32が表示されます.

  1. BlueZ (オプションパス) を使用してBluetoothでペアする

USBケーブルよりも無線ドングルを使用する場合は,ドングルを に接続します. はCH340シリアルポートとして表れます. HID デバイスではなく. 端口に設定されているファームウェアのATコマンドを T33 baudで使用します.

```bash
sudo apt install -y screen
screen /dev/rc-g1-glove-0 921600
```

T34セッション内では,ATコマンドを入力します:

```bash
AT+SCAN=1
# → +SCAN=2,3C8A1F2E9A36,-1,23,JQ-RH_3C:8A:1F:2E:9A:36   ← copy this MAC

AT+CONN=3C8A1F2E9A36
# → OK   (and then binary sensor data starts streaming — exit screen with Ctrl-A k)
```

固有ソフトウェアは,どのモジュールがペアリングされているかによって,T35 (左手),T36 (右手),T37 (左足),T38 (右足) またはT39 (全身) のいずれかを広告します.サフフイックスを物理デバイスにマッチします.ペアリングされたら,ドングルのシリアルポートの次回の読み聞かせは,ドングルの1つのセンサーフレームを生かす.

BlueZ注: 必要なのは T40またはホストのBlueZスタックです 端末はファームウェアでBLEを処理し,透明なシリアルリンクを暴露します. 無線拡張ケーブルとして扱います.

  1. Python依存をインストールする

システム全体でインストールができますが 仮想ナブは 整理を保ちます

```bash
python3 -m venv ~/.venv/rc-g1
source ~/.venv/rc-g1/bin/activate
pip install pyserial numpy
```

システムインストールを好む場合:

```bash
python3 -m pip install --user pyserial numpy
```

Python 3.9またはそれ以降は必要である. T41はクロスプラットフォームシリアルレイヤーを提供し, T42は圧力フレームバッファに使用される.

  1. 読者に書け

T43 を作成し,以下の内容を表示します.これは全ファイルです. 約60行です. このページで最も有用なものです. まず,docstring を読みましょう.ほとんどの人が間違える部分はフレーム形式です.

```python
#!/usr/bin/env python3
"""Minimal serial reader for the RC G1 Tactile Glove.

Frame format (per vendor protocol spec, v1.2):
    [Header 4B: 0xAA 0x55 0x03 0x99]
    [Packet seq 1B: 0x01 or 0x02]
    [Sensor type 1B: 0x01=LH, 0x02=RH, 0x03=LF, 0x04=RF, 0x05=WB]
    [Payload]
        seq 0x01: 128 bytes  — first 128 of 256 raw pressure values (8-bit ADC each)
        seq 0x02: 144 bytes  — last 128 pressure values + 16 bytes IMU (4 floats: w, x, y, z quaternion)

Two packets together = one full frame (256 pressure points, of which 162 are physically wired
to fabric sensors; the remaining slots read ~0 and can be masked). Wired streaming = 100 Hz,
Bluetooth = 30 Hz.
"""
import argparse, struct, sys, time
import serial
import numpy as np

HEADER = b"\xAA\x55\x03\x99"
SENSOR_NAMES = {0x01: "LH", 0x02: "RH", 0x03: "LF", 0x04: "RF", 0x05: "WB"}

def read_frame(port: serial.Serial):
    # Sync to header
    buf = b""
    while True:
        buf += port.read(1)
        if buf.endswith(HEADER):
            break
        if len(buf) > 4096:
            raise IOError("lost sync — no header in 4 KB")
    seq, sensor = port.read(1), port.read(1)
    if not seq or not sensor:
        raise IOError("short read on header trailer")
    seq, sensor = seq[0], sensor[0]
    payload_len = 128 if seq == 0x01 else 144
    payload = port.read(payload_len)
    if len(payload) != payload_len:
        raise IOError(f"short payload: got {len(payload)}/{payload_len}")
    return seq, sensor, payload

def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--port", default="/dev/rc-g1-glove-0")
    ap.add_argument("--baud", type=int, default=921600)
    args = ap.parse_args()

    with serial.Serial(args.port, args.baud, timeout=1) as port:
        print(f"Reading from {args.port} @ {args.baud}…", file=sys.stderr)
        half = None
        t0, n = time.time(), 0
        while True:
            seq, sensor, payload = read_frame(port)
            if seq == 0x01:
                half = payload  # stash first half
                continue
            if seq != 0x02 or half is None:
                continue
            # Combine the two halves
            raw = np.frombuffer(half + payload[:128], dtype=np.uint8)  # 256 pressure pts
            imu = struct.unpack("<ffff", payload[128:144])             # quaternion w,x,y,z
            n += 1
            if n % 100 == 0:
                hz = n / (time.time() - t0)
                side = SENSOR_NAMES.get(sensor, hex(sensor))
                peak = int(raw.max())
                print(f"[{side}] frames={n} rate={hz:5.1f} Hz peak={peak:3d}/255 quat={imu}",
                      file=sys.stderr)

if __name__ == "__main__":
    main()
```

実行する

```bash
python3 reader.py --port /dev/rc-g1-glove-0
```

検定速率を示す状態線を 100 枚のフレームごとに表示する必要があります 指を押して T44を256 チャンネルバッファーの最大圧力の値に登るのを観察します

  1. (オプション) システムDサービスとして実行する

型号のない部署では,データ収集セル,ラボベンチ,またはフィールドのロボットに 読み手をテンプレートされたシステムdユニットに包んで,クラッシュ時に自動復元し,起動を開始します.次のものをT45に落とす:

```bash
[Unit]
Description=RC G1 Tactile Glove reader (%i)
After=local-fs.target

[Service]
Type=simple
User=robotics
ExecStart=/home/robotics/.venv/rc-g1/bin/python /home/robotics/rc-g1-glove/reader.py --port /dev/%i
Restart=on-failure
RestartSec=2

[Install]
WantedBy=multi-user.target
```

起動する

```bash
sudo systemctl daemon-reload
sudo systemctl enable --now rc-g1-reader@rc-g1-glove-0.service
```

記録を追いかける

```bash
journalctl -u rc-g1-reader@rc-g1-glove-0.service -f
```

T46 テンプレートは,ユニットファイルを複製せずに,双手リグの場合は,複数のインスタンスを横並行して実行できます.

  1. ストリームをRCデータプラットフォームに

読み手は,スタータスをstderrにプリントし, (制作中) は,任意のフォーマットでフレームをstdoutに書き込みます.RC Data Platformの摂取への最も簡単な道は,RCSV CLIです:

```bash
pip install centeros-cli
centeros auth login
python reader.py --port /dev/rc-g1-glove-0 | centeros stream --hardware rc-g1-tactile-glove --operator-id <you>
```

CLIは,プラットフォームのインゲスト WebSocket に認証,再試し,断片アップルを処理します.同じコマンドラインにエピソードメタデータを (タスク名,シーンラベル,手側) 添付する方法を含む完全な参照については,SDKの速スタート (SDK quickstart) を参照してください.

フレームレイアウトとROS 2の例

上記の読者は,全フレームごとに,圧力の値の平坦256要素 T49配列と4浮式四角形を生成します.この256スロットは,ファームウェアの内部アドレススケーメットの16x16グリッドに対応しており,そのうち162は手掌と指の繊維センサーに物理的にケーブル接続されています.残りのスロットは約ゼロで,衍生機能を構築するときにマスクすることができます. チャンネルから指に映射するテーブルは [データプロトコル参照ページ]T71) に載っています

ROS 2 統合のために, 100 Hz で手当たり T52 を発行する T51T53 を巻いて,クアテリアン に T53 を 追加する.我々は github.com/robotics-center/rc-g1-ros2-driver に 参照ドライバーを公開する.

** 経路の健全性チェック:** 100 Hz x (256バイト圧力 + 16バイト IMU + 12バイト枠組) = ~28 KB/s/手. 921600 baudのCH340は使用可能な帯域幅 ~115 KB/sを持っています.

トラブルシューティング

T54 T55:** ステップ2 (T56グループ) を忘れてしまった. T57 グループ会員登録後,再ログインは,新しいセッションでのみ記録されます.

プラグインでは T58 が表示されない.** T59 モジュールがロードされていない.確認するために T60 を実行します. "モジュールが見つかりませんでした"でモッドプローブが失敗した場合, T61 (Ubuntu) または T62 (Fedora) をインストールして再試してください.

T63: データを収集するモジュールがバッテリーを節約するために1分間の無動待機状態に入りました. オンモジュール上の電源ボタンを短く押して目覚めさせます.

**100Hzの代わりに50Hzで読みます:**あなたはブルートゥース (30Hz名義;一部のホストはリトープを含む~50Hzを測定します.

Frames decode garbage / IMU quaternion is NaN: 確認ボードは T64. 固有ソフトウェアは高速ワイヤードモードでは T65 ボードもサポートします. 模块を適切に構成した場合は,読書を T66 で設定します. デフォルト工場ボードは T67です.

2つの手袋が接続され,ただ一つのストリーム: ステップ3からの udevルールが2つのシンボルリンク (T68) を生成していることを確認します.ただ一つだけが現れた場合,第2モジュールが異なるUSBベンダー/製品IDであります.

次にどうする?

単一の手が信頼性のあるストリーミングを行うと,次の高価値のステップは: (1) 怠け手5秒を記録して平均を引いて1チャンネルあたり圧力ベースラインを校正する, (2) 秒手を挙げて,両方のストリーミングを同時にプラットフォームに検証する,および (3) センターのCLIのエピソードモードを使用してラベル付きのデータセットを記録する.

関連チュートリアルとリソース