이제 전방 거리 센서의 기본 사항을 알았으므로 조금 더 복잡한 작업을 수행해 보겠습니다. 다음 프로그램에서는 전방 거리 센서를 사용하여 자율 비행 프로그램을 만들 것입니다!
경고: 이 프로그램에서 드론은 자신의 바로 앞에서만 볼 수 있음을 기억하세요. 코드론 EDU는 주변에 있는 다른 물체나 장애물에 가까워지지 않도록 여러분에게 의존할 것입니다. 드론이 위험한 위치에진입하면 조종기의 전원 버튼을 눌러 원격 비행 모드로 전환하고 원격으로 드론을 제어합니다. 또한 필요한 경우 비상 정지를 사용할 수 있도록 준비하세요!
먼저 평소와 같이 import 문, 드론 객체 생성 및 드론 페어링이 필요합니다. 또한 우리는 이륙 명령을 넣을 것입니다.
from codrone_edu.drone import *
import time
drone = Drone()
drone.pair()
drone.takeoff()
다음으로, 드론이 착륙하도록 하려면 타이머를 사용해야 합니다. 타이머가 어떻게 작동하는지 기억나지 않는다면 타이머 강의를 다시 살펴보세요!
먼저 time_elapsed
와 time_start
두 개의 변수를 만듭니다. time_elapsed
변수는 프로그램이 시작된 이후의 경과된 시간입니다. 처음에는 프로그램의 시작이기 때문에 0으로 설정하도록 합니다.
time_elapsed = 0
다음은 time_start
입니다. 이 변수는 프로그램이 시작되는 시간을 포함하여 기록하므로 다음과 같이 설정합니다.
time_start = time.time()
이제 while 반복문을 사용하려고 합니다. while 반복문은 프로그램이 시작한 이후부터의 경과시간이 설정한 시간보다 짧은 경우 계속 반복됩니다. 이 예제에서 코드는 30초 동안 실행됩니다.
while time_elapsed < 30:
경과된 시간이 총 30초 미만인 경우 반복문은 계속됩니다. time_elapsed
를 0으로 초기화하는 방법을 기억하나요? 우리는 그 변수가 우리의 while 반복문 내에서 계속 업데이트 되도록 해야 합니다. 지금 상태에서는 time_elapsed
의 값은 계속 0이므로, 무한으로 반복하게 됩니다.
time_elapsed = time.time() - time_start
이 코드 줄은 경과시간 (time_elapsed
)을 현재시간 (time_start
)과 프로그램 시작 시간의 차이 (time.time() - time_start
)로 설정합니다. 그러면 프로그램에서는 30초가 지날 경우, 반복문이 종료되고 착륙합니다!
이제 이전 수업에서 했던 것 처럼 전방 거리 센서에서 측정 값을 가져와야 합니다.
front_sensor = drone.get_front_range()
print("전방 센서", front_sensor)
이것은 전방 범위 센서 측정 값을 가져와서 이전 수업에서 했던 것처럼 출력하는 것입니다. 이것은 while 반복문 내부에 있기 때문에 프로그램이 실행되는 동안 센서 데이터를 계속해서 출력할 것입니다.
이제 조건문을 설정하는 일만 남았습니다. 먼저 전방 거리 센서의 측정 값이 500mm보다 큰지 확인합니다. 그렇다면 드론은 앞으로 이동합니다!
if front_sensor > 500:
print("앞으로 이동!")
drone.set_yaw(0) # 앞으로 가야할 때 방향 yaw는 0입니다.
drone.set_pitch(40)
drone.move()
time.sleep(0.01)
앞으로 장애물을 피하기 위해 set_yaw
를 사용할 것이므로 앞쪽 방향으로 비행할 때마다 0으로 재설정해야 합니다. 또한 매개 변수 없이 drone.move()
를 사용하여 드론이 다른 조건문을 확인할 때까지 계속해서 이동하도록 합니다.
다음 조건문 확인에서 전방 거리 센서가 500mm에서 300mm 사이의 물체를 감지하면 코드론 EDU의 속도를 줄여 실수로 충돌하지 않도록 합니다.
elif front_sensor < 500 and front_sensor > 300:
print("무언가 가까워지고 있습니다. 속도를 줄이세요!")
drone.set_yaw(0) # 앞으로 가야할 때 방향 yaw는 0입니다.
drone.set_pitch(20)
drone.move()
time.sleep(0.01)
이 조건은 이전의 조건문과 매우 유사합니다. 계속해서 요(yaw)를 사용할 것이기 때문에, 드론의 요(yaw)값이 0이 되도록 설정합니다. 그리고 드론을 이전의 상태보다 더 느리게 이동하고 싶습니다. 그 이유는 드론이 무언가에 가까워질 때 부딪히지 않도록 속도를 늦추는 것입니다. 또한 이 상태에 대해서 파이썬이 정확한 정보를 출력할 수 있도록 print
문을 추가할 것입니다!
이제 두 조건을 모두 코딩했으므로 마지막으로 확인할 조건이 하나 있습니다. 마지막 조건은 드론이 장애물에서 300mm(30cm) 이내에 있을 때입니다. 이 상태에서 드론은 피치(pitch) 움직임을 멈추고 요(yaw)를 사용하여 장애물에서 벗어나야 합니다.
else:
print("물체가 감지되었습니다! 회전 중입니다!")
drone.set_pitch(0) # 회전을 해야할 때 피치 값을 0으로 하고 전진을 멈춥니다.
drone.set_yaw(50)
drone.move()
time.sleep(0.01)
더 이상 앞으로 나아가지 않기 때문에, 현재 상태를 반영하도록 print
문을 변경합니다. 또한 모든 전진 이동이 중지되도록 피치(pitch)를 0으로 설정합니다. 이번엔 요(yaw)를 사용하여 드론의 전방 거리 센서에 감지되는 장애물을 피합니다. 드론의 전방 거리 센서에 더 이상 장애물이 감지되지 않으면, 회전중인 상태를 벗어나서 다음 장애물을 확인합니다.
마지막으로, 우리가 추가해야 할 것은 while 반복문 밖에 있는 착륙 명령입니다. 30초가 지나면 while 반복문이 종료되고 프로그램을 종료하기 위해 착륙합니다!
drone.land()
전체 코드는 다음과 같습니다.
from codrone_edu.drone import *
import time
drone = Drone()
drone.pair()
drone.takeoff()
time_elapsed = 0
time_start = time.time()
while time_elapsed < 30:
time_elapsed = time.time() - time_start
front_sensor = drone.get_front_range()
print("전방 센서", front_sensor)
if front_sensor > 500:
print("앞으로 이동!")
drone.set_yaw(0) # 앞으로 가야할 때 방향 yaw는 0입니다.
drone.set_pitch(40)
drone.move()
time.sleep(0.01)
elif front_sensor < 500 and front_sensor > 300:
print("무언가 가까워지고 있습니다. 속도를 줄이세요!")
drone.set_yaw(0) # 앞으로 가야할 때 방향 yaw는 0입니다.
drone.set_pitch(20)
drone.move()
time.sleep(0.01)
else:
print("물체가 감지되었습니다! 회전 중입니다!")
drone.set_pitch(0) # 회전을 해야할 때 피치 값을 0으로 하고 전진을 멈춥니다.
drone.set_yaw(50)
drone.move()
time.sleep(0.01)
drone.land()