CITCODING ACADEMY로봇 미션 · PYTHON과 데이터RoboMaster S1 수업 ↗
비행 로봇 · 12개 수업

Tello
Python 수업

명령 기록을 먼저 예상하고 Python으로 미션을 만듭니다. 교사 감독 아래 비행한 뒤 계획과 실제 관찰을 비교하며, 바닥에서 읽은 기체 상태와 직접 잰 이동 거리를 구분합니다.

01예상

코드가 어떻게 실행될지 따라갑니다.

02제작

요구 사항 하나를 바꿔 만듭니다.

03관찰

명령한 값과 실제 측정값을 구분합니다.

04설명

결과가 나온 이유를 설명합니다.

로봇을 움직이기 전에

노트북의 Python과 Tello Wi-Fi 연결을 사용합니다. 먼저 네트워크에 연결하지 않는 명령 기록 실행부터 시작하세요. 일반 Tello로 사용할 수 있으며 EDU 미션 패드는 필요하지 않습니다.

먼저 종이나 시험 실행의 명령 기록으로 확인합니다. 실제로 움직이기 전에는 선생님이 장비와 표시된 실습 구역을 점검합니다. 이 자료의 코드는 소프트웨어로 검사했으며 실제 비행이나 교실 장비 시험을 마쳤다는 뜻은 아닙니다.

노트북 준비와 데이터 분석
python3.12 -m venv .venv
# macOS / Linux
source .venv/bin/activate
# Windows PowerShell: .venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt

S1 이동 코드는 앱의 Lab에서, 데이터 분석은 노트북에서 실행합니다. 연습용으로 만든 값, 모의실험 값, 실측값을 구분해 표시하세요.

01같은 거리, 다른 단위: 변수와 단위 환산

계획한 거리를 Tello에는 cm, S1에는 m로 전달하고, 두 명령이 같은 거리를 뜻하는 이유를 설명합니다.

어떤 문제를 풀까요?

바닥에 30 cm 간격으로 테이프 표시 두 개를 붙이고, 30과 0.30이 적힌 카드를 봅니다. 각 로봇에는 어떤 값을 전달해야 할까요?

거리에 이름을 붙여 저장하면 이동 계획을 바꿀 때 그 값만 수정할 수 있습니다. Tello는 cm, S1은 m 단위를 쓰므로 같은 숫자를 그대로 전달하면 이동 거리도 달라집니다.

30이라는 숫자만으로는 단위를 알 수 없습니다. 여러 명령에 같은 숫자를 반복해서 쓰면 경로를 바꿀 때 일부를 빠뜨리기 쉽습니다. 변수 이름으로 단위를 나타낼 수는 있지만, 이름을 붙이는 것만으로 값이 환산되지는 않습니다.

읽고, 예상하고, 실행 따라가기

대입은 값에 이름을 붙여 저장하는 작업입니다. m 단위 값에 100을 곱하면 cm 단위 값이 됩니다. int(round(...))는 명령에 쓸 거리를 정수 cm로 나타냅니다. 이 수업의 예제 거리는 모두 정수 cm로 정확히 표현할 수 있습니다.

  • 변수(variable): 값에 붙인 이름
  • 단위(unit): 숫자가 무엇을 얼마나 나타내는지 정한 기준
  • 환산(conversion): 같은 양을 다른 단위로 표현하는 것
distance_m = 0.30
distance_cm = int(round(distance_m * 100))
print(distance_cm, distance_m)
예제의 실행 결과와 비교하기
30 0.3
실행 단계저장된 값·상태결과
distance_m = 0.30distance_m에 0.3 m 저장출력 없음
100을 곱하고 round, int 적용distance_cm은 30 cm출력 없음
두 값 출력두 값이 나타내는 실제 거리는 같음30 0.3

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 변수·수·단위 환산 개념을 사용하세요.

print(20 / 100)
  1. 20
  2. 0.2
  3. 2000

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-01-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 변수·수·단위 환산 개념을 사용하세요.

length_m = 0.40
print(int(round(length_m * 100)))
  1. 0
  2. 400
  3. 40

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

각 값 옆에 m 또는 cm를 적어 보세요. 100을 곱해 바꾸는 것은 숫자의 표현이며, 나타내는 실제 거리는 같습니다.

과제 robot-hooks-01-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 변수·수·단위 환산 개념을 사용하세요.

leg_m = 0.25
print(int(round(leg_m * 100)), leg_m)
  1. 25 0.25
  2. 0 25
  3. 25 25

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-01-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 변수·수·단위 환산 개념을 사용하세요.

duration_ms = 250
print(duration_ms / 1000)
  1. 250
  2. 0.25
  3. 250000

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-01-transfer-v1 · 2026-11-02.2

직접 만들어 보기

command_units(distance_m)를 완성하세요. 입력은 0.20~0.80 m이며 cm로 바꾸었을 때 정수가 되는 값입니다. (Tello의 cm 값, S1의 m 값)을 반환합니다. 이 함수는 값을 준비할 뿐 로봇에 연결하지 않습니다.

def command_units(distance_m):
    return (None, None)

print(command_units(0.4))
내 코드로 확인할 검사
assert command_units(0.2) == (20, 0.2)
assert command_units(0.4) == (40, 0.4)
assert command_units(0.8) == (80, 0.8)
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 계획한 거리를 Tello에는 cm, S1에는 m로 전달하고, 두 명령이 같은 거리를 뜻하는 이유를 설명합니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

먼저 hardware/tello_missions.py units를 시험 모드로 실행해 명령 기록을 확인합니다. 앞으로 30 cm, 뒤로 30 cm 이동하는 명령에는 정수 거리를 씁니다. 실제 실행 모드에서는 교사 감독 아래 한 번 비행합니다.

python hardware/tello_missions.py units

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

로봇이 최종적으로 어디에 멈출지 예상합니다. 정지하거나 착륙한 뒤 테이프 표시를 기준으로 실제 위치를 재고, 목표 거리와 관찰한 거리를 따로 적습니다. 같은 거리를 명령해도 이동 정확도가 같다고 볼 수는 없습니다.

설명하고 다른 상황에 적용하기

단위 없이 숫자 30을 두 로봇에 똑같이 전달하면 어떤 문제가 생길까요?

카메라의 지연 시간을 밀리초에서 초로 환산하고, API에 값을 전달할 때 어떤 단위를 써야 하는지 설명합니다.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

숫자에 단위가 저절로 따라붙는다고 생각한 경우

각 값 옆에 m 또는 cm를 적어 보세요. 100을 곱해 바꾸는 것은 숫자의 표현이며, 나타내는 실제 거리는 같습니다.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

02출발해도 될까요? 조건문과 비교

두 조건을 모두 확인하는 출발 규칙을 만들고, 기준보다 작은 값·같은 값·큰 값으로 검사합니다.

어떤 문제를 풀까요?

이동 경로는 비어 있지만 배터리가 부족한 경우와, 배터리는 충분하지만 경로가 막힌 경우를 비교합니다. 어느 쪽이 출발해도 될까요?

입력이 달라지면 같은 프로그램도 다른 동작을 해야 합니다. 조건을 함께 쓰면 출발 규칙을 코드로 명확하게 나타내고 움직이기 전에 검사할 수 있습니다.

아무 조건 없이 출발하면 입력을 무시하게 되고, 조건 하나만 검사하면 나머지 조건을 놓칩니다. 수업에서 정한 배터리 기준은 실습 규칙이며 제조사가 보장한 기준은 아닙니다.

읽고, 예상하고, 실행 따라가기

if는 조건에 따라 실행할 갈래를 고릅니다. >=는 기준과 같은 값도 포함하고, A and B는 두 조건이 모두 True일 때만 True입니다. Tello에는 수업용 사전 점검 기준인 배터리 40% 이상을 적용합니다. 이동 구역이 비어 있는지는 감독하는 사람이 확인합니다.

  • 조건(condition): True 또는 False로 판단하는 식
  • 경계값(boundary): 판단 기준과 정확히 같은 값
  • and: 두 조건을 모두 만족해야 참이 되는 연산
battery = 40
clear = False
if battery >= 40 and clear:
    print("go")
else:
    print("stop")
예제의 실행 결과와 비교하기
stop
실행 단계저장된 값·상태결과
battery >= 4040 >= 40은 True출력 없음
True and clearTrue and False는 Falseelse 선택
else 안의 print출발 조건을 충족하지 못함stop

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 if/else·>=·and 개념을 사용하세요.

print(40 > 40)
  1. True
  2. 40
  3. False

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-02-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 if/else·>=·and 개념을 사용하세요.

battery = 41
clear = True
print(battery >= 40 and clear)
  1. True
  2. False
  3. 41

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

True/False 조합 네 가지를 표로 만들고 39, 40, 41을 각각 검사해 보세요. 경로가 비어 있어도 배터리 조건을 충족하지 못하면 출발할 수 없습니다.

과제 robot-hooks-02-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 if/else·>=·and 개념을 사용하세요.

battery = 39
print("go" if battery >= 40 and True else "stop")
  1. go
  2. stop
  3. 39

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-02-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 if/else·>=·and 개념을 사용하세요.

print("enter" if 12 >= 12 and False else "wait")
  1. enter
  2. True
  3. wait

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-02-transfer-v1 · 2026-11-02.2

직접 만들어 보기

permit(battery, clear)를 작성하세요. 배터리가 40 이상이고 경로가 비어 있을 때만 "go"를, 나머지는 "stop"을 반환합니다. 배터리 입력은 백분율 숫자, 경로 입력은 불리언입니다.

def permit(battery, clear):
    return "stop"

print(permit(40, True))
내 코드로 확인할 검사
assert permit(39, True) == "stop"
assert permit(40, True) == "go"
assert permit(41, False) == "stop"
assert permit(90, True) == "go"
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 두 조건을 모두 확인하는 출발 규칙을 만들고, 기준보다 작은 값·같은 값·큰 값으로 검사합니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

decisions 예제는 기체를 바닥에 둔 채 실제 배터리 값을 읽습니다. 수업 규칙에 따라 --area-clear도 필요합니다. 경계값은 모의 입력으로 검사하며, 실제 배터리를 일부러 소모해 낮은 값을 만들지 않습니다.

python hardware/tello_missions.py decisions

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

모의 입력으로 네 가지 조건 조합을 검사합니다. 실제 장비에서는 정상 상태의 읽기 값과 S1의 정지 마커 반응을 관찰하되 이동 구역을 위험하게 만들지 않습니다. 센서로 읽은 입력과 사람이 알려준 입력을 구분해 적습니다.

설명하고 다른 상황에 적용하기

코드를 고치지 않아도 입력에 따라 다른 갈래가 실행되는 이유는 무엇일까요?

나이와 보호자 허용 여부를 함께 확인하는 도서관 출입 규칙을 만듭니다. 기준 나이와 정확히 같은 경우도 포함하세요.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

and를 or처럼 읽거나 기준과 같은 값을 제외한 경우

True/False 조합 네 가지를 표로 만들고 39, 40, 41을 각각 검사해 보세요. 경로가 비어 있어도 배터리 조건을 충족하지 못하면 출발할 수 없습니다.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

03정사각형 순찰: for와 range

range(4)의 실행을 따라가며 이동과 회전을 모두 반복문 안에 넣습니다.

어떤 문제를 풀까요?

네 변을 따라 도는 정사각형 순찰을 그립니다. 모든 변을 30 cm에서 40 cm로 바꾸고, 회전 명령의 들여쓰기가 동작에 어떤 영향을 주는지 예상해 보세요.

반복문 안에 순찰 한 단계를 적으면 같은 동작을 되풀이할 수 있습니다. 반복 횟수나 매개변수 하나를 바꾸면 반복되는 동작 전체에 반영됩니다.

코드를 네 번 복사해도 움직일 수 있지만 세 곳만 고치고 한 곳을 놓치면 경로가 달라집니다. 반복되는 것은 들여쓴 코드이며, 반복문 뒤의 회전 명령은 한 번만 실행됩니다.

읽고, 예상하고, 실행 따라가기

for는 반복 대상의 항목을 차례로 꺼냅니다. range(4)가 만드는 값은 0, 1, 2, 3입니다. 정사각형 순찰에서는 매번 앞으로 이동하고 90도 회전합니다. 반복문 다음 코드는 반복이 끝난 뒤 한 번 실행됩니다.

  • 반복(iteration): 반복문 내부를 한 차례 실행하는 것
  • range: 끝값을 포함하지 않는 정수 범위
  • 들여쓰기(indentation): 반복문에 포함되는 코드 줄을 구분하는 방법
for leg in range(2):
    print("move", leg)
    print("turn")
print("done")
예제의 실행 결과와 비교하기
move 0
turn
move 1
turn
done
실행 단계저장된 값·상태결과
leg = 0첫 번째 반복move 0 출력 후 turn 출력
leg = 1두 번째 반복move 1 출력 후 turn 출력
range의 값을 모두 사용반복문 종료done

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 for·range·들여쓰기·반복 동작 개념을 사용하세요.

print(list(range(3)))
  1. [0, 1, 2]
  2. [1, 2, 3]
  3. [0, 1, 2, 3]

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-03-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 for·range·들여쓰기·반복 동작 개념을 사용하세요.

for leg in range(3):
    print("move")
print("land")
  1. move land move land move land
  2. move move move land
  3. move move land

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

들여쓴 코드 전체를 상자로 묶고, range가 만드는 정수 하나마다 그 상자를 한 번씩 실행해 보세요.

과제 robot-hooks-03-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 for·range·들여쓰기·반복 동작 개념을 사용하세요.

count = 0
for leg in range(4):
    count = count + 2
print(count)
  1. 4
  2. 10
  3. 8

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-03-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 for·range·들여쓰기·반복 동작 개념을 사용하세요.

for photo in range(2):
    print("save")
print("close")
  1. save save close
  2. save close save close
  3. save close

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-03-transfer-v1 · 2026-11-02.2

직접 만들어 보기

square_commands(sides)를 완성하세요. 변 하나마다 "move", "turn" 문자열을 차례로 추가해 반환합니다. 이 함수는 명령 계획을 만들며, 실제 정사각형 예제는 항상 네 변을 사용합니다.

def square_commands(sides):
    commands = []
    # Repeat a move and a turn for each side.
    return commands

print(square_commands(4))
내 코드로 확인할 검사
assert square_commands(0) == []
assert square_commands(1) == ["move", "turn"]
assert square_commands(4) == ["move", "turn"] * 4
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: range(4)의 실행을 따라가며 이동과 회전을 모두 반복문 안에 넣습니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

square 예제는 30 cm 이동과 시계 방향 90도 회전을 네 번 반복한 뒤 착륙합니다. 교사 감독 아래 비행하기 전에 명령 기록 전체를 예상해 보세요.

python hardware/tello_missions.py square

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

종이 위에서 정사각형 경로를 먼저 따라가고 실제로 한 번 이동해 봅니다. 예상한 종료 위치와 방향을 표시한 뒤, 멈춘 지점이 출발점에서 얼마나 벗어났는지 잽니다. 반복문이 정확해도 기체가 밀리거나 바퀴가 미끄러질 수 있습니다.

설명하고 다른 상황에 적용하기

어느 값을 고치면 네 변의 길이가 모두 바뀔까요? 이동은 네 번, 회전은 한 번만 하게 되는 들여쓰기 오류는 무엇일까요?

사진을 찍고 기록하는 작업을 다섯 번 한 뒤 마지막에 한 번만 업로드하도록 계획합니다. 업로드를 반복문 밖에 두는 이유를 설명하세요.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

range의 끝값까지 세거나 반복문 밖의 코드도 반복된다고 생각한 경우

들여쓴 코드 전체를 상자로 묶고, range가 만드는 정수 하나마다 그 상자를 한 번씩 실행해 보세요.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

04새 관찰을 기다리기: while과 종료 조건

매번 새 입력을 읽으며, 성공했을 때와 검사 횟수를 다 썼을 때의 종료를 각각 구현하고 설명합니다.

어떤 문제를 풀까요?

처음에는 마커를 가렸다가 예상하기 어려운 순간에 보여 줍니다. 프로그램은 몇 번까지 확인해야 할까요?

새로 들어오는 관찰에 따라 종료 시점이 달라질 때 while 조건으로 이를 표현할 수 있습니다. 검사 횟수에 제한을 두면 끝없이 기다리는 일을 막을 수 있습니다.

횟수가 정해진 for문은 성공한 뒤에도 검사를 계속할 수 있습니다. while문에서 예전 값만 확인하면 새 마커를 알아차리지 못합니다. for와 break로 같은 동작을 만들 수도 있으므로 종료 규칙이 잘 드러나는 방식을 고릅니다.

읽고, 예상하고, 실행 따라가기

while은 매 반복 전에 조건을 검사합니다. 반복문 안에서 진행 상태를 갱신하고 새 관찰을 읽어야 합니다. 성공하거나 최대 검사 횟수에 도달하면 종료합니다. sleep은 검사 사이의 간격을 만들 뿐 새 센서 값을 읽는 동작은 아닙니다.

  • 폴링(poll): 새 읽기 값을 요청하는 것
  • 오래된 값(stale): 이전에 읽어 둔 값
  • 검사 한도(budget): 허용한 최대 검사 횟수
readings = [False, False, True]
checks = 0
found = False
while not found and checks < 3:
    found = readings[checks]
    checks += 1
print(checks, found)
예제의 실행 결과와 비교하기
3 True
실행 단계저장된 값·상태결과
checks 0: False 읽음found는 False, checks는 1출력 없음
checks 1: False 읽음found는 False, checks는 2출력 없음
checks 2: True 읽음found는 True, checks는 3, 종료3 True

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 while·상태 갱신·break·검사 횟수 제한 개념을 사용하세요.

count = 0
while count < 2:
    count += 1
print(count)
  1. 0
  2. 2
  3. 3

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-04-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 while·상태 갱신·break·검사 횟수 제한 개념을 사용하세요.

values = [False, True, False]
i = 0
found = False
while not found and i < 3:
    found = values[i]
    i += 1
print(i, found)
  1. 3 False
  2. 1 False
  3. 2 True

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

검사 번호, 이번에 읽은 값, 다음 조건을 표로 적어 보세요. 끝까지 준비 상태가 되지 않는 입력도 넣어 보세요.

과제 robot-hooks-04-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 while·상태 갱신·break·검사 횟수 제한 개념을 사용하세요.

values = [False, False, False]
i = 0
found = False
while not found and i < 2:
    found = values[i]
    i += 1
print(i, found)
  1. 2 False
  2. 3 False
  3. 2 True

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-04-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 while·상태 갱신·break·검사 횟수 제한 개념을 사용하세요.

pages = ["busy", "ready", "ready"]
i = 0
while i < len(pages):
    state = pages[i]
    i += 1
    if state == "ready":
        break
print(i)
  1. 3
  2. 2
  3. 1

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-04-transfer-v1 · 2026-11-02.2

직접 만들어 보기

first_ready(readings, max_checks)를 완성하세요. 준비된 불리언 입력을 최대 max_checks개까지 읽고 (사용한 검사 횟수, 찾았는지 여부)를 반환합니다. 입력이 비었거나 검사 한도가 0이면 (0, False)를 반환합니다. 기록된 입력으로 새 읽기를 흉내 내는 연습이며 장애물 감지기가 아닙니다.

def first_ready(readings, max_checks):
    checks = 0
    found = False
    # Update both variables from the next reading.
    return checks, found

print(first_ready([False, True], 4))
내 코드로 확인할 검사
assert first_ready([False, True, False], 3) == (2, True)
assert first_ready([False, False, True], 2) == (2, False)
assert first_ready([True], 0) == (0, False)
assert first_ready([], 4) == (0, False)
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 매번 새 입력을 읽으며, 성공했을 때와 검사 횟수를 다 썼을 때의 종료를 각각 구현하고 설명합니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

wait 예제는 제자리에서 비행하며 높이를 최대 여섯 번 확인합니다. 값이 정한 관찰 범위인 60~160 cm에 들어오면 검사를 끝내고 착륙합니다. 높이는 아래쪽 거리를 추정한 값이며 앞쪽 공간이 비었음을 뜻하지 않습니다. 최신 상태를 API로 다시 요청하지만, 매번 서로 다른 패킷인지 또는 시간상 최신 패킷인지는 검증하지 않습니다.

python hardware/tello_missions.py wait

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

기록된 입력으로 첫 검사에서 성공하는 경우, 늦게 성공하는 경우, 끝내 성공하지 못하는 경우를 비교합니다. S1에는 서로 다른 시점에 마커를 보여 줍니다. Tello는 드론 가까이에 장애물을 두지 않고 높이 기록을 교사의 관찰과 비교합니다.

설명하고 다른 상황에 적용하기

예전에 읽은 값 하나로 조건을 반복 검사하면 새 사건을 알아차릴 수 없는 이유는 무엇일까요?

인쇄 작업 대기열을 확인하는 프로그램을 생각해 봅니다. 어떤 정보를 갱신하고 무엇을 성공으로 볼지, 검사 횟수가 끝나면 어떻게 할지 설명하세요.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

읽기 값을 갱신하지 않거나 검사 횟수를 늘리는 코드를 빠뜨린 경우

검사 번호, 이번에 읽은 값, 다음 조건을 표로 적어 보세요. 끝까지 준비 상태가 되지 않는 입력도 넣어 보세요.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

05경로 바꾸기: 리스트와 순서

순서가 있는 경로를 고치고, 앞서 읽은 값을 잃지 않으면서 새 관찰을 덧붙입니다.

어떤 문제를 풀까요?

세 구간으로 된 경로를 만들고, 이동 코드는 그대로 둔 채 첫 번째와 마지막 거리 카드를 바꿔 보세요.

경로를 순서 있는 묶음으로 저장하면 경로 데이터와 이동 코드를 나눌 수 있습니다. 관찰을 리스트에 계속 추가하면 새 값 하나로 이전 기록을 덮어쓰지 않아도 됩니다.

변수를 세 개로 나누면 각각 따로 처리해야 하고, 변수 하나에 새 관찰을 계속 대입하면 이전 값을 잃습니다. 한 관찰의 항목에 이름을 붙일 때는 딕셔너리, 여러 관찰의 순서를 보관할 때는 리스트가 적합합니다.

읽고, 예상하고, 실행 따라가기

리스트는 항목의 순서를 보관합니다. 인덱스 0은 첫 항목, -1은 마지막 항목을 고릅니다. append는 맨 뒤에 항목 하나를 추가하고, 반복문으로 리스트를 순회하면 경로의 값을 차례로 읽습니다.

  • 인덱스(index): 항목의 위치
  • append: 맨 뒤에 항목을 추가하는 메서드
  • 순서(order): 항목이 놓인 차례에도 의미가 있음
route_cm = [20, 30]
route_cm.append(40)
print(route_cm[0], route_cm[-1], sum(route_cm))
예제의 실행 결과와 비교하기
20 40 90
실행 단계저장된 값·상태결과
경로 생성위치 0과 1에 20, 30 저장출력 없음
40 추가route가 [20,30,40]이 됨출력 없음
인덱스와 합계 확인첫 값 20, 마지막 값 40, 합계 9020 40 90

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 리스트·인덱스·순회·값 변경 개념을 사용하세요.

print([25, 35, 45][0])
  1. 35
  2. 0
  3. 25

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-05-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 리스트·인덱스·순회·값 변경 개념을 사용하세요.

log = [20]
log.append(30)
print(log)
  1. [20, 30]
  2. [30]
  3. [30, 20]

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

상자에 0부터 번호를 붙이고, append 뒤의 리스트를 다시 그려 보세요. 앞서 있던 상자는 그대로 남습니다.

과제 robot-hooks-05-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 리스트·인덱스·순회·값 변경 개념을 사용하세요.

route = [20, 40, 30]
print(route[1], route[-1])
  1. 20 30
  2. 40 30
  3. 40 20

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-05-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 리스트·인덱스·순회·값 변경 개념을 사용하세요.

playlist = ["intro", "theme"]
playlist.append("end")
print(playlist[1])
  1. intro
  2. end
  3. theme

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-05-transfer-v1 · 2026-11-02.2

직접 만들어 보기

route_summary(route_cm)에서 (구간 수, 전체 거리 cm, 마지막 구간 거리 cm)를 반환하세요. 빈 경로는 (0, 0, None)을 반환합니다. 이 값은 이동 거리이며 비행 좌표가 아닙니다.

def route_summary(route_cm):
    return (0, 0, None)

print(route_summary([20, 30, 40]))
내 코드로 확인할 검사
assert route_summary([20, 30, 40]) == (3, 90, 40)
assert route_summary([50]) == (1, 50, 50)
assert route_summary([]) == (0, 0, None)
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 순서가 있는 경로를 고치고, 앞서 읽은 값을 잃지 않으면서 새 관찰을 덧붙입니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

route 예제는 [20, 30, 40] cm를 차례로 이동한 뒤 순서를 거꾸로 따라 돌아옵니다. 먼저 시험 모드로 확인하고, 실제 이동 전에는 첫 구간뿐 아니라 전체 경로가 비어 있는지 확인합니다.

python hardware/tello_missions.py route

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

전체 전진 거리와 명령 순서를 예상합니다. 먼저 순서만, 그다음 구간 하나의 길이만 바꿔 보세요. 어느 변경이 최종 위치를 바꾸고 어느 변경이 중간 정지 위치만 바꾸는지 설명합니다.

설명하고 다른 상황에 적용하기

reading = new_value를 반복해서 대입하는 것보다 append로 관찰을 더 많이 보관할 수 있는 이유는 무엇일까요?

재생 목록이나 실험 읽기 값의 순서를 저장하고, 순서를 바꾸면 언제 의미가 달라지는지 설명하세요.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

인덱스를 1부터 세거나 append가 기존 값을 교체한다고 생각한 경우

상자에 0부터 번호를 붙이고, append 뒤의 리스트를 다시 그려 보세요. 앞서 있던 상자는 그대로 남습니다.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

06측정값에 이름 붙이기: 딕셔너리와 기록

의미 있는 키로 기록을 만들고, 빠진 값과 0을 구분하며 여러 차례의 관찰을 보관합니다.

어떤 문제를 풀까요?

[70, 80]을 보고 70이 배터리인지 높이인지 생각해 보세요. 각 값에 이름을 붙인 기록으로 바꿔 봅니다.

항목에 이름을 붙이면 서로 다른 측정값을 구분할 수 있습니다. 같은 항목을 여러 번 관찰할 때는 딕셔너리들을 리스트로 묶어 보관할 수 있습니다.

리스트의 위치로 항목을 구분하면 모두가 같은 순서를 기억해야 합니다. 딕셔너리는 항목에 이름을 붙여 주지만, 단위가 맞는지 또는 센서가 실제로 측정한 값인지까지 검증하지는 않습니다.

읽고, 예상하고, 실행 따라가기

딕셔너리는 키와 값을 연결합니다. 같은 키에 다시 대입하면 그 값이 바뀝니다. 시간에 따른 변화를 보관하려면 읽을 때마다 별도의 딕셔너리를 만들어 리스트에 넣습니다. None은 값이 없음을, 0은 실제로 측정한 영을 나타낼 수 있습니다.

  • 키(key): 항목의 이름
  • 기록(record): 이름 붙은 항목으로 구성된 한 차례의 관찰
  • 결측(missing): 0이 아니라 측정값이 없는 상태
reading = {"battery_pct": 70, "height_cm": 80}
reading["height_cm"] = 85
print(reading["battery_pct"], reading["height_cm"])
예제의 실행 결과와 비교하기
70 85
실행 단계저장된 값·상태결과
기록 생성battery_pct는 70, height_cm는 80출력 없음
height_cm 갱신배터리는 그대로, 높이는 85출력 없음
키로 값 읽기항목 이름으로 값을 구분70 85

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 딕셔너리·키·값·기록 리스트 개념을 사용하세요.

print({"height_cm": 90, "battery_pct": 60}["battery_pct"])
  1. 60
  2. 90
  3. 0

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-06-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 딕셔너리·키·값·기록 리스트 개념을 사용하세요.

r = {"count": 1}
r["count"] = 4
print(r["count"])
  1. 1
  2. 4
  3. 5

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

각 항목을 키: 의미(단위) 형태로 적어 보세요. 값을 바꾼 것이 기존 기록을 수정한 것인지, 새 관찰을 추가한 것인지 구분합니다.

과제 robot-hooks-06-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 딕셔너리·키·값·기록 리스트 개념을 사용하세요.

r = {"robot": "s1", "height_cm": None}
print(r["height_cm"] is None)
  1. False
  2. 0
  3. True

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-06-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 딕셔너리·키·값·기록 리스트 개념을 사용하세요.

weather = {"temp_c": 0, "rain_mm": None}
print(weather["temp_c"] is None)
  1. False
  2. True
  3. 0

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-06-transfer-v1 · 2026-11-02.2

직접 만들어 보기

make_record(robot, sample, battery_pct, height_cm)는 이 네 이름을 키로 쓰는 새 딕셔너리를 반환합니다. 빠진 측정값은 None으로 둡니다. 함수를 두 번 호출해 서로 다른 딕셔너리가 만들어지는지 확인하세요.

def make_record(robot, sample, battery_pct, height_cm):
    return {}

print(make_record("s1", 1, None, None))
내 코드로 확인할 검사
a = make_record("tello", 1, 80, 90)
b = make_record("s1", 2, None, None)
assert a == {"robot": "tello", "sample": 1, "battery_pct": 80, "height_cm": 90}
assert b["height_cm"] is None
assert a is not b
assert set(b) == {"robot", "sample", "battery_pct", "height_cm"}
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 의미 있는 키로 기록을 만들고, 빠진 값과 0을 구분하며 여러 차례의 관찰을 보관합니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

records 예제는 기체를 바닥에 둔 상태에서 실제 배터리·높이 값을 읽어 딕셔너리를 만듭니다. 바닥에서 읽은 높이로 비행 성능을 판단하지 않습니다.

python hardware/tello_missions.py records

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

수집 전에 기록 형식을 정하고 적어도 두 번 관찰합니다. 각 키의 값이 센서, 사람, 계산 중 어디에서 왔는지 구분하고, 얻을 수 없는 값은 비워 둡니다.

설명하고 다른 상황에 적용하기

키에 height_cm라고 적으면 어떤 점이 읽기 쉬워질까요? 그래도 알 수 없는 것은 무엇일까요?

실제 0인 값 하나와 빠진 값 하나를 포함한 날씨 기록을 만들고 둘의 차이를 설명하세요.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

항목 위치를 키처럼 사용하거나 기록 전체를 갱신된 딕셔너리 하나로 덮어쓴 경우

각 항목을 키: 의미(단위) 형태로 적어 보세요. 값을 바꾼 것이 기존 기록을 수정한 것인지, 새 관찰을 추가한 것인지 구분합니다.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

07동작을 다시 쓰기: 함수와 메서드

값을 환산하는 함수와 동작을 수행하는 메서드를 구분하고, 각 호출이 반환하거나 바꾸는 것을 설명합니다.

어떤 문제를 풀까요?

짧은 순찰과 긴 순찰을 요청받았다고 생각해 보세요. 프로그램 전체를 복사해야 할까요, 같은 동작에 다른 입력을 주면 될까요?

함수로 자주 쓰는 동작에 이름을 붙이고 매개변수로 입력을 바꿀 수 있습니다. 하드웨어 메서드를 실행하기 전에 반환값으로 계산을 검사할 수 있습니다.

이동 코드를 복사하면 고칠 곳도 여러 군데가 됩니다. 환산한 거리를 출력하는 것과 다른 함수에 반환하는 것은 다릅니다. tello.move_forward(...)는 특정 기체 객체의 메서드이며, 단순한 환산 함수에는 기체가 필요하지 않습니다.

읽고, 예상하고, 실행 따라가기

def는 함수를 정의하고, 호출하면 함수 내부가 실행됩니다. return은 호출한 곳으로 값을 돌려줍니다. 메서드는 samples.append(value), drone.move_forward(cm)처럼 객체를 통해 호출합니다. 둘 다 호출이지만 어떤 객체의 기능인지, 무엇을 바꾸는지는 다릅니다.

  • 매개변수(parameter): 전달받은 입력에 붙이는 이름
  • return: 호출한 곳에 결과를 돌려주는 문장
  • 메서드(method): 객체를 통해 호출하는 함수
def to_cm(metres):
    return int(round(metres * 100))

commands = []
commands.append(to_cm(0.4))
print(commands)
예제의 실행 결과와 비교하기
[40]
실행 단계저장된 값·상태결과
to_cm 정의아직 함수 내부는 실행하지 않음출력 없음
to_cm(0.4) 호출호출한 곳으로 40 반환출력 없음
commands.append(40); print리스트 메서드가 commands를 바꿈[40]

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 함수·인수·반환값·객체 메서드 개념을 사용하세요.

def leg():
    print("move")
print("ready")
  1. move ready
  2. ready
  3. move

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-07-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 함수·인수·반환값·객체 메서드 개념을 사용하세요.

def double(x):
    return x * 2
print(double(3))
  1. 3
  2. None
  3. 6

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

정의, 호출, 반환, 값의 변화를 따로 표시해 보세요. 숫자를 반환했다고 로봇이 움직이는 것은 아닙니다.

과제 robot-hooks-07-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 함수·인수·반환값·객체 메서드 개념을 사용하세요.

def to_cm(m):
    return int(round(m * 100))
print(to_cm(0.25) + to_cm(0.35))
  1. 60
  2. 0.6
  3. 2535

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-07-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 함수·인수·반환값·객체 메서드 개념을 사용하세요.

def seconds(milliseconds):
    return milliseconds / 1000
print(seconds(500))
  1. 500
  2. 0.5
  3. None

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-07-transfer-v1 · 2026-11-02.2

직접 만들어 보기

out_and_back(distance_m)는 [("forward", cm), ("back", cm)]를 반환합니다. 입력은 0.20~0.80 m이며 cm로 바꾸었을 때 정수가 되는 값입니다. 환산 함수를 사용하되 로봇 라이브러리를 가져오거나 이동 명령을 보내지 않습니다.

def to_cm(distance_m):
    return 0

def out_and_back(distance_m):
    return []

print(out_and_back(0.3))
내 코드로 확인할 검사
assert to_cm(0.2) == 20
assert out_and_back(0.3) == [("forward", 30), ("back", 30)]
assert out_and_back(0.6) == [("forward", 60), ("back", 60)]
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 값을 환산하는 함수와 동작을 수행하는 메서드를 구분하고, 각 호출이 반환하거나 바꾸는 것을 설명합니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

functions 예제는 out_and_back 보조 함수를 호출하고, 그 안에서 기체의 move_forward와 move_back 메서드를 호출합니다. 각 단계에 전달되는 인수에 밑줄을 그어 보세요.

python hardware/tello_missions.py functions

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

로봇 없이 환산 함수와 반환된 계획을 검사합니다. 실제 장비에서는 같은 보조 함수에 목표 거리 0.20 m와 0.30 m를 전달합니다. 함수 하나가 두 요청을 어떻게 처리하는지 설명하세요.

설명하고 다른 상황에 적용하기

to_cm(0.3)을 호출하는 것과 drone.move_forward(30)을 호출하는 것은 어떻게 다를까요?

사진 파일 이름을 만들어 주는 함수를 작성합니다. 이름을 만드는 작업과 실제 파일 저장은 분리하세요.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

정의만 하면 함수 내부가 실행된다고 생각하거나 print가 값을 반환한다고 생각한 경우

정의, 호출, 반환, 값의 변화를 따로 표시해 보세요. 숫자를 반환했다고 로봇이 움직이는 것은 아닙니다.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

08모든 칸 살펴보기: 중첩 반복문과 격자

격자의 모든 칸을 한 번씩 나열하고, 논리적인 좌표와 실제 이동을 구분합니다.

어떤 문제를 풀까요?

종이로 2행 3열의 점검 격자를 만듭니다. 반복문 두 개를 쓰면 다섯 번 점검할지 여섯 번 점검할지 예상해 보세요.

두 차원의 모든 조합을 살피려면 행과 열을 함께 순회해야 합니다. 바깥 반복문이 행을 고를 때마다 안쪽 반복문이 그 행의 열들을 확인합니다.

행 수와 열 수를 더해서는 모든 조합을 나열할 수 없습니다. 논리적인 격자 좌표는 그 자체로 비행이나 바퀴 이동 명령이 되지 않으므로 실제 경로의 모양과 거리를 따로 정해야 합니다.

읽고, 예상하고, 실행 따라가기

바깥쪽 행이 바뀔 때마다 안쪽 열 반복문은 처음부터 다시 시작합니다. 2행 3열 격자의 칸 수는 2 * 3입니다. 실제로 이동할 때는 행마다 진행 방향을 바꾸면 불필요하게 되돌아가는 거리를 줄일 수 있습니다.

  • 바깥 반복문(outer loop): 행 하나를 고름
  • 안쪽 반복문(inner loop): 그 행의 열들을 차례로 살핌
  • 좌표(coordinate): 행과 열을 묶은 위치
for row in range(2):
    for col in range(2):
        print(row, col)
예제의 실행 결과와 비교하기
0 0
0 1
1 0
1 1
실행 단계저장된 값·상태결과
row = 0col이 0, 1을 차례로 사용0 0; 0 1
row = 1col이 다시 0, 1부터 시작1 0; 1 1

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 중첩 for문·행과 열의 좌표 개념을 사용하세요.

print(2 * 3)
  1. 5
  2. 23
  3. 6

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-08-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 중첩 for문·행과 열의 좌표 개념을 사용하세요.

n = 0
for row in range(2):
    for col in range(3):
        n += 1
print(n)
  1. 6
  2. 5
  3. 3

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

행 하나를 적고 옆에 그 행의 모든 열을 나열해 보세요. 다음 행에서도 같은 작업을 반복합니다.

과제 robot-hooks-08-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 중첩 for문·행과 열의 좌표 개념을 사용하세요.

for row in range(1):
    for col in range(3):
        print(row, col)
  1. 0 0 1 1 2 2
  2. 0 0 0 1 0 2
  3. 1 1 1 2 1 3

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-08-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 중첩 for문·행과 열의 좌표 개념을 사용하세요.

for day in range(2):
    for sensor in ["A", "B"]:
        print(day, sensor)
  1. 0 A 1 B
  2. A 0 B 1
  3. 0 A 0 B 1 A 1 B

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-08-transfer-v1 · 2026-11-02.2

직접 만들어 보기

grid_cells(rows, cols)는 행을 기준으로 (row, col) 쌍을 차례로 반환합니다. 입력은 0 이상의 정수입니다. 행이 0인 경우와 열이 0인 경우도 검사하세요. 결과는 점검 목록이며 로봇을 움직이지 않습니다.

def grid_cells(rows, cols):
    cells = []
    return cells

print(grid_cells(2, 3))
내 코드로 확인할 검사
assert grid_cells(2, 3) == [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
assert grid_cells(0, 3) == []
assert grid_cells(2, 0) == []
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 격자의 모든 칸을 한 번씩 나열하고, 논리적인 좌표와 실제 이동을 구분합니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

grid 예제는 간격 30 cm의 2행 2열 경로를 지그재그로 지나며 각 논리적 칸을 출력합니다. 이 제한된 시연으로 실제 촬영 범위, 자율 위치 추정, 장애물 회피가 검증되는 것은 아닙니다.

python hardware/tello_missions.py grid

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

시험 모드의 명령 기록에 맞춰 종이 격자의 칸을 표시하고 중복 여부와 개수를 확인합니다. 교사 감독 아래 한 번 이동한 뒤 실제 위치도 표시합니다. 칸 번호를 출력한 것과 실제 촬영 범위를 확인한 것을 구분하세요.

설명하고 다른 상황에 적용하기

점검 횟수는 왜 행 수와 열 수를 곱한 값일까요? 격자 번호만으로는 실제 로봇을 움직일 수 없는 이유도 설명해 보세요.

각 센서를 매일 확인하는 일정을 만듭니다. 어느 반복문이 다시 시작되는지, 전체 읽기 횟수는 몇 번인지 설명하세요.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

두 반복 횟수를 더하거나 안쪽 반복문을 다시 시작하지 않은 경우

행 하나를 적고 옆에 그 행의 모든 열을 나열해 보세요. 다음 행에서도 같은 작업을 반복합니다.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

09기록 남기기: 파일, CSV와 데이터 출처

항목 이름·단위·출처·실패 결과를 포함한 실험 기록을 저장하고 다시 읽습니다.

어떤 문제를 풀까요?

결과를 화면에만 출력한 프로그램을 종료합니다. 다음 수업에서 어떤 기록을 다시 살펴볼 수 있을까요?

표를 파일로 저장하면 프로그램이 끝나도 남아 다른 도구로 다시 열 수 있습니다. 기록 형식과 출처를 함께 적어 두어야 나중에 측정값을 해석할 수 있습니다.

메모리의 리스트는 프로그램이 종료되면 사라지고, 성공한 실험만 복사하면 기록이 한쪽으로 치우칩니다. S1 Lab은 노트북의 CSV 파일을 직접 쓸 수 없으므로 관찰자가 제공된 노트북 도구로 실제 실험을 기록합니다.

읽고, 예상하고, 실행 따라가기

CSV는 첫 줄에 열 이름을 쓰고, 그다음부터 한 행에 기록 하나씩 저장합니다. DictWriter는 정해진 항목 목록에 맞춰 값을 씁니다. CSV의 값은 텍스트이므로 다시 읽은 숫자 문자열을 계산에 쓰려면 변환해야 합니다.

  • 스키마(schema): 예상하는 열과 각 열의 의미
  • 출처(provenance): 값을 어디서 얻었는지 나타내는 정보
  • CSV: 쉼표로 항목을 나누어 저장하는 표 형태의 텍스트
import csv
from io import StringIO
text = "robot,target_cm\ntello,30\ns1,30\n"
rows = list(csv.DictReader(StringIO(text)))
print(len(rows), rows[0]["target_cm"])
예제의 실행 결과와 비교하기
2 30
실행 단계저장된 값·상태결과
CSV의 첫 줄robot, target_cm가 키가 됨출력 없음
DictReader로 읽기딕셔너리 두 개 생성, 값은 문자열출력 없음
개수와 첫 목표 값 확인기록 2개, 첫 값은 문자열 "30"2 30

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 파일 입출력·CSV·행·기록 형식·데이터 출처 개념을 사용하세요.

import csv
from io import StringIO
r = list(csv.DictReader(StringIO("x\n3\n4\n")))
print(len(r))
  1. 2
  2. 3
  3. 1

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-09-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 파일 입출력·CSV·행·기록 형식·데이터 출처 개념을 사용하세요.

import csv
from io import StringIO
r = next(csv.DictReader(StringIO("cm\n30\n")))
print(type(r["cm"]).__name__)
  1. int
  2. str
  3. float

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

첫 줄의 열 이름과 데이터 행을 구분하세요. DictReader로 읽은 값은 문자열이므로 계산하기 전에 자료형을 바꿔야 합니다.

과제 robot-hooks-09-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 파일 입출력·CSV·행·기록 형식·데이터 출처 개념을 사용하세요.

import csv
from io import StringIO
r = list(csv.DictReader(StringIO("cm\n20\n35\n")))
print(sum(int(x["cm"]) for x in r))
  1. 2035
  2. 2
  3. 55

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-09-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 파일 입출력·CSV·행·기록 형식·데이터 출처 개념을 사용하세요.

import csv
from io import StringIO
r = list(csv.DictReader(StringIO("day,rain_mm\nMon,0\nTue,2\n")))
print(r[0]["rain_mm"])
  1. 0
  2. 2
  3. None

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-09-transfer-v1 · 2026-11-02.2

직접 만들어 보기

target_cm 열이 있는 CSV 텍스트를 읽어 목표 거리를 숫자로 바꾼 뒤 순서대로 반환하세요. 입력에는 유효한 정수 문자열이 들어 있습니다. 이어서 record_trial.py로 완료하거나 중단한 실제 실험을 origin=measured로 저장합니다. 연습용 가상 데이터를 고쳐 실측값처럼 쓰지 않습니다.

import csv
from io import StringIO

def read_targets(text):
    return []

print(read_targets("target_cm\n30\n40\n"))
내 코드로 확인할 검사
assert read_targets("target_cm\n30\n40\n") == [30, 40]
assert read_targets("target_cm\n") == []
assert read_targets("target_cm\n0\n") == [0]
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 항목 이름·단위·출처·실패 결과를 포함한 실험 기록을 저장하고 다시 읽습니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

telemetry 예제는 기체를 바닥에 둔 상태에서 실제 읽기 값을 --log로 지정한 파일에 씁니다. 이동 실험에서는 관찰자가 줄자로 독립적으로 잰 값을 record_trial.py로 기록합니다.

python hardware/tello_missions.py telemetry --log grounded-state.csv

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

사용 가능한 로봇으로 짧은 이동 실험을 한 번씩 수행합니다. 같은 목표 거리를 쓰고, 중간에 멈춘 경우에도 로봇·조건·짝 번호·실행 순서·측정 방법·결과·목표를 남깁니다. 터미널 출력과 다시 연 CSV를 비교하세요.

설명하고 다른 상황에 적용하기

저장한 행에 실험 결과와 측정 방법을 함께 적어야 하는 이유는 무엇일까요?

다른 학생이 일주일 뒤에도 이해할 수 있도록 출처와 단위를 포함한 날씨 관찰 기록을 남기세요.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

열 이름을 실험 한 건으로 세거나 CSV 값이 이미 숫자라고 생각한 경우

첫 줄의 열 이름과 데이터 행을 구분하세요. DictReader로 읽은 값은 문자열이므로 계산하기 전에 자료형을 바꿔야 합니다.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

10빈 값과 0 구분하기: pandas 데이터 정리

숫자 텍스트를 변환해 누락되거나 불가능한 값을 찾고, 실패한 실험의 개수도 보관합니다.

어떤 문제를 풀까요?

거리를 적지 않은 빈칸과 숫자 0을 비교합니다. 모든 빈칸을 0으로 채우면 로봇의 성능을 더 잘 알 수 있을까요?

컴퓨터가 읽을 수 있는 파일에도 사용할 수 없거나 빠진 값이 들어 있을 수 있습니다. 변환 방법과 표시 이유를 명시하면 정리 과정을 확인할 수 있고, 없던 측정값을 만들어 넣는 일을 막을 수 있습니다.

빠진 거리를 0으로 바꾸면 큰 오차를 임의로 만들어 냅니다. 실패한 행을 모두 지우면 로봇이 실제보다 잘 작동한 것처럼 보입니다. 원본 파일을 보관하고 각 행을 어떻게 처리했는지 별도 파일에 남깁니다.

읽고, 예상하고, 실행 따라가기

pd.to_numeric(errors="coerce")는 숫자로 바꿀 수 없는 텍스트를 결측값으로 만듭니다. isna로 이를 찾고, 불리언 마스크로 분석 대상 행을 고릅니다. 제외한 행과 제외 이유도 다시 확인할 수 있어야 합니다.

  • DataFrame: 열 이름이 있는 표
  • 마스크(mask): 행마다 True/False로 선택 여부를 나타낸 값
  • coerce: 숫자로 바꿀 수 없는 텍스트를 결측값으로 처리하는 옵션
import pandas as pd
s = pd.to_numeric(pd.Series(["30", "bad", "0"]), errors="coerce")
print(int(s.isna().sum()), int(s.dropna().sum()))
예제의 실행 결과와 비교하기
1 30
실행 단계저장된 값·상태결과
숫자 텍스트 변환30.0, 결측값, 0.0출력 없음
isna().sum()측정값을 모르는 항목 1개첫 결과는 1
dropna로 관찰값만 더하기30 + 0, 원본의 결측값은 그대로 남음1 30

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 DataFrame·숫자 변환·마스크·결측값 개념을 사용하세요.

import pandas as pd
print(pd.isna(None))
  1. False
  2. True
  3. 0

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-10-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 DataFrame·숫자 변환·마스크·결측값 개념을 사용하세요.

import pandas as pd
s = pd.to_numeric(pd.Series(["20", "oops", "40"]), errors="coerce")
print(int(s.notna().sum()))
  1. 3
  2. 1
  3. 2

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

실제로 잰 0, 빈칸, 잘못된 텍스트를 따로 구분하세요. 숫자 변환에 실패하면 표시해 두어야 하며 임의의 값을 넣어서는 안 됩니다.

과제 robot-hooks-10-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 DataFrame·숫자 변환·마스크·결측값 개념을 사용하세요.

import pandas as pd
s = pd.Series([0.0, None, 30.0])
print(int(s.isna().sum()), int((s == 0).sum()))
  1. 1 1
  2. 2 0
  3. 0 2

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-10-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 DataFrame·숫자 변환·마스크·결측값 개념을 사용하세요.

import pandas as pd
s = pd.to_numeric(pd.Series(["0", "", "2"]), errors="coerce")
print(int(s.notna().sum()))
  1. 3
  2. 2
  3. 1

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-10-transfer-v1 · 2026-11-02.2

직접 만들어 보기

clean_distances(values)는 pandas로 문자열을 숫자로 바꾸고, 빠진 값과 음수를 제외한 나머지 값을 원래 순서대로 반환합니다. 이 작은 연습이 전체 실험 기록의 행을 지우는 것은 아닙니다. 전체 실험에서는 모든 시도의 결과 개수를 보관합니다.

import pandas as pd

def clean_distances(values):
    return []

print(clean_distances(["30", "", "-2", "0"]))
내 코드로 확인할 검사
assert clean_distances(["30", "", "-2", "0"]) == [30, 0]
assert clean_distances(["bad", None]) == []
assert clean_distances([]) == []
assert clean_distances(["12.5"]) == [12.5]
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 숫자 텍스트를 변환해 누락되거나 불가능한 값을 찾고, 실패한 실험의 개수도 보관합니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

저장한 Tello 기록이나 가상 데이터라고 명시된 연습 파일을 씁니다. 바닥에서 읽은 기체 상태와 독립적으로 측정한 이동 실험은 구분합니다.

python analyze_trials.py --input data/synthetic_trials.csv --origin synthetic --output practice-analysis

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

data/synthetic_trials.csv를 analyze_trials.py로 분석하고 원본 행과 row_audit.csv를 나란히 봅니다. 잘못된 형식, 누락, 중단, 출처 불일치에 서로 다른 표시가 붙는 이유를 설명하세요.

설명하고 다른 상황에 적용하기

실제로 측정한 0은 남기고 빠진 값은 통계에서 제외하는 것이 왜 둘 다 올바른 처리일까요?

관찰하지 않은 날을 비가 오지 않은 날로 바꾸지 않으면서 강수량 열을 정리하세요.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

결측값을 0과 같다고 보거나 중단한 실험을 지운 경우

실제로 잰 0, 빈칸, 잘못된 텍스트를 따로 구분하세요. 숫자 변환에 실패하면 표시해 두어야 하며 임의의 값을 넣어서는 안 됩니다.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

11어떤 설정이 나을까요? 묶어서 비교하고 그래프 그리기

같은 로봇 안에서 설정을 짝지어 반복 비교합니다. 시도 수·절대오차·값의 퍼짐·결과 비율을 함께 보고 자료가 뒷받침하는 범위에서 설명합니다.

어떤 문제를 풀까요?

평균 오차는 같지만 값이 퍼진 정도가 다른 설정 두 개를 봅니다. 평균 하나로는 어떤 정보를 알 수 없을까요?

비슷한 조건끼리 묶어 비교하고 개수와 퍼짐을 함께 보면 요약값을 뒷받침하는 기록이 얼마나 있는지 알 수 있습니다. 각 점을 표시한 그래프는 평균에 가려진 차이를 보여 줍니다.

잘된 실험 한 번만으로 결론을 내리기는 어렵습니다. 서로 다른 로봇을 합치면 기계적인 차이가 가려집니다. 느린 실험과 빠른 실험의 바닥까지 다르면 속도와 바닥 중 무엇이 영향을 주었는지 구분하기 어렵습니다.

읽고, 예상하고, 실행 따라가기

부호 있는 오차는 실측값에서 목표를 뺀 값이고, 절대오차는 빗나간 크기입니다. 로봇과 조건별로 묶어 모든 시도의 결과를 세고, 거리 통계는 완료된 유효 측정값으로 계산합니다. 유효한 점을 모두 그리며 제외한 시도의 개수도 적습니다.

  • 그룹(group): 비교할 수 있는 행의 묶음
  • 절대오차(absolute error): 목표에서 빗나간 크기
  • 교란 요인(confound): 함께 바뀌어 영향을 구분하기 어렵게 하는 다른 조건
  • 퍼짐(spread): 시도 사이에서 값이 달라지는 정도
import pandas as pd
df = pd.DataFrame({"setting": ["slow", "slow", "fast", "fast"], "error_cm": [1, -1, 4, -4]})
df["abs_error"] = df["error_cm"].abs()
print(df.groupby("setting")["abs_error"].mean().to_dict())
예제의 실행 결과와 비교하기
{'fast': 4.0, 'slow': 1.0}
실행 단계저장된 값·상태결과
오차의 절댓값 계산slow: 1,1 / fast: 4,4출력 없음
설정별로 묶기각각 관찰값 2개인 그룹 두 개출력 없음
그룹별 평균 계산fast는 4.0, slow는 1.0{'fast': 4.0, 'slow': 1.0}

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 groupby·요약 통계·값의 차이·조건을 통제한 비교 개념을 사용하세요.

print((4 + -4) / 2)
  1. 4.0
  2. 8
  3. 0.0

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-11-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 groupby·요약 통계·값의 차이·조건을 통제한 비교 개념을 사용하세요.

errors = [3, -5]
print(sum(abs(e) for e in errors) / len(errors))
  1. 4.0
  2. -1.0
  3. 8.0

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

절댓값을 구하기 전에 부호 있는 오차부터 평균 내면 +4와 -4가 상쇄됩니다. 각 비율의 분모가 무엇인지도 적어 보세요.

과제 robot-hooks-11-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 groupby·요약 통계·값의 차이·조건을 통제한 비교 개념을 사용하세요.

import pandas as pd
df = pd.DataFrame({"condition": ["a", "a", "b"], "error": [2, 4, 9]})
print(float(df.groupby("condition")["error"].mean()["a"]))
  1. 5.0
  2. 3.0
  3. 2.0

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-11-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 groupby·요약 통계·값의 차이·조건을 통제한 비교 개념을 사용하세요.

waits = [1, 1, 7]
print(max(waits) - min(waits))
  1. 3
  2. 7
  3. 6

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-11-transfer-v1 · 2026-11-02.2

직접 만들어 보기

error_summary(target_cm, observed_cm)는 개수, 부호 있는 오차의 평균, 절대오차의 평균, 부호 있는 오차의 범위를 반환합니다. 관찰값은 모두 완료된 유효 숫자입니다. 빈 리스트는 개수 0과 세 통계값에 대해 None을 반환합니다. 이어서 analyze_trials.py가 만든 그룹별 CSV와 그래프를 확인하세요.

def error_summary(target_cm, observed_cm):
    return {"n": 0, "bias_cm": None, "mae_cm": None, "range_cm": None}

print(error_summary(30, [29, 31]))
내 코드로 확인할 검사
assert error_summary(30, [29, 31]) == {"n": 2, "bias_cm": 0, "mae_cm": 1, "range_cm": 2}
assert error_summary(30, []) == {"n": 0, "bias_cm": None, "mae_cm": None, "range_cm": None}
assert error_summary(30, [34])["mae_cm"] == 4
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 같은 로봇 안에서 설정을 짝지어 반복 비교합니다. 시도 수·절대오차·값의 퍼짐·결과 비율을 함께 보고 자료가 뒷받침하는 범위에서 설명합니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

trial 예제에서 느린 조건은 --speed 20, 빠른 조건은 --speed 30으로 설정하고 목표 거리는 30 cm로 고정합니다. 매번 착륙한 뒤 관찰자가 측정하며 Tello의 시도끼리 비교합니다.

python hardware/tello_missions.py trial

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

로봇마다 느림·빠름 조건을 적어도 세 쌍 계획합니다. 느림-빠름, 빠름-느림, 느림-빠름 순으로 번갈아 실행하거나 무작위 순서를 정해 기록합니다. 중단한 시도도 남기고 목표 30 cm, 바닥, 배터리 범위, 자, 출발 위치를 같게 유지합니다. 배터리 변화와 실행 순서처럼 남은 한계도 적습니다. 이는 교실에서 조건을 탐색한 자료이며 전체 기체의 속도 성능을 일반화한 결론은 아닙니다.

설명하고 다른 상황에 적용하기

평균 오차와 함께 시도 수와 실패한 시도도 보고해야 하는 이유는 무엇일까요?

대기열 처리 규칙 두 개를 여러 번 비교하세요. 가장 짧았던 대기 시간만 보여 주지 말고 작업량과 실행 순서도 기록합니다.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

오차의 상쇄를 정확도로 판단하거나 실패·제외한 시도를 무시한 경우

절댓값을 구하기 전에 부호 있는 오차부터 평균 내면 +4와 -4가 상쇄됩니다. 각 비율의 분모가 무엇인지도 적어 보세요.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

12점검 미션을 만들고 근거로 설명하기

각 구조를 선택한 이유를 설명하고, 정한 범위 안의 동작을 시연하며 다른 사람이 다시 확인할 수 있는 기록과 한계를 제시합니다.

어떤 문제를 풀까요?

표시된 지점 네 곳을 점검하고, 설정을 바꾸었을 때 더 안정적으로 작동했는지 설명해 달라는 요청을 받았습니다. 정답 코드를 보기 전에 어떤 구조를 쓸지 골라 보세요.

실제 작업에는 계획, 실행, 기록이 함께 필요합니다. 리스트는 지점의 순서, 딕셔너리는 읽기 값의 이름, 반복문은 반복이나 대기, 함수는 여러 번 쓸 판단을 맡는 식으로 각 구조의 역할을 정합니다.

로봇이 움직였다고 모든 지점을 점검한 것은 아닙니다. 공개 검사 통과만으로 이해도나 실제 장비의 신뢰성을 입증할 수도 없습니다. 가상 데이터로 그린 그래프는 실제 로봇의 결과가 아닙니다.

읽고, 예상하고, 실행 따라가기

미션 데이터, 동작 규칙, 관찰 기록을 구분합니다. 한 구간이라도 움직이기 전에 전체 경로를 검사하고, 정상 경로·빈 경로·허용하지 않는 값을 시험합니다. 알려진 지점은 정해진 순찰로 확인하고, 관찰 결과를 기다려야 할 때만 횟수가 제한된 대기를 사용합니다.

  • 요구 사항(requirement): 관찰로 확인할 수 있는 성공 조건
  • 통합(integration): 각 부분을 연결해 함께 작동시키는 것
  • 재현성(reproducibility): 다른 사람도 같은 분석을 다시 실행할 수 있음
route_cm = [20, 30]
records = []
for station, distance_cm in enumerate(route_cm):
    records.append({"station": station, "target_cm": distance_cm})
print(len(records), records[1]["target_cm"])
예제의 실행 결과와 비교하기
2 30
실행 단계저장된 값·상태결과
지점 0, 거리 20항목 이름이 있는 기록 하나 추가출력 없음
지점 1, 거리 30두 번째 기록 추가출력 없음
기록 확인기록 2개, 두 번째 목표는 302 30

실행 전에 풀어 보기

이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.

먼저 예상하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 자료구조 선택·검사·통합·관찰 근거 개념을 사용하세요.

route = [20, 30, 40]
print(len(route))
  1. 3
  2. 90
  3. 2

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-12-diagnosis-v1 · 2026-11-02.2

힌트와 함께 풀기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 자료구조 선택·검사·통합·관찰 근거 개념을 사용하세요.

rows = []
for station in range(2):
    rows.append({"station": station})
print(rows[-1]["station"])
  1. 2
  2. 1
  3. 0

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

힌트

요구 사항마다 데이터 항목, 동작 규칙, 관찰로 확인할 방법을 연결해 보세요. 전체 계획이 검사를 통과하기 전에 움직이지 않습니다.

과제 robot-hooks-12-guided-v1 · 2026-11-02.2

혼자 풀어 보기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 자료구조 선택·검사·통합·관찰 근거 개념을 사용하세요.

route = [20, 0, 30]
print(all(20 <= x <= 80 for x in route))
  1. True
  2. 0
  3. False

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-12-independent-a-v1 · 2026-11-02.2

다른 상황에 적용하기

실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 자료구조 선택·검사·통합·관찰 근거 개념을 사용하세요.

queue = ["A", "B"]
receipts = []
for job in queue:
    receipts.append({"job": job, "done": False})
print(receipts[1]["done"])
  1. False
  2. True
  3. B

실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.

과제 robot-hooks-12-transfer-v1 · 2026-11-02.2

직접 만들어 보기

mission_plan(route_cm)는 기록을 만들기 전에 경로 전체를 검사합니다. 불리언을 제외한 정확한 int 자료형만 받으며, 값은 20~80 cm, 최대 네 구간, 전체 합계는 200 cm 이하여야 합니다. 그 밖의 입력에는 ValueError를 발생시킵니다. 구간마다 {station, target_cm} 딕셔너리를 하나씩 반환하세요. 이어서 제공된 실행 코드로 검토한 고정 경로를 시연하고 모든 시도를 기록한 뒤, 기록이 뒷받침하는 설명을 적습니다.

def mission_plan(route_cm):
    return []

print(mission_plan([20, 30]))
내 코드로 확인할 검사
assert mission_plan([20, 30]) == [{"station": 0, "target_cm": 20}, {"station": 1, "target_cm": 30}]
assert mission_plan([]) == []
for route in ([0], [81], [True], [20.5], ["30"], [80, 80, 80], [20] * 5):
    try:
        mission_plan(route)
    except ValueError:
        pass
    else:
        raise AssertionError("invalid route accepted: " + repr(route))
  • 구체적인 입력과 값의 변화를 따라가며 목표를 설명합니다: 각 구조를 선택한 이유를 설명하고, 정한 범위 안의 동작을 시연하며 다른 사람이 다시 확인할 수 있는 기록과 한계를 제시합니다.
  • 시작 코드를 수정해 공개 검사를 통과하고, 예상과 실제 결과를 비교할 새 사례를 하나 추가합니다.
  • 로봇 실험이나 모의실험임을 밝힌 결과물을 제시하고, 관찰의 한계와 조건을 바꾼 과제의 풀이를 설명합니다.
Tello 실습

로봇에서 관찰하기

route 또는 square 예제와 시험 모드의 명령 기록에서 시작합니다. 실제 실행 코드를 바꿀 때도 검토한 수업 범위 안에서 바꾸며, 미션에 필요한 경우에만 횟수를 제한한 제자리 비행 검사를 사용합니다. 지점을 방문했다고 출력한 문장은 명령 기록이며 별도의 점검 근거가 되지는 않습니다.

python hardware/tello_missions.py route

--live 없이 실행하면 명령 기록만 출력하며 드론에는 연결하지 않습니다.

한 가지만 바꾸어 측정하기

경로 계획, 개념과 요구 사항을 연결한 표, 예상 명령 기록, 검사한 코드, 출처를 적은 원본 실험 CSV, 데이터 정리 기록, 그룹별 그래프와 90초 설명을 제출합니다. 실패한 사례와 조건을 바꾼 과제도 포함하세요. 실제 장비가 없다면 전체 시연을 모의실험으로 표시하고 장비의 신뢰성은 아직 판단하지 않습니다.

설명하고 다른 상황에 적용하기

반복문, 자료구조, 함수를 하나씩 골라 해결하는 요구 사항을 설명하세요. 다른 방법과, 어떤 경우에 그 방법을 택할지도 함께 이야기합니다.

사진 처리 대기열에 계획-실행-기록을 나누는 방식을 적용합니다. 그대로 설명할 수 있는 점과 새 근거가 필요한 점을 구분하세요.

코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.

예상과 다르다면

명령이 끝났다는 사실과 실제로 측정한 미션 성공을 혼동한 경우

요구 사항마다 데이터 항목, 동작 규칙, 관찰로 확인할 방법을 연결해 보세요. 전체 계획이 검사를 통과하기 전에 움직이지 않습니다.

수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.

출처와 수업 안내

CIT의 기존 Python·데이터 과학 수업에 Tello 실습을 연결한 자료입니다. 학습 내용 버전: 2026-11-02.2. 모든 수업에서 EN/KO로 언어를 바꿀 수 있습니다.

공식 참고 자료

아직 보지 않은 독립 과제나 나중에 다시 풀 문제는 선생님에게 요청하세요. 이 페이지는 점수를 부여하거나 LMS 수업 완료를 기록하지 않으며 복습 일정을 자동으로 예약하지 않습니다.