ArUco 마커 기본 개념

1. ArUco 마커란?

ArUco 마커는 정사각형 형태의 fiducial marker입니다. Fiducial marker는 카메라나 비전 시스템이 위치, 방향, 크기, 기준점을 쉽게 인식할 수 있도록 만든 기준 표식입니다.

QR 코드와 비슷하게 보이지만 목적은 다릅니다. QR 코드는 주로 URL, 문자열, 데이터 저장에 초점이 있고, ArUco 마커는 로봇이나 카메라가 다음 정보를 빠르게 계산하는 데 초점이 있습니다.

  • 이 마커가 몇 번 ID인지
  • 카메라 기준으로 어디에 있는지
  • 어느 방향으로 회전되어 있는지
  • 로봇이나 드론이 이 정보를 어떻게 제어에 활용할지

OpenCV의 ArUco 기능은 detectMarkers() 함수를 중심으로 동작합니다. 이 함수는 입력 이미지에서 지정된 dictionary에 포함된 마커를 찾고, 검출 결과로 마커 ID와 네 개의 코너 좌표를 반환합니다. 단, detectMarkers() 자체가 pose estimation까지 수행하는 것은 아닙니다. 자세 추정에는 코너 좌표, 실제 마커 크기, 카메라 보정값이 추가로 필요합니다.

2. ArUco 마커의 물리적 구조

ArUco 마커는 구조적으로 다음 요소로 구성됩니다.

구성 요소설명
흰색 여백마커 주변 배경과 분리하기 위한 인쇄 여백입니다. 검출 안정성에 중요합니다.
검은색 외곽 테두리이미지에서 사각형 후보를 빠르게 찾기 위한 기준 영역입니다. 보통 1비트 두께입니다.
내부 이진 행렬실제 ID를 표현하는 흑백 비트 영역입니다.
네 개의 코너카메라 pose 추정에 쓰이는 2D 기준점입니다.
Dictionary사용할 수 있는 마커 ID와 비트 패턴의 집합입니다.
실제 출력 크기pose 추정에서 거리 계산에 필요한 실제 한 변 길이입니다.

간단히 보면 다음과 같은 구조입니다.

┌───────────────────────┐
│ █ █ █ █ █ █ █         │  ← 검은색 외곽 border
│ █ 0 1 1 0 1 █         │
│ █ 1 0 0 1 0 █         │  ← 내부 binary matrix
│ █ 0 0 1 1 1 █
│ █ 1 1 0 0 0 █
│ █ 0 1 0 1 1 █
│ █ █ █ █ █ █ █         │  ← 검은색 외곽 border
└───────────────────────┘

여기서 중요한 점은 마커 전체가 ID를 의미하는 것이 아니라, 내부의 흑백 비트 패턴이 dictionary 안에서 특정 ID와 매칭된다는 것입니다.

3. 내부 비트 행렬과 전체 셀 구조

ArUco dictionary 이름에 나오는 4x4, 5x5, 6x6, 7x7은 내부 binary matrix 크기를 의미합니다.

Dictionary 이름내부 비트 크기내부 비트 수
DICT_4X4_504 × 416 bits
DICT_5X5_1005 × 525 bits
DICT_6X6_2506 × 636 bits
DICT_7X7_10007 × 749 bits

OpenCV에서 마커를 생성할 때 borderBits 값을 지정할 수 있고, 기본값은 1입니다. 즉 내부 비트 한 칸과 같은 두께의 검은 테두리가 기본으로 들어갑니다.

내부 비트 크기를 N × N, 테두리 두께를 B라고 하면 전체 마커의 셀 크기는 다음과 같습니다.

전체 셀 수 = (N + 2B) × (N + 2B)

예를 들어 DICT_5X5이고 borderBits = 1이면 다음과 같습니다.

내부: 5 × 5
테두리: 상하좌우 1칸씩
전체: (5 + 2×1) × (5 + 2×1) = 7 × 7

즉 실제 인쇄된 마커는 내부 5×5만 있는 것이 아니라, 검은 테두리를 포함해 7×7 셀 구조로 봐야 합니다.

4. Dictionary와 ID 구조

ArUco에서 dictionary는 사용할 수 있는 마커 패턴들의 목록입니다. 쉽게 말하면 “이 프로젝트에서 유효한 마커 ID와 비트 패턴의 집합”입니다.

예를 들어 다음 dictionary를 보겠습니다.

DICT_6X6_250

의미는 다음과 같습니다.

6X6  → 내부 비트 행렬이 6 × 6
250 → 사용 가능한 마커 개수가 250개

따라서 ID 범위는 보통 다음과 같습니다.

0 ~ 249

중요한 점은 ID가 내부 비트를 단순히 2진수에서 10진수로 바꾼 값이 아니라는 것입니다. ArUco ID는 해당 dictionary 안에서의 인덱스입니다.

예를 들어 카메라가 읽은 내부 비트 패턴이 dictionary 안의 23번째 패턴과 일치하면 결과는 다음과 같습니다.

id = 23

즉 ArUco ID는 “패턴 자체의 숫자값”이 아니라 “dictionary 안에서 몇 번째 패턴인가”를 의미합니다.

5. 회전 인식 구조

ArUco 마커는 실제 환경에서 0도, 90도, 180도, 270도로 회전된 상태로 보일 수 있습니다. 따라서 검출기는 내부 비트 패턴을 네 방향으로 돌려 보면서 dictionary와 비교합니다.

이 과정이 중요한 이유는 pose 추정 때문입니다. 검출기는 단순히 사각형을 찾는 것에서 끝나지 않고, 각 코너가 원래 몇 번째 코너인지 알아야 합니다.

일반적인 코너 순서는 다음과 같습니다.

corner 0: 좌상단
corner 1: 우상단
corner 2: 우하단
corner 3: 좌하단

마커가 카메라에 비스듬히 보이거나 회전되어 보여도, 검출기는 원래 기준의 코너 순서를 복원해야 합니다. 그래야 마커 좌표계와 카메라 좌표계를 정확히 연결할 수 있습니다.

6. 검은 테두리의 역할

검은 테두리는 단순한 장식이 아닙니다. 검출 안정성에 직접 영향을 주는 핵심 구조입니다.

첫째, 이미지에서 사각형 후보를 빠르게 찾게 해줍니다. 흑백 대비가 강하기 때문에 contour 검출에 유리합니다.

둘째, 내부 비트 영역을 안정적으로 분리합니다. 테두리가 없으면 배경 패턴과 내부 비트가 섞여 오검출이 늘어납니다.

셋째, 검출기가 “이 사각형이 진짜 ArUco 후보인지” 판단하는 데 도움을 줍니다. 기본적으로 border 비트는 검은색이어야 하며, OpenCV의 detector parameter에는 border 안에 허용되는 흰색 오류 비트 비율을 제어하는 항목도 있습니다.

7. 오류 검출과 보정 구조

ArUco dictionary는 아무 비트 패턴이나 모아둔 것이 아닙니다. 마커들 사이의 Hamming distance가 고려됩니다.

Hamming distance는 두 비트 패턴이 몇 비트나 다른지를 의미합니다.

예를 들어 다음 두 패턴이 있다고 하겠습니다.

A: 1 0 1 1 0
B: 1 1 1 0 0
      ↑  ↑
차이 = 2 bits

dictionary 안의 마커들끼리 충분히 멀리 떨어져 있으면, 일부 비트가 노이즈나 블러로 잘못 읽혀도 원래 마커를 복구할 수 있습니다.

실전에서는 필요한 마커 개수가 적으면 큰 dictionary를 무조건 쓰는 것보다 작은 dictionary를 쓰는 편이 더 안전합니다. 예를 들어 10개 마커만 필요하다면 DICT_6X6_1000보다 더 작은 dictionary나 커스텀 10개 dictionary가 오검출에 강할 수 있습니다.

8. ArUco 마커 검출 과정

ArUco 검출은 대략 다음 순서로 진행됩니다.

카메라 이미지 입력
        ↓
흑백/threshold 처리
        ↓
사각형 contour 후보 찾기
        ↓
perspective 보정
        ↓
내부 grid 셀 샘플링
        ↓
흑/백 bit 판정
        ↓
dictionary와 비교
        ↓
ID와 4개 코너 반환

OpenCV는 지정된 dictionary에 포함된 마커만 검출합니다. 검출 결과로는 보통 다음 정보를 얻습니다.

  • 마커 ID
  • 네 개의 2D 코너 좌표
  • rejected candidate 후보
  • pose 추정에 필요한 입력값

9. Pose 추정 원리

ArUco 마커 하나는 네 개의 코너를 제공합니다.

P0 ───── P1
│              │
│              │
P3 ───── P2

카메라는 이미지에서 이 네 점의 2D 좌표를 얻습니다.

image points:
(u0, v0), (u1, v1), (u2, v2), (u3, v3)

그리고 실제 마커 크기를 알고 있으면 3D 좌표를 정의할 수 있습니다. 예를 들어 마커 한 변이 L이면 다음과 같이 둘 수 있습니다.

object points:
(-L/2,  L/2, 0)
( L/2,  L/2, 0)
( L/2, -L/2, 0)
(-L/2, -L/2, 0)

이 3D-2D 대응관계를 이용해 solvePnP 방식으로 카메라 기준 마커의 위치와 자세를 계산합니다.

결과는 보통 다음 형태입니다.

translation vector → 마커 위치 x, y, z
rotation vector    → 마커 회전 정보

예를 들어 다음 값이 나왔다고 하겠습니다.

tvec = [0.05, 0.00, 0.50]

이 값은 대략 다음 의미로 볼 수 있습니다.

x = 0.05 m  → 마커가 카메라 중심보다 오른쪽에 있음
y = 0.00 m  → 높이 방향 차이가 거의 없음
z = 0.50 m  → 카메라 앞쪽 0.50 m 거리에 있음

실제 정확도는 카메라 보정, 마커 크기, 조명, 초점, 영상 해상도에 따라 달라집니다.

10. Dictionary 선택 기준

실전에서는 다음 기준으로 dictionary를 선택하면 됩니다.

상황추천
가까운 거리, 마커 수 적음DICT_4X4_50, DICT_5X5_50
중간 거리, 안정성 필요DICT_5X5_100, DICT_6X6_250
많은 ID 필요DICT_6X6_1000, DICT_7X7_1000
오검출 줄이고 싶음필요한 개수보다 너무 큰 dictionary 피하기
먼 거리에서 인식비트 수가 너무 큰 마커 피하고, 마커 크기 키우기

큰 dictionary는 사용할 수 있는 ID가 많다는 장점이 있습니다. 하지만 마커 간 구분 여유가 줄어들 수 있고, 내부 비트 수가 많은 마커는 각 셀을 충분히 해상도 있게 촬영해야 합니다.

따라서 강의 초반이나 TurtleBot3 실습에서는 DICT_4X4_50 또는 DICT_5X5_100 정도가 적당합니다. 드론 착륙이나 조금 더 안정적인 인식을 원한다면 DICT_5X5_100 또는 DICT_6X6_250이 무난합니다.

11. 로봇과 드론에서 ArUco가 유용한 이유

로봇은 현실 공간에서 자기 위치와 주변 환경을 알아야 합니다. 하지만 실내에서는 GPS를 쓰기 어렵고, LiDAR나 카메라 기반 SLAM도 환경에 따라 오차가 생길 수 있습니다.

ArUco 마커는 이런 상황에서 단순하고 강력한 기준점 역할을 합니다.

예를 들어 벽에 ID 10번 마커를 붙이고, 충전 스테이션 근처에 ID 20번 마커를 붙였다고 가정합니다. TurtleBot3가 카메라로 ID 20번 마커를 발견하면 “충전 스테이션 근처에 왔다”고 판단할 수 있습니다.

또한 마커 중심 좌표가 영상 중앙보다 왼쪽에 있으면 로봇은 왼쪽으로 회전하고, 마커가 너무 작게 보이면 아직 멀리 있다고 판단할 수 있습니다.

ArUco 방식은 완벽한 자율주행 시스템은 아니지만, 교육과 실험에서는 매우 실용적입니다. 특히 “비전 인식 결과를 로봇 제어 명령으로 연결하는 방법”을 설명하기 좋습니다.

12. TurtleBot3 Burger와 ArUco 실습 구성

TurtleBot3 Burger에서 ArUco 실습을 하려면 기본적으로 다음 구성이 필요합니다.

  • TurtleBot3 Burger
  • Ubuntu 22.04 Server
  • ROS 2 Humble
  • TurtleBot3 ROS 2 소스 코드
  • USB 카메라 또는 Raspberry Pi Camera 계열 카메라
  • OpenCV
  • ArUco 마커 출력물
  • 원격 PC 또는 SSH 접속 환경
  • RViz2 또는 rqt_image_view
  • ROS 2 Python 또는 C++ 노드

TurtleBot3는 보통 원격 PC와 로봇 본체를 나누어 사용합니다. 실습 구조는 다음처럼 잡을 수 있습니다.

카메라
  ↓
ROS 2 Image Topic
  ↓
ArUco 인식 노드
  ↓
마커 ID / 중심 좌표 / 거리 / 자세 계산
  ↓
로봇 제어 노드
  ↓
/cmd_vel 발행
  ↓
TurtleBot3 이동

블로그나 강의 자료에는 다음 그림을 넣으면 좋습니다.

이미지 설명:
TurtleBot3 Burger의 카메라 영상이 ROS 2 토픽으로 들어오고,
ArUco 인식 노드가 마커 ID와 위치를 계산한 뒤,
로봇 제어 노드가 /cmd_vel을 발행하는 구조를 보여주는 그림

13. 카메라 연결 확인

먼저 TurtleBot3 Burger에 카메라가 정상적으로 연결되었는지 확인합니다.

ls /dev/video*

보통 USB 카메라는 /dev/video0로 잡힙니다.

카메라 장치 정보를 확인하려면 다음 패키지를 설치합니다.

sudo apt install v4l-utils
v4l2-ctl --list-devices

ROS 2에서 카메라 노드를 실행한 뒤 토픽을 확인합니다.

ros2 topic list

예상 토픽 예시는 다음과 같습니다.

/image_raw
/camera_info

14. OpenCV ArUco 기능 확인

Python에서 OpenCV ArUco 기능을 사용하려면 보통 다음 패키지가 필요합니다.

sudo apt update
sudo apt install python3-opencv

환경에 따라 cv2.aruco가 포함되지 않은 경우가 있습니다. 실습 전에는 반드시 아래처럼 확인합니다.

import cv2

print(cv2.__version__)
print(hasattr(cv2, "aruco"))

결과가 True이면 ArUco 모듈 사용이 가능합니다.

15. ArUco 마커 생성과 출력

마커는 OpenCV 코드로 직접 생성할 수 있습니다.

import cv2
import cv2.aruco as aruco

dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
marker_id = 1
marker_size = 400

marker_image = aruco.generateImageMarker(dictionary, marker_id, marker_size)
cv2.imwrite("aruco_marker_1.png", marker_image)

출력할 때 중요한 점은 실제 마커 크기를 정확히 알아야 한다는 것입니다. 예를 들어 A4 용지에 출력한 마커의 검은색 외곽 기준 한 변 길이가 10 cm라면, 코드에서 마커 크기를 0.10 m로 설정해야 합니다.

출력 시 주의할 점은 다음과 같습니다.

  • 흑백 대비가 선명해야 합니다.
  • 출력 후 마커가 찌그러지면 안 됩니다.
  • 마커 주변에 충분한 흰색 여백을 둡니다.
  • 검은색 농도가 진해야 합니다.
  • 코팅 반사나 조명 반사를 피합니다.
  • 카메라 초점이 흐리면 인식률이 떨어집니다.
  • 먼 거리에서 쓸수록 마커 물리 크기를 키워야 합니다.

블로그에는 다음 이미지를 넣으면 좋습니다.

이미지 설명:
DICT_4X4_50 사전의 ID 0번 ArUco 마커 예시.
실제 강의에서는 ID 0, 1, 2, 3번 마커를 출력해 ID별 동작을 실습할 수 있음.

16. 카메라 보정이 중요한 이유

ArUco 마커의 위치와 방향을 정확히 구하려면 카메라 보정이 필요합니다. 카메라 렌즈는 실제 세계를 완벽한 직선으로 찍지 않습니다. 특히 저가형 광각 카메라는 왜곡이 큽니다.

카메라 보정에서는 보통 다음 값을 구합니다.

  • 초점 거리
  • 광학 중심점
  • 렌즈 왜곡 계수
  • 카메라 행렬
  • 왜곡 보정 파라미터

ROS 2에서 카메라 보정 파일은 보통 YAML 형식으로 관리됩니다. camera_info_url 파라미터를 통해 카메라 보정 파일을 지정할 수 있으며, 파일 경로는 일반 로컬 경로가 아니라 URL 형식으로 넣어야 합니다.

예시는 다음과 같습니다.

file:///home/ubuntu/camera_calibration.yaml

카메라 보정 없이도 마커 ID 검출은 가능합니다. 하지만 마커까지의 거리, 방향, 3D 자세를 제대로 쓰려면 보정이 사실상 필수입니다.

강의에서는 다음 순서를 추천합니다.

1단계: 보정 없이 ID만 검출하기
2단계: 보정 후 거리와 자세 추정하기
3단계: 추정값을 이용해 로봇 제어하기

17. ROS 2 ArUco 인식 노드 구조

ROS 2에서 ArUco 인식 노드는 카메라 이미지를 구독하고, OpenCV로 마커를 검출한 뒤 결과를 다시 토픽으로 발행하는 구조로 만들 수 있습니다.

기본 구조는 다음과 같습니다.

구독:
  /image_raw
  /camera_info

처리:
  cv_bridge로 ROS Image 메시지를 OpenCV 이미지로 변환
  OpenCV ArUco로 마커 검출
  마커 ID, 중심 좌표, 거리, 방향 계산

발행:
  /aruco/detected_markers
  /aruco/pose
  /tf

Python으로 만들면 수업 난이도가 낮아지고, C++로 만들면 실제 로봇 시스템에 더 가깝습니다. 초급 강의에서는 Python을 추천하고, 중급 이후 C++로 포팅하는 방식이 좋습니다.

18. 마커 중심 좌표를 이용한 로봇 제어

가장 쉬운 응용은 마커를 화면 중앙에 오도록 로봇을 회전시키는 것입니다.

카메라 영상의 가로 크기가 640 px이라고 가정하면 영상 중앙은 320 px입니다.

image_center_x = 320

마커 중심 x좌표가 250 px이면 마커가 화면 왼쪽에 있는 것입니다. 마커 중심 x좌표가 400 px이면 마커가 화면 오른쪽에 있는 것입니다.

간단한 제어식은 다음과 같습니다.

error_x = marker_center_x - image_center_x
angular_z = -Kp * error_x

처음에는 Kp를 아주 작은 값으로 시작하는 것이 좋습니다.

Kp = 0.002

단, 실제 회전 방향 부호는 카메라 장착 방향과 로봇 좌표계에 따라 달라집니다. 따라서 현장에서 테스트하면서 +, - 부호를 반드시 확인해야 합니다.

19. 마커 거리 기반 접근 제어

ArUco 자세 추정을 사용하면 마커까지의 거리를 대략 계산할 수 있습니다. 일반적으로 tvec의 z값을 카메라 전방 거리로 사용합니다.

목표 거리를 0.4 m로 잡는다고 가정합니다.

target_distance = 0.4
current_distance = marker_z

error_z = current_distance - target_distance
linear_x = Kp_distance * error_z

마커가 1.0 m 앞에 있으면 로봇은 전진합니다. 마커가 0.3 m 앞에 있으면 목표보다 너무 가까우므로 정지하거나 후진합니다.

기본 동작 규칙은 다음과 같습니다.

마커가 보이지 않으면 천천히 회전하며 탐색
마커가 보이면 화면 중앙에 오도록 회전
마커가 중앙에 가까우면 앞으로 이동
목표 거리 안에 들어오면 정지
특정 ID의 마커라면 정해진 동작 수행

이 방식으로 “마커를 찾아가서 정지하는 TurtleBot3” 실습을 만들 수 있습니다.

20. 마커 ID를 이용한 동작 분기

ArUco 마커는 ID를 갖기 때문에 ID별로 다른 동작을 지정할 수 있습니다.

예시는 다음과 같습니다.

ID동작
0정지
1좌회전
2우회전
3직진
4충전 위치
5물류 픽업 위치
6물류 드롭 위치

간단한 코드 구조는 다음과 같습니다.

if marker_id == 1:
    cmd.angular.z = 0.3

elif marker_id == 2:
    cmd.angular.z = -0.3

elif marker_id == 0:
    cmd.linear.x = 0.0
    cmd.angular.z = 0.0

이 실습은 단순하지만 교육 효과가 큽니다. 학생들이 “영상 인식 결과가 로봇 행동을 바꾼다”는 것을 바로 확인할 수 있기 때문입니다.

21. TF와 ArUco 마커

ROS 2에서 위치와 자세를 다룰 때는 TF 개념이 중요합니다. ArUco 마커 자세 추정 결과를 TF로 발행하면 RViz2에서 마커 좌표계를 시각화할 수 있습니다.

예를 들어 다음과 같은 좌표계 관계를 만들 수 있습니다.

camera_link
  └── aruco_marker_0

로봇 전체 좌표계와 연결하면 다음처럼 확장할 수 있습니다.

map
  └── odom
      └── base_link
          └── camera_link
              └── aruco_marker_0

이 구조를 이해하면 ArUco 마커를 단순 검출이 아니라 로봇 위치 추정, 도킹, 작업 위치 보정에 사용할 수 있습니다.

RViz2에서는 다음 항목을 표시하면 좋습니다.

  • Camera Image
  • TF
  • Marker
  • RobotModel
  • LaserScan
  • Odometry

블로그에는 다음 이미지를 넣으면 좋습니다.

이미지 설명:
RViz2에서 camera_link 기준으로 aruco_marker_0 좌표축이 표시되는 화면.
마커의 위치와 방향을 직관적으로 확인할 수 있음.

22. TurtleBot3 Burger 실습 시 주의할 점

TurtleBot3 Burger는 크기가 작고 가볍기 때문에 카메라 장착 위치가 중요합니다. 카메라가 흔들리면 마커 인식 결과도 같이 흔들립니다.

실습 시에는 다음 사항을 지키는 것이 좋습니다.

  • 카메라를 단단히 고정합니다.
  • 카메라 높이를 마커 높이와 비슷하게 맞춥니다.
  • 카메라가 너무 위나 아래를 보지 않도록 합니다.
  • 마커는 평평한 벽이나 판에 붙입니다.
  • 조명 반사를 피합니다.
  • 로봇 속도를 너무 빠르게 하지 않습니다.
  • 마커가 영상에서 너무 작게 보이지 않도록 합니다.
  • 카메라 보정값을 정확히 사용합니다.
  • 마커 실제 크기를 코드에 정확히 입력합니다.
  • Wi-Fi 지연 때문에 원격 화면 확인이 느릴 수 있음을 고려합니다.

특히 Burger는 무게중심과 공간이 제한적입니다. 카메라를 너무 높게 달면 흔들림이 커질 수 있으므로 처음에는 낮고 단단한 위치에 장착하는 것이 좋습니다.

23. 로봇과 드론 적용 시 핵심 포인트

드론 착륙이나 로봇 docking에 쓸 때는 알고리즘보다 인쇄와 촬영 조건이 더 중요해지는 경우가 많습니다.

핵심 포인트는 다음과 같습니다.

  1. 마커는 완전한 정사각형으로 인쇄합니다.
  2. 흰색 여백을 충분히 확보합니다.
  3. 검은색 농도를 진하게 출력합니다.
  4. 코팅 반사를 피합니다.
  5. 마커 크기는 카메라 거리 기준으로 결정합니다.
  6. 카메라 캘리브레이션을 반드시 수행합니다.
  7. motion blur를 줄입니다.
  8. dictionary는 필요한 ID 개수보다 과하게 크게 잡지 않습니다.
  9. 먼 거리에서는 비트 수보다 마커 물리 크기와 카메라 해상도를 우선합니다.
  10. 마커가 가려지거나 오염될 경우를 대비한 백업 로직을 준비합니다.

드론 착륙용이면 DICT_5X5_100 또는 DICT_6X6_250 정도가 무난합니다. 멀리서 봐야 한다면 ID 개수 욕심보다 마커 크기, 카메라 해상도, 렌즈 초점, 조명 조건이 더 중요합니다.

24. ArUco 마커 응용 사례

1) 실내 위치 보정

실내 자율주행에서는 바퀴 오도메트리와 IMU만으로 위치를 추정하면 시간이 지날수록 오차가 누적됩니다. LiDAR SLAM을 사용하더라도 복도, 유리벽, 반복 구조 환경에서는 위치가 흔들릴 수 있습니다.

이때 벽이나 기둥에 ArUco 마커를 붙여두면, 로봇이 특정 마커를 볼 때마다 자기 위치를 보정할 수 있습니다.

예를 들어 ID 10번 마커의 실제 위치가 지도상 (x=2.0, y=1.0)이라고 알고 있다면, 로봇이 이 마커를 인식했을 때 현재 위치 추정값을 보정하는 데 사용할 수 있습니다.

2) 자동 도킹

충전 스테이션 위나 근처에 ArUco 마커를 붙이면 TurtleBot3가 충전 위치를 찾는 데 사용할 수 있습니다.

동작 흐름은 다음과 같습니다.

로봇이 충전 명령을 받음
        ↓
충전 스테이션 방향으로 이동
        ↓
카메라로 도킹 마커 탐색
        ↓
마커가 보이면 중앙 정렬
        ↓
목표 거리까지 천천히 접근
        ↓
마지막 구간에서 속도 감소
        ↓
접촉 또는 충전 상태 확인

실제 제품 수준의 도킹은 더 많은 센서와 안전 로직이 필요하지만, 교육용 실습에서는 ArUco만으로도 도킹 원리를 설명하기 좋습니다.

3) 물류 로봇 목적지 식별

창고나 실습장에 여러 위치를 만들고 각 위치마다 다른 ArUco ID를 붙일 수 있습니다.

예시는 다음과 같습니다.

ID위치
1입고 위치
2출고 위치
3검사 위치
4충전 위치
5대기 위치

TurtleBot3가 특정 위치에 도착했을 때 마커 ID를 확인하면, 현재 위치가 올바른 목적지인지 검증할 수 있습니다.

이 방식은 “지도 기반 Navigation + 비전 기반 최종 위치 확인” 구조로 확장할 수 있습니다.

4) 로봇 팔 작업 위치 보정

TurtleBot3 위에 소형 로봇 팔이나 그리퍼를 장착하는 경우, 작업 대상 근처에 ArUco 마커를 붙여 위치를 보정할 수 있습니다.

예를 들어 박스 위에 마커를 붙이면 로봇은 박스의 위치와 방향을 추정할 수 있습니다. 이 정보를 사용해 그리퍼가 박스 중심으로 접근하도록 만들 수 있습니다.

산업 현장에서도 마커 기반 위치 보정은 복잡한 3D 인식보다 간단하고 안정적인 방법으로 쓰일 수 있습니다. 다만 마커가 가려지거나 오염되면 인식이 실패할 수 있으므로 백업 로직이 필요합니다.

5) 교육용 미션 게임

ArUco 마커는 강의나 실습 대회에도 적합합니다.

예를 들어 다음과 같은 미션을 만들 수 있습니다.

ID 0번 마커를 찾으면 출발
ID 1번 마커를 찾으면 좌회전
ID 2번 마커를 찾으면 우회전
ID 3번 마커를 찾으면 3초 정지
ID 4번 마커를 찾으면 목표 도착
목표 도착 후 LED 또는 사운드 출력

이 방식은 학생들이 ArUco 검출, ROS 2 토픽, /cmd_vel, TF, 로봇 제어 흐름을 한 번에 이해하는 데 좋습니다.

Leave a Comment