본문 바로가기

IT/ROS

[ROS] 16. Camera Calibration

반응형

☞ 메인보드 : Jetson Nano Developer Kit

☞ 운영 체제 : Ubuntu 18.04 - JetPack 4.4.3

☞ ROS 버전 : Melodic

 

 

 

 


목차

1. Camera Calibration

2. Camera Calibration 과정

3. 결과 파일

 

 

 


 

 

 

 

 

이번 연구에 ROS 패키지를 사용하게 되어 오랜만에 ROS 포스팅을 하게 되었다. 카메라 비전 쪽 연구를 담당하여 진행하고 있고, 카메라 왜곡 보정에 대한 글을 하나 써놓으면 좋겠다는 생각이 들었다.

 

필자는 기하학적으로 영상처리를 공부해본 것이 아니라 단지 경험에 의한(뇌피셜) 것을 적는 것으로 수학적 데이터가 필요하다면 다른 글을 읽는 것이 효과적임을 밝히고 시작한다.

 

 

 

 

① Camera Calibration

로봇에 관해 학습을 하다 보면 카메라와 OPENCV 라이브러리를 사용해보게 된다. 카메라는 로봇의 눈으로써 시각 데이터를 얻어 로봇이 움직이는 것에 대한 근거를 제공한다. 카메라는 각각 고유의 값을 갖고 있으며, 렌즈의 픽셀(화소) 마다 3개의 채널(RED, GREEN, BLUE) 색 정보를 얻을 수 있다. 렌즈가 바라보는 풍경을 펼치기에는 위의 정보들로도 충분할지 모른다.

 

 

그렇다면 Camera Calibration은 왜 필요한 것일까?

 

 

비전공자여도 알 수 있는 사실로는 카메라가 3차원 공간을 2차원 평면에 투영하기 때문이라는 것이다. cv::imshow로부터 얻어 보이는 노트북 화면 또한 평면이다. 640 x 480 또는 1024 x 960과 같은 픽셀은 단순히 색에 대한 정보로 거리와 같이 공간감을 주지는 않는다.

 

카메라가 영상을 구성하기 위해 필요한 것은 충분한 빛이다. 빛은 직선성을 갖고 있으나 이를 최대한 넓은 영역에서 굴절시켜 한 곳(투영점)에 수렴시켜주면 많은 양의 빛을 얻을 수 있다. 이러한 역할을 하는 것이 렌즈이다. 렌즈는 충분한 빛을 제공하지만, 제조 공정에서 왜곡이 발생한다. 아래의 사진을 보자.

 

 

아이폰 12 미니로 찍은 사진

 

 

분명히 노트북을 정면에서 찍었는데 노트북 상단 왼쪽과 오른쪽 모서리에 곡선이 생겼다.애플이 일을 안 했다는 건 아니고.. 무튼 왜곡이 정말 심한 경우를 제외하고선 이미지의 중심보다 가장자리에 갈수록 왜곡이 심해졌다.

 

이는 렌즈 특성상 렌즈의 중심에서 멀어질수록 방사형 왜곡(Radial Distortion)이 심해지기 때문이며 카메라 제작 시 내부 구조(렌즈와 센서)가 100% 수평을 이루지 않는 경우에 생기는 접선형 왜곡(Tangential Distortion) 때문이다. 두 가지의 유형의 왜곡으로 인해 원래와는 다른 좌표에 투영되어 직선이어야 할 부분이 곡선이 되는 결과가 나오는 것이다.

 

이러한 왜곡을 보정하기 위해서는 카메라 고유 값을 통해 교정 패턴을 얻어야한다. 보정에 필요한 카메라 내부, 외부 파라미터를 통해 복잡한 계산을 거쳐 왜곡을 보정할 수 있는데 이러한 것들을 ROS 패키지를 통해 간소화 할 수 있다.

 

 

 


② Camera Calibration 과정

 

먼저 아래에 ROS에서 제공하는 카메라 유형별 Calibration 튜토리얼 사이트를 첨부한다. 각자 본인의 카메라에 맞는 것을 택하여 진행하기 바란다.

 

 

☞ Monocular Camera

 

 

camera_calibration/Tutorials/MonocularCalibration - ROS Wiki

Note: This tutorial assumes that you have completed the previous tutorials: ROS Tutorials. Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of y

wiki.ros.org

 

 

☞ Stereo Camera

 

 

camera_calibration/Tutorials/StereoCalibration - ROS Wiki

Note: This tutorial assumes that you have completed the previous tutorials: ROS Tutorials. Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of y

wiki.ros.org

 

 

 

 

 

※ 체커보드 다운로드

 

 

 

첨부한 링크에서 PDF 파일 형식으로 제공하고 이를 PNG 이미지 파일 형식으로 재첨부하였다. 진행에 필요하니 다운받도록하고 체스보드는 8x6이며 A4 용지로 출력했을 때 사각형 하나의 길이가 28cm이었다. 노드를 실행할 때 8x6 --size 파라미터에 28cm는 --square 파라미터에 0.028로 입력하여 실행해야한다.

 

 

 

 

※ 컴파일링

 

 

터미널에 rosdep install camera_calibration를 입력하여 진행한다. rosdep 명령어는 ROS 저장소로부터 해당 패키지(camera_calibration)에 대한 의존성을 파악하여 패키지 실행에 필요한 의존성 패키지를 함께 설치해주는 명령어이다.

 

 

rosdep 설치나 자세한 사항은 아래 링크에서 확인할 수 있다.

 

rosdep - ROS Wiki

rosdep is a command-line tool for installing system dependencies. New documentation As of ROS fuerte, rosdep is now a stand-alone tool that you can download and use separately: External rosdep documentation. Quick reference Installing rosdep Do prefer apt

wiki.ros.org

 

 

 

 

위 내용은 해당 노드를 실행했을 때 rostopic list에 /camera 관련 토픽이 출력된다는 의미이다. 각 토픽에서 /camera/camera_info는 카메라의 정보를, /camera/image_raw는 카메라에서 얻은 이미지를 열로 표현한 값을 출력한다. 

 

 

 

※ Calibration Node 실행

 

 

위에 camera_calibration 노드를 실행할 때 예시를 보여주고 있다. 앞서 체커보드에서 말했듯 --size에는 체커보드의 행x열을 --square에는 체커보드의 사각형 길이를 의미한다. image와 camera 부분에는 본인의 카메라에 대한 정보를 기입하면 된다.

 

 

 

Jetson Nano는 /dev/video0, /dev/video1로 0과 1 인덱스 두 가지 안에서 옮겨가며 영상을 출력했던 것으로 기억하는데 보통은 index를 0으로 입력했을 때 됐다. 깃허브에 있는 ROS 오픈소스를 사용할 때 카메라 index는 1이 default 값인듯하니 문제가 있으면 먼저 index를 0으로 바꾸고 사용해보자.

 

 

 

 

☞ usb_cam 설치

필자는 image:=/camera/image_raw를 입력했을 때 화면이 나오지 않았다. 그래서 usb_cam 패키지 설치를 추천한다. 

 

설치 확인은 아래의 명령어로 할 수 있다.

 

 

rospack find usb_cam

 

 

터미널에 두 가지 명령만 적어주면 된다.

 

rosdep install usb_cam
sudo apt install ros-melodic-usb-cam*

 

 

cv_bridge를 통해 bgr8 이미지 포맷으로 /usb/cam의 영상을 띄운 결과이다. 잘 작동되는 것을 확인할 수 있다.

 

 

 

 

 

 

 

usb_cam이 잘 작동되는 것이 확인됐으니 터미널에 아래 명령어를 입력하여 camera_calibration 노드를 실행해보자.

 

 

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.028 image:=/usb_cam/image_raw camera:=/usb_cam

 

 

 

 

 

체커보드를 카메라에 비추면 위 사진처럼 무지개 연결선이 생긴다. 오른쪽에는 X, Y, Size, Skew가 있는데 이는 맨 처음부터 연두색 선으로 되어있지 않고 사용자가 체커보드를 돌려가면서 채워진 것이다. 체커보드를 천천히 돌려가면서 연두색 선으로 변하게 만들어보자.

 

적당히 연두색으로 변하면 CALIBRATE 버튼을 누르자. 이 과정에서는 시간이 조금 걸릴 수도 있다. Jetson의 경우 방열판이 신이 잔뜩나서 손을 댈 수 없었다. 팬이나 물병을 올려놓아서 식혀주어야 한다.

 

 

 

 

CALIBRATE가 완료되고 나면 정보를 저장할 수 있는 버튼이 활성화된다. SAVE를 눌러 정보를 저장하자. 화면을 보면 실제로 가장자리의 곡선이 둔해진 느낌이 있다.

 

 

 

 

 


③ 결과 파일

 

 

 

 

SAVE 버튼을 클릭하여 마치고나면 실행중인 터미널에 위와 같이 데이터 파일이 어디에 저장됐는지 나온다. 

 

 

 

 

/tmp 디렉터리를 찾아가보면 압축 파일이 하나 있다. 이것을 들고 홈으로 가자. 홈에서 숨긴 파일 보이기를 활성화하면 디렉터리명 앞에 . 이 붙어 있는 숨김 파일들이 나온다. 이중에 .ros 를 찾고 안에다가 calibration 압축 파일을 복사한 후 압축 해제하자.

 

 

 

 

압축 파일 안에는 사용자가 체커보드를 돌리면서 X, Y, Size, Skew 값을 어떻게 높였는지에 대한 순간 이미지들이 있고 calibration 정보들이 있다. 이중에 필요한건 ost.yaml 파일이다.

 

 

 

 

ost.yaml 파일을 실행하면 카메라 왜곡 보정에 대한 내용이 나온다. 이 파일을 ~/.ros/camera_info 에 넣어주면 ROS에서 calibration 정보를 참고할 때 자동으로 파일을 선택해준다.

 

 

 

 

 

 

 

 

 

 

 

반응형