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 시리얼 포트 닫기

▶ 군집 대형 군집 대형

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c34387f7-2d2b-47ca-927b-4d29c45ff2f5/BRC-105_5.png


[비행영상]

☞ BRC-105 5대 군집비행 영상

☞ BRC-105 5대 군집비행 영상