Руководство по установке BrainCo Revo II

Пошаговая настройка бионической руки BrainCo Revo II — от подключения USB или BLE до калибровки, управления позой и интеграции платформы.

1

USB-CDC-соединение

Установите зависимости Python

pip install pyserial websockets

Подключитесь и определите порт

Подключите Revo II через USB. В Linux устройство обозначается как /dev/ttyACM0 (или ttyACM1, если присутствуют другие устройства ACM). В Windows проверьте диспетчер устройств COM-порта.

ls /dev/ttyACM*          # Linux — find the device
# Windows: check Device Manager → Ports (COM & LPT)

Исправить разрешения в Linux

Если вы получаете сообщение об ошибке «отказано в разрешении», добавьте своего пользователя в dialout группу, затем выйдите из системы и снова войдите:

sudo usermod -aG dialout $USER
# Log out and back in for the change to take effect
Скорость передачи данных Revo II обменивается данными ровно на 115200 бод. Любая другая скорость приведет к нечитаемому выводу. Команды представляют собой строки JSON UTF-8, завершающиеся новой строкой.
2

Соединение Bluetooth с низким энергопотреблением (BLE)

Тот же командный протокол JSON работает через BLE GATT. Используйте этот путь для беспроводных развертываний.

Установите библиотеку BLE.

pip install bleak

Сканируйте Revo II

import asyncio
from bleak import BleakScanner

async def scan():
    devices = await BleakScanner.discover(timeout=5.0)
    for d in devices:
        print(d.address, d.name)

asyncio.run(scan())
# Look for a device named "BrainCo" or similar — note its address

UUID БЫЛ ПРИНЯТ

  • Услуга: 0000ffe0-0000-1000-8000-00805f9b34fb
  • Напишите характеристику: 0000ffe1-0000-1000-8000-00805f9b34fb
  • Характеристика уведомления: 0000ffe2-0000-1000-8000-00805f9b34fb

Подключитесь и отправьте команду через BLE

import asyncio, json
from bleak import BleakClient

WRITE_CHAR = "0000ffe1-0000-1000-8000-00805f9b34fb"
ADDRESS = "AA:BB:CC:DD:EE:FF"   # replace with your device address

async def main():
    async with BleakClient(ADDRESS) as client:
        # Close all fingers to 50%
        cmd = json.dumps({"cmd": "set_pose", "positions": [50,50,50,50,50]})
        await client.write_gatt_char(WRITE_CHAR, cmd.encode("utf-8"), response=False)
        await asyncio.sleep(1.0)
        # Open all fingers
        cmd2 = json.dumps({"cmd": "set_pose", "positions": [0,0,0,0,0]})
        await client.write_gatt_char(WRITE_CHAR, cmd2.encode("utf-8"), response=False)

asyncio.run(main())
3

Команды первой позы (USB)

Значения позиции в протоколе JSON представляют собой целые числа от 0 до 100 (процент закрытия). Python SDK использует нормализованные числа с плавающей запятой 0,0–1,0 и выполняет внутренние преобразования.

Необработанные последовательные команды

import serial, json, time

port = serial.Serial("/dev/ttyACM0", baudrate=115200, timeout=1.0)

def set_pose(positions):
    pcts = [int(p * 100) for p in positions]
    cmd = json.dumps({"cmd": "set_pose", "positions": pcts}) + "\n"
    port.write(cmd.encode("utf-8"))

# Open all fingers
set_pose([0.0, 0.0, 0.0, 0.0, 0.0])
time.sleep(1.0)

# Point with thumb extended, close others
set_pose([0.0, 0.8, 0.8, 0.8, 0.8])
time.sleep(1.0)

# Fist
set_pose([1.0, 1.0, 1.0, 1.0, 1.0])
time.sleep(1.0)

# Open again
set_pose([0.0] * 5)
port.close()

Отображение индексов пальцев

  • 0 — Большой палец (2 степени свободы: сгибание + вращение = сгибание × 0,4)
  • 1 — Индекс (1 степень сгибания)
  • 2 — Средний (сгибание 1 ГРИП)
  • 3 — Кольцо (1 степень изгиба)
  • 4 — Пинки (сгибание 1 ГРИП)

Установить один палец

# Set index finger to 75% closure
cmd = json.dumps({"cmd": "set_finger", "finger": 1, "position": 75}) + "\n"
port.write(cmd.encode("utf-8"))
Нет оборудования? Использовать макетный режим Бегать python brainco_revo_agent.py --mock --session test --self-test использовать все методы API и последовательности нажатия фортепиано без какого-либо физического устройства.
4

Калибровочная волновая последовательность

Калибровка устанавливает ограничения на перемещение каждого пальца в встроенном программном обеспечении. Запустите это после первого подключения и после любой механической регулировки.

Последовательность калибровки (автоматическая)

  1. Все пальцы открыты до закрытия 0%.
  2. Подождите 300 мс для механического урегулирования.
  3. Для каждого пальца (большой → указательный → средний → безымянный → мизинец):
    • Закрытие близко к 90 % — подождите 120 мс.
    • Открытие до 0% закрытие — ожидание 120 мс
  4. Все пальцы фиксируются в положении наведения (закрытие 15%).
  5. Отправлять {"cmd": "calibrate"} заблокировать ограничения прошивки

Запустите калибровку через SDK

import asyncio
from brainco_revo_agent import BrainCoReVoController

async def calibrate():
    ctrl = BrainCoReVoController(mock=False)
    await ctrl.connect("/dev/ttyACM0")
    await ctrl.calibrate()   # runs full wave then sends calibrate cmd
    print("Calibration complete")
    await ctrl.disconnect()

asyncio.run(calibrate())
5

Интеграция платформы Teleop

The brainco_revo_agent.py соединяет Revo II с платформой RoboticsCenter через WebSocket, обеспечивая удаленное управление, мониторинг положения пальцев и сбор демонстрационных данных из браузера.

Запустить агент

# Real hardware (USB)
python brainco_revo_agent.py \
  --backend wss://your-backend.run.app \
  --session YOUR_SESSION_ID \
  --device /dev/ttyACM0

# Real hardware (BLE)
python brainco_revo_agent.py \
  --backend wss://your-backend.run.app \
  --session YOUR_SESSION_ID \
  --ble AA:BB:CC:DD:EE:FF

# Mock mode — no hardware required
python brainco_revo_agent.py \
  --backend ws://localhost:8000 \
  --session test-session \
  --mock

Режим фортепиано через платформу

Запускайте нажатие клавиш пианино с телеоп-панели браузера. При каждом нажатии выполняется 4-фазная последовательность: выдвижение (20 мс) → движение (30 мс) → удержание → втягивание (20 мс). Поддерживаются одновременные нажатия пальцев.

Высокоуровневый API SDK

import asyncio
from brainco_revo_agent import BrainCoReVoController

async def main():
    ctrl = BrainCoReVoController(mock=False)
    await ctrl.connect("/dev/ttyACM0")

    # Set all fingers to 60% closure
    await ctrl.set_hand_pose([0.6, 0.6, 0.6, 0.6, 0.6])
    await asyncio.sleep(0.5)

    # Read current state
    snap = await ctrl.snapshot()
    print(snap["positions_dict"])   # {"thumb":0.6, "index":0.6, ...}

    await ctrl.disconnect()

asyncio.run(main())
← Назад к обзору Полные характеристики →

Нужна помощь с настройкой?

Посетите форум сообщества или обратитесь в службу поддержки SVRC.