Недорогий роботизований рук SO-100 на столі, налаштований для телеоперації та навчання політики
DAggerSO-100Навчання наслідуваннямVLAТелеоперація

Запуск циклу DAgger на SO-100 з VLA-політикою

AY-Robots ResearchAugust 27, 202615 хвилин читання

Послідовний опис одного циклу DAgger з людською гавернкою на рукаві SO-100: запустити політику та записати її, захопити управління, якщо щось пішло не так, зареєструвати запуск як коригування, скомпонувати змішаний набір даних та продовжити навчання з контрольної точки. Включає шлях захоплення клавіатури та слайдерів для людей без лідер-руки та чотири помилки, які роблять цикл марним.

Ваша політика працює. Вона тягне до кубика, закриває захоплювач на сантиметр раніше, ніж потрібно, і продовжує йти так, ніби вона його має. Нічого не помилки, і ніякому обстеженню втрати навчання це не пояснює. Виправленням не є ще 20 000 кроків градієнту на тих же демонстраціях. Це вкласти руку назад на рук саме там, де це пішло не так, записати, що ви натомість зробили, та навчити наступну контрольну точку на старих даних плюс це коригування. Це цикл DAgger, і ось як його запустити на SO-100 із політикою дії-зору-мови.

Теорія знаходиться в іншому місці: чому агрегація набору даних взагалі працює та як людська гаврнка змінює це. Це робоча інструкція, і вона припускає навчену контрольну точку, робочий набір камер та рук, який рухається. Шість кроків нижче - це цикл, як реалізований на сторінці DAgger цієї платформи, але послідовність одна й та ж з ваших власних скриптів.

Один цикл коротко

  • Запустити навчену політику та записати її, з текстом завдання запуску замість загального ярлика телеоперації.
  • Захопити управління в той момент, коли поведінка піде не так: дзеркальна передача з лідер-рукою, негайна та ручна на клавіатурі або слайдерах без неї.
  • Тріажувати кожен запуск: зареєструвати його як коригування, зберегти як оціночний епізод або відкинути.
  • Скомпонувати суміш вручну - оригінальні демонстрації плюс коригування, епізоди вибрані за джерелом. Ніколи не навчайте лише на коригуваннях.
  • Продовжити навчання з останньої контрольної точки та зазначити, яка контрольна точка що змішала.
  • Число, яке вказує, чи був цикл вартим чого-небудь, - це коефіцієнт втручання, а не втрата навчання.

Чому другий цикл - це не просто більше даних

Наслідування навчанням тренує на станах, які відвідував людина. На час тестування політика відвідує стани, які вона викликає, і невеликі помилки дій складаються в стани, які жодна демонстрація не охоплювала. Росс, Гордон та Багнелл формалізували цю невдачу для AISTATS 2011 та відповіли їй ітеративним алгоритмом, який тренує стаціонарну детерміністичну політику та, згідно з їхнім скороченням, повинен добре працювати під розподілом станів, який він викликає: запустити поточну політику, мати експерта позначити стани, які вона фактично досягла, додати їх до набору даних, перетренувати, повторити. Келлі та інші зробили запит практичним з HG-DAgger, де людина вирішує, коли взяти контроль, замість маркування станів без утримання засобів управління; вони повідомляють про покращену продуктивність як порівняно з DAgger, так і поведінковим клонуванням на симульованому та реальному завданні автономного вождіння. Людська гаврнка - це те, що робить цикл терпимим на настільному рукаві - ви рухаєте руками лише тоді, коли щось пішло не так.

Дві наслідки мають більше значення на практиці, ніж теорія. Коригування - це не звичайні демонстрації: вони зосереджуються на регіонах вузьких місць, які описують Мандлекар та інші, де невеликий відхил скидає політику в стани, які демонстрації ніколи не охоплювали. І набір даних, складений лише з цих складних частин, - це погано сформований набір даних - Белхале, Цуй та Садіг стверджують з боку даних, що різноманітність станів не завжди корисна, і що різноманітність дій та різноманітність переходів разом визначають якість набору даних. Змішаний набір даних - це не компроміс, це суть.

Заморозити це перед першим циклом

Цикл DAgger порівнює політику з собою протягом часу. Будь-що, що ви змінюєте між циклами, що не є набором даних, робить цей порівняння безглуздим.

  • Положення та кріплення камер, включаючи камеру зап'ястя. Ослабити один затискач і ви змінили розподіл спостережень, а не політику.
  • Експозиція та баланс білого, якщо ваш стек захоплення дозволяє їх закріпити. Автоекспозиція, яка дрейфує між циклами, - це повільний, невидимий зсув домену.
  • Калібрування руки та нульові позиції сервоприводів. Якщо ви повинні перекалібрувати, розглядайте все записане до цього як окремий набір даних.
  • Текст завдання. Кожна VLA тут залежить від нього; переформулювання його в середині циклу - це інше завдання.
  • Освітлення, поверхня столу, набір об'єктів. Новий об'єкт - це новий експеримент, а не наступний цикл.
  • Частота кадрів запису. Порівняння коефіцієнтів втручання на двох растрах вибірок виробляє різниці, які походять від растра.
Камера зап'ястя - це не факультативне оснащення

Сюй та інші порівняли представлення з погляду руки проти звичайного представлення з третьої особи та виявили, що перспектива очей в руці послідовно покращила ефективність навчання та узагальнення поза розподілом, незважаючи на менше сцени. На п'ятиланковому рукаві закриття захоплювача - це зазвичай те, що ви виправляєте, і закриття захоплювача - це те, що несе вид зап'ястя.

Цикл, від початку до кінця

  1. 1
    Запустити вивід та записати його

    Запустити запуск проти контрольної точки, яку ви хочете поліпшити, потім запустити запис у корінь вивіду. Записаний таким чином він успадковує текст завдання самого запуску, на якому була навчена політика, замість стандартного ярлика телеоперації. Без запису ви можете спостерігати невдачу, але не можете навчатися на ній.

    bash
    # two calls, not one: the run, then its recording
    POST /inference/start      # model_id, and hf_repo_id = the checkpoint to drive
    POST /recording/start      # root=inference
    # root=inference also makes the recording inherit the run's task text
  2. 2
    Захопити управління, коли щось пішло не так

    Натисніть Захопити управління та виберіть режим введення: лідер-рука, клавіатура або слайдери. Програма робить паузу, ви коригуєте, ви передаєте назад. Кадри, записані, поки ви їхали, автоматично позначаються як втручання.

    bash
    POST /inference/takeover/start   # input = leader | keyboard | sliders
    POST /inference/takeover/nudge   # keyboard, relative delta per call
    POST /inference/takeover/set     # sliders, absolute target
    POST /inference/takeover/stop    # back to the policy
  3. 3
    Тріажувати епізоди

    Вирішити для кожного епізоду: зареєструвати як коригування, зберегти як оціночний або відкинути. Запуск, який політика завершила без допомоги, - це оціночні дані.

  4. 4
    Синхронізувати коригуючий набір даних

    Коригування накопичуються в локальному наборі даних на політику та переходять до хмарного сховища через автоматичну синхронізацію. Нічого не змішується в те, що ви там не помістили.

  5. 5
    Скомпонувати змішаний набір даних

    Об'єднати оригінальний набір даних з коригуючим набором даних, вибираючи епізоди явно за джерелом. Результат - звичайний набір даних з цього моменту далі.

    bash
    POST /training/datasets/compose
      sources  = [ original_dataset, korrekturen_<policy> ]
      episodes = explicit selection per source
  6. 6
    Продовжити навчання з контрольної точки

    Навчите суміш з попередньої контрольної точки, а не з базової моделі. Зазначте, яка контрольна точка та яка суміш; без цієї пари цикл не можна відтворити.

    bash
    # field on the training job
    base_checkpoint = s3://ay-robots/checkpoints/<run>/<checkpoint>
    # the platform passes it to the training pod as BASE_CKPT_S3

Крок 2 детально: два способи захопити управління

З лідер-рукою

У режимі лідер-послідовник захоплення управління - це передача між двома руками, які не в одній позі. Натискання Захопити управління призупиняє програму та вдаряє лідера на поточну позицію послідовника, щоб нічого не стрибнуло, коли крутний момент передається. Якщо цей привід вирівнювання перевищує час, ви вирівнюєте лідера вручну та звільняєте лише після того, як обидва будуть у межах п'яти градусів. З цього моменту ви телеоперуєте звичайним чином і стовпець дій записує те, що ви наказали.

Будьте чесні щодо цього шляху: привід вирівнювання та передача крутного моменту - це найменш перевірена частина циклу на реальному обладнанні. Тестуйте передачу на повільній, нешкідливій позі, перш ніж покладатися на неї в запусті, який вам важливий. Лідер-рука виробляє найплавніші коригування з трьох режимів і також має найбільше того, що може піти не так механічно.

Без лідер-руки: клавіатура та слайдери

Більшість людей, які це читають, володіють одним рукавом. Цього достатньо. Виберіть введення клавіатури або слайдера в той момент, коли ви натискаєте Захопити управління, і захоплення управління негайне та ручне - немає другої руки для вирівнювання, тому немає кроку вирівнювання. Послідовник утримує свою позицію та чекає введення.

Режим введенняЯк рухається рукОбмеження за викликом, що застосовується серверомЗаблокований, коли
Лідер-рукаДзеркало управляє послідовником від кутів суглобів лідераНіяких поштовхів або встановлених викликів у цьому режимі; дзеркало пише цілі послідовника безперервноНіколи не блокується, і за замовчуванням, якщо режим введення не задано - але йому потрібна друга рука; без ID лідера захоплення управління відхилено
КлавіатураВідносний поштовх за натискання клавіші, надісланий на кінцеву точку поштовху захопленняЖорсткий затискач на 2 градуса за суглоб, 4 градуса для захоплювачаВідхилено з 409, якщо захоплення управління було запущено в режимі лідера
СлайдериАбсолютна цільова поза, надісланая до кінцевої точки встановлення захопленняМаксимум 6 градусів руху в напрямку мети на виклик; інтерфейс продовжує надсилати близько десять разів на секундуВідхилено з 409, якщо захоплення управління було запущено в режимі лідера

Затискачі застосовуються на стороні сервера, а не в інтерфейсі, тому що невірно набрана дельта на рукаві з шинним сервоприводом - це зіткнення. Коригування клавіатури виходять поступово і дещо грубо; коригування слайдерів більш плавні, тому що сервер рухається в напрямку мети, поки інтерфейс продовжує потокувати. У будь-якому випадку стовпець дій отримує весь командний вектор позиції та позначення втручання ідентичне шляху лідера, тому коригування клавіатури потрапляють у той же набір даних без різниці формату.

text
Q / A   joint 1      R / F   joint 4
W / S   joint 2      T / G   joint 5
E / D   joint 3      Z / X   gripper
Те ж саме розташування клавіш, що й скрізь у стеку, так що м'язова пам'ять від запису переносяться.
Навчальна інструкція, що показує впорядковані кроки запуску GR00T тонкотюнінгу на наборі даних SO-100
Сторона навчання циклу - це та ж сама керована послідовність як перший запуск; відрізняється лише поле контрольної точки.

Коли натисніти кнопку

Раніше, ніж пізніше. Коригування, яке починається після закриття захоплювача на нічого, навчає відновлення від помилки, в яку політика не повинна була входити, і дані відновлення коштують набагато менше, ніж дані про уникнення. Переривайте в перший момент, коли ви впевнені, що траєкторія неправильна, коригуйте через складну частину, передавайте назад, як тільки стан - це той, який політика обробляла раніше. ThriftyDAgger автоматизує це рішення, гавернку втручань на новизну та оцінювальний ризик під фіксованим людським бюджетом, але на одному рукаві з людиною, яка вже спостерігає, людська гаврнка дешевша та краще калібрована, ніж будь-що, що ви налаштуєте.

Можливо з відкритим вихідним кодом стеку та кількома скриптами. Що це коштує, це бухгалтерія, і бухгалтерія - це місце, де цикли DAgger гинуть.

  1. Запишіть кадри з вашого власного скрипту вивіду у набір даних LeRobot, з текстом завдання, на якому була навчена політика.
  2. Призупинити цикл політики, перемкнути джерело команд та позначити кожен кадр, який ви їдете, як втручання. Без прапора коригування виглядають як звичайні демонстрації.
  3. Вирішити свідомо, що відбувається з кадрами переходу між політикою, яка звільняє контроль, та вашим першим введенням.
  4. Зберегти коригування у власному наборі даних на політику та відстежувати індекси епізодів вручну, щоб суміш могла бути реконструйована.
  5. Вкажіть на попередню контрольну точку на кінцеву точку тонкотюнінгу та перевірте у журналі, що вона завантажила ці ваги.

Крок 3 детально: тріаж вирішує якість

Після запуску у вас є запис з деякими кадрами, позначеними як втручання. Існує три пункти призначення, і неправильний спокійно отруює наступний цикл.

  • Зареєструйте як коригування, коли втручання було справжнім виправленням: політика йшла куди-небудь неправильно і ваш введення показав правильне з стану, який сама політика виробила.
  • Зберегти як оціночні для чистих автономних запусків та для запусків, які ви захопили з обережності. Оціночні епізоди - це як ви вимірюєте наступну контрольну точку, і вони ніколи не повинні навчатися.
  • Відкинути запуски, пошкоджені чимось незв'язаним - впала рамка камери, застав сервопривід, об'єкт, який ви поштовхнули. Брудне коригування гірше, ніж ніяке коригування.
Кадри заморозки належать до сирого запису, а не до навчальних даних

Між політикою, яка звільняє контроль, та вашим першим введенням, рук утримується нерухомо, поки рекордер продовжує писати - запуск однакових поз у парі зі трохи різними зображеннями. Тут ті кадри передачі залишаються в сирому записі та поза коригуючим набором даних. Якщо ви будуєте цикл самі, порізайте їх свідомо: політика, навчена на них, вчиться робити паузу, де вона повинна діяти.

Крок 5 детально: компонування суміші

Склад приймає оригінальний набір даних плюс коригуючий набір даних і виробляє новий, звичайний LeRobot набір даних що навчається, як будь-який інший. Важлива властивість полягає в тому, що вибір епізоду явний за джерелом - нічого не змішується автоматично. Це звучить незначно, поки вперше політика не поводиться дивно і вам потрібно реконструйвати, на чому вона була навчена.

Відкрите питання - це співвідношення, і ніхто не має числа, яке переносить. Те, з чим згідна література, це те, що коригування повинні рахуватися більше за їх часту долю. Мандлекар та інші перетренують ітеративно на даних, які накопичує їхня система втручання, так що політика вчиться проходити вузькі місця, і повідомляють, що агенти, навчені таким чином, перевищують агентів, навчених на еквівалентній кількості вибірок від недержавних демонстраторів. Сіріус йде далі і переважує вибірки навчання за приблизною людською довірою, повідомляючи про 8-відсоток gain у симуляції та 27-відсоток на реальному обладнанні в успішності політики проти методів, з якими вона порівнюється, із удвічі більшою швидкістю сходимості. Жодна з точок входу навчання тут не виставляє ручку для переважування вибірок, тому грубий заступник - це зберегти кожен епізод коригування під час підвибірки оригінальних демонстрацій - і записати те, що ви зробили.

Вид запису набору даних, що показує епізоди набору даних SO-100 з потоками камер
Епізоди коригування - це звичайні епізоди з прапором втручання за кадром, тому вони складаються з оригінальним набором даних без перетворення.

Крок 6 детально: що продовження з контрольної точки дійсно означає

Навчання суміші з базової моделі працює, але викидає попередній цикл і коштує повної гонки. Продовження з попередньої контрольної точки швидше і зазвичай краще. Це також більш обмежено, ніж пропозиція пропонує.

Ініціалізація ваги - це не резюме оптимізатора

Контрольна точка, яка містить лише ваги, містить параметри та нічого більше. Завантажити її дає наступному запуску кращу вихідну точку, ніж базова модель, але моменти оптимізатора, позиція графіка швидкості навчання та порядок даних усе починаються з нуля. Очікуйте всплеск втрати на початку продовженого запуску, не читайте це як помилку, і не називайте цикл резюме. Це тепла старт.

ПолітикаРозмірЯрус GPUВивід на кроці діїФормат набору данихЕпізоди, перш ніж вартий спробувати
GR00T N1.7близько 3 B, грубо 40 M підготовлено під час тонкотюнінгуA100 80 GB або H100 80 GBблизько 152 мсLeRobot v2.0 або v2.150
GR00T N1.5близько 3 BA100 80 GB або H100 80 GBблизько 165 мсLeRobot v2.0 або v2.150
Pi0.5близько 3 B на хребті PaliGemmaA100 80 GB або H100 80 GBблизько 485 мсLeRobot v3.050
SmolVLAблизько 450 MRTX 4090 або будь-яка карта 24 GBблизько 245 мсLeRobot v3.030
ACTблизько 80 M, навчено з нуляRTX 4090 або будь-яка карта 24 GBблизько 20 мсLeRobot v3.050

Латентність складається всередині циклу DAgger способом, як вона не робить під час демо: при приблизно 485 мс за крок дії ви захопили управління, тому що рук вагався, а не тому, що це було неправильно, і коригування вагання не є корисними навчальними даними. Якщо ви повторюєте на даних, а не переслідуєте остаточний успіх, повторіть на швидкій моделі. Шукор та інші описують SmolVLA як розроблену для навчання на одному GPU та розгортання на побутових GPU або CPU, з асинхронним стеком виведення, який розділяє прогнозування дії від виконання, щоб дозволити вищі швидкості керування - властивість, яка утримує цикл захоплення відповідальним.

Формати наборів даних не є взаємозамінні. GR00T приймає LeRobot v2.0 або v2.1, і сховище Isaac-GR00T описує його вхід як смак формату LeRobot v2 з доданим файлом опису модальності; новіші тренери тут очікують v3.0. Суміш, складена в неправильній версії, не завантажується замість того, щоб виробляти погану політику - кращий режим невдачі, все ще розтратив слот черги. Документація документація набору даних перелічує, який формат приймає кожен тренер.

Цикл, з бухгалтерією вже завершеною

Захоплення управління з лідер-рукою, клавіатурою або слайдерами; позначення втручання за кадром; запис запусків як коригування або оцінювання; компонування змішаного набору даних з явним вибором епізоду за джерелом; та продовження навчання з контрольної точки замість базової моделі. Те, що залишається вашим рішенням, - це який запуск рахується як коригування, що входить до суміші та коли коефіцієнт втручання перестав падати.

Подивіться, як циклу DAgger переведено

Чотири способи розтратити цикл

1. Навчання лише на коригуваннях

Найпоширеніша помилка та найспокусливіша ярлик. Набір даних лише коригування майже повністю складається з складної середини завдання, з наближенням та відступом відсутні; політика покращується на складній частині та забуває, як туди прибути. Агрегація - це не деталь реалізації методу, це механізм: старі дані - це те, що утримує решту поведінки на місці, поки коригування рухають одну її частину.

2. Переміщення камери між циклами

Камера, яка зміщується на два сантиметри між циклами, виробляє політику гіршу за ту, з якої ви почали, та діагноз, який коштує день. Кожна VLA тут залежить від зображень; стан суглоба сам по собі не відрізняє, де знаходиться об'єкт. Сфотографуйте встановлення перед першим циклом і перевірте це фото перед кожним пізнішим.

3. Дозвіл артефактів передачі в навчання

Розглянуто вище, і на списку, тому що це невидимо. Симптом - це політика, яка стає в затримці на частку секунди саме там, де оператор попереднього циклу взяв управління. Це виглядає як вагання; це наслідування.

4. Називання теплої старту резюме

Якщо ви вважаєте, що стан оптимізатора переносив, початкова втрата падіння читається як помилка і ви шукаєте пошкоджених даних. Якщо ви знаєте, що оптимізатор почав свіжий, падіння очікується і ви дивитеся, що приходить після цього. Одні й ті ж числа, протилежні висновки.

Вимірювання циклу

Метрика для людської гавернутої гонки - це коефіцієнт втручання: кадри, записані, поки ви були в керуванні, поділені на загальну кількість кадрів запуску. Це у статусі захоплення управління, і це єдине число, яке відповідає на питання, яке задав цикл. Втрата навчання падає, незалежно від того, покращилася ли політика; коефіцієнт успіху двійковий і шумний у розмірах вибірки, які виробляє настільний рук. Коефіцієнт втручання постійний, вимірюється на станах, які сама політика викликала, і він падає, оскільки політика вас менше потребує.

Порівнюйте його лише на запусках, записаних у однакових умовах. Повна аргументація та як побудувати набір оцінювання, який переживає більше двох циклів, - це в статті про вимірювання циклу DAgger. Перший цикл реалістично тест можливості: ви перевіряєте, що захоплення управління працює на вашому обладнанні, що коригування приходять з їхніми прапорами та що продовжений запуск завантажив контрольну точку, яку ви назвали. Цикли два та три - це місце, де рівень повинен почати рухатися. Якщо він не рухався до четвертого циклу, проблема вище за течією DAgger.

Запишіть для кожного циклуЧому це має значення пізніше
Контрольна точка, яка була керованаБез неї ви не можете приписати поліпшення суміші
Режим введення, який використовувався для захопленняКоригування клавіатури грубіше, ніж коригування лідера, і це видно в даних
Кількість запусків та як кожен був тріажованийЧи було досить коригувань у циклі, щоб це важливо
Коефіцієнт втручання на запуск та середнійМетрика прогресу циклу
Точний вибір епізоду за джереломЄдиний спосіб відтворити або скасувати цикл
Тепла старт або свіжа заготовкаПояснює криву втрати, яку ви дивитеся за тиждень

Якщо ви поки не маєте контрольну точку

Цикл не має точки входу без неї. Запишіть перший набір даних, навчіть першу політику, запустіть - запис, навчання та запуск політики охоплювати цей шлях. Клієнт запису розташований на сторінці завантажень, ярусів GPU та погодинних ставок на сторінці цінування, та як виглядає придатний епізод у посібнику збору даних SO-100. Отримайте демонстрації правильно перед коригуваннями: DAgger - це механізм ремонту, і він працює набагато краще на чомусь, що вже було майже правильним.

Чи можу я запустити цикл DAgger без лідер-руки?

Так. Виберіть введення клавіатури або слайдера, коли ви натискаєте Захопити управління: захоплення управління негайне та ручне, без другої руки для вирівнювання. Клавіатура надсилає відносні поштовхи, які сервер затискає жорстко на 2 градуса за суглоб та 4 для захоплювача; слайдери надсилають абсолютну ціль і сервер рухається максимум на 6 градусів до неї за виклик, поки інтерфейс продовжує потокувати. Стовпець дій та позначення втручання - це те ж саме, що в режимі лідера, тому коригування неможливо розпізнати у наборі даних.

Скільки коригувань потребує один цикл?

Немає захищаної універсальної кількості, і кількість кадрів має значення більше, ніж підрахунок епізодів. Робоче правило полягає в тому, що коригування не повинні бути втрачені в суміші: з 200 оригінальних епізодів та трьома епізодами коригування нічого не рухається. Спрямуйтесь до коригувань, які охоплюють невдачу поведінки з кількох конфігурацій старту, замість трьох повторень однієї та тієї ж порятунку.

Чому навчання лише на коригуваннях - така погана ідея?

Тому що коригування майже повністю складаються зі складної середини завдання. Наближення, вирівнювання та відступ відсутні, тому політика втрачає те, що вона вже робила добре, поки покращується в частині, яку ви виправили. Утримування старих даних та додавання до них - це сам механізм, не факультативний додаток.

Чи продовження з контрольної точки відновлює попередній запуск навчання?

Ні. Контрольна точка, яка містить лише ваги, відновлює параметри та нічого більше: моменти оптимізатора, позиція графіка швидкості навчання та порядок даних починаються свіжо. Це тепла старт, і початкова втрата падіння очікується, а не симптом. Запишіть, що з цих двох ви насправді зробили, щоб правильно прочитати криву через тиждень.

Що робити, якщо коефіцієнт втручання не падає?

Припиніть додавати цикли. Плаский коефіцієнт означає, що коригування не навчають те, що ви думаєте. Звичайні причини - вище за течією: камера рухалася, коригування починаються занадто пізно, щоб бути дані про уникнення, кадри передачі знаходяться в наборі даних про навчання або завдання недовизначена з спостережень, які політика насправді отримує.

Жодна з них не розв'язана проблема і жодна з них не один клік. Інтерактивне навчання наслідуванням - це активна область дослідження саме тому, що її питання - коли втручатися, як зважити, що людина зробила, скільки старих даних зберегти - мають не встановлені відповіді; обстеження Целеміна та інші картографує те, що все ще відкрито. Те, що цикл дійсно має, це вимірюване збіжність, коли його запускають обережно, на обладнанні, яке коштує кілька сотень євро. Заморозити встановлення, втручатися рано, тріажувати чесно, компонувати свідомо, і записувати коефіцієнт втручання кожний раз.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started