RC G1触摸手套 <unk> Linux 设置
使用RC G1触摸手套在Ubuntu,Debian或任何现代Linux上.供应商GUI仅是Windows/macOS.
在Linux上,您可以直接通过USB连续使用文档二进制协议与手套交谈,没有需要专有驱动程序,因为CH340模块由每个现代发行中内核T17
触觉感测总时间:约45分钟 难度:中期更新 2026年5月
** 在:** Ubuntu 22.04, Ubuntu 24.04, Debian 12, Fedora 40 上测试. 5.4 或更新的内置
你将实现什么
在本指南的结束时,您将有一个运行的Linux管道:手套通过USB连线或蓝牙流入一个稳定的T19
条件
- 硬件: RC G1触摸手套,数据采集模块 (充电),USB-A蓝牙
或USB-A到USB-C有线串行电缆. - **OS:**任何 Linux 分布在 5.4 核或更新的.本指南是针对 Ubuntu 22.04 / 24.04, Debian 12 和 Fedora 40 编写的.
T20 ,和阅读短字符串.
步骤
确认内核驱动器存在
现代Linux内核 (5.4+) 捆绑了CH340USB连续芯片,用于数据采集模块.将USB-A蓝牙
```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连续芯片. 如果它不列出,
- 加入对话组
在 Debian 和 Ubuntu 上,该连续设备由
```bash
sudo usermod -aG dialout $USER
```
之后登录退出,重新登录,或者运行
```bash
serial.serialutil.SerialException: [Errno 13] Permission denied: '/dev/ttyUSB0'
```
在Fedora上,同等组是
- ###安装确定性使用规则 (可选但建议)
没有 udev 规则,内核将
```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
```
现在你的设备显示为
- ###使用蓝色Z (可选路径) 通过蓝牙对
如果您更喜欢使用无线通道,而不是USB电缆,将通道插入
```bash
sudo apt install -y screen
screen /dev/rc-g1-glove-0 921600
```
在
```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
**BlueZ注:**你不需要
- ###安装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
```
- 写给读者
创建
```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
```
按一个指尖,看
(可选) 运行作为系统d服务
对于无头部署,将读器包装在一个模板系统d单元中,以便它自动重新启动,然后启动.将以下内容放入
```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
```
流入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快启动]
框架布局和ROS 2的例子
上面的读器每一个全
为了实现ROS 2集成,将
通过输出智能检查: 100 Hz x (256 字节压力 + 16 字节 IMU + 12 字节框架) = ~ 28 KB/s 每个手.
解决问题
**
** 插件上没有
**
**读器运行在50Hz而不是100Hz:**您在蓝牙 (30Hz名义;一些主机测量50Hz包括重试).
**
**两个手套连接,只有一个流:**检查从步骤3的 udev 规则产生两个符号链接 (
接下来要做什么?
一旦单手可靠流,高价值的下一步步骤是: (1) 通过记录5秒的空手,减去平均值来校准每







