๐Ÿง  ORB-SLAM2 ๊ตฌ์กฐ ์ •๋ฆฌ


ORB-SLAM2๋Š” ์‹ค์‹œ๊ฐ„ Visual SLAM์„ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๋‹จ์ผ ์นด๋ฉ”๋ผ, ์Šคํ…Œ๋ ˆ์˜ค ์นด๋ฉ”๋ผ, RGB-D ์นด๋ฉ”๋ผ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ”ง 1. Tracking (์ถ”์ )

์‹ค์‹œ๊ฐ„์œผ๋กœ ์นด๋ฉ”๋ผ ์œ„์น˜๋ฅผ ์ถ”์ •ํ•˜๋Š” ๋ชจ๋“ˆ

  • ์ž…๋ ฅ: ์ด๋ฏธ์ง€ ํ”„๋ ˆ์ž„
  • ORB ํŠน์ง•์  ์ถ”์ถœ
  • ์ด์ „ ํ”„๋ ˆ์ž„๊ณผ์˜ ํŠน์ง•์  ๋งค์นญ
  • PnP or ICP ๋ฐฉ์‹์œผ๋กœ ์นด๋ฉ”๋ผ ํฌ์ฆˆ(6DoF) ์ถ”์ •
  • KeyFrame ์—ฌ๋ถ€ ํŒ๋‹จ
  • Relocalization ๊ธฐ๋Šฅ ํฌํ•จ (์œ„์น˜ ์ถ”์  ์‹คํŒจ ์‹œ ์žฌ์ธ์‹ ์‹œ๋„)

๐Ÿ—บ๏ธ 2. Local Mapping (๋กœ์ปฌ ์ง€๋„ ์ž‘์„ฑ)

ํ˜„์žฌ KeyFrame ์ฃผ๋ณ€์˜ ๊ตญ์†Œ์ ์ธ 3D ๋งต ์—…๋ฐ์ดํŠธ

  • KeyFrame์˜ ORB ํŠน์ง•์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๋งต ํฌ์ธํŠธ ์ƒ์„ฑ
  • ๊ธฐ์กด ํฌ์ธํŠธ์™€ ์—ฐ๊ฒฐํ•ด์„œ Local Bundle Adjustment ์ˆ˜ํ–‰
  • ์ฃผ๋ณ€ KeyFrame๋“ค๊ณผ์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„(์ฝ”๋น„์ „ ๊ทธ๋ž˜ํ”„)๋ฅผ ์—…๋ฐ์ดํŠธ

โ™ป๏ธ 3. Loop Closing (๋ฃจํ”„ ํด๋กœ์ €)

๋“œ๋ฆฌํ”„ํŠธ ๋ˆ„์ ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ์œ„์น˜ ์žฌ์ธ์‹ ๋ฐ ์ „์—ญ ๋ณด์ •

  • ์ƒˆ KeyFrame์ด ๊ณผ๊ฑฐ์— ๋ณธ ์žฅ์†Œ์™€ ๊ฒน์น˜๋Š”์ง€ ํƒ์ƒ‰
  • BoW (Bag of Words) ๋ฐฉ์‹์œผ๋กœ ์œ ์‚ฌ๋„ ํŒ๋‹จ
  • ๋ฃจํ”„๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด Pose Graph Optimization ์ˆ˜ํ–‰
  • ์ „์—ญ์ ์ธ Bundle Adjustment๋กœ ์ „์ฒด ์ง€๋„ ์ •ํ•ฉ

๐Ÿงฉ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์š”์•ฝ

[์ด๋ฏธ์ง€ ์ž…๋ ฅ] 
    โ†“
[Tracking] โ†’ KeyFrame ๊ฒฐ์ • โ†’ [Local Mapping] โ†” [Loop Closing]
    โ†“
[์‹ค์‹œ๊ฐ„ ์นด๋ฉ”๋ผ ์œ„์น˜ ์ถ”์ • (Pose)]

๐Ÿ”„ Sensor Fusion (์„ ํƒ์‚ฌํ•ญ)

  • ORB-SLAM2 ์ž์ฒด๋Š” IMU ๋ฏธ์ง€์›์ด์ง€๋งŒ,
  • ํ™•์žฅํŒ์ธ ORB-SLAM3์—์„œ๋Š” Visual-Inertial SLAM ์ง€์›๋จ (IMU + vSLAM ์œตํ•ฉ)

๐Ÿ’ก ํŠน์ง• ์š”์•ฝ

ํ•ญ๋ชฉ๋‚ด์šฉ
ํŠน์ง•์  ๋ฐฉ์‹ORB (FAST + BRIEF) ๊ธฐ๋ฐ˜
์ง€๋„ ๋ฐฉ์‹Sparse point map (์  ๊ธฐ๋ฐ˜ ์ง€๋„)
์นด๋ฉ”๋ผ ์ง€์›Mono, Stereo, RGB-D ๋ชจ๋‘ ๊ฐ€๋Šฅ
์ฝ”๋“œ ๊ตฌ์กฐC++ + OpenCV + Pangolin (์‹œ๊ฐํ™”)
์„ฑ๋Šฅ์‹ค์‹œ๊ฐ„ ๋™์ž‘ ๊ฐ€๋Šฅ, ์ •ํ™•๋„ ๋งค์šฐ ๋†’์Œ
๋‹จ์ ์ €์กฐ๋„, ๋ฐ˜์‚ฌ, ํ…์Šค์ฒ˜ ๋ถ€์กฑ ํ™˜๊ฒฝ์— ์•ฝํ•จ


๐Ÿงฉ A. ORB-SLAM2 + ROS ์—ฐ๋™

๐Ÿ“ฆ 1. ROS ํŒจํ‚ค์ง€ ์„ค์น˜

cd ~/catkin_ws/src
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
cd ORB_SLAM2
chmod +x build.sh
./build.sh
  • build.sh ์‹คํ–‰ ์‹œ Pangolin, OpenCV ๋“ฑ ์ž๋™ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.
  • catkin_make๋กœ ROS ํŒจํ‚ค์ง€ ๋นŒ๋“œ

๐Ÿ“ก 2. ROS ํ† ํ”ฝ ์—ฐ๊ฒฐ

ORB-SLAM2๋Š” sensor_msgs/Image์™€ sensor_msgs/CameraInfo๋ฅผ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.

rosrun ORB_SLAM2 Mono PATH_TO_VOC PATH_TO_CONFIG.yaml

์˜ˆ์‹œ:

rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml
  • /camera/image_raw ๋“ฑ์˜ ํ† ํ”ฝ์—์„œ ์‹ค์‹œ๊ฐ„ ์ด๋ฏธ์ง€ ์ˆ˜์‹ 
  • ORB-SLAM2๋Š” ๋‚ด๋ถ€์—์„œ geometry_msgs/PoseStamped ํ˜•ํƒœ๋กœ ์ถ”์ • ์œ„์น˜๋ฅผ ํผ๋ธ”๋ฆฌ์‹œํ•˜๊ฑฐ๋‚˜, TF ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋„ ๊ฐ€๋Šฅ

๐Ÿงญ 3. ์—ฐ๋™๋˜๋Š” ํ† ํ”ฝ

ํ† ํ”ฝ ์ด๋ฆ„๋ฉ”์‹œ์ง€ ํƒ€์ž…์„ค๋ช…
/camera/image_rawsensor_msgs/Image์นด๋ฉ”๋ผ ์˜์ƒ ์ž…๋ ฅ
/camera/camera_infosensor_msgs/CameraInfo์นด๋ฉ”๋ผ ๋‚ด์—ญ (์ดˆ์ ๊ฑฐ๋ฆฌ ๋“ฑ)
/orbslam2/posegeometry_msgs/PoseStamped์ถ”์ •๋œ ์นด๋ฉ”๋ผ ์œ„์น˜ ์ถœ๋ ฅ
/tfTF ๋ณ€ํ™˜์–ธ๋ฆฌ์–ผ ํ˜น์€ RViz์—์„œ ์‹œ๊ฐํ™”

๐ŸŽฎ B. ORB-SLAM2 + Unreal Engine ์—ฐ๋™

Unreal์€ ROS์™€ ์ง์ ‘ ํ†ต์‹ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ์ค‘๊ฐ„ ๋ธŒ๋ฆฟ์ง€๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ธ๋ฆฌ์–ผ์˜ Actor ์œ„์น˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• 1: ROS โ†” UDP/Socket โ†” Unreal

๐Ÿ“ก 1. ORB-SLAM2 โ†’ Pose ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ์ผ“์œผ๋กœ ์ „์†ก (Python ์˜ˆ์‹œ)

import socket
import rospy
from geometry_msgs.msg import PoseStamped

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
unreal_ip = '127.0.0.1'
unreal_port = 9876

def callback(pose_msg):
    x = pose_msg.pose.position.x
    y = pose_msg.pose.position.y
    z = pose_msg.pose.position.z
    data = f"{x},{y},{z}"
    sock.sendto(data.encode(), (unreal_ip, unreal_port))

rospy.init_node('orbslam2_udp_sender')
rospy.Subscriber('/orbslam2/pose', PoseStamped, callback)
rospy.spin()

๐ŸŽฎ 2. ์–ธ๋ฆฌ์–ผ์—์„œ ์ˆ˜์‹  (C++ or Blueprint via UDP)

  • Unreal Engine์—์„œ UDP ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ†ตํ•ด x, y, z ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ Actor ์œ„์น˜ ๊ฐฑ์‹ 
  • ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํ”Œ๋Ÿฌ๊ทธ์ธ: UE4 UDP Receiver Plugin

๋ฐฉ๋ฒ• 2: ROS Integration Plugin for Unreal

  • ROSIntegration Plugin ์‚ฌ์šฉ
    • ROS ๋ฉ”์‹œ์ง€๋ฅผ ์ง์ ‘ ์–ธ๋ฆฌ์–ผ์—์„œ ๊ตฌ๋… ๊ฐ€๋Šฅ
    • ์–ธ๋ฆฌ์–ผ Actor์— TF ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๋ฐ˜์˜

โš ๏ธ ์„ค์ •์ด ๋ณต์žกํ•˜๊ณ  ROS ๋ฒ„์ „, Unreal ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ์ด ๊นŒ๋‹ค๋กœ์›€


๐Ÿ ๊ฒฐ๋ก 

  • ROS ์—ฐ๋™์€ ์•ˆ์ •์ ์ด๊ณ  RViz ์‹œ๊ฐํ™”๊นŒ์ง€ ๊ฐ€๋Šฅ โ†’ ์—ฐ๊ตฌ ๋ฐ ์‹ค์ฆ ํ™˜๊ฒฝ์— ์ ํ•ฉ
  • Unreal ์—ฐ๋™์€ UDP ๋˜๋Š” ROS ๋ธŒ๋ฆฌ์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์‹ค์‹œ๊ฐ„ XR/AR ์‘์šฉ์— ์ ํ•ฉ
  • ์‹ค์ œ XR ๊ธฐ๋ฐ˜ ์œ„์น˜ ์ถ”์ ์ด๋‚˜ VR ๊ฒŒ์ž„์—์„œ ORB-SLAM2 ๊ฒฐ๊ณผ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•œ ๊ตฌ์กฐ

๐Ÿ“Œ ์š”์•ฝ ๋จผ์ €: PnP vs ICP

ํ•ญ๋ชฉPnP (Perspective-n-Point)ICP (Iterative Closest Point)
์ฃผ๋กœ ์“ฐ๋Š” ๋ฐ์ดํ„ฐ3D ํฌ์ธํŠธ โ†” 2D ์ด๋ฏธ์ง€ ์ขŒํ‘œ๋‘ ๊ฐœ์˜ 3D ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ
ํ•ต์‹ฌ ๋ชฉ์ ์นด๋ฉ”๋ผ ์œ„์น˜ ์ถ”์ • (PnP + RANSAC์œผ๋กœ ์ถ”์ • robust)ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ ๊ฐ„ ์ •ํ•ฉ (๋“ฑ๋ก/์ •๋ ฌ)
๋Œ€ํ‘œ ์‚ฌ์šฉ์ฒ˜๋น„์ฃผ์–ผ SLAM (ORB-SLAM, ARKit ๋“ฑ)๋ผ์ด๋‹ค ๊ธฐ๋ฐ˜ SLAM, 3D ์Šค์บ” ์ •ํ•ฉ
์—ฐ์‚ฐ๋Ÿ‰์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์Œ์ƒ๋Œ€์ ์œผ๋กœ ํผ
์š”๊ตฌ ์กฐ๊ฑด3D ๋งตํฌ์ธํŠธ์™€ ์ด๋ฏธ์ง€์ƒ ํŠน์ง•์  ๋งค์นญ ํ•„์š”์ •๋ฐ€ํ•œ 3D ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ ํ•„์š”

๐Ÿ” 1. PnP (Perspective-n-Point)

โœ”๏ธ ๋ชฉ์ :

3D ํฌ์ธํŠธ + 2D ์ด๋ฏธ์ง€์ƒ ๋Œ€์‘์ ์ด ์žˆ์„ ๋•Œ,
์นด๋ฉ”๋ผ์˜ 6DoF ํฌ์ฆˆ (์œ„์น˜ + ํšŒ์ „)๋ฅผ ์ถ”์ •ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

โœ”๏ธ ์ž…๋ ฅ:

  • 3D ์ ๋“ค (์›”๋“œ ์ขŒํ‘œ๊ณ„ ์ƒ์˜ ๋งตํฌ์ธํŠธ๋“ค)
  • ํ•ด๋‹น ์ ์ด ์นด๋ฉ”๋ผ ์ด๋ฏธ์ง€์— ์ฐํžŒ 2D ์ขŒํ‘œ๋“ค
  • ์นด๋ฉ”๋ผ ๋‚ด๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ (์ดˆ์  ๊ฑฐ๋ฆฌ ๋“ฑ)

โœ”๏ธ ๋™์ž‘ ๋ฐฉ์‹:

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ 3Dโ†”2D ์Œ์ด ์žˆ์œผ๋ฉด, ์ˆ˜ํ•™์ ์œผ๋กœ ์ด๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์นด๋ฉ”๋ผ ์œ„์น˜์™€ ๋ฐฉํ–ฅ(R, t) ์„ ์—ญ์œผ๋กœ ๊ณ„์‚ฐ
  • ๋ณดํ†ต EPnP, RPnP, RANSAC PnP ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ๋…ธ์ด์ฆˆ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๊ฒŒ ๊ฐœ์„ 

โœ”๏ธ ์˜ˆ์‹œ:

cv2.solvePnP(points_3d, points_2d, K, distCoeffs)

๐Ÿ” 2. ICP (Iterative Closest Point)

โœ”๏ธ ๋ชฉ์ :

๋‘ ๊ฐœ์˜ 3D ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ,
์„œ๋กœ ์–ด๋–ป๊ฒŒ ๊ฒน์ณ์•ผ ๊ฐ€์žฅ ์ž˜ ๋งž๋Š”์ง€(๋ณ€ํ™˜ํ–‰๋ ฌ R, t)๋ฅผ ์ถ”์ •ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

โœ”๏ธ ์ž…๋ ฅ:

  • ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ A (๊ธฐ์ค€)
  • ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ B (์ด๋™ ๋Œ€์ƒ)

โœ”๏ธ ๋™์ž‘ ๋ฐฉ์‹:

  1. B์˜ ๊ฐ ํฌ์ธํŠธ์— ๋Œ€ํ•ด A์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํฌ์ธํŠธ ์ฐพ๊ธฐ
  2. ๋Œ€์‘์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ตœ์ ์˜ ๋ณ€ํ™˜(R, t)์„ ๊ณ„์‚ฐ
  3. B์— ์ ์šฉํ•˜๊ณ , ์˜ค์ฐจ๊ฐ€ ์ค„์–ด๋“ค ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

โœ”๏ธ ์˜ˆ์‹œ:

  • LiDAR SLAM
  • 3D ์Šค์บ๋‹ ๋ชจ๋ธ ์ •ํ•ฉ
pcl::IterativeClosestPoint<PointT, PointT> icp;
icp.setInputSource(cloud_source);
icp.setInputTarget(cloud_target);
icp.align(cloud_aligned);

๐ŸŽฏ ์‹ค์ œ SLAM ์‹œ์Šคํ…œ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋‚˜?

์ƒํ™ฉ์‚ฌ์šฉ ๋ฐฉ์‹
ORB-SLAM, ARKit ๋“ฑ ๋น„์ฃผ์–ผ SLAMPnP ์‚ฌ์šฉ
LiDAR ๊ธฐ๋ฐ˜ SLAM (e.g., Cartographer, LOAM)ICP ์‚ฌ์šฉ
RGB-D SLAMPnP + Depth or ICP ํ˜ผ์šฉ ๊ฐ€๋Šฅ

โœ… ํ•œ์ค„ ์ •๋ฆฌ

  • PnP๋Š” “2D ์ด๋ฏธ์ง€์—์„œ ๋ณด๊ณ  ์žˆ๋Š” 3D ํฌ์ธํŠธ๋กœ๋ถ€ํ„ฐ ์นด๋ฉ”๋ผ ์œ„์น˜๋ฅผ ์œ ์ถ””
  • ICP๋Š” “๋‘ ๊ฐœ์˜ 3D ์  ๊ตฌ๋ฆ„์„ ์ •๋ ฌํ•ด์„œ ์ƒ๋Œ€ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐ”

๋‘˜ ๋‹ค SLAM, AR, 3D ์žฌ๊ตฌ์„ฑ์—์„œ ํ•ต์‹ฌ์ ์ธ ์œ„์น˜ ์ถ”์ • ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.


์ด์ œ PnP (Perspective-n-Point) ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜ํ•™์  ์œ ๋„๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…๋“œ๋ฆด๊ฒŒ์š”.
๋‹ค์†Œ ์ˆ˜ํ•™์ ์ธ ๋‚ด์šฉ์ด์ง€๋งŒ, ํ•ต์‹ฌ์€ 2D ์ด๋ฏธ์ง€์— ๋ณด์ด๋Š” ์ ์ด ์‹ค์ œ 3D ๊ณต๊ฐ„์˜ ์–ด๋А ์œ„์น˜์— ๋Œ€์‘ํ•˜๋Š”์ง€๋ฅผ ํ†ตํ•ด ์นด๋ฉ”๋ผ์˜ ์œ„์น˜์™€ ์ž์„ธ(R, t)๋ฅผ ์ถ”์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๐Ÿ“Œ ๋ฌธ์ œ ์ •์˜: PnP๋ž€?

N๊ฐœ์˜ 3D ํฌ์ธํŠธ XiโˆˆR3\mathbf{X}_i \in \mathbb{R}^3 ์™€
๊ทธ์— ๋Œ€์‘ํ•˜๋Š” ์ด๋ฏธ์ง€ ๋‚ด 2D ํฌ์ธํŠธ xiโˆˆR2\mathbf{x}_i \in \mathbb{R}^2 ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ,
์นด๋ฉ”๋ผ์˜ ํšŒ์ „ ํ–‰๋ ฌ RโˆˆSO(3)\mathbf{R} \in SO(3) ๊ณผ ์ด๋™ ๋ฒกํ„ฐ tโˆˆR3\mathbf{t} \in \mathbb{R}^3 ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ


๐Ÿ”ง 1. ์นด๋ฉ”๋ผ ํˆฌ์˜ ๋ชจ๋ธ

๐ŸŒ ์›”๋“œ์ขŒํ‘œ โ†’ ์นด๋ฉ”๋ผ์ขŒํ‘œ

Xc=Rโ‹…Xw+t\mathbf{X}_c = \mathbf{R} \cdot \mathbf{X}_w + \mathbf{t}

๐Ÿ” ์นด๋ฉ”๋ผ์ขŒํ‘œ โ†’ ์ด๋ฏธ์ง€์ขŒํ‘œ

xi=Kโ‹…[Rโˆฃt]โ‹…[Xw1]\mathbf{x}_i = \mathbf{K} \cdot [\mathbf{R} | \mathbf{t}] \cdot \begin{bmatrix} \mathbf{X}_w \\ 1 \end{bmatrix}

์—ฌ๊ธฐ์„œ:

  • xi=(ui,vi,1)T\mathbf{x}_i = (u_i, v_i, 1)^T: ์ด๋ฏธ์ง€์˜ homogeneous ์ขŒํ‘œ
  • K\mathbf{K}: ์นด๋ฉ”๋ผ ๋‚ด๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ ํ–‰๋ ฌ

K=[fx0cx0fycy001]\mathbf{K} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}


๐ŸŽฏ 2. ์ตœ์†Œ ์กฐ๊ฑด

  • ์ตœ์†Œ 3์  ์ด์ƒ ํ•„์š” (Perspective-3-Point)
  • ์‹ค์ œ๋กœ๋Š” 4์  ์ด์ƒ์œผ๋กœ ๊ณผ์ž‰ ๊ฒฐ์ •(overdetermined) โ†’ ์ตœ์†Œ์ž์Šน๋ฒ• (Least Squares) ์‚ฌ์šฉ

๐Ÿ” 3. ๋น„์„ ํ˜• ์ตœ์ ํ™” ๋ฌธ์ œ๋กœ ์ •์˜

minโกR,tโˆ‘i=1Nโˆฅxiโˆ’ฯ€(Rโ‹…Xi+t)โˆฅ2\min_{\mathbf{R}, \mathbf{t}} \sum_{i=1}^{N} \left\| \mathbf{x}_i – \pi(\mathbf{R} \cdot \mathbf{X}_i + \mathbf{t}) \right\|^2

  • ฯ€(โ‹…)\pi(\cdot): 3D โ†’ 2D ํ”„๋กœ์ ์…˜ ํ•จ์ˆ˜ (์นด๋ฉ”๋ผ ๋‚ด๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ ํฌํ•จ)

ฯ€(Xc)=[fxโ‹…XcZc+cxfyโ‹…YcZc+cy]\pi(\mathbf{X}_c) = \begin{bmatrix} f_x \cdot \frac{X_c}{Z_c} + c_x \\ f_y \cdot \frac{Y_c}{Z_c} + c_y \end{bmatrix}

  • ์ด ์‹์€ ๋น„์„ ํ˜•์ด๋ฏ€๋กœ Levenberg-Marquardt ์ตœ์ ํ™” ๋˜๋Š” EPnP ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ™์€ ๊ทผ์‚ฌ ๊ธฐ๋ฒ• ์‚ฌ์šฉ

๐Ÿง  4. RANSAC PnP

์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋งค์นญ๋œ ์  ์ค‘ ์ผ๋ถ€๊ฐ€ **์˜ค๋ฅ˜(outlier)**์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,
PnP๋Š” ๋ณดํ†ต RANSAC๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  1. 4~6๊ฐœ์˜ ๋žœ๋ค ๋Œ€์‘์  ์„ ํƒ
  2. PnP๋กœ R, t ๊ณ„์‚ฐ
  3. ๋‚˜๋จธ์ง€ ์ ์— ๋Œ€ํ•ด reprojection error ๊ณ„์‚ฐ
  4. ์˜ค์ฐจ๊ฐ€ ์ž‘์€ ์ ๋“ค(inliers)์˜ ๊ฐœ์ˆ˜๋กœ ๋ชจ๋ธ ํ‰๊ฐ€
  5. ์—ฌ๋Ÿฌ ๋ฐ˜๋ณต ์ค‘ ๊ฐ€์žฅ ์ข‹์€ ๋ชจ๋ธ ์„ ํƒ

โœ… ์š”์•ฝ ์ •๋ฆฌ

๋‹จ๊ณ„์„ค๋ช…
1.3D โ†” 2D ๋Œ€์‘์  ํ™•๋ณด
2.ํˆฌ์˜ ๋ชจ๋ธ ์ˆ˜์‹์œผ๋กœ ์œ„์น˜(R, t) ์ถ”์ •
3.๋น„์„ ํ˜• ์ตœ์ ํ™”๋กœ ์˜ค์ฐจ ์ตœ์†Œํ™”
4.RANSAC๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด outlier์— ๊ฐ•์ธํ•จ

์ฝ”๋ฉ˜ํŠธ

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค