BRC-105 드론 5대로 군집비행하는 코딩입니다. 가운데 드론 1대를 중심으로 4대의 드론이 사각형 패턴비행을 하는 군집비행입니다.
※ 코딩 방법은 "4대 군집비행"과 동일합니다.
from time import sleep
# BRC-105 모듈 불러오기
from e_drone.drone import *
from e_drone.protocol import *
# ACK 이벤트 함수 정의
def eventAck(ack):
print("{0} / {1} / {2:04X}".format(ack.dataType.name, ack.systemTime, ack.crc16))
# 메인 실행 부분
if __name__ == '__main__':
drone1 = Drone() # 1번째 Drone 객체 생성 후 변수(drone1)에 저장
drone2 = Drone() # 2번째 Drone 객체 생성 후 변수(drone2)에 저장
drone3 = Drone() # 3번째 Drone 객체 생성 후 변수(drone3)에 저장
drone4 = Drone() # 4번째 Drone 객체 생성 후 변수(drone4)에 저장
drone5 = Drone() # 5번째 Drone 객체 생성 후 변수(drone5)에 저장
# 연결된 각 드론과의 통신을 위한 시리얼 포트 연결 작업
drone1.open("COM15") # drone1 시리얼 포트 연결
drone2.open("COM12") # drone2 시리얼 포트 연결
drone3.open("COM16") # drone3 시리얼 포트 연결
drone4.open("COM13") # drone4 시리얼 포트 연결
drone5.open("COM14") # drone5 시리얼 포트 연결
# ACK 이벤트 함수 등록
drone1.setEventHandler(DataType.Ack, eventAck)
drone2.setEventHandler(DataType.Ack, eventAck)
drone3.setEventHandler(DataType.Ack, eventAck)
drone4.setEventHandler(DataType.Ack, eventAck)
drone5.setEventHandler(DataType.Ack, eventAck)
# drone1/2/3/4 LED 점등
drone1.sendLightModeColors(LightModeDrone.BodyHold, 200, Colors.Red)
drone2.sendLightModeColors(LightModeDrone.BodyHold, 200, Colors.Yellow)
drone3.sendLightModeColors(LightModeDrone.BodyHold, 200, Colors.Red)
drone4.sendLightModeColors(LightModeDrone.BodyHold, 200, Colors.Yellow)
sleep(1.0)
# 1단계: drone1/2/3/4 이륙하기
print("[Step.1] Drone1/2/3/4 Takeoff")
drone1.sendTakeOff() # drone1 이륙
drone2.sendTakeOff() # drone2 이륙
drone3.sendTakeOff() # drone3 이륙
drone4.sendTakeOff() # drone4 이륙
for i in range(5, 0, -1): # 이륙하는동안 5초 카운트
drone1.sendPing(DeviceType.Drone)
drone2.sendPing(DeviceType.Drone)
drone3.sendPing(DeviceType.Drone)
drone4.sendPing(DeviceType.Drone)
sleep(1.0)
# 2단계: drone1/2/3/4 호버링하기
print("[Step.2] Drone1/2/3/4 Hovering")
for i in range(2, 0, -1): # 2초동안 호버링
drone1.sendControlWhile(0, 0, 0, 0, 1000) # drone1 호버링(1초)
drone2.sendControlWhile(0, 0, 0, 0, 1000) # drone2 호버링(1초)
drone3.sendControlWhile(0, 0, 0, 0, 1000) # drone3 호버링(1초)
drone4.sendControlWhile(0, 0, 0, 0, 1000) # drone4 호버링(1초)
sleep(0.01)
# 3단계: drone1/2/3/4 1m 전진하기
print("[Step.3] Drone1/2/3/4 Going Forward 1m")
drone1.sendControlPosition(1.0, 0, 0, 0.5, 0, 0) # drone1 전진(0.5m/s 속도로 1m 전진)
drone2.sendControlPosition(1.0, 0, 0, 0.5, 0, 0) # drone2 전진(0.5m/s 속도로 1m 전진)
drone3.sendControlPosition(1.0, 0, 0, 0.5, 0, 0) # drone3 전진(0.5m/s 속도로 1m 전진)
drone4.sendControlPosition(1.0, 0, 0, 0.5, 0, 0) # drone4 전진(0.5m/s 속도로 1m 전진)
for i in range(3, 0, -1): # 전진하는동안 3초 카운트
drone1.sendPing(DeviceType.Drone)
drone2.sendPing(DeviceType.Drone)
drone3.sendPing(DeviceType.Drone)
drone4.sendPing(DeviceType.Drone)
sleep(1.0)
# 4단계: drone1/2/3/4 호버링하기
print("[Step.4] Drone1/2/3/4 Hovering")
for i in range(3, 0, -1): # 3초동안 호버링
drone1.sendControlWhile(0, 0, 0, 0, 1000) # drone1 호버링(1초)
drone2.sendControlWhile(0, 0, 0, 0, 1000) # drone2 호버링(1초)
drone3.sendControlWhile(0, 0, 0, 0, 1000) # drone3 호버링(1초)
drone4.sendControlWhile(0, 0, 0, 0, 1000) # drone4 호버링(1초)
sleep(0.01)
# drone5 LED 점등
drone5.sendLightModeColors(LightModeDrone.BodyHold, 200, Colors.Blue)
sleep(1.0)
# 5단계: drone1/3 90도 우회전하기 + drone5 이륙하기
print("[Step.5] Drone1/3 Turning Right 90 degree + Drone5 Takeoff")
drone5.sendTakeOff() # drone5 이륙
drone1.sendControlPosition(0, 0, 0, 0, -90, 45) # drone1 90도 우회전(45도/s 속도로 90도 우회전)
drone3.sendControlPosition(0, 0, 0, 0, -90, 45) # drone3 90도 우회전(45도/s 속도로 90도 우회전)
for i in range(5, 0, -1): # 이륙 및 회전하는동안 5초 카운트
drone1.sendPing(DeviceType.Drone)
drone3.sendPing(DeviceType.Drone)
drone5.sendPing(DeviceType.Drone)
sleep(1.0)
# 6단계: drone1/2/3/4/5 호버링하기
print("[Step.6] All Drones Hovering")
for i in range(2, 0, -1): # 2초동안 호버링
drone1.sendControlWhile(0, 0, 0, 0, 1000) # drone1 호버링(1초)
drone2.sendControlWhile(0, 0, 0, 0, 1000) # drone2 호버링(1초)
drone3.sendControlWhile(0, 0, 0, 0, 1000) # drone3 호버링(1초)
drone4.sendControlWhile(0, 0, 0, 0, 1000) # drone4 호버링(1초)
drone5.sendControlWhile(0, 0, 0, 0, 1000) # drone5 호버링(1초)
sleep(0.01)
# 7단계: drone1/2/3/4 사각형 패턴 비행하기 + drone5 상승 및 하강 반복하기
print("[Step.7] Drone1/2/3/4 Flying Square Pattern + Drone 5 Going Up & Down")
for i in range(4, 0, -1): # 전진과 좌회전을 4번 반복하여 사각형 패턴 비행 구현하기
drone5.sendControlPosition(0, 0, 1.0, 0.5, 0, 0) # drone5 상승(0.5m/s 속도로 1m 상승)
drone1.sendControlPosition(4.0, 0, 0, 1.0, 0, 0) # drone1 전진(1m/s 속도로 4m 전진)
drone2.sendControlPosition(4.0, 0, 0, 1.0, 0, 0) # drone2 전진(1m/s 속도로 4m 전진)
drone3.sendControlPosition(4.0, 0, 0, 1.0, 0, 0) # drone3 전진(1m/s 속도로 4m 전진)
drone4.sendControlPosition(4.0, 0, 0, 1.0, 0, 0) # drone4 전진(1m/s 속도로 4m 전진)
drone1.sendControlWhile(0, 0, 0, 0, 1000) # drone1 호버링(1초)
drone2.sendControlWhile(0, 0, 0, 0, 1000) # drone2 호버링(1초)
drone3.sendControlWhile(0, 0, 0, 0, 1000) # drone3 호버링(1초)
drone4.sendControlWhile(0, 0, 0, 0, 1000) # drone4 호버링(1초)
drone5.sendControlWhile(0, 0, 0, 0, 1000) # drone5 호버링(1초)
drone5.sendControlPosition(0, 0, -1.0, 0.5, 0, 0) # drone5 하강(0.5m/s 속도로 1m 하강)
drone1.sendControlPosition(0, 0, 0, 0, 90, 45) # drone1 전진(45도/s 속도로 90도 좌회전)
drone2.sendControlPosition(0, 0, 0, 0, 90, 45) # drone2 전진(45도/s 속도로 90도 좌회전)
drone3.sendControlPosition(0, 0, 0, 0, 90, 45) # drone3 전진(45도/s 속도로 90도 좌회전)
drone4.sendControlPosition(0, 0, 0, 0, 90, 45) # drone4 전진(45도/s 속도로 90도 좌회전)
drone1.sendControlWhile(0, 0, 0, 0, 1000) # drone1 호버링(1초)
drone2.sendControlWhile(0, 0, 0, 0, 1000) # drone2 호버링(1초)
drone3.sendControlWhile(0, 0, 0, 0, 1000) # drone3 호버링(1초)
drone4.sendControlWhile(0, 0, 0, 0, 1000) # drone4 호버링(1초)
drone5.sendControlWhile(0, 0, 0, 0, 1000) # drone5 호버링(1초)
# 8단계: All Drones 호버링하기
print("[Step.8] All Drones Hovering")
for i in range(3, 0, -1): # 3초동안 호버링
drone1.sendControlWhile(0, 0, 0, 0, 1000) # drone1 호버링(1초)
drone2.sendControlWhile(0, 0, 0, 0, 1000) # drone2 호버링(1초)
drone3.sendControlWhile(0, 0, 0, 0, 1000) # drone3 호버링(1초)
drone4.sendControlWhile(0, 0, 0, 0, 1000) # drone4 호버링(1초)
drone5.sendControlWhile(0, 0, 0, 0, 1000) # drone5 호버링(1초)
sleep(0.01)
# 9단계: drone1/2/3/4/5 착륙하기
print("[Step.9] All Drones Landing")
drone1.sendLanding() # drone1 착륙
drone2.sendLanding() # drone2 착륙
drone3.sendLanding() # drone3 착륙
drone4.sendLanding() # drone4 착륙
drone5.sendLanding() # drone5 착륙
for i in range(5, 0, -1): # 착륙하는동안 5초 카운트
drone1.sendPing(DeviceType.Drone)
drone2.sendPing(DeviceType.Drone)
drone3.sendPing(DeviceType.Drone)
drone4.sendPing(DeviceType.Drone)
drone5.sendPing(DeviceType.Drone)
sleep(1.0)
# 시리얼 포트 닫기 작업(모든 명령이 완료되면 시리얼 포트를 닫아줌.)
drone1.close() # drone1 시리얼 포트 닫기
drone2.close() # drone2 시리얼 포트 닫기
drone3.close() # drone3 시리얼 포트 닫기
drone4.close() # drone4 시리얼 포트 닫기
drone5.close() # drone5 시리얼 포트 닫기
☞ BRC-105 5대 군집비행 영상