콘텐츠로 이동

Line Tracing

examples/line-tracing.ipynb머신러닝 없이 노란 트랙 라인을 따라 달립니다. HSV 색 필터로 라인의 픽셀을 찾고, 그 무게중심으로 라인이 화면 중앙에서 벗어난 정도를 구하고, 벗어난 만큼에 비례해 조향합니다. 색 분할·이미지 모멘트·비례(P) 제어 — 모든 라인 팔로워의 고전 레시피이자, 첫 자율주행으로 가장 좋은 예제입니다.

노트북 구성

하는 일
1. Setup 로봇 Web API를 감싼 camera()·drive() 헬퍼, 그리고 화면 확인용 스냅샷 한 장
2. See the line find_line_offset() — 노란색 마스킹, 바로 앞 도로만 남기기, 오프셋 수치 하나로 요약; 카메라와 마스크를 나란히 표시
3. Drive 실시간 웹 뷰, 이어서 주행 루프: 카메라 → 오프셋 → 조향, 초당 약 15회

실행

  1. examples/line-tracing.ipynb를 열고 Python 3 (PhysiCar AI) 커널을 선택하세요.
  2. 셀을 위에서 아래로 실행하세요. 주행 셀은 ⏹ (인터럽트) 를 누를 때까지 돌고, 그때 노트북이 차를 대신 멈춰 줍니다.
  3. 차의 '생각'을 보려면 app.physicar를 열고 MYAPP 탭으로 이동하세요. 필터를 통과한 픽셀이 전부 마젠타로 덧칠됩니다 — 코드가 실제로 조향에 쓰는 픽셀 — 그 위에 화면 중앙선과 검출된 라인이 그려집니다.

조향 원리

find_line_offset()cv2.inRange(hsv, YELLOW_LO, YELLOW_HI)로 노란색을 마스킹하고, 이미지의 하반부(차 바로 앞 도로)만 남긴 뒤, 무게중심(cv2.moments)을 중앙 기준 오프셋 수치 하나([-1, 1] 정규화)로 요약합니다. 그다음:

steering = max(-20, min(20, -offset * STEER_GAIN))   # 도(degree), + = 좌
drive(SPEED, steering)

노란 픽셀이 거의 없으면 탐색합니다: drive(0.3, 15) — 좌회전하며 천천히 전진.

코드는 로봇의 로컬 Web API(GET /camera, POST /speed, POST /steering)만 사용하므로, 같은 노트북이 실물 키트에서도 그대로 돌아갑니다.

고쳐보기

  • SPEED(0.5 m/s) — 올려 보고 코너가 어디서 무너지는지 보세요.
  • STEER_GAIN(20.0) — 너무 낮으면 코너를 크게 돌고, 너무 높으면 지그재그. P 제어의 감각.
  • YELLOW_LO / YELLOW_HI — HSV 범위. 다른 색 라인을 따라가게 바꿔보세요.
  • find_line_offset()에서 비워 두는 이미지 상반부 — 관심 영역(ROI). 더 가깝게 또는 멀리 보게 조절해 보세요.

주의

  • 화면에 노란 라인이 보여야 합니다 — HSV 범위가 트랙(실물이라면 방의 조명)과 안 맞으면 아무것도 검출되지 않습니다. YELLOW_LO/HI부터 맞추세요.
  • 라인을 잃으면 무조건 좌회전 탐색합니다 — 오른쪽으로 잃으면 영영 제자리를 돌 수 있습니다.
  • Web API의 /steering라디안을 받지만 이 코드는 도(degree)로 생각하고 drive() 안에서 변환합니다. API를 직접 호출할 때 단위를 섞지 마세요.
  • 5000 포트가 사용 중이면 웹 뷰만 건너뜁니다(안내 출력) — 주행은 그대로 동작합니다.

🛠 미션: 탐색을 똑똑하게 — 라인을 마지막으로 본 쪽을 기억했다가, 항상 왼쪽이 아니라 그쪽으로 돌게 만들어 보세요.

더 알아보기

로봇 엔드포인트 → Web API. 카메라와 센서 → 로봇 구조 & 센서. 규칙 대신 차가 트랙을 학습하게 하려면 → Racing Deep Learning.

AI