1. Python이 로봇 개발에 많이 쓰이는 이유
로봇 개발은 보통 다음 요소들이 섞여 있습니다.
센서 입력 → 데이터 처리 → 판단 → 제어 명령 출력
예를 들어 자율주행 로봇이라면:
라이다 / 카메라 / IMU / GPS
↓
센서 데이터 처리
↓
위치 추정 / 장애물 판단 / 경로 계획
↓
모터 제어 / 조향 제어
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])
실습결과 파일 :
'강좌 > 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 |