HandEye: привязка камеры к роботу¶
HandEye определяет положение оптического фрейма камеры относительно TCP/фланца или базы робота. Для этого SmartCamera сохраняет пары «изображение мишени — положение робота», а затем рассчитывает преобразование отдельно для каждой камеры. Приложение читает позы, но не отправляет роботу команды движения.
До начала работы добавьте и включите камеры, подготовьте жёсткую мишень с известными размерами и внутреннюю калибровку для текущего разрешения. Собрать изображения можно и до загрузки внутренних параметров; перед расчётом параметры понадобятся каждой камере.
Выбор схемы¶
| Схема | Что закреплено на роботе | Что неподвижно | Результат |
|---|---|---|---|
| Eye-in-hand — камера на роботе | Камера | Мишень | Оптический фрейм камеры относительно TCP/фланца |
| Eye-to-hand — камера неподвижна | Мишень | Камера | Оптический фрейм камеры относительно базы |
Крепление должно оставаться жёстким на протяжении всей сессии. Если камера или мишень смещается на креплении, собранные пары перестают описывать одно преобразование.
Шаг 1. Настройка¶

- Откройте Калибровка → HandEye. В поле Сессия оставьте Новая сессия.
- Введите Название, выберите Схема установки и отметьте камеры.
- Укажите Базовый фрейм и Фрейм TCP / фланца, соответствующие источнику положения. Например,
base_linkиtcpподходят только если ваш издатель или FK использует именно эту пару. - Для каждой камеры проверьте поле оптический фрейм. Если
Image.header.frame_idзаполнен, он должен совпадать с этим значением. - Выберите Источник позы, заполните его параметры и размеры Мишени.
- Нажмите Создать сессию. После последующих правок используйте Сохранить настройки либо Отменить изменения перед переходом на другой шаг.
После первого снимка схема, состав камер и фреймы фиксируются. Для их изменения создайте новую сессию. Это предотвращает смешивание данных с разным смыслом координат.
Для HandEye рекомендуется ChArUco: задайте словарь и фактическую геометрию распечатки. У симметричной шахматной доски или круговой сетки порядок точек может измениться при повороте; сохраняйте одну ориентацию координат мишени во всех кадрах. Все размеры мишени вводятся в миллиметрах.
Ручной ввод¶
Выберите Источник позы → Вручную XYZ ABC. На шаге записи вводятся координаты и углы текущего TCP/фланца относительно выбранной базы. По умолчанию используются миллиметры и градусы; доступны метры и радианы.
Конвенция ABC соответствует KUKA: A — вращение вокруг Z, B — вокруг Y, C — вокруг X, порядок R = Rz(A) · Ry(B) · Rx(C). Это не три произвольных угла из любого интерфейса робота. Сверьте порядок и единицы источника, прежде чем переносить числа. Например, X=500 в мм и X=0.5 в м обозначают одно расстояние.
ROS 2 топик¶
Выберите ROS 2 топик, задайте ROS-топик и Профиль сообщения: PoseStamped, TransformStamped или Настраиваемые поля. Для первых двух профиль задаёт стандартный тип. PoseStamped не содержит дочерний фрейм: соответствие выбранному TCP должно следовать из документации издателя.
Для пользовательского типа укажите Тип сообщения, ориентацию, единицы и пути полей. Примеры путей: position.x, data[0], orientation.euler_deg.a. Для ABC нужны x, y, z, a, b, c; для quaternion — x, y, z, qx, qy, qz, qw. Путь stamp_path, обычно header.stamp, должен вести к структуре sec/nanosec. Это пути данных, не Python-выражения. Тип сообщения должен быть установлен в окружении сервера.
lightweight-cobot / FK¶
Выберите lightweight-cobot / FK, проверьте Топик суставов /joint_states и Сервис FK /compute_fk. Используются sensor_msgs/msg/JointState и moveit_msgs/srv/GetPositionFK. При необходимости замените имена и фреймы на принятые в вашей системе.
FK рассчитывается по состоянию суставов, ближайшему ко времени кадра. Время позы берётся из исходного JointState, а имена и положения суставов сохраняются вместе с наблюдением. Доступность сервиса и корректность выбранного TCP проверяйте до массовой съёмки.
Шаг 2. Параметры камер¶
Для каждой камеры загрузите ROS YAML либо выберите Готовая калибровка из сессий монокалибровки. В HandEye сохраняется копия внутренних параметров. Разрешение должно совпадать с записываемыми кадрами. Поддерживаются plumb_bob, rational_polynomial и equidistant.
Если параметры ещё не готовы, кнопка Записать пары, параметры позже позволяет продолжить съёмку. Вернитесь к этому шагу до расчёта; наличие изображения само по себе не заменяет внутреннюю калибровку.
Шаг 3. Запись¶
- Переместите робота средствами его системы управления так, чтобы мишень была видна выбранным камерам.
- Остановите робота и дождитесь неподвижного резкого изображения.
- Для ручного источника заполните XYZ ABC и отметьте Робот остановлен, XYZ ABC соответствуют текущему положению. Подтверждение требуется перед каждым снимком.
- Для ROS или FK дождитесь Данные поступают. Проверьте показанные XYZ ABC, возраст и отсутствие ошибки; в Разобранные поля можно сверить исходные данные.
- Нажмите Снять с позой и дождитесь подтверждения сохранения.
- Соберите 15–25 положений, изменяя не только XYZ, но и наклоны вокруг нескольких осей. Сохраняйте видимость и резкость мишени.
Набор публикуется в manifest после сохранения изображений и поз всех выбранных камер. Если запись одного элемента не удалась, неполный набор удаляется. Не увеличивайте число повторов одного положения вместо разнообразных наклонов: расчёт проверяет пригодность движений.
В Синхронизация и дополнительные настройки по умолчанию допуск кадр/поза равен 100 мс, максимальный возраст — 500 мс, таймаут записи — 2 с. Межкамерный допуск по умолчанию составляет 30 мс. Источники должны использовать согласованную шкалу ROS clock; нулевые, старые или несогласованные timestamps препятствуют записи.
Сопоставление времени → Время получения — приблизительно предназначено для сообщений без timestamp. В этом режиме учитывается время получения и кадров, и поз; признак approximate сохраняется. Он не устраняет сетевую задержку, поэтому робот должен оставаться неподвижным. QoS по умолчанию — BEST_EFFORT, VOLATILE, KEEP_LAST(100); при необходимости reliability переключается на RELIABLE.
Шаг 4. Проверка пар¶
Нажмите Проверить мишень, выберите пару в списке и проверьте точки на изображениях. Фильтр помогает найти отклонённые или исключённые пары. Снимите Использовать в расчёте у плохого наблюдения: исходные изображения сохранятся.
Для ручных поз кнопка Исправить XYZ ABC открывает выбранную пару. Внесите исправление, подтвердите его и нажмите Сохранить позу. Исправляйте только по достоверным данным положения в момент этого снимка. Удалить пару → Удалить навсегда удаляет изображения; для временного исключения достаточно флага участия.
Скачать набор ZIP сохраняет полный набор для архива. Сессии находятся в <recordings_directory>/handeye/<session_id>. Правки данных делают прежний результат устаревшим.
Шаг 5. Результат¶
Проверьте наличие внутренних параметров всех камер и минимум трёх включённых пар, затем нажмите Рассчитать HandEye. Используется метод Park. Технический минимум не заменяет рекомендованные разнообразные 15–25 положений.
В результате показано направление parent_frame ← child_frame. Матрица T_parent_child преобразует координаты из дочернего оптического фрейма камеры в родительский:
p_parent = T_parent_child × p_child
Eye-in-hand: T_tcp_camera
Eye-to-hand: T_base_camera
В матрице перенос выражен в метрах; отдельное представление XYZ ABC (mm, deg) — в миллиметрах и градусах. Quaternion имеет порядок xyzw. Для преобразования в обратную сторону нужна обратная матрица, а не та же матрица с переименованными фреймами.
Согласованность мишени, RMS показывает разброс положения мишени в мм и градусах. В Ошибки по наблюдениям также приведена репроекция в пикселях. Это показатели согласованности набора, не гарантия абсолютной точности робота. При больших выбросах проверьте позу, единицы, фреймы, временное соответствие и внутреннюю калибровку соответствующей камеры.
Скачайте JSON или YAML рассчитанного результата. SmartCamera не публикует его в TF автоматически: дальнейшее подключение выполняется в вашей ROS-системе с проверкой направления преобразования и имён фреймов.