La calibración mano-ojo es un proceso fundamental en robótica para determinar la relación geométrica entre una cámara y el efector final (o la base) de un brazo robótico. Para ejecutar este procedimiento en OpenCV, se requiere la versión 4.1.0 o superior.
De acuerdo con la documentación oficial, para resolver la transformación se nceesitan al menos dos movimientos con ejes de rotación no paralelos. Aunque el mínimo teórico es de 3 poses diferentes, en entornos de producción se recomienda utilizar un conjunto significativamente mayor para mejorar la precisión.
Uso de cv::calibrateHandEye
La función principal proporcionada por la biblioteca es cv::calibrateHandEye. Su firma en C++ es la siguiente:
void cv::calibrateHandEye(
InputArrayOfArrays R_gripper2base,
InputArrayOfArrays t_gripper2base,
InputArrayOfArrays R_target2cam,
InputArrayOfArrays t_target2cam,
OutputArray R_cam2gripper,
OutputArray t_cam2gripper,
HandEyeCalibrationMethod method = CALIB_HAND_EYE_TSAI
);
Los parámetros de entrada son vectores (std::vector<cv::Mat>) que contienen las matrices de rotación y traslación correspondientes a n posiciones capturadas durante el proceso.
Algoritmos de resolución
El parámetro method define cómo se resuelev el sistema de ecuaciones \(AX = XB\). OpenCV implementa los siguientes métodos:
- CALIB_HAND_EYE_TSAI: Una técnica eficiente y ampliamente utilizada basada en la separación de rotación y traslación.
- CALIB_HAND_EYE_PARK: Resuelve el problema en el grupo euclidiano para mayor estabilidad.
- CALIB_HAND_EYE_HORAUD: Un enfoque clásico para la visión robótica.
- CALIB_HAND_EYE_ANDREFF: Un método lineal diseñado para calibración en tiempo real.
- CALIB_HAND_EYE_DANIILIDIS: Utiliza cuaterniones duales para resolver rotación y traslación simultáneamente, ofreciendo gran robustez.
Sistemas de Coordenadas
Para comprender el flujo de datos, definimos los siguientes marcos de referencia:
- base: El origen del brazo robótico.
- gripper: El punto de acoplamiento o punta del robot (efector final).
- cam: El centro óptico de la cámara.
- target: El patrón de calibración (por ejemplo, un tablero de ajedrez).
Configuración Eye-in-Hand (Ojo en la mano)
En este escenario, la cámara está montada sobre el efector final y se mueve con el robot. El objetivo es encontrar la matriz \( ^{gripper}_{cam}T \).
Entradas requeridas:
R_gripper2base: Rotación del efector respecto a la base (\( ^{base}_{gripper}R \)).t_gripper2base: Traslación del efector respecto a la base (\( ^{base}_{gripper}t \)).R_target2cam: Rotación del patrón respecto a la cámara (\( ^{cam}_{target}R \)).t_target2cam: Traslación del patrón respecto a la cámara (\( ^{cam}_{target}t \)).
Configuración Eye-to-Hand (Ojo fijo)
Aquí, la cámara está en una posición fija en el entorno y observa el brazo moviéndose. El objetivo suele ser obtener la transformación entre la cámara y la base del robot (\( ^{base}_{cam}T \)).
Para este caso, las entradas se adaptan para representar la relación entre la base y el efector final de manera inversa, o se ajusta el planteamiento del sistema de ecuaciones según la documentación específica del método elegido.
Obtención de la pose del patrón mediante SolvePnP
Para obtener los datos necesarios de la cámara (target2cam), se utiliza el algoritmo SolvePnP, que estima la pose de un objeto 3D a partir de sus proyecciones 2D.
bool cv::solvePnP(
InputArray objectPoints, // Coordenadas 3D en el sistema del tablero
InputArray imagePoints, // Coordenadas 2D detectadas en la imagen
InputArray cameraMatrix, // Matriz intrínseca
InputArray distCoeffs, // Coeficientes de distorsión
OutputArray rvec, // Vector de rotación de salida
OutputArray tvec, // Vector de traslación de salida
bool useExtrinsicGuess = false,
int flags = SOLVEPNP_ITERATIVE
);
El vector de rotación resultante (rvec) debe convertirse en una matriz de 3x3 mediante cv::Rodrigues() antes de pasarlo a la función de calibración mano-ojo.
Consideraciones Técnicas y Errores Comunes
- Consistencia de Intrínsecos: Es imperativo utilizar la misma matriz de cámara y coeficientes de distorsión tanto para el proceso de calibración mano-ojo como para la posterior detección de objetos. Mezclar parámetros de diferentes sesiones de calibración introducirá errores sistemáticos.
- Variedad de Movimiento: Si el robot solo se mueve en traslación (por ejemplo, arriba/abajo o adelante/atrás) sin cambiar su orientación, el algoritmo no podrá resolver la rotación. Es necesario realizar rotaciones en múltiples ejes.
- Orientación del Tablero: Al generar los puntos 3D del tablero, asegúrese de que el orden de los puntos coincida con el orden de detección de las esquinas en la imagen. Un tablero invertido en una sola toma arruinará todo el cálculo.
- Cantidad de Datos: Aunque el mínimo son 3 poses, se recomienda capturar entre 15 y 20 poses variadas para promediar el ruido de los sensores y mejorar la estabilidad del resultado.
- Cámaras RGB-D: Si se utiliza una cámara de profundidad, asegúrese de verificar si la calibración se refiere al sensor óptico RGB o al sensor infrarrojo, ya que existe un desplazamiento físico (offset) entre ellos.