Juqiao 촉각 장갑

소프트웨어 및 드라이버 설정

USB CDC 드라이버를 설치하고, Python에서 64노드 압력 데이터를 스트리밍하고, 접촉 히트맵을 시각화하고, Orca Hand 녹음 파이프라인과 통합하세요.

1단계 — 설치

juqiao-glove 패키지 설치

장갑은 USB CDC 직렬을 통해 통신하며 커널 모듈이나 맞춤형 드라이버가 없습니다. Python 패키지가 래핑됩니다. 비연속성 바이너리 프레임 프로토콜을 처리합니다.

모든 OS 지원 장갑은 표준 CDC-ACM 직렬 장치로 나타납니다. Windows, macOS 및 Linux는 모두 인박스 드라이버를 사용하여 자동으로 열거합니다. 공급업체 드라이버 설치 프로그램이 필요하지 않습니다.
# Python 3.10+ recommended pip 설치 juqiao-glove # Or with optional visualization extras (matplotlib, numpy) pip 설치 "juqiao-glove[viz]" # Or with ROS2 bridge extras (requires ROS2 Humble or later) pip 설치 "juqiao-glove[ros2]"

설치를 확인합니다.

python -c "juqiao_glove 가져오기; 인쇄(juqiao_glove.__version__)" # Expected: 0.4.x or later
2단계 - 포트 감지

USB 포트 감지

1.5m USB-C 케이블을 통해 장갑을 연결합니다. 장치는 CDC-ACM 직렬 포트로 열거됩니다.

OS일반적인 포트 이름메모
리눅스/dev/ttyACM0사용자 추가 다이얼아웃 권한이 거부된 경우 그룹
macOS/dev/tty.usbmodem*사용 ls /dev/tty.usb* 정확한 이름을 찾으려면
윈도우COM3 (다양함)장치관리자 → 포트(COM & LPT) 확인

Python에서 장갑을 자동 감지합니다.

juqiao_glove에서 가져오기 JuqiaoGlove # Auto-scan all serial ports and return the first Juqiao device found 장갑 = JuqiaoGlove.find() 인쇄(glove.port) # → '/dev/ttyACM0' or 'COM3' etc. 인쇄(glove.info()) # → firmware version, node count, sample rate

또는 포트를 명시적으로 지정하세요.

장갑 = JuqiaoGlove(port="/dev/ttyACM0", 전송 속도=3000000)
리눅스 권한 오류? 달리다 sudo usermod -aG 다이얼아웃 $USER 그런 다음 로그아웃했다가 다시 로그인하십시오. 또는 다음을 사용하십시오. sudo chmod 666 /dev/ttyACM0 단일 세션 해결 방법입니다.
3단계 - 스트리밍 API

Python 스트리밍 API

장갑은 200Hz로 스트리밍됩니다. 각 프레임에는 64요소 압력 배열(16비트 ADC, 정규화 0.0~1.0)과 타임스탬프가 포함되어 있습니다.

juqiao_glove에서 가져오기 JuqiaoGlove 수입 시간 장갑 = JuqiaoGlove.find() 장갑.연결() # Single-frame read 프레임 = 장갑.read_frame() 인쇄(프레임.타임스탬프) # float, seconds since epoch 인쇄(프레임.압력) # np.ndarray shape (64,), float32, range 0.0-1.0 인쇄(프레임.압력.재형성(8, 8)) # 8×8 spatial grid # Continuous callback stream def on_frame(프레임): max_node = 프레임.압력.argmax() print(f"t={frame.timestamp:.4f} peak_node={max_node} val={frame.압력[max_node]:.3f}") 장갑.스트림(콜백=on_frame, 기간=5.0) # stream for 5 seconds # Or use as an iterator 글러브.스트림()을 프레임으로 사용: 프레임 안의 프레임의 경우: 프로세스(프레임) 완료되면: 휴식 장갑.연결 해제()

프레임 객체 참조

기인하다유형설명
프레임.타임스탬프뜨다호스트측 수신 시간(초, Unix epoch)
프레임.압력np.ndarray (64,)노드당 정규화된 압력, 0.0(없음) ~ 1.0(최대)
프레임.압력_원시np.ndarray (64,)원시 16비트 ADC 수(0~65535)
프레임.접촉_마스크np.ndarray (64,) 부울압력이 임계값을 초과하는 경우 True(기본값 0.05)
프레임.접촉_노드목록[int]현재 접속 중인 노드의 인덱스
프레임.파악_지역str 또는 없음경험적 영역: "손바닥 안에 감추다", "무지", "색인", "가운데", "반지", "핑키", 없음
프레임.시퀀스정수프레임 카운터(65535에서 래핑); 드롭된 프레임을 감지하는 데 사용
참조 - 센서 레이아웃

64노드 센서 레이아웃

64개의 탁셀은 손바닥과 다섯 개의 손가락 부분을 모두 덮는 직조 섬유 매트릭스로 배열되어 있습니다. 노드 색인은 일관된 등쪽 보기 행 주요 순서를 따릅니다.

0–12
손바닥(중앙 패드)
13–23
엄지(3부분)
24–34
집게손가락
35–45
가운데 손가락
46–54
약지
55–63
새끼손가락
# Access region slices by name juqiao_glove.layout에서 REGION_SLICES 가져오기 palm_nodes = 프레임.압력[REGION_SLICES["palm"]] Thumb_nodes = 프레임.압력[REGION_SLICES["thumb"]] index_nodes = 프레임.압력[REGION_SLICES["index"]] # Reshape to 8×8 spatial grid (dorsal view, row-major) 그리드 = 프레임.압력.재형성(8, 8)
선택 사항 — 시각화

압력 히트맵 시각화

그만큼 [즉] extra는 교정 및 디버깅에 유용한 라이브 matplotlib 히트맵 렌더러를 설치합니다.

# Requires: pip install "juqiao-glove[viz]" juqiao_glove에서 가져오기 JuqiaoGlove juqiao_glove.viz에서 PressureHeatmap 가져오기 장갑 = JuqiaoGlove.find() 장갑.연결() viz = PressureHeatmap(title="Juqiao Glove — 실시간 압력") viz.show(장갑) # Opens a matplotlib window; press Q to quit

헤드리스 환경 또는 데이터 검토를 위해 프레임을 비디오로 저장합니다.

juqiao_glove.viz에서 Record_heatmap_video 가져오기 Record_heatmap_video( input_npy="session_압력.npy", # shape (N, 64) saved during recording output_mp4="히트맵.mp4", FPS=30, colormap="인페르노", )
선택 사항 — ROS2

ROS2 인터페이스

그만큼 juqiao_glove_ros2 패키지는 사용자 정의를 게시합니다 촉각 배열 200Hz에서 메시지를 보냅니다. ROS2 Humble 및 Iron과 호환됩니다.

# Install the package (requires ROS2 to be sourced) pip 설치 "juqiao-glove[ros2]" # Or build from source in your workspace CD ~/ros2_ws/src 자식 클론 https://github.com/roboticscenter/juqiao_glove_ros2 cd ~/ros2_ws && colcon build --packages-select juqiao_glove_ros2

드라이버 노드를 시작합니다.

소스 /opt/ros/humble/setup.bash 소스 ~/ros2_ws/install/setup.bash # Auto-detect port ros2 실행 juqiao_glove_ros2 글러브.launch.py # Specify port explicitly ros2 실행 juqiao_glove_ros2 글러브.launch.py ​​포트:=/dev/ttyACM0

게시된 주제:

주제메시지 유형비율설명
/juqiao_glove/tactile_arrayjuqiao_glove_ros2/TactileArray200Hz전체 64노드 압력 어레이
/juqiao_glove/contact_maskstd_msgs/UInt8MultiArray200Hz노드당 바이너리 접촉(0 또는 1)
/juqiao_glove/grasp_regionstd_msgs/문자열200Hz활성 지역 경험적 또는 빈 문자열
/juqiao_glove/statusDiagnostic_msgs/DiagnosticStatus1Hz펌웨어 버전, 프레임 드롭률

오르카 손 + 장갑 결합 출시

동기화 녹음을 위해 Orca Hand와 함께 장갑을 사용하는 경우:

# Launch Orca Hand driver ros2 실행 orca_ros2 orca_hand.launch.py ​​포트:=/dev/ttyUSB0 # In a second terminal, launch Juqiao Glove driver ros2 실행 juqiao_glove_ros2 글러브.launch.py ​​포트:=/dev/ttyACM0 # Verify synchronized topics ros2 주제 목록 | grep -E "orca|juqiao" ros2 주제 hz /juqiao_glove/tactile_array ros2 주제 hz /orca_hand/joint_states
4단계 - 교정

기준선 교정

장갑은 공장 교정과 함께 배송됩니다. 기준선 드리프트(휴지 상태에서 노드가 0이 아닌 값을 읽음)를 발견하거나 보관 기간을 연장한 후에는 다시 보정하십시오.

보정하기 전에 장갑을 벗으십시오. 교정은 무압력 기준선을 포착합니다. 교정 과정 중에는 장갑을 착용하거나 만지지 마십시오. 표면에 편평하게 놓으십시오.
# CLI calibration — lay glove flat, do not touch python -m juqiao_glove.calibrate --port /dev/ttyACM0 # Or from Python juqiao_glove에서 가져오기 JuqiaoGlove 장갑 = JuqiaoGlove.find() 장갑.연결() Globe.calibrate_baseline(기간=3.0) # averages 3 seconds of idle frames 장갑.save_calibration("~/.juqiao_glove_cal.json") 장갑.연결 해제()

런타임 시 로드 교정:

장갑 = JuqiaoGlove.find() 장갑.연결() 글러브.로드_캘리브레이션("~/.juqiao_glove_cal.json") # Now frame.pressures reflects calibrated values 프레임 = 장갑.read_frame() 인쇄(프레임.압력.최대()) # Should be ~0.0 at rest

임계값 조정

기본 접촉 임계값은 0.05(전체 범위의 5%)입니다. 작업별로 조정:

# For delicate objects (lower threshold detects light touch) 장갑.set_contact_threshold(0.02) # For heavy manipulation tasks (reduce false positives) 장갑.set_contact_threshold(0.10) # Per-region thresholds Globe.set_contact_threshold({"palm": 0.08, "thumb": 0.03, "index": 0.03})
문제 해결

일반적인 문제

SerialException: [Errno 13] 권한이 거부되었습니다: '/dev/ttyACM0'
달리다 sudo usermod -aG dialout $USER 그런 다음 로그아웃했다가 다시 로그인하세요. sudo chmod 666 /dev/ttyACM0 (플러그를 뽑으면 재설정됩니다).
JuqiaoGlove.find()가 없음을 반환했습니다. — 장치를 찾을 수 없습니다.
USB 연결을 확인하세요. 달리다 dmesg | tail -20 (리눅스) 또는 ls /dev/tty.usb* (macOS) OS가 장치를 열거했는지 확인합니다. 다른 USB 포트나 케이블을 사용해 보십시오(커넥터는 USB-C이지만 충전 전용이 아닌 데이터 케이블이어야 함).
64개 노드 모두 0.0을 읽음 - 압력 데이터 없음
부르다 glove.info() 펌웨어가 응답하는지 확인합니다. 그렇다면 교정 파일이 과도하게 빼지 않는지 확인하십시오. 삭제 ~/.juqiao_glove_cal.json 그리고 장갑을 편평하게 눕힌 상태에서 재보정하세요.
기준선 드리프트 - 유휴 상태에서 노드 읽기 0.1–0.2
재보정: 압력을 가하지 않고 장갑을 평평하게 놓고 달리십시오. glove.calibrate_baseline(). 온도 변화 또는 장기간 보관 후에 발생할 수 있습니다. 장갑을 낀 상태에서 드리프트가 0.4보다 큰 경우 감지 직물을 교체해야 할 수 있습니다(Juqiao 지원팀에 문의).
프레임 저하 - 시퀀스 번호 건너뛰기
USB 케이블 품질과 포트를 확인하세요. USB 3.0 포트를 사용하세요. Linux에서는 다른 고대역폭 장치와 함께 USB 허브를 사용하지 마십시오. 귀하의 on_frame 콜백은 빠르게 반환됩니다. 별도의 스레드에서 과도한 처리를 수행합니다.
ROS2 노드가 시작되지만 /juqiao_glove/tactile_array에 메시지가 없습니다.
포트 인수를 확인합니다. ros2 launch juqiao_glove_ros2 glove.launch.py port:=/dev/ttyACM0. 노드 로그를 확인하세요. ros2 node info /juqiao_glove_driver. 보장 dialout ROS2 노드를 실행하는 사용자에게 그룹 수정이 적용되었습니다.