Camera Calibration (1)

 

 

🐣 0. 시작하기 전에

 

ROS (Robot Operating System)를 통해 3D 재구성 / 객체 인식 등을 하기 위한 첫걸음으로
Ubuntu 20.04 + ROS Noetic + Realsense 카메라 + YOLO를 기반으로 실시간 객체 인식까지 가는 과정을 기록했습니다.


🛠️ 1. 준비된 환경

 

  • Ubuntu 20.04
  • ROS Noetic 설치
  • 사용 카메라: Realsense
  • CUDA + cuDNN 설치

 

🧩 2. 카메라 캘리브레이션

 

✅ 목표

 

카메라의 렌즈 왜곡 보정하기 ➡️ 정확한 3D 재구성 or 물체 탐지를 위해 필요함.

 

📝 진행 순서

 

1. 체커보드 출력

  • [체커보드 PDF 링크]
  • A4 용지에 체커보드 패턴 출력
  • A4용지에 100% 비율(크기 조절 없이)로 인쇄하고, 딱딱한 판자 등에 붙인다.
  • 보통 많이 쓰는 패턴: 9x6 (체스판의 내부 코너 기준)

주의점

  • 칸 수는 내부 코너 개수로 입력해야 함. (9x6이면 실제 격자는 10x7)
  • 인쇄 품질이 중요.  왜곡되면 정확한 캘리브레이션이 안됌.

 

2. 카메라 노드 실행

# realsense 카메라 예시
roslaunch realsense2_camera rs_camera.launch

 

3. 캘리브레이션 도구 실행

rosrun camera_calibration cameracalibrator.py \
  --size 7x6 --square 0.024 \
  --no-service-check \
  image:=/camera/color/image_raw \
  camera:=/camera/color

 

4. 캘리브레이션 과정

  • 체커보드를 여러 각도에서 보여줌
  • Success 메시지가 뜨면 /tmp/calibrationdata.tar.gz 에 저장됨

 

5. 결과 적용

  • 저장한 결과 압축파일 해제
cd /tmp
tar -xvzf calibrationdata.tar.gz
  • yaml 파일을 camera_info에 적용해야 함 (노드에서 직접 적용 or launch 파일 수정)
<!-- launch/realsense_with_calib.launch -->
<launch>
  <node pkg="image_proc" type="image_proc" name="image_proc" output="screen">
    <remap from="image" to="/camera/color/image_raw" />
    <remap from="camera" to="/camera/color" />
    <param name="camera_info_url" value="file:///home/your-name/realsense_calib.yaml" />
  </node>
</launch>

 

🧠 3. YOLO로 실시간 객체 인식

 

✅ 목표

 

YOLO를 이용해 카메라 영상 속 객체를 실시간으로 탐지

 

YOLO v5 설치

 

🐍 YOLO 노드(Python) 예시

 
#!/usr/bin/env python

import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import torch

class YOLODetector:
    def __init__(self):
        self.model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
        self.bridge = CvBridge()
        self.sub = rospy.Subscriber("/camera/color/image_raw", Image, self.callback)
        self.pub = rospy.Publisher("/yolo_output", Image, queue_size=1)

    def callback(self, msg):
        img = self.bridge.imgmsg_to_cv2(msg, "bgr8")
        results = self.model(img)
        results.render()
        img_out = self.bridge.cv2_to_imgmsg(results.ims[0], "bgr8")
        self.pub.publish(img_out)

if __name__ == "__main__":
    rospy.init_node("yolo_detector")
    YOLODetector()
    rospy.spin()

 

🚀 launch 파일 예시

<launch>
  <node pkg="3d_reconstruct" type="yolo_detector_node.py" name="yolo_detector" output="screen" />
</launch>

 

 

🚧 4. 에러와 문제 해결

❌ Service not found

→ 카메라가 아직 제대로 실행되지 않았거나 topic 이름이 다를 수 있음

❌ rqt_image_view에서 이미지 안 나옴

→ 카메라 노드, 토픽 이름 확인 필요
→ image_raw 토픽이 제대로 퍼블리시되고 있는지 rostopic echo로 확인

❌ RLException launch 오류

→ roslaunch는 패키지 내부의 launch 폴더를 기준으로 작동함
→ 해당 파일이 실제로 있는지 확인하고, catkin_make로 다시 빌드 필요

 

 

✅ 5. 마무리하며

 

이 글에서는 ROS에서 카메라 캘리브레이션을 시작으로, YOLO를 이용해 객체 인식을 실시간으로 수행하는 방법까지 정리해봤습니다.
처음에는 어렵지만, 하다 보면 재미도 있고 성취감도 큽니다.
ROS + YOLO를 이용하면 카메라를 기반으로 하는 다양한 재밌는 애플리케이션을 만들어 볼 수 있습니다.

 

 

 

 

 

1