드론 이동
학습 목표
앞·옆 이동의 기준이 회전 후에도 같다고 생각하면 Path가 어긋납니다. Coordinate Frame을 계산으로 먼저 확인합니다.
실행 조건
이 실습은 좌표 시뮬레이션입니다. 실제 비행으로 확장할 때는 제공 장비의 좌표계·단위와 명령 응답 방식을 별도로 대조합니다.
이동 명령의 좌표 확인
시작 조건
시작 위치 (0,0) m, yaw=0°. 전방은 body +x, 오른쪽은 body -y, yaw는 반시계방향입니다. 제공 commands 5개를 사용합니다.
진행 방법
- 각 명령 후의 Body Frame에서의 Displacement·World Frame에서의 Displacement·누적 위치·yaw를 표에 한 행씩 기록하세요.
- body_to_world 함수를 사용해 예상한 위치를 코드와 비교하세요.
- XY Path에 명령 순서 번호와 축 단위를 표시하세요.
남길 결과
- 명령 5행 표와 XY Path 1개.
import math
import numpy as np
import matplotlib.pyplot as plt
# world x: 처음의 전방, world y: 처음의 왼쪽, yaw: 반시계방향 degree
commands=[('forward',1.),('right',.5),('yaw',90.),('forward',1.),('right',.5)]
pos=np.array([0.,0.]);yaw=0.;trace=[pos.copy()]
def body_to_world(dx,dy,yaw_deg):
a=math.radians(yaw_deg)
return np.array([[math.cos(a),-math.sin(a)],[math.sin(a),math.cos(a)]])@np.array([dx,dy])
# 예: yaw=90에서 전방 1 m의 world 변위
print(body_to_world(1,0,90))
# TODO: commands를 순서대로 해석하고 위치·yaw를 기록하세요.
결과 기록·자가 점검
명령:
Body Frame에서의 Displacement [m]:
World Frame에서의 Displacement [m]:
누적 (x,y) [m]:
yaw [deg]:
확인할 점
- yaw 명령만 실행했을 때 위치가 바뀌지 않는가?
- 회전 변환 전후 변위 벡터의 길이가 같은가?
같은 목적지의 다른 Path
시작 조건
첫 명령열의 최종 위치를 목적지로 두고, yaw=0을 유지하는 world 축 정렬 Path를 새로 만듭니다.
진행 방법
- 직접 정한 두 번째 명령열을 명시하세요.
- 두 Path의 최종 위치 오차·총 이동 거리·회전 횟수를 비교하세요.
- 최단 거리와 실제 명령 수행 편의가 같은 기준인지 설명하세요.
남길 결과
- 두 Path를 겹친 그림과 비교 표.
# 첫 활동의 목적지와 body_to_world를 재사용합니다.
route2=[('forward',1.5),('left',.5)]
# TODO: 첫 활동의 최종 위치를 확인한 뒤 route2를 목적지에 맞게 수정하세요.
결과 기록·자가 점검
Path:
최종 위치:
목적지 오차 [m]:
이동 거리 [m]:
회전 횟수:
확인할 점
- 두 Path의 시작점과 목적지를 같게 두었는가?
- 평면 좌표를 비행 SDK의 실제 Coordinate Frame과 동일하다고 가정하지 않았는가?
명령 오차를 넣은 Path
시작 조건
이동 길이에 각각 ±5% 오차를 넣습니다. seed=7, 반복 30회로 고정하고 yaw 오차는 0으로 둡니다.
진행 방법
- 각 반복에서 거리 명령만 perturb하고 최종 위치를 저장하세요.
- 최종 위치 산점도와 목적지 거리 오차의 평균·최댓값을 구하세요.
- 오차율을 0%,5%,10%로 바꾸어 결과를 비교하세요.
남길 결과
- 위치 산점도와 3조건 표, 짧은 해석.
rng=np.random.default_rng(7)
length_errors=rng.uniform(-.05,.05,size=(30,4))
# TODO: yaw를 제외한 거리 명령에만 오차를 적용하세요.
결과 기록·자가 점검
오차율:
반복 수:
평균 위치 오차 [m]:
최대 오차 [m]:
확인할 점
- seed와 오차 분포를 기록했는가?
- 오차 0%에서 기준 Path의 목적지로 돌아가는가?