먼저 예상하기
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 변수·수·단위 환산 개념을 사용하세요.
print(20 / 100)200.22000
실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-01-diagnosis-v1 · 2026-11-02.2명령을 계획하고 코드의 실행을 따라간 뒤 RoboMaster Lab Python으로 짧은 이동을 시험합니다. 관찰한 내용을 바탕으로 코드로 확인할 수 있는 것과 실제로 측정해야 할 것을 설명합니다.
코드가 어떻게 실행될지 따라갑니다.
요구 사항 하나를 바꿔 만듭니다.
명령한 값과 실제 측정값을 구분합니다.
결과가 나온 이유를 설명합니다.
RoboMaster 앱 → Lab → Python에서 실행합니다. def start()를 포함한 S1 프로그램 전체를 붙여 넣으세요. S1 컨트롤러를 사용하는 예제이며 EP용 데스크톱 SDK로 대체하지 않습니다.
먼저 종이나 시험 실행의 명령 기록으로 확인합니다. 실제로 움직이기 전에는 선생님이 장비와 표시된 실습 구역을 점검합니다. 이 자료의 코드는 소프트웨어로 검사했으며 실제 비행이나 교실 장비 시험을 마쳤다는 뜻은 아닙니다.
python3.12 -m venv .venv
# macOS / Linux
source .venv/bin/activate
# Windows PowerShell: .venv\Scripts\Activate.ps1
python -m pip install -r requirements.txtS1 이동 코드는 앱의 Lab에서, 데이터 분석은 노트북에서 실행합니다. 연습용으로 만든 값, 모의실험 값, 실측값을 구분해 표시하세요.
계획한 거리를 Tello에는 cm, S1에는 m로 전달하고, 두 명령이 같은 거리를 뜻하는 이유를 설명합니다.
바닥에 30 cm 간격으로 테이프 표시 두 개를 붙이고, 30과 0.30이 적힌 카드를 봅니다. 각 로봇에는 어떤 값을 전달해야 할까요?
거리에 이름을 붙여 저장하면 이동 계획을 바꿀 때 그 값만 수정할 수 있습니다. Tello는 cm, S1은 m 단위를 쓰므로 같은 숫자를 그대로 전달하면 이동 거리도 달라집니다.
30이라는 숫자만으로는 단위를 알 수 없습니다. 여러 명령에 같은 숫자를 반복해서 쓰면 경로를 바꿀 때 일부를 빠뜨리기 쉽습니다. 변수 이름으로 단위를 나타낼 수는 있지만, 이름을 붙이는 것만으로 값이 환산되지는 않습니다.
대입은 값에 이름을 붙여 저장하는 작업입니다. m 단위 값에 100을 곱하면 cm 단위 값이 됩니다. int(round(...))는 명령에 쓸 거리를 정수 cm로 나타냅니다. 이 수업의 예제 거리는 모두 정수 cm로 정확히 표현할 수 있습니다.
distance_m = 0.30
distance_cm = int(round(distance_m * 100))
print(distance_cm, distance_m)30 0.3| 실행 단계 | 저장된 값·상태 | 결과 |
|---|---|---|
| distance_m = 0.30 | distance_m에 0.3 m 저장 | 출력 없음 |
| 100을 곱하고 round, int 적용 | distance_cm은 30 cm | 출력 없음 |
| 두 값 출력 | 두 값이 나타내는 실제 거리는 같음 | 30 0.3 |
이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 변수·수·단위 환산 개념을 사용하세요.
print(20 / 100)200.22000실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-01-diagnosis-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 변수·수·단위 환산 개념을 사용하세요.
length_m = 0.40
print(int(round(length_m * 100)))040040실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
각 값 옆에 m 또는 cm를 적어 보세요. 100을 곱해 바꾸는 것은 숫자의 표현이며, 나타내는 실제 거리는 같습니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 변수·수·단위 환산 개념을 사용하세요.
leg_m = 0.25
print(int(round(leg_m * 100)), leg_m)25 0.250 2525 25실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-01-independent-a-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 변수·수·단위 환산 개념을 사용하세요.
duration_ms = 250
print(duration_ms / 1000)2500.25250000실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-01-transfer-v1 · 2026-11-02.2command_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)hardware/s1/01_units.py 전체를 새 Lab Python 프로그램에 붙여 넣습니다. 0.2 m/s로 0.30 m 이동한 뒤 돌아오는 코드입니다. 두 로봇에 전달할 값을 먼저 예상하고 distance_m만 바꿔 보세요.
# DJI RoboMaster S1 app > Lab > Python. No imports. Units: metres, m/s.
def start():
chassis_ctrl.stop()
robot_ctrl.set_mode(rm_define.robot_mode_free)
chassis_ctrl.set_trans_speed(0.2)
distance_m = 0.30
chassis_ctrl.move_with_distance(0, distance_m)
chassis_ctrl.move_with_distance(180, distance_m)
chassis_ctrl.stop()로봇이 최종적으로 어디에 멈출지 예상합니다. 정지하거나 착륙한 뒤 테이프 표시를 기준으로 실제 위치를 재고, 목표 거리와 관찰한 거리를 따로 적습니다. 같은 거리를 명령해도 이동 정확도가 같다고 볼 수는 없습니다.
단위 없이 숫자 30을 두 로봇에 똑같이 전달하면 어떤 문제가 생길까요?
카메라의 지연 시간을 밀리초에서 초로 환산하고, API에 값을 전달할 때 어떤 단위를 써야 하는지 설명합니다.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
숫자에 단위가 저절로 따라붙는다고 생각한 경우
각 값 옆에 m 또는 cm를 적어 보세요. 100을 곱해 바꾸는 것은 숫자의 표현이며, 나타내는 실제 거리는 같습니다.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
두 조건을 모두 확인하는 출발 규칙을 만들고, 기준보다 작은 값·같은 값·큰 값으로 검사합니다.
이동 경로는 비어 있지만 배터리가 부족한 경우와, 배터리는 충분하지만 경로가 막힌 경우를 비교합니다. 어느 쪽이 출발해도 될까요?
입력이 달라지면 같은 프로그램도 다른 동작을 해야 합니다. 조건을 함께 쓰면 출발 규칙을 코드로 명확하게 나타내고 움직이기 전에 검사할 수 있습니다.
아무 조건 없이 출발하면 입력을 무시하게 되고, 조건 하나만 검사하면 나머지 조건을 놓칩니다. 수업에서 정한 배터리 기준은 실습 규칙이며 제조사가 보장한 기준은 아닙니다.
if는 조건에 따라 실행할 갈래를 고릅니다. >=는 기준과 같은 값도 포함하고, A and B는 두 조건이 모두 True일 때만 True입니다. Tello에는 수업용 사전 점검 기준인 배터리 40% 이상을 적용합니다. 이동 구역이 비어 있는지는 감독하는 사람이 확인합니다.
battery = 40
clear = False
if battery >= 40 and clear:
print("go")
else:
print("stop")stop| 실행 단계 | 저장된 값·상태 | 결과 |
|---|---|---|
| battery >= 40 | 40 >= 40은 True | 출력 없음 |
| True and clear | True and False는 False | else 선택 |
| else 안의 print | 출발 조건을 충족하지 못함 | stop |
이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 if/else·>=·and 개념을 사용하세요.
print(40 > 40)True40False실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-02-diagnosis-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 if/else·>=·and 개념을 사용하세요.
battery = 41
clear = True
print(battery >= 40 and clear)TrueFalse41실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
True/False 조합 네 가지를 표로 만들고 39, 40, 41을 각각 검사해 보세요. 경로가 비어 있어도 배터리 조건을 충족하지 못하면 출발할 수 없습니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 if/else·>=·and 개념을 사용하세요.
battery = 39
print("go" if battery >= 40 and True else "stop")gostop39실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-02-independent-a-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 if/else·>=·and 개념을 사용하세요.
print("enter" if 12 >= 12 and False else "wait")enterTruewait실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-02-transfer-v1 · 2026-11-02.2permit(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"02_decisions.py는 로봇을 움직이지 않고 실제 정지 마커 감지 여부에 따라 LED를 바꿉니다. 마커가 없다는 이유로 움직임을 허용하지 않습니다. 화면에 출력하는 배터리 예제는 노트북 연습용이며 S1 배터리 API가 아닙니다.
# Observe a genuine DJI stop marker. LED only; no movement permission.
def start():
chassis_ctrl.stop()
vision_ctrl.enable_detection(rm_define.vision_detection_marker)
time.sleep(0.5)
stop_seen = vision_ctrl.check_condition(rm_define.cond_recognized_marker_trans_stop)
if stop_seen:
led_ctrl.set_top_led(rm_define.armor_top_all, 255, 0, 0, rm_define.effect_always_on)
else:
led_ctrl.set_top_led(rm_define.armor_top_all, 0, 0, 255, rm_define.effect_always_on)
vision_ctrl.disable_detection(rm_define.vision_detection_marker)
chassis_ctrl.stop()모의 입력으로 네 가지 조건 조합을 검사합니다. 실제 장비에서는 정상 상태의 읽기 값과 S1의 정지 마커 반응을 관찰하되 이동 구역을 위험하게 만들지 않습니다. 센서로 읽은 입력과 사람이 알려준 입력을 구분해 적습니다.
코드를 고치지 않아도 입력에 따라 다른 갈래가 실행되는 이유는 무엇일까요?
나이와 보호자 허용 여부를 함께 확인하는 도서관 출입 규칙을 만듭니다. 기준 나이와 정확히 같은 경우도 포함하세요.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
and를 or처럼 읽거나 기준과 같은 값을 제외한 경우
True/False 조합 네 가지를 표로 만들고 39, 40, 41을 각각 검사해 보세요. 경로가 비어 있어도 배터리 조건을 충족하지 못하면 출발할 수 없습니다.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
range(4)의 실행을 따라가며 이동과 회전을 모두 반복문 안에 넣습니다.
네 변을 따라 도는 정사각형 순찰을 그립니다. 모든 변을 30 cm에서 40 cm로 바꾸고, 회전 명령의 들여쓰기가 동작에 어떤 영향을 주는지 예상해 보세요.
반복문 안에 순찰 한 단계를 적으면 같은 동작을 되풀이할 수 있습니다. 반복 횟수나 매개변수 하나를 바꾸면 반복되는 동작 전체에 반영됩니다.
코드를 네 번 복사해도 움직일 수 있지만 세 곳만 고치고 한 곳을 놓치면 경로가 달라집니다. 반복되는 것은 들여쓴 코드이며, 반복문 뒤의 회전 명령은 한 번만 실행됩니다.
for는 반복 대상의 항목을 차례로 꺼냅니다. range(4)가 만드는 값은 0, 1, 2, 3입니다. 정사각형 순찰에서는 매번 앞으로 이동하고 90도 회전합니다. 반복문 다음 코드는 반복이 끝난 뒤 한 번 실행됩니다.
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)))[0, 1, 2][1, 2, 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")move
land
move
land
move
landmove
move
move
landmove
move
land실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
들여쓴 코드 전체를 상자로 묶고, range가 만드는 정수 하나마다 그 상자를 한 번씩 실행해 보세요.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 for·range·들여쓰기·반복 동작 개념을 사용하세요.
count = 0
for leg in range(4):
count = count + 2
print(count)4108실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-03-independent-a-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 for·range·들여쓰기·반복 동작 개념을 사용하세요.
for photo in range(2):
print("save")
print("close")save
save
closesave
close
save
closesave
close실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-03-transfer-v1 · 2026-11-02.2square_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"] * 403_for_square.py는 각 변을 0.30 m 이동하며 같은 반복 구조를 사용합니다. 이동과 회전을 모두 for 안에 넣고, 속도와 거리는 S1 단위로 표현합니다.
def start():
chassis_ctrl.stop()
robot_ctrl.set_mode(rm_define.robot_mode_free)
chassis_ctrl.set_trans_speed(0.2)
chassis_ctrl.set_rotate_speed(45)
for leg in range(4):
chassis_ctrl.move_with_distance(0, 0.30)
chassis_ctrl.rotate_with_degree(rm_define.clockwise, 90)
chassis_ctrl.stop()종이 위에서 정사각형 경로를 먼저 따라가고 실제로 한 번 이동해 봅니다. 예상한 종료 위치와 방향을 표시한 뒤, 멈춘 지점이 출발점에서 얼마나 벗어났는지 잽니다. 반복문이 정확해도 기체가 밀리거나 바퀴가 미끄러질 수 있습니다.
어느 값을 고치면 네 변의 길이가 모두 바뀔까요? 이동은 네 번, 회전은 한 번만 하게 되는 들여쓰기 오류는 무엇일까요?
사진을 찍고 기록하는 작업을 다섯 번 한 뒤 마지막에 한 번만 업로드하도록 계획합니다. 업로드를 반복문 밖에 두는 이유를 설명하세요.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
range의 끝값까지 세거나 반복문 밖의 코드도 반복된다고 생각한 경우
들여쓴 코드 전체를 상자로 묶고, range가 만드는 정수 하나마다 그 상자를 한 번씩 실행해 보세요.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
매번 새 입력을 읽으며, 성공했을 때와 검사 횟수를 다 썼을 때의 종료를 각각 구현하고 설명합니다.
처음에는 마커를 가렸다가 예상하기 어려운 순간에 보여 줍니다. 프로그램은 몇 번까지 확인해야 할까요?
새로 들어오는 관찰에 따라 종료 시점이 달라질 때 while 조건으로 이를 표현할 수 있습니다. 검사 횟수에 제한을 두면 끝없이 기다리는 일을 막을 수 있습니다.
횟수가 정해진 for문은 성공한 뒤에도 검사를 계속할 수 있습니다. while문에서 예전 값만 확인하면 새 마커를 알아차리지 못합니다. for와 break로 같은 동작을 만들 수도 있으므로 종료 규칙이 잘 드러나는 방식을 고릅니다.
while은 매 반복 전에 조건을 검사합니다. 반복문 안에서 진행 상태를 갱신하고 새 관찰을 읽어야 합니다. 성공하거나 최대 검사 횟수에 도달하면 종료합니다. sleep은 검사 사이의 간격을 만들 뿐 새 센서 값을 읽는 동작은 아닙니다.
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)023실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 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)3 False1 False2 True실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
검사 번호, 이번에 읽은 값, 다음 조건을 표로 적어 보세요. 끝까지 준비 상태가 되지 않는 입력도 넣어 보세요.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 while·상태 갱신·break·검사 횟수 제한 개념을 사용하세요.
values = [False, False, False]
i = 0
found = False
while not found and i < 2:
found = values[i]
i += 1
print(i, found)2 False3 False2 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)321실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-04-transfer-v1 · 2026-11-02.2first_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)04_while_marker.py는 움직이지 않고 내장 A 마커 조건을 최대 열 번 확인합니다. 초록 LED는 관찰 성공, 빨강 LED는 검사 횟수 소진을 뜻합니다. 어떤 응답도 이동을 허용하는 신호로 쓰지 않습니다.
# Remain stationary. Read a NEW marker condition on each pass.
def start():
chassis_ctrl.stop()
vision_ctrl.enable_detection(rm_define.vision_detection_marker)
checks = 0
found = False
while not found and checks < 10:
found = vision_ctrl.check_condition(rm_define.cond_recognized_marker_letter_A)
checks = checks + 1
if not found:
time.sleep(0.2)
if found:
led_ctrl.set_top_led(rm_define.armor_top_all, 0, 255, 0, rm_define.effect_always_on)
else:
led_ctrl.set_top_led(rm_define.armor_top_all, 255, 0, 0, rm_define.effect_always_on)
vision_ctrl.disable_detection(rm_define.vision_detection_marker)
chassis_ctrl.stop()기록된 입력으로 첫 검사에서 성공하는 경우, 늦게 성공하는 경우, 끝내 성공하지 못하는 경우를 비교합니다. S1에는 서로 다른 시점에 마커를 보여 줍니다. Tello는 드론 가까이에 장애물을 두지 않고 높이 기록을 교사의 관찰과 비교합니다.
예전에 읽은 값 하나로 조건을 반복 검사하면 새 사건을 알아차릴 수 없는 이유는 무엇일까요?
인쇄 작업 대기열을 확인하는 프로그램을 생각해 봅니다. 어떤 정보를 갱신하고 무엇을 성공으로 볼지, 검사 횟수가 끝나면 어떻게 할지 설명하세요.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
읽기 값을 갱신하지 않거나 검사 횟수를 늘리는 코드를 빠뜨린 경우
검사 번호, 이번에 읽은 값, 다음 조건을 표로 적어 보세요. 끝까지 준비 상태가 되지 않는 입력도 넣어 보세요.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
순서가 있는 경로를 고치고, 앞서 읽은 값을 잃지 않으면서 새 관찰을 덧붙입니다.
세 구간으로 된 경로를 만들고, 이동 코드는 그대로 둔 채 첫 번째와 마지막 거리 카드를 바꿔 보세요.
경로를 순서 있는 묶음으로 저장하면 경로 데이터와 이동 코드를 나눌 수 있습니다. 관찰을 리스트에 계속 추가하면 새 값 하나로 이전 기록을 덮어쓰지 않아도 됩니다.
변수를 세 개로 나누면 각각 따로 처리해야 하고, 변수 하나에 새 관찰을 계속 대입하면 이전 값을 잃습니다. 한 관찰의 항목에 이름을 붙일 때는 딕셔너리, 여러 관찰의 순서를 보관할 때는 리스트가 적합합니다.
리스트는 항목의 순서를 보관합니다. 인덱스 0은 첫 항목, -1은 마지막 항목을 고릅니다. append는 맨 뒤에 항목 하나를 추가하고, 반복문으로 리스트를 순회하면 경로의 값을 차례로 읽습니다.
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, 합계 90 | 20 40 90 |
이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 리스트·인덱스·순회·값 변경 개념을 사용하세요.
print([25, 35, 45][0])35025실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-05-diagnosis-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 리스트·인덱스·순회·값 변경 개념을 사용하세요.
log = [20]
log.append(30)
print(log)[20, 30][30][30, 20]실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
상자에 0부터 번호를 붙이고, append 뒤의 리스트를 다시 그려 보세요. 앞서 있던 상자는 그대로 남습니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 리스트·인덱스·순회·값 변경 개념을 사용하세요.
route = [20, 40, 30]
print(route[1], route[-1])20 3040 3040 20실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-05-independent-a-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 리스트·인덱스·순회·값 변경 개념을 사용하세요.
playlist = ["intro", "theme"]
playlist.append("end")
print(playlist[1])introendtheme실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-05-transfer-v1 · 2026-11-02.2route_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)05_list_route.py는 [0.20, 0.30, 0.40] m를 순서대로 이동한 뒤 인덱스를 거꾸로 읽으며 돌아옵니다. 노트북에서 만든 계획과 순서·합계를 비교하세요.
def start():
chassis_ctrl.stop()
robot_ctrl.set_mode(rm_define.robot_mode_free)
chassis_ctrl.set_trans_speed(0.2)
route_m = [0.20, 0.30, 0.40]
for distance_m in route_m:
chassis_ctrl.move_with_distance(0, distance_m)
for index in range(len(route_m) - 1, -1, -1):
chassis_ctrl.move_with_distance(180, route_m[index])
chassis_ctrl.stop()전체 전진 거리와 명령 순서를 예상합니다. 먼저 순서만, 그다음 구간 하나의 길이만 바꿔 보세요. 어느 변경이 최종 위치를 바꾸고 어느 변경이 중간 정지 위치만 바꾸는지 설명합니다.
reading = new_value를 반복해서 대입하는 것보다 append로 관찰을 더 많이 보관할 수 있는 이유는 무엇일까요?
재생 목록이나 실험 읽기 값의 순서를 저장하고, 순서를 바꾸면 언제 의미가 달라지는지 설명하세요.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
인덱스를 1부터 세거나 append가 기존 값을 교체한다고 생각한 경우
상자에 0부터 번호를 붙이고, append 뒤의 리스트를 다시 그려 보세요. 앞서 있던 상자는 그대로 남습니다.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
의미 있는 키로 기록을 만들고, 빠진 값과 0을 구분하며 여러 차례의 관찰을 보관합니다.
[70, 80]을 보고 70이 배터리인지 높이인지 생각해 보세요. 각 값에 이름을 붙인 기록으로 바꿔 봅니다.
항목에 이름을 붙이면 서로 다른 측정값을 구분할 수 있습니다. 같은 항목을 여러 번 관찰할 때는 딕셔너리들을 리스트로 묶어 보관할 수 있습니다.
리스트의 위치로 항목을 구분하면 모두가 같은 순서를 기억해야 합니다. 딕셔너리는 항목에 이름을 붙여 주지만, 단위가 맞는지 또는 센서가 실제로 측정한 값인지까지 검증하지는 않습니다.
딕셔너리는 키와 값을 연결합니다. 같은 키에 다시 대입하면 그 값이 바뀝니다. 시간에 따른 변화를 보관하려면 읽을 때마다 별도의 딕셔너리를 만들어 리스트에 넣습니다. None은 값이 없음을, 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"])60900실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-06-diagnosis-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 딕셔너리·키·값·기록 리스트 개념을 사용하세요.
r = {"count": 1}
r["count"] = 4
print(r["count"])145실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
각 항목을 키: 의미(단위) 형태로 적어 보세요. 값을 바꾼 것이 기존 기록을 수정한 것인지, 새 관찰을 추가한 것인지 구분합니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 딕셔너리·키·값·기록 리스트 개념을 사용하세요.
r = {"robot": "s1", "height_cm": None}
print(r["height_cm"] is None)False0True실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-06-independent-a-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 딕셔너리·키·값·기록 리스트 개념을 사용하세요.
weather = {"temp_c": 0, "rain_mm": None}
print(weather["temp_c"] is None)FalseTrue0실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-06-transfer-v1 · 2026-11-02.2make_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"}06_dictionary.py는 마커를 관찰했는지 여부를 이름 붙은 항목에 저장합니다. S1에 없는 Tello 방식의 높이·배터리 읽기 값을 만들어 넣지 않습니다.
# The named record lives in robot memory. Observer records the LED result.
def start():
chassis_ctrl.stop()
vision_ctrl.enable_detection(rm_define.vision_detection_marker)
time.sleep(0.5)
observation = {"robot": "s1", "sample": 0, "marker_seen": False}
observation["marker_seen"] = vision_ctrl.check_condition(rm_define.cond_recognized_marker_letter_A)
if observation["marker_seen"]:
led_ctrl.set_top_led(rm_define.armor_top_all, 0, 255, 0, rm_define.effect_always_on)
else:
led_ctrl.set_top_led(rm_define.armor_top_all, 255, 0, 0, rm_define.effect_always_on)
vision_ctrl.disable_detection(rm_define.vision_detection_marker)
chassis_ctrl.stop()수집 전에 기록 형식을 정하고 적어도 두 번 관찰합니다. 각 키의 값이 센서, 사람, 계산 중 어디에서 왔는지 구분하고, 얻을 수 없는 값은 비워 둡니다.
키에 height_cm라고 적으면 어떤 점이 읽기 쉬워질까요? 그래도 알 수 없는 것은 무엇일까요?
실제 0인 값 하나와 빠진 값 하나를 포함한 날씨 기록을 만들고 둘의 차이를 설명하세요.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
항목 위치를 키처럼 사용하거나 기록 전체를 갱신된 딕셔너리 하나로 덮어쓴 경우
각 항목을 키: 의미(단위) 형태로 적어 보세요. 값을 바꾼 것이 기존 기록을 수정한 것인지, 새 관찰을 추가한 것인지 구분합니다.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
값을 환산하는 함수와 동작을 수행하는 메서드를 구분하고, 각 호출이 반환하거나 바꾸는 것을 설명합니다.
짧은 순찰과 긴 순찰을 요청받았다고 생각해 보세요. 프로그램 전체를 복사해야 할까요, 같은 동작에 다른 입력을 주면 될까요?
함수로 자주 쓰는 동작에 이름을 붙이고 매개변수로 입력을 바꿀 수 있습니다. 하드웨어 메서드를 실행하기 전에 반환값으로 계산을 검사할 수 있습니다.
이동 코드를 복사하면 고칠 곳도 여러 군데가 됩니다. 환산한 거리를 출력하는 것과 다른 함수에 반환하는 것은 다릅니다. tello.move_forward(...)는 특정 기체 객체의 메서드이며, 단순한 환산 함수에는 기체가 필요하지 않습니다.
def는 함수를 정의하고, 호출하면 함수 내부가 실행됩니다. return은 호출한 곳으로 값을 돌려줍니다. 메서드는 samples.append(value), drone.move_forward(cm)처럼 객체를 통해 호출합니다. 둘 다 호출이지만 어떤 객체의 기능인지, 무엇을 바꾸는지는 다릅니다.
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")move
readyreadymove실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-07-diagnosis-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 함수·인수·반환값·객체 메서드 개념을 사용하세요.
def double(x):
return x * 2
print(double(3))3None6실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
정의, 호출, 반환, 값의 변화를 따로 표시해 보세요. 숫자를 반환했다고 로봇이 움직이는 것은 아닙니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 함수·인수·반환값·객체 메서드 개념을 사용하세요.
def to_cm(m):
return int(round(m * 100))
print(to_cm(0.25) + to_cm(0.35))600.62535실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-07-independent-a-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 함수·인수·반환값·객체 메서드 개념을 사용하세요.
def seconds(milliseconds):
return milliseconds / 1000
print(seconds(500))5000.5None실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-07-transfer-v1 · 2026-11-02.2out_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)]07_functions.py는 travel(distance_m)를 정의하고 서로 다른 두 값으로 호출합니다. S1 컨트롤러 메서드에는 거리를 m로 전달합니다.
def travel(distance_m):
chassis_ctrl.move_with_distance(0, distance_m)
chassis_ctrl.move_with_distance(180, distance_m)
def start():
chassis_ctrl.stop()
robot_ctrl.set_mode(rm_define.robot_mode_free)
chassis_ctrl.set_trans_speed(0.2)
travel(0.20)
travel(0.30)
chassis_ctrl.stop()로봇 없이 환산 함수와 반환된 계획을 검사합니다. 실제 장비에서는 같은 보조 함수에 목표 거리 0.20 m와 0.30 m를 전달합니다. 함수 하나가 두 요청을 어떻게 처리하는지 설명하세요.
to_cm(0.3)을 호출하는 것과 drone.move_forward(30)을 호출하는 것은 어떻게 다를까요?
사진 파일 이름을 만들어 주는 함수를 작성합니다. 이름을 만드는 작업과 실제 파일 저장은 분리하세요.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
정의만 하면 함수 내부가 실행된다고 생각하거나 print가 값을 반환한다고 생각한 경우
정의, 호출, 반환, 값의 변화를 따로 표시해 보세요. 숫자를 반환했다고 로봇이 움직이는 것은 아닙니다.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
격자의 모든 칸을 한 번씩 나열하고, 논리적인 좌표와 실제 이동을 구분합니다.
종이로 2행 3열의 점검 격자를 만듭니다. 반복문 두 개를 쓰면 다섯 번 점검할지 여섯 번 점검할지 예상해 보세요.
두 차원의 모든 조합을 살피려면 행과 열을 함께 순회해야 합니다. 바깥 반복문이 행을 고를 때마다 안쪽 반복문이 그 행의 열들을 확인합니다.
행 수와 열 수를 더해서는 모든 조합을 나열할 수 없습니다. 논리적인 격자 좌표는 그 자체로 비행이나 바퀴 이동 명령이 되지 않으므로 실제 경로의 모양과 거리를 따로 정해야 합니다.
바깥쪽 행이 바뀔 때마다 안쪽 열 반복문은 처음부터 다시 시작합니다. 2행 3열 격자의 칸 수는 2 * 3입니다. 실제로 이동할 때는 행마다 진행 방향을 바꾸면 불필요하게 되돌아가는 거리를 줄일 수 있습니다.
for row in range(2):
for col in range(2):
print(row, col)0 0
0 1
1 0
1 1| 실행 단계 | 저장된 값·상태 | 결과 |
|---|---|---|
| row = 0 | col이 0, 1을 차례로 사용 | 0 0; 0 1 |
| row = 1 | col이 다시 0, 1부터 시작 | 1 0; 1 1 |
이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 중첩 for문·행과 열의 좌표 개념을 사용하세요.
print(2 * 3)5236실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 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)653실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
행 하나를 적고 옆에 그 행의 모든 열을 나열해 보세요. 다음 행에서도 같은 작업을 반복합니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 중첩 for문·행과 열의 좌표 개념을 사용하세요.
for row in range(1):
for col in range(3):
print(row, col)0 0
1 1
2 20 0
0 1
0 21 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)0 A
1 BA 0
B 10 A
0 B
1 A
1 B실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-08-transfer-v1 · 2026-11-02.2grid_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) == []08_nested_grid.py는 반복문 두 개를 사용하며 두 번째 행에서는 열 표시 순서를 뒤집습니다. 옆으로 0.30 m 이동해 다음 행으로 들어갑니다. 명령 순서와 종이에 그린 격자를 비교하세요.
# Logical 2x2 inspection grid, serpentine traversal, no camera coverage claim.
def start():
chassis_ctrl.stop()
robot_ctrl.set_mode(rm_define.robot_mode_free)
chassis_ctrl.set_trans_speed(0.2)
visited = []
for row in range(2):
for visit in range(2):
col = visit
if row == 1:
col = 1 - visit
visited.append([row, col])
if visit < 1:
if row == 0:
chassis_ctrl.move_with_distance(0, 0.30)
else:
chassis_ctrl.move_with_distance(180, 0.30)
if row < 1:
chassis_ctrl.move_with_distance(90, 0.30)
chassis_ctrl.stop()시험 모드의 명령 기록에 맞춰 종이 격자의 칸을 표시하고 중복 여부와 개수를 확인합니다. 교사 감독 아래 한 번 이동한 뒤 실제 위치도 표시합니다. 칸 번호를 출력한 것과 실제 촬영 범위를 확인한 것을 구분하세요.
점검 횟수는 왜 행 수와 열 수를 곱한 값일까요? 격자 번호만으로는 실제 로봇을 움직일 수 없는 이유도 설명해 보세요.
각 센서를 매일 확인하는 일정을 만듭니다. 어느 반복문이 다시 시작되는지, 전체 읽기 횟수는 몇 번인지 설명하세요.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
두 반복 횟수를 더하거나 안쪽 반복문을 다시 시작하지 않은 경우
행 하나를 적고 옆에 그 행의 모든 열을 나열해 보세요. 다음 행에서도 같은 작업을 반복합니다.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
항목 이름·단위·출처·실패 결과를 포함한 실험 기록을 저장하고 다시 읽습니다.
결과를 화면에만 출력한 프로그램을 종료합니다. 다음 수업에서 어떤 기록을 다시 살펴볼 수 있을까요?
표를 파일로 저장하면 프로그램이 끝나도 남아 다른 도구로 다시 열 수 있습니다. 기록 형식과 출처를 함께 적어 두어야 나중에 측정값을 해석할 수 있습니다.
메모리의 리스트는 프로그램이 종료되면 사라지고, 성공한 실험만 복사하면 기록이 한쪽으로 치우칩니다. S1 Lab은 노트북의 CSV 파일을 직접 쓸 수 없으므로 관찰자가 제공된 노트북 도구로 실제 실험을 기록합니다.
CSV는 첫 줄에 열 이름을 쓰고, 그다음부터 한 행에 기록 하나씩 저장합니다. DictWriter는 정해진 항목 목록에 맞춰 값을 씁니다. 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))231실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 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__)intstrfloat실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
첫 줄의 열 이름과 데이터 행을 구분하세요. DictReader로 읽은 값은 문자열이므로 계산하기 전에 자료형을 바꿔야 합니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 파일 입출력·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))2035255실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 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"])02None실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-09-transfer-v1 · 2026-11-02.2target_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]09_trial.py로 0.30 m 이동 실험을 한 번 수행합니다. 관찰자가 정지 후 거리를 재고 record_trial.py에 입력합니다. Lab 프로그램은 csv를 가져오거나 파일을 쓰지 않습니다.
# ONE forward trial; measure only after it stops, then manually reset the start.
# Keep target 0.30 m. Conditions: slow=0.20 m/s, fast=0.30 m/s.
SPEED_M_S = 0.20
def start():
chassis_ctrl.stop()
robot_ctrl.set_mode(rm_define.robot_mode_free)
chassis_ctrl.set_trans_speed(SPEED_M_S)
chassis_ctrl.move_with_distance(0, 0.30)
chassis_ctrl.stop()사용 가능한 로봇으로 짧은 이동 실험을 한 번씩 수행합니다. 같은 목표 거리를 쓰고, 중간에 멈춘 경우에도 로봇·조건·짝 번호·실행 순서·측정 방법·결과·목표를 남깁니다. 터미널 출력과 다시 연 CSV를 비교하세요.
저장한 행에 실험 결과와 측정 방법을 함께 적어야 하는 이유는 무엇일까요?
다른 학생이 일주일 뒤에도 이해할 수 있도록 출처와 단위를 포함한 날씨 관찰 기록을 남기세요.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
열 이름을 실험 한 건으로 세거나 CSV 값이 이미 숫자라고 생각한 경우
첫 줄의 열 이름과 데이터 행을 구분하세요. DictReader로 읽은 값은 문자열이므로 계산하기 전에 자료형을 바꿔야 합니다.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
숫자 텍스트를 변환해 누락되거나 불가능한 값을 찾고, 실패한 실험의 개수도 보관합니다.
거리를 적지 않은 빈칸과 숫자 0을 비교합니다. 모든 빈칸을 0으로 채우면 로봇의 성능을 더 잘 알 수 있을까요?
컴퓨터가 읽을 수 있는 파일에도 사용할 수 없거나 빠진 값이 들어 있을 수 있습니다. 변환 방법과 표시 이유를 명시하면 정리 과정을 확인할 수 있고, 없던 측정값을 만들어 넣는 일을 막을 수 있습니다.
빠진 거리를 0으로 바꾸면 큰 오차를 임의로 만들어 냅니다. 실패한 행을 모두 지우면 로봇이 실제보다 잘 작동한 것처럼 보입니다. 원본 파일을 보관하고 각 행을 어떻게 처리했는지 별도 파일에 남깁니다.
pd.to_numeric(errors="coerce")는 숫자로 바꿀 수 없는 텍스트를 결측값으로 만듭니다. isna로 이를 찾고, 불리언 마스크로 분석 대상 행을 고릅니다. 제외한 행과 제외 이유도 다시 확인할 수 있어야 합니다.
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))FalseTrue0실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 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()))312실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
실제로 잰 0, 빈칸, 잘못된 텍스트를 따로 구분하세요. 숫자 변환에 실패하면 표시해 두어야 하며 임의의 값을 넣어서는 안 됩니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 DataFrame·숫자 변환·마스크·결측값 개념을 사용하세요.
import pandas as pd
s = pd.Series([0.0, None, 30.0])
print(int(s.isna().sum()), int((s == 0).sum()))1 12 00 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()))321실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-10-transfer-v1 · 2026-11-02.2clean_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]관찰자가 입력한 S1 실험 측정값을 사용합니다. 높이나 배터리 값을 얻을 수 없다면 빈칸으로 두며 0으로 바꾸지 않습니다.
# ONE forward trial; measure only after it stops, then manually reset the start.
# Keep target 0.30 m. Conditions: slow=0.20 m/s, fast=0.30 m/s.
SPEED_M_S = 0.20
def start():
chassis_ctrl.stop()
robot_ctrl.set_mode(rm_define.robot_mode_free)
chassis_ctrl.set_trans_speed(SPEED_M_S)
chassis_ctrl.move_with_distance(0, 0.30)
chassis_ctrl.stop()data/synthetic_trials.csv를 analyze_trials.py로 분석하고 원본 행과 row_audit.csv를 나란히 봅니다. 잘못된 형식, 누락, 중단, 출처 불일치에 서로 다른 표시가 붙는 이유를 설명하세요.
실제로 측정한 0은 남기고 빠진 값은 통계에서 제외하는 것이 왜 둘 다 올바른 처리일까요?
관찰하지 않은 날을 비가 오지 않은 날로 바꾸지 않으면서 강수량 열을 정리하세요.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
결측값을 0과 같다고 보거나 중단한 실험을 지운 경우
실제로 잰 0, 빈칸, 잘못된 텍스트를 따로 구분하세요. 숫자 변환에 실패하면 표시해 두어야 하며 임의의 값을 넣어서는 안 됩니다.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
같은 로봇 안에서 설정을 짝지어 반복 비교합니다. 시도 수·절대오차·값의 퍼짐·결과 비율을 함께 보고 자료가 뒷받침하는 범위에서 설명합니다.
평균 오차는 같지만 값이 퍼진 정도가 다른 설정 두 개를 봅니다. 평균 하나로는 어떤 정보를 알 수 없을까요?
비슷한 조건끼리 묶어 비교하고 개수와 퍼짐을 함께 보면 요약값을 뒷받침하는 기록이 얼마나 있는지 알 수 있습니다. 각 점을 표시한 그래프는 평균에 가려진 차이를 보여 줍니다.
잘된 실험 한 번만으로 결론을 내리기는 어렵습니다. 서로 다른 로봇을 합치면 기계적인 차이가 가려집니다. 느린 실험과 빠른 실험의 바닥까지 다르면 속도와 바닥 중 무엇이 영향을 주었는지 구분하기 어렵습니다.
부호 있는 오차는 실측값에서 목표를 뺀 값이고, 절대오차는 빗나간 크기입니다. 로봇과 조건별로 묶어 모든 시도의 결과를 세고, 거리 통계는 완료된 유효 측정값으로 계산합니다. 유효한 점을 모두 그리며 제외한 시도의 개수도 적습니다.
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)4.080.0실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-11-diagnosis-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 groupby·요약 통계·값의 차이·조건을 통제한 비교 개념을 사용하세요.
errors = [3, -5]
print(sum(abs(e) for e in errors) / len(errors))4.0-1.08.0실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
절댓값을 구하기 전에 부호 있는 오차부터 평균 내면 +4와 -4가 상쇄됩니다. 각 비율의 분모가 무엇인지도 적어 보세요.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 groupby·요약 통계·값의 차이·조건을 통제한 비교 개념을 사용하세요.
import pandas as pd
df = pd.DataFrame({"condition": ["a", "a", "b"], "error": [2, 4, 9]})
print(float(df.groupby("condition")["error"].mean()["a"]))5.03.02.0실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-11-independent-a-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 groupby·요약 통계·값의 차이·조건을 통제한 비교 개념을 사용하세요.
waits = [1, 1, 7]
print(max(waits) - min(waits))376실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-11-transfer-v1 · 2026-11-02.2error_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"] == 409_trial.py의 SPEED_M_S를 0.20 또는 0.30으로 바꾸되 거리와 표시한 바닥은 그대로 둡니다. 정지 후 측정하며, Tello와는 속도 단위가 다르므로 숫자만 직접 비교하지 않습니다.
# ONE forward trial; measure only after it stops, then manually reset the start.
# Keep target 0.30 m. Conditions: slow=0.20 m/s, fast=0.30 m/s.
SPEED_M_S = 0.20
def start():
chassis_ctrl.stop()
robot_ctrl.set_mode(rm_define.robot_mode_free)
chassis_ctrl.set_trans_speed(SPEED_M_S)
chassis_ctrl.move_with_distance(0, 0.30)
chassis_ctrl.stop()로봇마다 느림·빠름 조건을 적어도 세 쌍 계획합니다. 느림-빠름, 빠름-느림, 느림-빠름 순으로 번갈아 실행하거나 무작위 순서를 정해 기록합니다. 중단한 시도도 남기고 목표 30 cm, 바닥, 배터리 범위, 자, 출발 위치를 같게 유지합니다. 배터리 변화와 실행 순서처럼 남은 한계도 적습니다. 이는 교실에서 조건을 탐색한 자료이며 전체 기체의 속도 성능을 일반화한 결론은 아닙니다.
평균 오차와 함께 시도 수와 실패한 시도도 보고해야 하는 이유는 무엇일까요?
대기열 처리 규칙 두 개를 여러 번 비교하세요. 가장 짧았던 대기 시간만 보여 주지 말고 작업량과 실행 순서도 기록합니다.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
오차의 상쇄를 정확도로 판단하거나 실패·제외한 시도를 무시한 경우
절댓값을 구하기 전에 부호 있는 오차부터 평균 내면 +4와 -4가 상쇄됩니다. 각 비율의 분모가 무엇인지도 적어 보세요.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
각 구조를 선택한 이유를 설명하고, 정한 범위 안의 동작을 시연하며 다른 사람이 다시 확인할 수 있는 기록과 한계를 제시합니다.
표시된 지점 네 곳을 점검하고, 설정을 바꾸었을 때 더 안정적으로 작동했는지 설명해 달라는 요청을 받았습니다. 정답 코드를 보기 전에 어떤 구조를 쓸지 골라 보세요.
실제 작업에는 계획, 실행, 기록이 함께 필요합니다. 리스트는 지점의 순서, 딕셔너리는 읽기 값의 이름, 반복문은 반복이나 대기, 함수는 여러 번 쓸 판단을 맡는 식으로 각 구조의 역할을 정합니다.
로봇이 움직였다고 모든 지점을 점검한 것은 아닙니다. 공개 검사 통과만으로 이해도나 실제 장비의 신뢰성을 입증할 수도 없습니다. 가상 데이터로 그린 그래프는 실제 로봇의 결과가 아닙니다.
미션 데이터, 동작 규칙, 관찰 기록을 구분합니다. 한 구간이라도 움직이기 전에 전체 경로를 검사하고, 정상 경로·빈 경로·허용하지 않는 값을 시험합니다. 알려진 지점은 정해진 순찰로 확인하고, 관찰 결과를 기다려야 할 때만 횟수가 제한된 대기를 사용합니다.
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개, 두 번째 목표는 30 | 2 30 |
이 문제는 개념을 익히는 연습입니다. 답을 보거나 도움을 받아 푼 것은 연습 기록이며 LMS 수업 완료로 처리하지 않습니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 자료구조 선택·검사·통합·관찰 근거 개념을 사용하세요.
route = [20, 30, 40]
print(len(route))3902실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-12-diagnosis-v1 · 2026-11-02.2실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 자료구조 선택·검사·통합·관찰 근거 개념을 사용하세요.
rows = []
for station in range(2):
rows.append({"station": station})
print(rows[-1]["station"])210실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
요구 사항마다 데이터 항목, 동작 규칙, 관찰로 확인할 방법을 연결해 보세요. 전체 계획이 검사를 통과하기 전에 움직이지 않습니다.
실행 전에 정확한 출력 결과를 예상해 보세요. 설명할 때는 자료구조 선택·검사·통합·관찰 근거 개념을 사용하세요.
route = [20, 0, 30]
print(all(20 <= x <= 80 for x in route))True0False실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 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"])FalseTrueB실행 전에 예상 결과와 확신 정도, 이유를 적어 보세요. 도움을 받았다면 어떤 도움인지 함께 남깁니다.
과제 robot-hooks-12-transfer-v1 · 2026-11-02.2mission_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))종이 위에서 실행을 따라가 본 뒤 03_for_square.py, 04_while_marker.py, 07_functions.py의 구조를 조합합니다. 실제 움직임은 S1 프로그램이 제어하며, 노트북 분석 프로그램이 EP SDK로 S1을 조종하는 것은 아닙니다.
def start():
chassis_ctrl.stop()
robot_ctrl.set_mode(rm_define.robot_mode_free)
chassis_ctrl.set_trans_speed(0.2)
route_m = [0.20, 0.30, 0.40]
for distance_m in route_m:
chassis_ctrl.move_with_distance(0, distance_m)
for index in range(len(route_m) - 1, -1, -1):
chassis_ctrl.move_with_distance(180, route_m[index])
chassis_ctrl.stop()경로 계획, 개념과 요구 사항을 연결한 표, 예상 명령 기록, 검사한 코드, 출처를 적은 원본 실험 CSV, 데이터 정리 기록, 그룹별 그래프와 90초 설명을 제출합니다. 실패한 사례와 조건을 바꾼 과제도 포함하세요. 실제 장비가 없다면 전체 시연을 모의실험으로 표시하고 장비의 신뢰성은 아직 판단하지 않습니다.
반복문, 자료구조, 함수를 하나씩 골라 해결하는 요구 사항을 설명하세요. 다른 방법과, 어떤 경우에 그 방법을 택할지도 함께 이야기합니다.
사진 처리 대기열에 계획-실행-기록을 나누는 방식을 적용합니다. 그대로 설명할 수 있는 점과 새 근거가 필요한 점을 구분하세요.
코드, 예상 결과, 실제 결과와 관찰의 한계를 남깁니다. 명령 기록만 실행했다면 모의실험으로 표시하세요. 선생님과 상의해 첫 학습 약 2일 뒤와 7일 뒤에 새 문제로 다시 확인합니다. 간격은 필요에 따라 조정합니다.
명령이 끝났다는 사실과 실제로 측정한 미션 성공을 혼동한 경우
요구 사항마다 데이터 항목, 동작 규칙, 관찰로 확인할 방법을 연결해 보세요. 전체 계획이 검사를 통과하기 전에 움직이지 않습니다.
수정한 뒤 어떤 값이 달라졌는지 설명하고, 아직 보지 않은 독립 과제를 풀어 봅니다. 이미 본 과제라면 선생님이 입력을 바꾼 새 과제에 새 ID를 붙여 제공합니다. 원래 답안은 그대로 보관합니다.
관련 Python 수업 열기 ↗ · 일부 기존 Python 수업은 수강 계정 로그인이 필요합니다.
CIT의 기존 Python·데이터 과학 수업에 RoboMaster S1 실습을 연결한 자료입니다. 학습 내용 버전: 2026-11-02.2. 모든 수업에서 EN/KO로 언어를 바꿀 수 있습니다.
아직 보지 않은 독립 과제나 나중에 다시 풀 문제는 선생님에게 요청하세요. 이 페이지는 점수를 부여하거나 LMS 수업 완료를 기록하지 않으며 복습 일정을 자동으로 예약하지 않습니다.