返回Learn

RC G1触摸手套 <unk> Linux 设置

使用RC G1触摸手套在Ubuntu,Debian或任何现代Linux上.供应商GUI仅是Windows/macOS.

在Linux上,您可以直接通过USB连续使用文档二进制协议与手套交谈,没有需要专有驱动程序,因为CH340模块由每个现代发行中内核T17驱动程序支持. 这本指南提供了一个60行字符串阅读器, 能够在100Hz下播放162通道压力加上6轴IMU,加上Udev规则和系统d服务.

触觉感测总时间:约45分钟 难度:中期更新 2026年5月

** 在:** Ubuntu 22.04, Ubuntu 24.04, Debian 12, Fedora 40 上测试. 5.4 或更新的内置T18驱动程序 没有DKMS.

你将实现什么

在本指南的结束时,您将有一个运行的Linux管道:手套通过USB连线或蓝牙流入一个稳定的T19设备,Python进程将两包框架协议在100Hz上解码,系统d单元将其在重启中运行.同样的读者将清洁地进入RC数据平台进行数据集记录.

条件

  • 硬件: RC G1触摸手套,数据采集模块 (充电),USB-A蓝牙或USB-A到USB-C有线串行电缆.
  • **OS:**任何 Linux 分布在 5.4 核或更新的.本指南是针对 Ubuntu 22.04 / 24.04, Debian 12 和 Fedora 40 编写的.
  • T20,和阅读短字符串.

步骤

  1. 确认内核驱动器存在

现代Linux内核 (5.4+) 捆绑了CH340USB连续芯片,用于数据采集模块.将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. 加入对话组

在 Debian 和 Ubuntu 上,该连续设备由 T23拥有.

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

之后登录退出,重新登录,或者运行T24在当前的格中.

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

在Fedora上,同等组是T25;在Arch上,它是T26.用T27来验证.

  1. ###安装确定性使用规则 (可选但建议)

没有 udev 规则,内核将T28分配给第一人,如果连接多个手套或如果 dongle 移动到不同的 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. ###使用蓝色Z (可选路径) 通过蓝牙对

如果您更喜欢使用无线通道,而不是USB电缆,将通道插入它呈现为CH340连续端口,而不是隐藏设备然后使用固件的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 (全身) 根据你对配.对配后音与你的物理设备.一旦对配,果的连续端口上所有后续读取给你现场传感器框架对配是持久的果,所以只修复如果你交换模块.

**BlueZ注:**你不需要T40或主机的BlueZ堆,果处理BLE在固件中并暴露了一个透明的连接链接.

  1. ###安装Python依赖

系统整体安装工作,但虚拟v让事情保持整洁:

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

T41提供跨平台序列层,T42用于压力框架缓冲器.

  1. 写给读者

创建T43,包含以下内容.这是全文件大约60行,这是这个页面上最有用的东西.先阅读文件;框架格式是大多数人错误的部分.

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

按一个指尖,看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,并在制作中将框架写到任何形式中.

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

对于完整的参考,请参阅[SDK快启动]T70,包括如何将事件的元数据 (任务名称,场景标签,手边) 添加到同一命令行上.

框架布局和ROS 2的例子

上面的读器每一个全格产生了一个平面的256元素T49压力值阵列加上4浮四. 256个槽相应于固件内部地址方案中的16x16格格,其中162个槽是物理连接到手掌和手指上的布料传感器;剩余的槽读到大约零,并且可以在构建衍生特征时掩盖. 向指映射表位于 [数据协议参考页面]T71) 上,打印一次,并将其贴在你的子旁边.

为了实现ROS 2集成,将T50包装在一个T51中,它每手以100Hz发布一个T52,加上一个T53用于四旋翼.我们将在 [github.com/robotics-center/rc-g1-ros2-driver]T72上发布一个参考驱动程序.

通过输出智能检查: 100 Hz x (256 字节压力 + 16 字节 IMU + 12 字节框架) = ~ 28 KB/s 每个手.

解决问题

**T54T55:**你忘了第2步 (T56组). T57 后重新登录,只有在新会议上才能获得组成员.

** 插件上没有T58出现:** T59模块没有加载.运行T60以确认.如果模块测试失败,安装T61 (Ubuntu) 或T62 (Fedora) 再试.

**T63:**数据采集模块进入1分钟的空置预备状态,以节省电池.快点按电源按,唤醒它.

**读器运行在50Hz而不是100Hz:**您在蓝牙 (30Hz名义;一些主机测量50Hz包括重试).

** 格解码垃圾 / IMU 四方体是 NaN:** 验证波特是T64. 固件还支持高速度有线模式的T65波特;设置读器为T66,如果您已根据配置模块. 默认的工厂波特是T67.

**两个手套连接,只有一个流:**检查从步骤3的 udev 规则产生两个符号链接 (T68).如果只出现一个,第二个模块在不同的USB供应商/产品ID 运行 T69并添加一个第二个规则与匹配的ID.

接下来要做什么?

一旦单手可靠流,高价值的下一步步骤是: (1) 通过记录5秒的空手,减去平均值来校准每道的压力基线, (2) 提升第二手并同时检查两个流向平台, (3) 使用中心CLI的集模式记录标签的数据集.

相关教程和资源