Перейти к содержанию
Скачать руководство PDF

HandEye: привязка камеры к роботу

HandEye определяет положение оптического фрейма камеры относительно TCP/фланца или базы робота. Для этого SmartCamera сохраняет пары «изображение мишени — положение робота», а затем рассчитывает преобразование отдельно для каждой камеры. Приложение читает позы, но не отправляет роботу команды движения.

До начала работы добавьте и включите камеры, подготовьте жёсткую мишень с известными размерами и внутреннюю калибровку для текущего разрешения. Собрать изображения можно и до загрузки внутренних параметров; перед расчётом параметры понадобятся каждой камере.

Выбор схемы

Схема Что закреплено на роботе Что неподвижно Результат
Eye-in-hand — камера на роботе Камера Мишень Оптический фрейм камеры относительно TCP/фланца
Eye-to-hand — камера неподвижна Мишень Камера Оптический фрейм камеры относительно базы

Крепление должно оставаться жёстким на протяжении всей сессии. Если камера или мишень смещается на креплении, собранные пары перестают описывать одно преобразование.

Шаг 1. Настройка

Мастер HandEye с настройками схемы, фреймов и источника позы

  1. Откройте Калибровка → HandEye. В поле Сессия оставьте Новая сессия.
  2. Введите Название, выберите Схема установки и отметьте камеры.
  3. Укажите Базовый фрейм и Фрейм TCP / фланца, соответствующие источнику положения. Например, base_link и tcp подходят только если ваш издатель или FK использует именно эту пару.
  4. Для каждой камеры проверьте поле оптический фрейм. Если Image.header.frame_id заполнен, он должен совпадать с этим значением.
  5. Выберите Источник позы, заполните его параметры и размеры Мишени.
  6. Нажмите Создать сессию. После последующих правок используйте Сохранить настройки либо Отменить изменения перед переходом на другой шаг.

После первого снимка схема, состав камер и фреймы фиксируются. Для их изменения создайте новую сессию. Это предотвращает смешивание данных с разным смыслом координат.

Для 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. Запись

  1. Переместите робота средствами его системы управления так, чтобы мишень была видна выбранным камерам.
  2. Остановите робота и дождитесь неподвижного резкого изображения.
  3. Для ручного источника заполните XYZ ABC и отметьте Робот остановлен, XYZ ABC соответствуют текущему положению. Подтверждение требуется перед каждым снимком.
  4. Для ROS или FK дождитесь Данные поступают. Проверьте показанные XYZ ABC, возраст и отсутствие ошибки; в Разобранные поля можно сверить исходные данные.
  5. Нажмите Снять с позой и дождитесь подтверждения сохранения.
  6. Соберите 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-системе с проверкой направления преобразования и имён фреймов.