Тактильная перчатка Juqiao

Настройка программного обеспечения и драйверов

Установите драйвер USB CDC, выполните потоковую передачу данных о давлении на 64 узлах в Python, визуализируйте тепловые карты контактов и интегрируйтесь с конвейерами записи Orca Hand.

Шаг 1 — Установка

Установите пакет перчаток juqiao.

Перчатка обменивается данными через последовательный порт USB CDC — без модулей ядра и специальных драйверов. Пакет Python обертывает pyserial и обрабатывает протокол двоичных кадров.

Поддерживается любая ОС Перчатка выглядит как стандартное последовательное устройство CDC-ACM. Windows, macOS и Linux автоматически пересчитывают его с помощью встроенных драйверов. Установщик драйверов поставщика не требуется.
# Python 3.10+ recommended pip install juqiao-перчатка # Or with optional visualization extras (matplotlib, numpy) pip install "juqiao-glove[viz]" # Or with ROS2 bridge extras (requires ROS2 Humble or later) pip install "juqiao-glove[ros2]"

Проверьте установку:

python -c "импортировать juqiao_glove; print(juqiao_glove.__version__)" # Expected: 0.4.x or later
Шаг 2 — Обнаружение порта

Обнаружение USB-порта

Подключите перчатку с помощью кабеля USB-C длиной 1,5 м. Устройство идентифицируется как последовательный порт CDC-ACM.

OSТипичное имя портаПримечания
Линукс/dev/ttyACM0Добавить пользователя в дозвон группа, если в разрешении отказано
macOS/dev/tty.usbmodem*Использовать лс /dev/tty.usb* чтобы найти точное имя
ОкнаCOM3 (варьируется)Проверьте Диспетчер устройств → Порты (COM и LPT).

Автоматическое определение перчатки из Python:

из juqiao_glove импортировать JuqiaoGlove # Auto-scan all serial ports and return the first Juqiao device found перчатка = JuqiaoGlove.find() печать(перчатка.порт) # → '/dev/ttyACM0' or 'COM3' etc. печать(glove.info()) # → firmware version, node count, sample rate

Или укажите порт явно:

перчатка = JuqiaoGlove(port="/dev/ttyACM0", скорость=3000000)
Ошибка разрешения Linux? Бегать sudo usermod -aG дозвон $USER затем выйдите из системы и снова войдите. Альтернативно, используйте sudo chmod 666 /dev/ttyACM0 для обходного пути за один сеанс.
Шаг 3 — API потоковой передачи

API потоковой передачи Python

Перчатка течет с частотой 200 Гц. Каждый кадр содержит 64-элементный массив давления (16-битный АЦП, нормализованный 0,0–1,0) плюс временную метку.

из juqiao_glove импорт JuqiaoGlove время импорта перчатка = JuqiaoGlove.find() перчатка.connect() # Single-frame read рамка = перчатка.read_frame() печать (frame.timestamp) # float, seconds since epoch печать(frame.pressures) # np.ndarray shape (64,), float32, range 0.0-1.0 print(frame.pressures.reshape(8, 8)) # 8×8 spatial grid # Continuous callback stream защита on_frame(кадр): max_node =frame.pressures.argmax() print(f"t={frame.timestamp:.4f}peak_node={max_node} val={frame.pressures[max_node]:.3f}") glove.stream(callback=on_frame, продолжительность=5.0) # stream for 5 seconds # Or use as an iterator с glove.stream() в качестве фреймов: за кадр в кадрах: процесс (кадр) если сделано: сломать перчатка.отключить()

Ссылка на объект фрейма

АтрибутТипОписание
кадр.метка времениплаватьВремя получения на стороне хоста (секунды, эпоха Unix)
рама.давлениеnp.ndarray (64,)Нормализованное давление на узел, от 0,0 (нет) до 1,0 (макс.)
Frame.pressures_rawnp.ndarray (64,)Необработанные значения 16-битного АЦП (0–65535)
Frame.contact_masknp.ndarray (64,) boolИстинно, если давление превышает пороговое значение (по умолчанию 0,05).
Frame.contact_nodesСписок[интервал]Индексы узлов, находящихся в данный момент в контакте
frame.grasp_regionул или нетЭвристическая область: "ладонь", "большой палец", "индекс", "середина", "кольцо", "мизинец", Никто
кадр.последовательностьинтервалСчетчик кадров (обертывается на 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 =frame.pressures[REGION_SLICES["palm"]] Thumb_nodes = Frame.pressures[REGION_SLICES["thumb"]] index_nodes =frame.pressures[REGION_SLICES["index"]] # Reshape to 8×8 spatial grid (dorsal view, row-major) сетка =frame.pressures.reshape(8, 8)
Необязательно — Визуализация

Визуализация тепловой карты давления

The [а именно] extra устанавливает живой модуль визуализации тепловых карт matplotlib, полезный для калибровки и отладки.

# Requires: pip install "juqiao-glove[viz]" из juqiao_glove импорт JuqiaoGlove из juqiao_glove.viz импорт PressureHeatmap перчатка = JuqiaoGlove.find() перчатка.connect() viz = PressureHeatmap(title="Перчатка Цзюцяо — Живое давление") viz.show(перчатка) # Opens a matplotlib window; press Q to quit

Для использования безголовых сред или просмотра данных сохраните кадры как видео:

из juqiao_glove.viz import Record_heatmap_video Record_heatmap_video( input_npy="session_pressures.npy", # shape (N, 64) saved during recording output_mp4="тепловая карта.mp4", кадры в секунду=30, цветовая карта="инферно", )
Опционально — РОС2

Интерфейс РОС2

The juqiao_glove_ros2 пакет публикует пользовательский ТактильныйМассив сообщение на частоте 200 Гц. Совместим с ROS2 Humble and Iron.

# Install the package (requires ROS2 to be sourced) pip install "juqiao-glove[ros2]" # Or build from source in your workspace компакт-диск ~/ros2_ws/src клон git 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 glove.launch.py # Specify port explicitly запуск ros2 juqiao_glove_ros2 glove.launch.py ​​порт:=/dev/ttyACM0

Опубликованные темы:

ТемаТип сообщенияСтавкаОписание
/juqiao_glove/tactile_arrayjuqiao_glove_ros2/TactileArray200 ГцПолный массив давления из 64 узлов
/juqiao_glove/contact_maskstd_msgs/UInt8MultiArray200 ГцБинарный контакт на узел (0 или 1)
/juqiao_glove/grasp_regionstd_msgs/Строка200 ГцЭвристика активной области или пустая строка
/juqiao_glove/statusDiagnostic_msgs/DiagnosticStatus1 ГцВерсия прошивки, частота пропадания кадров

Комбинированный запуск из руки и перчатки Orca

При использовании перчатки вместе с 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 glove.launch.py ​​порт:=/dev/ttyACM0 # Verify synchronized topics список тем ros2 | grep -E "косатка|юцяо" тема ros2 хз /juqiao_glove/tactile_array тема ros2 хз /orca_hand/joint_states
Шаг 4 — Калибровка

Базовая калибровка

Перчатка поставляется с заводской калибровкой. Выполните повторную калибровку, если вы заметили смещение базовой линии (в состоянии покоя показания узлов не равны нулю) или после длительного хранения.

Снимите перчатку перед калибровкой. Калибровка фиксирует базовую линию нулевого давления. Не надевайте и не прикасайтесь к перчаткам во время процедуры калибровки — положите их ровно на поверхность.
# CLI calibration — lay glove flat, do not touch python -m juqiao_glove.калибровка --port /dev/ttyACM0 # Or from Python из juqiao_glove импорт JuqiaoGlove перчатка = JuqiaoGlove.find() перчатка.connect() glove.калибровка_baseline(длительность=3,0) # averages 3 seconds of idle frames glove.save_ Calibration("~/.juqiao_glove_cal.json") перчатка.отключить()

Загрузить калибровку во время выполнения:

перчатка = JuqiaoGlove.find() перчатка.connect() glove.load_калибровка("~/.juqiao_glove_cal.json") # Now frame.pressures reflects calibrated values рамка = перчатка.read_frame() печать(frame.pressures.max()) # Should be ~0.0 at rest

Настройка порога

Порог контакта по умолчанию составляет 0,05 (5 % от полной шкалы). Настройка для каждой задачи:

# For delicate objects (lower threshold detects light touch) glove.set_contact_threshold(0.02) # For heavy manipulation tasks (reduce false positives) glove.set_contact_threshold(0.10) # Per-region thresholds glove.set_contact_threshold({"ладонь": 0,08, "большой палец": 0,03, "индекс": 0,03})
Поиск неисправностей

Общие проблемы

SerialException: [Errno 13] Разрешение отклонено: '/dev/ttyACM0'
Бегать sudo usermod -aG dialout $USER затем выйдите из системы и снова войдите. Альтернативно: sudo chmod 666 /dev/ttyACM0 (сбрасывается при отключении от сети).
JuqiaoGlove.find() вернул None — устройство не найдено
Проверьте USB-соединение. Бегать dmesg | tail -20 (Линукс) или ls /dev/tty.usb* (macOS) для проверки того, что ОС перечислила устройство. Попробуйте использовать другой 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.