단계 4 — Python 입문과 환경 설정

차시 3차시 · 선수 학습 단계 1, 2

이번 단계 목표 Python 환경을 설치하고, ESP32와 첫 메시지를 주고받는다.

1. 학습 목표

2. 환경 설치 (1차시)

2-1. Python 설치 (Windows)

  1. python.org/downloads에서 Python 3.10 이상 다운로드
  2. 설치 시 ✅ Add python.exe to PATH 체크
  3. 설치 후 PowerShell에서 확인:
    python --version
    Python 3.10.x 와 같이 나오면 OK

2-2. VSCode 설치

  1. code.visualstudio.com에서 다운로드 후 설치
  2. 확장(Extension) 설치:
    • Python (Microsoft)
    • Pylance
    • Korean Language Pack (선택)

2-3. 가상환경 만들기

cd d:\data\study\AI\자율주행\auto_car
python -m venv .venv
.\.venv\Scripts\Activate.ps1
⚠️ Activate.ps1 실행 정책 오류 시:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

활성화되면 프롬프트 앞에 (.venv)가 붙습니다.

2-4. 필수 패키지 설치

pip install opencv-python==4.8.1.78 numpy==1.24.3

3. Python 기초 (1차시)

3-1. 변수와 출력

speed = 100
steering = 90
print(f"속도: {speed}, 조향각: {steering}")
💡 f"..." 포맷 문자열 안에 {변수}를 쓰면 그 자리에 값이 들어갑니다.

3-2. 조건문

speed = 50

if speed > 100:
    print("빠름")
elif speed > 30:
    print("보통")
else:
    print("느림")

3-3. 반복문

for angle in range(45, 135, 10):  # 45, 55, 65, ..., 125
    print(f"조향각: {angle}도")

3-4. 함수

def calculate_steering(error, kp):
    """오차를 입력받아 조향각을 계산한다."""
    steering = 90 + kp * error
    if steering < 45:
        steering = 45
    if steering > 135:
        steering = 135
    return steering

result = calculate_steering(error=20, kp=0.5)
print(result)  # 100.0

3-5. 리스트와 딕셔너리

angles = [45, 90, 135]
print(angles[1])         # 90
angles.append(180)
print(len(angles))       # 4

config = {"speed": 100, "steering": 90}
print(config["speed"])   # 100
config["speed"] = 150

4. UDP 통신 첫 체험 (1차시)

4-1. UDP란?

UDP(User Datagram Protocol)는 네트워크 통신 방식 중 하나로, 빠르지만 도착 보장이 없는 통신입니다. 자율주행 명령처럼 빠른 전송이 중요하고 한 번 놓쳐도 다음 패킷이 오면 되는 상황에 적합합니다.

4-2. 우리 차량의 통신

노트북 ──[UDP 패킷 {"speed":100,"steering":90}]──→ ESP32
        매 50ms마다 새 패킷 송신

4-3. 첫 송신 코드

import socket
import json

# UDP 소켓 만들기
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 보낼 메시지
message = {"speed": 0, "steering": 90}  # 정지, 직진
data = json.dumps(message).encode('utf-8')

# 보내기
ESP32_IP = "192.168.137.74"  # 본인 ESP32 IP로 변경
ESP32_PORT = 4210
sock.sendto(data, (ESP32_IP, ESP32_PORT))

print(f"보냄: {message}")
sock.close()
📝 ESP32 시리얼 모니터에서 Received: {"speed":0,"steering":90}이 보이면 성공!

5. 활동

활동 3-A: Python 환경 점검 ⭐ Easy

다음 명령을 실행하고 결과를 캡처하시오.

python --version
pip list

opencv-python, numpy가 보이면 OK.

활동 3-B: 함수 작성 ⭐⭐ Standard

다음 빈칸을 채워 함수를 완성하시오.

def speed_to_korean(speed):
    """속도(0~200)를 한국어 표현으로 바꾼다."""
    # TODO: speed가 0이면 "정지" 반환
    # TODO: 0 < speed <= 50 이면 "느림" 반환
    # TODO: 50 < speed <= 150 이면 "보통" 반환
    # TODO: speed > 150 이면 "빠름" 반환
    pass

# 검증
print(speed_to_korean(0))    # 정지
print(speed_to_korean(30))   # 느림
print(speed_to_korean(100))  # 보통
print(speed_to_korean(200))  # 빠름

활동 3-C: ESP32에 첫 명령 보내기 ⭐⭐ Standard

학생용 프로그램 단계4_파이썬기초.py를 열고:

  1. ESP32_IP를 본인 차량 IP로 수정
  2. # TODO 부분을 채워 완성
  3. 실행하여 ESP32 시리얼 모니터에서 메시지 수신 확인

활동 3-D: 명령 시퀀스 만들기 ⭐⭐⭐ Challenge

3초 간격으로 다음 시퀀스를 보내는 프로그램을 작성하시오.

1초:  정지 (speed=0, steering=90)
2초:  앞으로 (speed=100, steering=90)
3초:  좌회전 (speed=80, steering=60)
4초:  우회전 (speed=80, steering=120)
5초:  정지

힌트: import timetime.sleep(1) 사용.

6. 핵심 개념 정리

개념설명
가상환경프로젝트별로 패키지를 분리해서 관리하는 공간
pipPython 패키지 설치 도구
f-stringf"..{변수}.." 형태의 문자열 포맷팅
함수입력을 받아 처리 후 출력하는 코드 묶음
UDP빠르지만 도착 보장 없는 네트워크 통신
JSON{"key": "value"} 형식의 데이터 표현
socket네트워크 통신을 위한 Python 표준 라이브러리

7. 자기평가

항목12345
가상환경을 스스로 만들고 활성화할 수 있다
함수를 정의하고 호출할 수 있다
ESP32에 UDP 메시지를 보낼 수 있다
어려울 때 검색·문제해결 문서를 활용했다