Призначення та межі відповідальності
codroid-api — це низькорівневий Python-клієнт для контролера Codroid, який поєднує:
- WebSocket-керування (команди, стани, IO, події).
- HTTP-операції (обмін login-ключами, читання/збереження .crp-проєктів).
- Уніфікований API для прикладного ПЗ (зокрема codroid-ball-picker).
Пакет не є веб-інтерфейсом (UI) і не замінює логіку прикладної програми: він надає керовані примітиви руху, моніторингу, OnRobot-викликів та доступу до даних проєкту.
Основні класи і як вони взаємодіють
- CodroidConfig (codroid_api/client.py)
- зберігає host/port, токен, дані авторизації, коди команд і шляхи setparam;
- формує ws_url.
- CodroidAPI (codroid_api/client.py)
- головний асинхронний клієнт;
- встановлює WebSocket, надсилає/читає повідомлення, виконує рухи, IO-опитування, допоміжні HTTP-операції.
- CodroidSettings (codroid_api/settings.py)
- джерело конфігурації з .env (CODROID_*);
- збирає окремі конфігурації для user-каналу і robot-каналу.
- RobotSession (codroid_api/robot_session.py)
- довгоживуча сесія з фоновими задачами прослуховування і опитування (listener/poll);
- знімає з UI необхідність вручну керувати reconnect, posture/DI/status snapshots, release/acquire control.
Канали підключення і модель авторизації
У поточній реалізації використовуються два WebSocket-канали:
- Канал користувача (User channel) (типово ws://<host>:9098/)
- ws_login_with_password() або ws_login();
- призначений для користувацьких дій і узгодження з веб-сесією.
- Канал робота (Robot channel) (типово ws://<host>:9000/)
- robot_login();
- виконує команди руху/стану робота.
Паралельно застосовується HTTP-процедура login (handshake):
- GET /code/init (отримання pub/pri ключів),
- POST /user/login (шифровані дані запиту через _asencode()),
- передача отриманого usercode у wslogin.
Ця схема реалізована в http_login() + ws_login_with_password().
Структура WebSocket-повідомлень
Метод build_message() формує уніфікований формат:
- id — ідентифікатор повідомлення (message id);
- time — unix-time в ms;
- token — токен сесії;
- type — простір імен (namespace) повідомлення (user, Robot, common, IOManager, projexecute …);
- action — команда;
- data — дані повідомлення (payload).
Ключові транспортні примітиви:
- send_message() — надсилання JSON у WebSocket;
- recv(timeout=…) — читання черги вхідних повідомлень;
- listen() — асинхронний стрім усіх повідомлень;
- send_and_wait(…, predicate=…) — патерн request/response із фільтрацією відповіді.
Командна модель Robot/Control/*
Керування реалізоване через common.setparam і шляхи Robot/Control/….
| Параметр | Призначення | Де у коді |
|---|---|---|
| Robot/Control/command | запуск команд (power/mode/move/error clear) | RobotControlPaths.command |
| Robot/Control/commandHeart | heartbeat для утримуваних команд | send_command_heartbeat() |
| Robot/Control/manualMoveRate | множник ручної швидкості | set_manual_move_rate() |
| Robot/Control/jogMode | режим jog (stop/joint/tcp) | RobotJogMode |
| Robot/Control/jogIndex | вісь jog | set_jog_index() |
| Robot/Control/jogSpeed | напрям/швидкість jog (-1/0/1) | set_jog_speed() |
| Robot/Control/jogReference | reference frame (coordinate/tool) | RobotJogReference |
| Robot/Control/targetPosType | тип цілі (none/apos/cpos) | RobotTargetPosType |
| Robot/Control/targetAPos | ціль у joint-space | set_target_apos() |
| Robot/Control/targetCPos | ціль у cartesian-space | set_target_cpos() |
Набір кодів команд за замовчуванням (RobotCommandSet):
- 1 power on, 2 power off, 3 manual mode, 4 rescue mode, 5 auto mode;
- 501 clear error;
- 104/1001/1002/105 — preset moves (home/safe/candle/package);
- 106/107 — цільові переміщення (linear/optimal).
Рух: від jog до цільових траєкторій
Jog-режим
start_joint_jog() і start_tcp_jog() виконують послідовність:
- виставити jogMode,
- виставити jogSpeed (напрям),
- виставити jogIndex (вісь),
- за потреби надіслати heartbeat.
hold_jog() підтримує рух впродовж hold_seconds і завершує stop_jog().
Цільові переміщення (Target moves)
move_to_*_target_*() використовують двоетапну модель:
- запис цілі (targetPosType + targetAPos/targetCPos),
- подача команди 106 або 107.
Після виконання (за reset_after=True) API очищає вибір цілі (target selection, targetPosType = none) і скидає команду.
Формування даних позицій (payload)
- build_target_apos([…]) — joint payload (jntpos1..7, exjntpos1..10).
- build_target_cpos(x,y,z,a,b,c,…) — cartesian payload (x,y,z,a,b,c,e,poscfg,…).
- build_poscfg(mode, cf) — posture-конфігурація для CPOS.
Калібрування координат у codroid-api
Код реалізує повний 3-точковий цикл:
- підготовка трьох CPOS-точок;
- coordinate_calibration(points, coordinate_id, …):
- валідує рівно 3 точки;
- (опційно) активує слот координат (coordinate slot) через SetCurrentCoordinateId;
- надсилає Robot/CoordinateCalibration і чекає відповідь.
- change_coordinate_parameter(coordinate_id, frame):
- зберігає обчислений frame у користувацький слот координат контролера (user coordinate slot).
Для швидкого підходу до початку користувацької СК передбачено move_to_coordinate_origin(coordinate_id, linear=…, hold_seconds=…).
Моніторинг IO, DI і аварійних станів
Моніторинг DI (DI monitoring)
watch_di_changes():
- запускає GetIOInfo для імен портів;
- циклічно опитує IOManager/GetIOValue;
- детектує фронтові події (edge) (зміну 0->1 або 1->0) і повертає port/value/label.
Типовий набір портів за замовчуванням (default) у коді: 0–15, 32, 33, 40–45.
Моніторинг попереджень і помилок робота (Robot warning/error monitoring)
У CodroidAPI є детектори:
- emergency stop,
- overspeed,
- joint protection (колізійна подія),
- drag-not-allowed,
- wrong tool/payload.
Є два режими:
- monitor_robot_errors() — тільки стрім детектованих подій;
- auto_recover_from_errors(auto_clear=True) — спроба автоматичного clear через recovery sequence.
RobotSession: рекомендований шар для UI і сервісів
RobotSession додає експлуатаційну поведінку (production) поверх CodroidAPI:
- довгоживучі user/robot підключення;
- контрольний автомат станів (state machine) acquired/released;
- acquire_control() / release_control() з перевіркою закриття websocket;
- API-знімків стану (snapshot API):
- position_snapshot();
- robot_status_snapshot();
- coordinate_frame_snapshot();
- calibration_frame_snapshot();
- robot_warning_snapshot() / robot_error_snapshot();
- фонове опитування IO (poll) для flange-кнопки і черга натискань (next_flange_press()).
У лабораторних застосунках рекомендовано працювати саме через RobotSession, а не через одноразові ad-hoc підключення.
Робота з .crp-проєктами через HTTP
CodroidAPI містить допоміжні CRUD-методи для robot project:
- read_project(project_id);
- save_project(project_doc);
- create_project(label, …);
- upsert_point(project_id, point);
- delete_point(project_id, point_id/label);
- delete_project(project_id).
Ці методи використовуються для автоматизації сценаріїв без ручного редагування в teach pendant/UI.
Практичний мінімум для інтеграції в лабораторії
Рекомендований порядок при старті нового модуля:
- Ініціалізувати CodroidSettings з .env.
- Встановити RobotSession.
- acquire_control().
- Перевірити наявність свіжих даних знімків стану (snapshot: posture_seen, robot_status_age_seconds).
- Перед автоматичним циклом перевірити калібрування та інструментальний профіль.
- Після завершення циклу виконати release_control(power_off=True).
Обмеження та зауваження
- Мапінг OnRobot у codroid-api позначений як попередній (provisional) і може відрізнятись між ревізіями прошивки (firmware).
- Деякі методи очікують конкретний формат повідомлень контролера; при зміні firmware необхідна повторна валідація.
- Для одночасного використання listen()/recv() у кількох задачах потрібно чітко планувати, хто споживає потік (щоб не «перехопити» повідомлення іншого споживача, consumer).
- API протестований під стек, сумісний з Codroid Web UI v1.6.3c (згідно README).