오차(error): 화면 중심 - 차선 중심
화면 중심: 160 (320/2)
차선 중심: 200 → error = -40 (차선이 오른쪽에 있음)
→ 차량을 오른쪽으로 꺾어야 함
가장 단순한 제어기. 오차가 클수록 더 많이 보정합니다.
조향 보정 = Kp × error 조향각 = 90 + Kp × error
| 상황 | error | Kp=0.3일 때 조향각 |
|---|---|---|
| 차선 정확히 중앙 | 0 | 90 (직진) |
| 차선이 약간 오른쪽 | -20 | 90 + 0.3×(-20) = 84 |
| 차선이 많이 오른쪽 | -50 | 90 + 0.3×(-50) = 75 |
| 차선이 왼쪽 | +30 | 90 + 0.3×(30) = 99 |
flip(frame, 1)) 후 좌표를 사용하므로 부호 컨벤션을 코드와 일치시켜야 합니다.Kp 0.1 ──→ ◯ ────→ ◯ ────→ ◯ ────→ ◯ (못 따라감, 차선 이탈) Kp 0.5 ──→ ◯ ─→ ◯ ──→ ◯ ──→ ◯ ──→ ◯ (적절) Kp 2.0 ──→ ◯╲ ╱◯╲ ╱◯╲ ╱◯╲ ╱◯ (진동)
P 제어만으로는:
산업용 자율주행은 PID 제어 + Pure Pursuit + MPC 등 더 정교한 방법을 씁니다.
python/controller.py는 단순 P보다 한 단계 발전된 형태:
조향 보정 = k_position × 위치오차 + k_angle × 각도오차 조향각 = 90 + 보정 (단, 45~135로 클립)
def calculate_steering(lane_center_x, frame_center_x, kp=0.3,
steering_neutral=90, steering_min=45, steering_max=135):
if lane_center_x is None:
return steering_neutral # 차선 못 찾음 → 직진
error = frame_center_x - lane_center_x
steering = steering_neutral + kp * error
if steering < steering_min:
steering = steering_min
if steering > steering_max:
steering = steering_max
return int(steering)
손으로 시뮬레이션. 화면 중심 = 160일 때 다음 표를 채우시오.
| 차선 중심 (cx) | error | Kp=0.5 보정 | 조향각 | 좌·우 어느 쪽? |
|---|---|---|---|---|
| 160 | 0 | 0 | 90 | 직진 |
| 100 | ||||
| 60 | ||||
| 220 | ||||
| 260 |
학생용 프로그램 단계8_차선추종.py를 열고 빈칸을 채우시오.
# TODO 1: 차선 중심 검출 (단계 7 코드 재활용)
# TODO 2: error 계산
# TODO 3: 조향각 = 90 + kp * error 계산
# TODO 4: 범위 제한 (45~135)
# TODO 5: UDP로 송신 ({"speed": 80, "steering": ...})
미션 — 직선 트랙: 길이 2m, 흰 테이프 폭 5cm, 간격 50cm → 1회 끝까지 도달하면 성공
| 시도 | Kp | base_speed | 결과 (성공/이탈/멈춤) |
|---|---|---|---|
| 1 | 0.3 | 80 | |
| 2 | |||
| 3 |
python/main.py를 실행하면 위치+각도 하이브리드 제어가 자동 적용됩니다.
출발 ──직선 1m──→ 우커브 ──직선 50cm──→ 좌커브 ──→ 골인 (S자)
키 조작 (실행 중)
| 키 | 동작 |
|---|---|
s | 자율주행 시작/정지 |
w/x | base_speed ± 10 |
a/d | k_angle ± 0.1 |
z/v | k_position ± 0.1 |
+/− | kp ± 0.05 |
SPACE | 긴급 정지 |
| 팀 | k_position | k_angle | base_speed | 완주 시간 |
|---|---|---|---|---|
| 전략 | 장점 | 단점 |
|---|---|---|
| 직진 유지 | 단순 | 위험 |
| 즉시 정지 | 안전 | 자주 멈춤 |
| 마지막 조향각 유지 | 부드러움 | 곡선에서 위험 |
| 천천히 정지 | 안전+부드러움 | 코드 복잡 |
| 개념 | 설명 |
|---|---|
| 오차(error) | 목표값과 실제값의 차이 |
| 비례 제어(P) | 오차에 비례하여 보정 |
| Kp | 비례 상수 (반응 속도 결정) |
| 진동(oscillation) | Kp가 너무 클 때 좌우로 흔들림 |
| PID | P + I(적분) + D(미분), 더 정교한 제어 |
| 클리핑 | 출력값을 일정 범위로 제한 |
| 항목 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| P 제어의 원리를 그림으로 설명할 수 있다 | |||||
| 차선 인식 결과로 조향각을 계산할 수 있다 | |||||
| Kp 튜닝을 통해 안정적 주행을 만들었다 | |||||
| 직선 트랙을 자율주행으로 완주했다 |