知之者 不如好之者, 好之者 不如樂之者

기계처럼 살지 말고, 즐기는 인간이 되자

Project/ROS2 + CV + Robot (2023.12~2024.02)

이미지로부터 실제 좌표를 얻기 위한 Camera Transformation 수행

코방코 2024. 2. 13. 14:34
728x90

 

 

이번 글에서는 Camera Transformation 개념에 대해서 간단히 언급하겠습니다.

 

우선 Camera Transformation 은 

카메라에 보인 물체를 실제 좌표계의 위치로 옮기는 작업입니다.

 

카메라 상에서 물체의 x, y pixel 좌표와 Depth 를 이용하여

물체의 Camera coordinate를 얻고,

Camera의 x, y, z 좌표와 w, x, y, z 쿼터니언을 이용

Camera Transformation Matrix를 획득해

Camera Coordinate를 Real World Coordinate로 변환하게 됩니다.

 

 

잠시 넘어가기 전에 쿼터니언에 대해서 간단하게만 설명하겠습니다.

쿼터니언은 굉장히 비직관적인 개념입니다.

대부분의 회전은 Roll Pitch Yaw라고 하는 방식으로 설명이 되는데요,

이러한 Euler 의 RPY 방식은 특정 축의 회전에 의해 하나의 축의 자유도가 소실되는 

짐벌락 문제가 발생합니다.

예를 들어 아래 비행기의 회전을 생각해 보았을 때, 

만약 비행기가 Pitch 방향으로 90도의 회전이 발생하면,

Roll 과 Yaw의 회전을 구분할 수 없는 현상이 발생합니다.

 

그리하여, 절대적으로 물체의 회전을 표현하기 위한 개념이 필요했는데요,

이를 위해 등장한 것이 쿼터니언입니다.

 

쿼터니언은 하나의 실수축과 3개의 허수축을 가지는 4차원 벡터입니다.

w 는 회전 각에 대한 scalar 값을 의미하며, 

x, y, z는 각 회전 축에 대해 어느 정도의 회전이 이루어졌는지를 나타냅니다.

정규화된 쿼터니언은 항상 크기가 1 인 특징을 지닙니다.

 

RPY는 다음과 같은 방식으로 쿼터니언으로 변환이 될 수 있습니다.

 

그럼 다시 돌아가서 이렇게 얻은 쿼터니언을 이용해서

어떻게 Image로부터 real world 좌표를 얻는지 그 과정을 정리하도록 하겠습니다.

 

 


Camera Intrinsic Matrix

먼저 카메라의 특성을 결정하는 Camera Intrinsic Matrix는 다음과 같이 정의됩니다.

해당 값을 얻는 방법과 설명은 아래 글을 참조하시기 바랍니다.

 

Python3 에서 Intel RealSense Camera Intrinsic Matrix 얻기

Camera Intrinsic Matrix? Camera Intrinsic Matrix는 카메라의 내부 매개변수를 나타내는 행렬로, 컴퓨터 비전에서 카메라의 기하학적 및 광학적 특성을 정의하는 데 사용됩니다. 이 행렬은 카메라가 3차원

cobang.tistory.com

 

 

Camera Coordinate

Depth Camera 이미지로부터 물체의 pixel x좌표 x_p , pixel y좌표 y_p , Depth Z를 얻었을 때

Camera Coordinate X_c, Y_c, Z_c는 다음과 같이 획득이 가능합니다.

 

Camera Transformation Matrix

카메라 coordinate를 real world coordinate로 바꾸기 위한 Camera Transformation Matrix는 

카메라의 현재 위치의 x, y, z 좌표 (T_x, T_y, T_z)와

쿼터니언 w, x, y, z를 이용하여 다음과 같이 정의됩니다.

 

이제 이를 이용하여 real world coordinate X_w, Y_w, Z_w를 얻는 방식은 다음과 같습니다.

 

결론적으로 image 에 대하여 어떤 물체의 x, y pixel 좌표와 Depth, 

카메라의 x, y, z 좌표와 쿼터니언, Camera Intrinsic Matrix를 알고 있으면,

해당 물체의 Real world coordinate를 계산할 수 있습니다.

 

실제로 아래 글들의 작업에서

vision을 이용한 로봇팔에서 이를 구현하기 위해

하나씩 해당 Input들을 얻는 과정을 쌓아왔습니다.

 

ROS2 MoveIt2 이용하여 UR3e 의 Link Position 및 Quaternion 획득하기

지난 글들에서, UR3e 에 Intel RealSense ROS2 패키지를 추가하여 vision을 달고, 고정 위치에 대해 pick and place를 수행해보았습니다. ROS2 MoveIt2 에서 UR3e + Intel RealSense Pick and Place 예제 수행 점점 심연 속으

cobang.tistory.com

 

 

ROS2 에서 Intel realsense 기반 YOLOv8 분석하고 결과 topic publishing 하기

이번에는 ROS2 humble에서 Intel D435 Depth Camera에 YOLOv8 을 붙여보도록 하겠습니다. 이번 글의 최종 목표는 rviz에서 YOLOv8으로 분석된 Image 화면을 확인하고 결과를 publishing 하는 것입니다. 실력이 부족

cobang.tistory.com

 

 

그럼 다음 글에선 실제로 ROS2에서 Real World Coordinate를 얻도록 cpp 코드를 작성하고

UR3e가 해당 인식 위치로 이동하여 Pick and Place task를 수행하는 글을 작성하겠습니다.

 

 

728x90
반응형