본문으로 바로가기

로봇 개발자를 위한 Python 기초 교육 #1

category 강좌/ROS2 2026. 5. 22. 17:24

1. Python이 로봇 개발에 많이 쓰이는 이유

로봇 개발은 보통 다음 요소들이 섞여 있습니다.

센서 입력 → 데이터 처리 → 판단 → 제어 명령 출력
 

예를 들어 자율주행 로봇이라면:

라이다 / 카메라 / IMU / GPS
        ↓
센서 데이터 처리
        ↓
위치 추정 / 장애물 판단 / 경로 계획
        ↓
모터 제어 / 조향 제어
 

Python은 이 과정에서 특히 다음 작업에 좋습니다.

                             분야                                                                 Python 활용
ROS 2 노드 작성 토픽 발행, 구독, 서비스, 액션
센서 데이터 처리 거리값, 좌표값, 이미지, 로그 처리
AI / 딥러닝 TensorFlow, PyTorch, OpenCV
시뮬레이션 Gazebo, Isaac Sim, Webots 연동
데이터 분석 NumPy, Pandas, Matplotlib
자동화 테스트 스크립트, 로그 저장, 장비 제어

 

즉, Python은 로봇에서 두뇌와 도구 역할을 많이 합니다.


2. Python 기본 구조 이해하기

Python 코드는 위에서 아래로 실행됩니다.

 
print("로봇 시스템 시작")
print("센서 초기화")
print("모터 준비 완료")
 

실행 결과:

로봇 시스템 시작
센서 초기화
모터 준비 완료
 

 

Python은 C언어처럼 세미콜론 ;을 거의 사용하지 않습니다.
대신 들여쓰기가 매우 중요합니다.

 
if True:
    print("이 문장은 if 안에 있습니다.")
 

 

아래 코드는 잘못된 코드입니다.

 
if True:
print("들여쓰기가 없어서 에러 발생")
 

 

Python에서는 들여 쓰기가 문법입니다.
로봇 제어 코드에서 조건문, 반복문, 함수, 클래스가 많기 때문에 들여쓰기 습관은 처음부터 잡아야 합니다.


3. 변수: 센서값과 상태를 저장하는 공간

변수는 값을 저장하는 이름입니다.

 
speed = 1.5
battery = 87
robot_name = "delivery_bot"
is_armed = False
 

각 변수는 이런 의미를 가질 수 있습니다.

                                       변수                                                                          의미
speed 로봇 속도
battery 배터리 잔량
robot_name 로봇 이름
is_armed 모터 활성화 여부

 

예제:

 
battery = 25

print("현재 배터리:", battery, "%")
 

 

결과:

현재 배터리: 25 %
 

 

로봇 개발에서는 변수 이름을 대충 짓지 않는 것이 중요합니다.

나쁜 예:

 
a = 3.5
b = 80
c = True
 

 

좋은 예:

 
distance_m = 3.5
battery_percent = 80
motor_enabled = True
 

 

현장에서는 3개월 뒤에 자기 코드도 남의 코드처럼 보입니다.
변수명은 길어도 명확한 게 낫습니다.


4. 자료형: Python 데이터의 종류

Python에서 자주 쓰는 기본 자료형은 다음과 같습니다.

          자료형                                      예시                                                         설명
int 10 정수
float 3.14 실수
str "robot" 문자열
bool True, False 참/거짓
list [1, 2, 3] 여러 값 저장
dict {"x": 1, "y": 2} 이름과 값을 쌍으로 저장

 

예제:

 
wheel_count = 4
velocity = 0.75
robot_type = "mobile_robot"
obstacle_detected = True

print(type(wheel_count))
print(type(velocity))
print(type(robot_type))
print(type(obstacle_detected))
 

 

출력:

<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
 

 

로봇 개발에서는 보통 다음처럼 씁니다.

 
x = 1.2
y = 3.4
theta = 0.78

position = {
    "x": x,
    "y": y,
    "theta": theta
}

print(position)
 

결과:

{'x': 1.2, 'y': 3.4, 'theta': 0.78}
 

5. 리스트: 센서값 여러 개 저장하기

리스트는 여러 데이터를 순서대로 저장할 때 사용합니다.

 
lidar_ranges = [1.2, 1.5, 0.8, 2.3, 3.1]
 

 

라이다 거리값이라고 생각하면 됩니다.

 
print(lidar_ranges[0])
print(lidar_ranges[2])
 

 

출력:

1.2
0.8
 

 

Python의 리스트 인덱스는 0부터 시작합니다.

리스트: [1.2, 1.5, 0.8, 2.3, 3.1]
인덱스:   0    1    2    3    4
 

 

센서값 중 최솟값 찾기:

 
lidar_ranges = [1.2, 1.5, 0.8, 2.3, 3.1]

min_distance = min(lidar_ranges)

print("가장 가까운 장애물 거리:", min_distance, "m")
 

 

출력:

가장 가까운 장애물 거리: 0.8 m
 

 

이런 식으로 라이다 값에서 가장 가까운 장애물을 판단할 수 있습니다.


6. 딕셔너리: 로봇 상태를 묶어서 관리하기

딕셔너리는 이름표가 붙은 데이터 묶음입니다.

 
robot_status = {
    "battery": 85,
    "mode": "AUTO",
    "speed": 1.2,
    "armed": True
}
 

 

값 꺼내기:

 
print(robot_status["battery"])
print(robot_status["mode"])
 

 

출력:

85
AUTO
 

 

값 수정하기:

 
robot_status["battery"] = 70
robot_status["mode"] = "MANUAL"

print(robot_status)
 

 

로봇 상태 관리에는 딕셔너리가 자주 쓰입니다.

 
drone_state = {
    "altitude": 12.5,
    "gps_fix": True,
    "flight_mode": "OFFBOARD",
    "gripper_open": False
}
 

 

이런 구조는 드론, 모바일 로봇, 매니퓰레이터 상태 관리에 모두 응용할 수 있습니다.


7. 조건문: 로봇의 판단 만들기

 

조건문은 로봇이 상황에 따라 다르게 행동하게 만듭니다.

 
battery = 18

if battery < 20:
    print("배터리 부족: 복귀 필요")
else:
    print("작업 계속 진행")
 

 

출력:

배터리 부족: 복귀 필요
 

 

장애물 회피 예제:

 
front_distance = 0.4

if front_distance < 0.5:
    print("장애물 감지: 정지")
else:
    print("전진")
 

 

조금 더 복잡한 예제:

 
battery = 45
front_distance = 0.3
gps_ok = True

if battery < 20:
    print("배터리 부족: 복귀")
elif front_distance < 0.5:
    print("장애물 가까움: 정지")
elif not gps_ok:
    print("GPS 이상: 수동 모드 전환")
else:
    print("자율주행 계속")
 

 

로봇 제어에서는 조건문의 순서가 중요합니다.

보통 위험도가 높은 조건을 먼저 검사합니다.

1. 비상 정지
2. 배터리 부족
3. 센서 이상
4. 장애물 감지
5. 정상 주행
 

8. 반복문: 센서값을 계속 확인하기

로봇은 한 번 판단하고 끝나지 않습니다.
계속 센서값을 읽고, 계속 판단하고, 계속 명령을 보냅니다.

Python에서는 while과 for 반복문을 많이 씁니다.

while 반복문

 
count = 0

while count < 5:
    print("센서 읽기:", count)
    count += 1
 

 

출력:

센서 읽기: 0
센서 읽기: 1
센서 읽기: 2
센서 읽기: 3
센서 읽기: 4
 

 

로봇 제어 느낌으로 쓰면:

 
robot_running = True
loop_count = 0

while robot_running:
    print("센서 확인")
    print("제어 명령 계산")
    print("모터 명령 출력")

    loop_count += 1

    if loop_count >= 3:
        robot_running = False
 

for 반복문

리스트 안의 센서값을 하나씩 확인할 때 좋습니다.

 
distances = [1.2, 0.9, 0.4, 2.0]

for distance in distances:
    if distance < 0.5:
        print("위험 거리:", distance)
    else:
        print("안전 거리:", distance)
 

출력:

안전 거리: 1.2
안전 거리: 0.9
위험 거리: 0.4
안전 거리: 2.0
 

9. 함수: 반복되는 코드를 정리하기

함수는 특정 기능을 이름으로 묶은 것입니다.

 
def say_hello():
    print("로봇 준비 완료")

say_hello()
 

 

출력:

로봇 준비 완료
 

 

 

센서값 판단 함수:

 
def check_obstacle(distance):
    if distance < 0.5:
        print("장애물 감지")
    else:
        print("전방 안전")

check_obstacle(0.3)
check_obstacle(1.2)
 

 

출력:

장애물 감지
전방 안전
 

 

 

값을 반환하는 함수:

 
def is_obstacle_close(distance):
    if distance < 0.5:
        return True
    else:
        return False

result = is_obstacle_close(0.3)

print(result)
 

 

출력:

True
 

 

 

더 실전적으로 쓰면:

 
def calculate_motor_speed(target_speed, obstacle_distance):
    if obstacle_distance < 0.5:
        return 0.0
    elif obstacle_distance < 1.0:
        return target_speed * 0.5
    else:
        return target_speed

speed = calculate_motor_speed(1.2, 0.8)

print("출력 속도:", speed)
 

 

결과:

출력 속도: 0.6
 

 

이 함수는 다음 의미입니다.

장애물이 0.5m보다 가까우면 정지
장애물이 1.0m보다 가까우면 감속
그 외에는 정상 속도
 

10. 클래스: 로봇을 객체로 표현하기

클래스는 변수와 함수를 하나로 묶는 구조입니다.
처음에는 어렵게 느껴지지만, 로봇 개발에서는 매우 중요합니다.

 

로봇은 여러 상태와 기능을 가집니다.

상태:
- 배터리
- 속도
- 위치
- 모드

기능:
- 전진
- 정지
- 회전
- 배터리 확인
 

 

이걸 클래스로 표현할 수 있습니다.

 
class Robot:
    def __init__(self, name):
        self.name = name
        self.battery = 100
        self.speed = 0.0

    def move_forward(self, speed):
        self.speed = speed
        print(self.name, "전진:", self.speed, "m/s")

    def stop(self):
        self.speed = 0.0
        print(self.name, "정지")

    def check_battery(self):
        print("배터리:", self.battery, "%")
 

 

사용 예:

 
robot = Robot("delivery_bot")

robot.check_battery()
robot.move_forward(1.2)
robot.stop()
 

 

출력:

배터리: 100 %
delivery_bot 전진: 1.2 m/s
delivery_bot 정지
 

self는 “이 객체 자기 자신”을 의미합니다.

 
self.battery
self.speed
self.name
 

 

이 값들은 각각의 로봇 객체가 따로 가집니다.

 
robot1 = Robot("robot_1")
robot2 = Robot("robot_2")

robot1.move_forward(1.0)
robot2.move_forward(2.0)
 

클래스는 ROS 2 노드 작성할 때도 거의 기본 구조로 쓰입니다.


11. 예외 처리: 에러가 나도 시스템이 죽지 않게 하기

로봇 시스템에서 에러는 반드시 발생합니다.

 

예를 들어:

센서 연결 끊김
파일 없음
통신 실패
잘못된 데이터 입력
0으로 나누기
 

 

그냥 두면 프로그램이 멈춥니다.

 
value = 10 / 0
 

이 코드는 에러가 납니다.

 

안전하게 처리하려면:

 
try:
    value = 10 / 0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
 

 

센서 읽기 예제:

 
def read_sensor():
    raise TimeoutError("센서 응답 없음")

try:
    distance = read_sensor()
    print("거리:", distance)
except TimeoutError:
    print("센서 통신 실패: 기본값 사용")
    distance = 999.0
 

로봇 개발에서는 예외 처리를 대충 하면 안 됩니다.

 

특히 모터, 배터리, 통신, 파일 저장 부분은 반드시 방어 코드를 넣는 게 좋습니다.


12. 파일 입출력: 로그 저장하기

로봇 개발에서 로그는 매우 중요합니다.
현장에서 문제가 생기면 로그 없이는 원인 분석이 어렵습니다.

 

파일 쓰기:

 
with open("robot_log.txt", "w") as file:
    file.write("로봇 시작\n")
    file.write("센서 초기화 완료\n")
 

 

파일 읽기:

 
with open("robot_log.txt", "r") as file:
    content = file.read()
    print(content)
 

 

센서 로그 저장 예제:

 
distance = 1.25
battery = 87

with open("sensor_log.txt", "a") as file:
    file.write(f"distance={distance}, battery={battery}\n")
 

 

"a"는 append, 즉 기존 파일 뒤에 추가한다는 뜻입니다.

 

실전에서는 CSV 형식을 많이 씁니다.

 
import csv

with open("robot_data.csv", "w", newline="") as file:
    writer = csv.writer(file)
    writer.writerow(["time", "x", "y", "battery"])
    writer.writerow([0.0, 1.2, 3.4, 90])
    writer.writerow([0.1, 1.3, 3.5, 89])
 

 

실습결과 파일 :

python_lecture1.ipynb
0.02MB

728x90
728x90

'강좌 > ROS2' 카테고리의 다른 글

1일차 강의  (0) 2026.05.22
ROS2 Action Server 만들기 #1  (0) 2026.05.22
4일차 강의  (0) 2026.05.21
서비스 서버 만들기  (0) 2026.05.21
서비스 정의 만들기  (0) 2026.05.21