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

Установите Paxini SDK, передавайте данные о давлении в Python, визуализируйте тепловые карты контактов, добавьте дополнительную интеграцию с ROS2 и синхронизируйте с манипулятором робота для полного сбора данных.

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

Установите Paxini SDK

Paxini Gen3 обменивается данными через USB HID — модули ядра или драйверы поставщиков не требуются. Python SDK охватывает низкоуровневый протокол HID и предоставляет чистый потоковый API.

Поддерживается любая ОС Gen3 считается стандартным USB HID-устройством. Windows, macOS и Linux поддерживают его с помощью встроенных драйверов. Требуется Python 3.10 или новее.
# Python 3.10+ required pip install paxini-sdk # With visualization extras (matplotlib, numpy) pip install "paxini-sdk[viz]" # With ROS2 bridge (requires ROS2 Humble or Jazzy) pip install "paxini-sdk[ros2]"

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

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

Обнаружение датчика

Подключите датчик Gen3 к компьютеру через USB-C. Используйте утилиту обнаружения устройств SDK, чтобы убедиться, что оно распознано:

python -m paxini.discover # Example output: # Found 1 Paxini device(s): # [0] PX-6AX-GEN3 serial=PX3A0042 firmware=1.2.4 variant=fingertip

Для настроек с несколькими датчиками (например, пять пальцев на USB-концентраторе):

python -m paxini.discover --all # Found 5 Paxini device(s): # [0] PX-6AX-GEN3 serial=PX3A0042 variant=fingertip (index 0) # [1] PX-6AX-GEN3 serial=PX3A0043 variant=fingertip (index 1) # ...
Разрешения USB для Linux В Linux вам может потребоваться добавить правило udev для доступа к HID-устройствам без root-прав. Бегать sudo python -m paxini.install_udev один раз, чтобы установить правило, затем отключите и снова подключите датчик.
Шаг 3 — API потоковой передачи

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

Основной API представляет собой поток на основе обратного вызова. Каждый кадр передает ТактильнаяРамка объект, содержащий полный массив давления и метаданные.

# Minimal streaming example — 5 lines импорт паксини датчик = паксини.Датчик() # connects to first detected device датчик.start() для кадра в Sensor.stream(): печать (frame.pressure_map) # 2D numpy array, shape (rows, cols) печать(frame.total_force_n) # float, total normal force in Newtons

Все общедоступные методы API:

Метод/Свойство Описание Возврат
датчик.start()Начать трансляцию; неблокирующийНикто
датчик.стоп()Остановите поток чистоНикто
датчик.поток()Генератор, создающий объекты TactileFrame с настроенной частотой Гц.Генератор[TactileFrame]
датчик.последний()Возвращает самый последний кадр без блокировкиТактильнаяРамка
датчик.set_rate(Гц)Установите частоту дискретизации (50–500 Гц для USB-C, 50–200 Гц для BLE)Никто
датчик.калибровать()Калибровка смещения нуля по текущей нагрузке покояНикто
датчик.серийныйСтрока серийного номера устройстваул.
датчик.вариант"кончик пальца" | "подушечка пальца" | "ладонь"ул.
Шаг 4 — Формат данных

Тактильный формат данных

Каждый ТактильнаяРамка содержит:

Поле Тип Описание
кадр.timestamp_nsинтервалНаносекундная метка времени (монотонная, часы хоста)
frame.pressure_mapnp.ndarray(В, Ш) float32Давление в кПа на таксель. Форма варьируется в зависимости от варианта: кончик пальца — 8×8, ладонь — 16×12.
Frame.contact_masknp.ndarray (H, W) boolИстинно, когда давление превышает порог контакта (по умолчанию: 5 кПа)
frame.contact_area_mm2плаватьСумма активных площадей такселей в мм²
Frame.total_force_nплаватьИнтегрированная нормальная сила по всем такселям в Ньютонах
Frame.contact_centroid(плавать, плавать)(строка, столбец) центроид области контакта в координатах такселя
Frame.in_contactлогическое значениеИстинно, если total_force_n превышает порог контакта (по умолчанию: 0,05 Н)
фрейм.seqинтервалМонотонно увеличивающийся порядковый номер кадра
Пространственное разрешение Вариант с кончиком пальца: массив такселей 8×8, размер такселей 14×14 мм, шаг такселей 1,75 мм. Вариант Palm: массив 16×12, размер 48×36 мм, шаг 3 мм. Каждый таксель имеет размеры 0–600 кПа.
Шаг 5 — Визуализация

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

В состав SDK входит готовый к работе визуализатор в реальном времени. Запустите его прямо из командной строки:

# Launch live heatmap — press Q to quit python -m paxini.visualize # Multi-sensor visualization (e.g., 5-finger setup) python -m paxini.visualize --all

Или вставьте в свой собственный скрипт, используя paxini.viz модуль:

импорт паксини из paxini.viz импортировать HeatmapWindow датчик = паксини.Датчик() датчик.start() window = HeatmapWindow(title="Paxini Gen3 — Fingertip") для кадра в Sensor.stream(): window.update(frame.pressure_map) если window.should_close(): сломать датчик.стоп()
Шаг 6 (необязательно) — ROS2

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

Мост ROS2 публикует Sensor_msgs/Изображение (карта давления) и пользовательская paxini_msgs/TactileFrame тема для каждого датчика. Требуется ROS2 Humble или Jazzy.

# Install the ROS2 extras and launch the node pip install "paxini-sdk[ros2]" ros2 запустить paxini_ros2 Sensor_node # Published topics (per sensor): # /paxini/PX3A0042/pressure_image sensor_msgs/Image # /paxini/PX3A0042/tactile_frame paxini_msgs/TactileFrame # /paxini/PX3A0042/contact_event std_msgs/Bool

При использовании нескольких датчиков каждое устройство публикуется под своим серийным номером. Вы можете переназначить темы в файле запуска, используя стандартное переназначение ROS2.

Шаг 7 — Интеграция руки

Интеграция манипулятора робота

Чтобы синхронизировать данные Paxini с состоянием сустава руки робота, используйте команду paxini.sync модуль. Он присваивает временные метки всем кадрам датчика по общим часам и предоставляет API блокировки, который создает синхронизированные пары (arm_state, tactile_frame):

импорт паксини из paxini.sync импортировать MultiSourceSync # Initialize sensor and arm interface датчик = паксини.Датчик() рука = ВашАрмИнтерфейс() # any arm with a get_joint_state() method синхронизация = MultiSourceSync( датчик = датчик, рука = рука, max_dt_ms=5,0 # reject pairs with >5ms timestamp gap ) для Arm_state, тактильный в sync.stream(): печать(arm_state.joint_positions) печать(tactile.total_force_n) печать (tactile.pressure_map)
Выравнивание временной метки Ген3 маркирует кадры с наносекундным разрешением, используя тактовую частоту хоста во время прерывания USB. Джиттер обычно составляет <0,5 мс. MultiSourceSync класс обрабатывает интерполяцию, когда скорости руки и датчика различаются.
Поиск неисправностей

3 главных проблемы

paxini.discover() возвращает пустой список

Датчик не обнаруживается. Проверьте по порядку: (1) Попробуйте использовать другой кабель USB-C — некоторые кабели предназначены только для зарядки и не передают данные. (2) В Linux запустите sudo python -m paxini.install_udev затем отключите/переподключите датчик. (3) Убедитесь, что светодиод датчика горит (не мигает) — мигание означает, что он находится в режиме обновления прошивки; удерживайте кнопку сброса в течение 5 секунд, чтобы выйти.

Pressure_map — все нули при нажатии

Датчик нуждается в калибровке или установлен слишком высокий порог. Бегать sensor.calibrate() при разгруженном датчике (нет контакта). Если проблема не устранена, проверьте, соответствует ли вариант датчика вашему креплению — датчик ладони, установленный на кончике пальца, будет показывать очень низкие значения давления из-за большей площади такселя. Также подтвердите версию прошивки 1.2+ с помощью python -m paxini.discover.

MultiSourceSync вызывает ошибку TimestampDriftError

Часы интерфейса руки и временная метка датчика отличаются более чем на max_dt_ms. Обычно это вызвано тем, что Arm SDK возвращает устаревшее состояние соединения (например, буферизуется с более низкой скоростью). Увеличивать max_dt_ms до 10.0 в качестве первого теста, а затем выясните, почему частота обновления состояния охраны ниже ожидаемой. Для USB-руководств убедитесь, что частота опроса USB не регулируется управлением питанием (sudo powertop в Linux).

Все еще застрял? Опубликовать в ветка вопросов на форуме с вашей ОС, версией SDK (paxini.__version__) и точный вывод ошибки.