Learn(으)로 돌아가기

RC G1 터틸 글래브 <unk> 리눅스 설정

우부투, 데비안 또는 현대 리눅스에서 RC G1 터틸 글래브를 사용하십시오. 공급자 GUI는 윈도우/macOS에서만 있습니다. 이 가이드는 udev 규칙, 문서화된 일련 프로토콜 및 60 라인 파이썬 리더를 통해 진행됩니다.

이 후속 GUI는 윈도우와 맥오스에서만 제공됩니다. 리눅스에서 문서화된 바이너리 프로토콜을 사용하여 USB-시리즈를 통해 직접 장갑과 대화합니다. CH340 모듈은 모든 현대 디스트로에서 내장된 T17 드라이버가 지원되기 때문에 독자적인 드라이버가 필요하지 않습니다. 이 가이드에서는 162 채널 압력을 더하기 6 축 IMU를 100 Hz에서 스트리밍하는 60 라인 파이썬 리더를 제공합니다.

촉각 감지 총 시간: 약 45 분 난이도: 중간 업데이트 2026 년 5 월

** Ubuntu 22.04, Ubuntu 24.04, Debian 12, Fedora 40에서 테스트되었습니다. Kernel 5.4 또는 최신 버전은 T18 드라이버를 내장했습니다. DKMS가 필요하지 않습니다.

당신 이 성취 할 것

이 가이드의 끝으로, 당신은 작동하는 리눅스 파이프라인을 갖게 될 것입니다. 장갑은 USB 시리즈 또는 블루투스를 통해 안정적인 T19 장치로 스트리밍되며, 파이썬 프로세스는 100 Hz에서 2 패킷 프레임 프로토콜을 디코드하고, 시스템d 단위는 리부트를 통해 실행되도록합니다. 동일한 리더는 데이터 세트 녹화를 위해 RC 데이터 플랫폼에 깔끔하게 파이프합니다.

전제 조건

  • ** 하드웨어:** RC G1 터틸 글래브, 데이터 획득 모듈 (충전), USB-A 블루투스 둥글 또는 USB-A에서 USB-C 케이블로 연결된 일련 케이블
  • OS: 5.4 또는 그 이상의 커널에서 리눅스 배포를 합니다. 이 가이드 는 우분투 22.04 / 24.04, 데비안 12, 그리고 페도라 40에 대항하여 작성되었습니다.
  • ** 기술:** T20, T20, 짧은 파이썬을 읽는 편입니다.

단계

  1. 커널 드라이버가 존재하는지 확인하세요

현대 리눅스 커널 (5.4+) 은 데이터 획득 모듈에서 사용되는 CH340 USB 시리즈 칩에 대한 T21 를 묶어줍니다. USB-A 블루투스 둥글 또는 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
```

CH340은 지구상에서 가장 많이 사용되고 있는 USB 시리즈 칩입니다. 만약 그 번호가 나오지 않는다면, 커널을 의심하기 전에 나쁜 케이블을 의심하십시오.

  1. 자신을 대화 그룹에 추가하십시오

데비안과 우부턴에서, 일련 장치는 T23의 소유물입니다. 그룹에 가입해야 합니다:

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

** 로그 아웃 및 로그 아웃**, 또는 현재 T24를 실행. 이 없이는, 사용자 공간 리더는 실패:

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

페도라에서는 T25이 동등한 그룹이고, 아치에서는 T26입니다. T27로 확인하세요.

  1. 결정적인 udev 규칙을 설치합니다 (선택하지만 권장됩니다)

udev 규칙이 없으면 커널은 1인칭으로 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
```

이제 장치가 플러그 순서에 관계없이 T29로 표시됩니다. 여러 장갑은 T30, T31, T32을 수열 순서에 따라 얻습니다. 그러나 각 장갑은 플러그인의 평생 동안 자신의 시뮬레이션을 유지합니다.

  1. 블루투스를 사용하여 Bluetooth를 짝짓습니다 (선택 경로)

USB 케이블보다는 무선 둥글을 사용하려면 에 둥글을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 을 연결해 이 연결해 이 연결해 이 연결해 이 연결해 이 연결해 이 연결해 이 연결해 에 연결된 이 연결된 이 연결해 이 연결해 이 연결해 이 연결된

```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 (체 전체) 를 광고합니다. 어떤 모듈을 짝짓고 있는지에 따라. 후자자를 물리적 장치와 일치합니다. 짝짓고 나면, 둥글의 일련 포트에 있는 모든 후속 읽기들은 실시간 센서 프레임을 제공합니다. 둥글에 짝짓기는 지속되어 있으므로 모듈을 교환하면만 수리합니다.

BlueZ 참고: 당신은 T40 또는 호스트의 BlueZ 스택이 필요하지 않습니다.

  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
```

파이썬 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 템플릿은 T47T48이용 이용 파일의 복제 없이 여러 인스턴스를 옆으로 실행할 수 있습니다.

  1. RC 데이터 플랫폼에 스트리밍

리더는 상태를 stderr로 인쇄하고 (생산) 에서 원하는 형식으로 프레임을 stdout로 작성합니다. RC 데이터 플랫폼 섭취에 가장 쉬운 길은 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는 인증, 재시험 및 플랫폼의 섭취 웹소켓에 조각 업로드를 처리합니다. 같은 명령 줄에 에피소드 메타데이터를 (task name, scene labels, hand side) 첨부하는 방법을 포함하여 전체 참조를 위해 [SDK quickstart]T70을 참조하십시오.

프레임 레이아웃 및 ROS 2 예제

위의 리더는 전체 프레임에 대해 평면 256개의 T49 요소 압력 값 배열을 더해 4개의 부동의 사각형으로 생성한다. 256개의 슬롯은 펌웨어의 내부 주소계획에 16x16의 그리드에 해당한다. 이 중 162개의 슬롯은 팔꿈치와 손가락에 있는 섬유 센서에 물리적으로 연결되어 있다. 나머지 슬롯은 대략 0을 읽으며, 파생된 특징을 만들 때 마스크를 할 수 있다. 채널에서 손가락에 대한 지도 테이블은 [데이터 프로토콜 참조 페이지]T71) 에 있습니다. 한 번 인쇄하고 벤치 옆에 탭합니다.

ROS 2 통합을 위해 T51T50를 포장하여 100 Hz에서 손당 T52를 게시하고, T53을 쿼터니온에 게시합니다. 우리는 [github.com/robotics-center/rc-g1-ros2-driver] (T72) 에서 참조 드라이버를 곧 게시합니다.

공급성 검사: 100 Hz x (256 바이트 압력 + 16 바이트 IMU + 12 바이트 프레임) = ~28 KB/s 한 손. 921600 바이트의 CH340는 ~115 KB/s의 사용 가능한 대역폭을 가지고 있으므로 전선 단손 스트리밍은 링크의 약 1/4를 사용합니다.

문제 해결

T54 T55: 당신은 단계 2 (T56 그룹) 을 잊었습니다. T57 그룹 회원가입 후 다시 로그인하는 것은 새로운 세션에서만 열립니다.

** 플러그인에서 T58이 표시되지 않습니다:** T59 모듈이 로드되지 않습니다. 확인하기 위해 T60을 실행하십시오. "모듈이 발견되지 않았습니다"로 모드조사가 실패하면 T61 (Ubuntu) 또는 T62 (Fedora) 를 설치하고 다시 시도하십시오.

T63: 데이터 획득 모듈은 배터리를 절약하기 위해 1 분 동안 대기 상태가 되었습니다. 모듈의 전력 버튼을 단축 누르면 깨어나게 됩니다.

레더는 100 Hz 대신 50 Hz에서 실행됩니다: 당신은 블루투스 (30 Hz 명칭; 일부 호스트는 다시 시도를 포함하여 ~ 50 Hz를 측정합니다.

** 프레임 캔버스 / IMU 쿼터니온은 NaN:** 확인 보드 는 T64이다. 펌웨어 또한 고속 유선 모드에서 T65 보드를 지원한다. 해당 모듈을 적절히 구성했다면 T66로 리더를 설정한다. 기본 공장 보드 는 T67이다.

** 두 개의 장갑이 연결되어 있으며, 오직 한 스트림:** 단계 3의 udev 규칙이 두 개의 시뮬링크 (T68) 를 생성하는지 확인하십시오. 하나만 표시되면 두 번째 모듈은 다른 USB 공급자 / 제품 ID에 있습니다.

다음으로 어떻게 해야 할까요?

한 손이 안정적으로 스트리밍되면 다음 값이 높은 단계는: (1) 빈손의 5 초를 기록하고 평균을 빼어내는 방식으로 채널당 압력 기준선을 기밀화하고, (2) 두 번째 손을 가져와 동시에 플랫폼으로 스트리밍을 확인하고, (3) 중앙 CLI의 에피소드 모드를 사용하여 라벨화된 데이터 세트를 기록합니다.

관련 교과서 및 자원