Skip to content

LINEARJUN/DRONAI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Logo

DRONAI

드론 전투체계 시스템 관리 콘솔

Web Demo . Download · Notion · Documents · Presentation

🤖 DRONAI QUICK VIEW

소개 영상 보기 시뮬레이션 다운로드
웹 대시보드 접속하기 프로젝트 보고서 보기
프로젝트 Documentation 보기 협업 기록 및 전체 작업 보기

📚 목차

Details
  1. 왜 사용해야 하는가? (Why?)
  2. 프로젝트 소개 (About)
  3. 기능 설명 (Features)
  4. 기술 스택 (Techniques)
  5. 클라이언트 기술 설명 (Client Technique Explanation)
  6. 웹 및 서버 기술 설명 (Web and Server Technique Explanation)
  7. 사용된 알고리즘 (Used Algorithm)
  8. 컴퓨터 구성 / 필수 조건 안내 (Prequisites)
  9. 설치 안내 (Installation Process)
  10. 팀 정보 (Team Information)
  11. 저작권 및 사용권 정보 (Copyleft / End User License)

❔ 왜 사용해야 하는가?

DRONAI는 현 체제에서 어떠한 변화를 줄 수 있는가? 그에대한 설명을 기술하였다.
현재 군에서는 '드론 운용 정비병'과 '해당 간부'가 팀을 이뤄 하나의 드론을 정비하고 조작한다. 현재와 같이 소수의 드론만을 전투에 활용한다면 이러한 체제로 운용이 가능할 수 있다. 그러나 다가오는 미래의 워리어 플랫폼에서 계속 소수의 드론만을 고집할지는 의문이며 만약 그렇다 한들 이는 심각한 문제로 제기 될 것이다.

드론 군집비행의 사례를 조사해본 결과 이미 해외에서는 어느정도 연구를 했거나 결과가 나온 경우가 많다. 대표적으로 인텔의 빛의 드론 프로젝트나 중국 드론쇼 등이 있다. 물론 지금은 사람의 눈을 즐겁게하는 정도이지만 이 기술은 군사력 증진에 얼마든지 응용될 수 있다고 본다. 기존에 드론 군집 비행 개발 노하우가 있던 나라와 노하우가 없던 나라가 동시에 군용 드론 군집 비행 기술 개발을 시작한다면 당연히 전자가 후자보다 유리할 것이다.
드론으로 표적을 암살에 성공한 사례가 있는 지금, 드론의 가능성과 능력은 증명 되었다고 본다. 그렇기에 다수에 드론을 동시에 제어할 수 있는 시스템의 존재는 필수적이라 본다. 사람이 언제까지 드론을 1대 1로 조종할 수 는 없으며 조종해야 될 개체수가 많아질 수록 더더욱 그렇다. 또한, 드론 군집 비행을 개발하고 연구한 노하우가 있어야, 반대로 드론 군집 비행으로부터의 공격을 막아낼 수 있는 안목이 생길 수 있다고 확신한다.
위와 같은 이유를 토대로 'DRONAI' 프로젝트는 기획되었다. 기획단계에서 한계점이 없었던 것은 아니다. 군 내에서 드론 군집 비행 시스템을 개발해 보인다는 것은 기술적으로 어려운 것은 둘째치고 여건이나 환경적으로 사실상 불가능 했다. 때문에 한계점을 명확히 인지하되 현실 상황에 빗된 시뮬레이션을 개발하여 프로젝트를 진행해 나가기로 결정했다. 이번 프로젝트의 목적은 실사용 가능한 드론 군집비행 시스템을 개발하는 것이 아니다. 드론 군집 비행의 뼈대를 잡고 응용 가능성을 테스트 해보며 이를 발전시켜 나아갈 수 있는지를 보는 것이 첫째이며, 추후 실제 상황에 투입할 드론 군집비행 개발을 위한 하나의 길잡이가 되는 것이 둘째 목표이다.
그래서 'DRONAI'가 성공적으로 길잡이가 되어 주었는가를 뭍는다면 답은 '그렇다' 이다. 'DRONAI'는 동적으로 3차원 공간에서 경로를 탐색할 수 있는 능력을 가졌으며, 테스트 결과 동시에 64대까지 98.2% (바람이나 드론끼리의 고속 충돌 등 물리적인 예외는 존재) 의 확률로 안전한 경로를 탐색해 준다. 따라서 앞으로의 드론 군집 비행을 개발하는데에 있어 충분히 활용가능하다고 생각하며 만약 그렇지 못하더라도 전반적인 시스템으로부터 프로토타입이나 아이디어는 얻을 수 있다고 본다.

❗ 프로젝트 소개

드론 전투체계를 통합적으로 관리하는 플랫폼이다.

Details

64기급 편대 빌딩

'DRONAI SIMULATION'이 64기급 편대를 구축하기 위해 드론 64기를 동시에 부팅하는 상황이다.

64기급 편대 형태 구성

'DRONAI SIMULATION'이 64기급 편대를 구축하기 위해 드론 64기의 비행 형태를 구성하는 장면 중 일부이다

64기급 원형 편대 비행

'DRONAI SIMULATION'이 64기의 드론을 동시에 비행시키는 모습이다.

64기급 편대 복귀

'DRONAI SIMULATION'이 64기의 드론을 동시에 제자리로 복귀 시키는 모습 중 일부이다.

클라이언트 로딩 화면

'DRONAI SIMULATION'을 구동할시 볼 수 있는 로딩화면이다.

클라이언트 UI

작업 중인 클라이언트 UI 2차 프로토타입 초안

클라이언트 UI [ESC 반응 / Interaction]

작업 중인 클라이언트 UI 2차 프로토타입 초안

회원가입 및 로그인

아래 사진은 'DRONAI' 대시보드에서 지원하는 회원가입 시스템이다. JWT 토큰을 이용한 세션 인증 방식으로 작동한다.

아래 사진은 'DRONAI' 대시보드에서 지원하는 로그인 시스템이다. 로그인 역시 회원가입과 비슷하게 JWT 토큰을 이용한 세션 인증 방식으로 작동한다.

대쉬보드 / DASHBOARD

기본 페이지입니다. 드론 개수, 이벤트 수, 마지막 이벤트 발생 시각, 마지막 이벤트 발생 장소 등의 원하는 정보를 실시간으로 반영하여 나타나게 만들 수 있습니다.

이벤트 리스트 / EVENT LIST

이벤트 리스트입니다. 리액트 특성 상 컴포넌트의 상태가 업데이트 될 때 렌더링을 다시 해줍니다. 따라서 서버에 새로운 이벤트를 입력하면 즉시 반영되어 웹 페이지 내 이벤트 리스트가 수정됩니다.

🔍 기능 설명

DRONAI에서 제공하는 기능에 대해 기술하는 영역
Details

에디터 / EDITOR

에디터에서만 동작하는 기능

DRONAI는 컴파일된 프로그램뿐만 아니라 개발단계에서 필요한 에디터 화면에서도 여러 가지 기능을 제공한다.

앞으로 에디터에서만 동작하는 기능들에 대해서는 EDITOR라는 약어를 붙이겠다.

런타임 / RUNTIME

런타임에서 동작하는 기능

컴파일 및 빌드 된 DRONAI 시뮬레이션이 실질적으로 사용자에게 제공하는 기능들이다.

앞으로 런타임에서 동작하는 기능들에 대해서는 RUNTIME이라는 약어를 붙이겠다.

드론 자동배치 기능 (EDITOR)

원하는 사이즈와 높이, 생성 빈도에 맞추어 초기 드론 그룹을 자동으로 생성해 준다

드론 자동회피 기능 (RUNTIME)

드론에 부착된 센서 기능으로 근방 1m 이내에 장애물이 감지되면 그와 반대 방향 벡터로 이동함

시스템 UML

DRONAI 시스템 UML 프로토타입 (간략화 버전)

🔌 기술 스택 (Techniques Used)

Front-end (Dashboard)

  • Module: react.js, react-redux, react-router
  • Theme: material-ui, react-berry

Back-end (Api & Socket)

  • Language: javascript, typescript, scss
  • Module: nodejs, express, socket, bcrypt, passport
  • Database: sqlite3

Simulation (Client)

Server (Linux)

  • OS: Linux
  • Tools: Docker, Maria DB
  • Technique: SSL, HSTS, Reverse Proxy, Proxied, Virtual Host

💾 클라이언트 기술 설명 (Client Technique Explanation)

A* Dynamic

실시간 동적으로 경로 탐색이 가능한 자제 개발 알고리즘

이 알고리즘은 A* 3차원 알고리즘과 Sebastian Lague의 A* 프로젝트[MIT]를 응용하여 탄생한 자체 개발 알고리즘이다. 이 알고리즘은 동적으로 움직이는 오브젝트들까지 경로 탐색 과정에 반영하여 피해갈 수 있도록 해준다. 핵심되는 내용은 일정 주기에 맵을 Rebake 하는 쓰레드가 도는 것이며 그 소스는 아래와 같다

public void UpdateGrid()
{
    if(Time.time - previousUpdateGridTime < .4f)
    {
        // print("[A* Dynamic] Request denied : Grid 최신화 주기가 잦음!");
        return;
    }
    previousUpdateGridTime = Time.time;

    Vector3 worldBottomLeft = transform.position - Vector3.right * gridWorldSize.x / 2 - Vector3.up * gridWorldSize.y / 2 - Vector3.forward * gridWorldSize.z / 2;
    for (int x = 0; x < gridSizeX; x++)
    {
        for (int y = 0; y < gridSizeY; y++)
        {
            for (int z = 0; z < gridSizeZ; z++)
            {
                Vector3 worldPoint = worldBottomLeft + Vector3.right * (x * nodeDiameter + nodeRadius) + Vector3.up * (y * nodeDiameter + nodeRadius) + Vector3.forward * (z * nodeDiameter + nodeRadius);
                bool walkable = !(Physics.CheckSphere(worldPoint, nodeRadius, unwalkableMask));

                int movementPenalty = 0;


                Ray ray = new Ray(worldPoint + Vector3.up * 50, Vector3.down);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit, 100, walkableMask))
                {
                    walkableRegionsDictionary.TryGetValue(hit.collider.gameObject.layer, out movementPenalty);
                }

                if (!walkable)
                {
                    movementPenalty += obstacleProximityPenalty;
                }

                grid[x, y, z] = new AstarNode(walkable, worldPoint, x, y, z, movementPenalty);
            }
        }
    }
}

드론 작업 스케줄러

DRONAI에서 드론 TASK를 관리 시스템
Priority Code 가 낮을수록 더 높은 작업 우선순위를 갖게 된다.

EX) 이 상황의 경우 0번 작업 실행 후 이어서 12 -> 16 -> ... -> 256까지 실행하고 난 뒤 드론 작업이 모두 종료된다.
[Priority Code : 0] > [Priority Code : 12] > [Priority Code : 16] > ... > [Priority Code : 256]

만약 위의 작업 스케줄에서 Priority Code : 14를 갖는 작업이 추가 된다면 아래와 같이 작업 우선순위 구성이 바뀐다.
[Priority Code : 0] > [Priority Code : 12] > [Priority Code : 14] > [Priority Code : 16] > ... > [Priority Code : 256]

여기서 Priority Code : 0의 작업이 종료 된다면 단순하게 First Element가 Pop 되므로 결과는 아래와 같다.
[Priority Code : 12] > [Priority Code : 14] > [Priority Code : 16] > ... > [Priority Code : 256]

DRONAI에서 존재하는 모든 드론은 Priority Queue를 기반으로한 TASK 시스템을 갖고 있다. 이는 CPU 작업 스케줄러와 비슷하다고 보면 된다. 위의 작업 스케줄러 시스템은 Priority Queue 알고리즘 (Heap and some more)으로 작성되었다.

🌏 웹 및 서버 기술 설명 (Web and Server Technique Explanation)

REVERSE PROXY

리버스 프록시(reverse proxy)는 컴퓨터 네트워크에서 클라이언트를 대신해서 한 대 이상의 서버로부터 자원을 추출하는 프록시 서버의 일종이다. 그런 다음 이러한 자원들이 마치 웹 서버 자체에서 기원한 것처럼 해당 클라이언트로 반환된다.

DRONAI DASHBOARD및 API 서버, 백엔드 서버에 적용된 기술입니다.

HSTS

HTTP 엄격한 전송 보안 (HSTS)는 다운 그레이드 공격 및 쿠키 하이재킹으로부터 HTTPS 웹 사이트를 보호하도록 설계된 웹 보안 정책 메커니즘입니다. HSTS를 사용하도록 구성된 웹 서버는 웹 브라우저 (또는 기타 클라이언트 소프트웨어)에 HTTPS 연결 만 사용하도록 지시하고 HTTP 프로토콜 사용을 허용하지 않습니다.

DRONAI DASHBOARD에 엄격히 적용된 기술입니다.

✏️ 사용된 알고리즘 (Used Algorithm)

A* 3rd Dimension

DRONAI에서 드론의 경로를 찾을 때 핵심적으로 사용된 알고리즘이다

기본적으로 A star 알고리즘은 2차원에서 동작한다. 하지만 이 프로젝트에서는 3차원급 탐색을 요구하기에 A* 알고리즘의 핵심적인 부분을 변경할 필요가 있었다. 다행이 이번 프로젝트를 진행하면서 이 부분을 해결하는데에 성공했다. 62BN 팀에서 자체적으로 개발한 A* 응용 알고리즘이며 그 핵심소스는 아래와 같다

public int GetDistance(AstarNode nodeA, AstarNode nodeB)
{
    int dx = (int)Math.Abs(nodeA.GridX - nodeB.GridX);
    int dy = (int)Math.Abs(nodeA.GridY - nodeB.GridY);
    int dz = (int)Math.Abs(nodeA.GridZ - nodeB.GridZ);

    // make (dx, dy, dz) to (dx > dy > dz)
    if (dx < dy) Swap(ref dx, ref dy);
    if (dx < dz) Swap(ref dx, ref dz);
    if (dy < dz) Swap(ref dy, ref dz);

    // sqrt(3) = 1.7xxx, sqrt(2) = 1.4xxx
    // dz, dy - dz, (dx - dz) - (dy - dz)
    return 17 * dz + 14 * (dy - dz) + 10 * (dx - dy);
}



Priority Queue

DRONAI에서 드론 TASK를 관리할 때 핵심적으로 사용된 알고리즘

어떠한 자료구조 및 Queue 혹은 Generic에서 최대한 빠르게 최소값에 접근하기 위해 이 알고리즘을 채택하였다.



Theta star and Lazy Theta star

DRONAI에서 smooth pathing을 위해 사용된 알고리즘

ASCANE이 작성한 논문에서 발취한 알고리즘이다. 딱딱하게 나온 드론 경로를 조금 더 부드럽게 처리할 때 유용하여 부분적으로 채택하였다. 아래는 위 알고리즘의 의사소통 코드이다.

Theta star Lazy theta star

💻 컴퓨터 구성 / 필수 조건 안내 (Prerequisites)

Web

Chrome Chrome IE Internet Explorer Edge Edge Safari Safari Firefox Firefox
Yes No Yes Yes Yes

Client (Recommendation)

Processor Processor Memory Memory Graphics Graphics DirectX DirectX Storage Storage
AMD Athlon X4
Intel Core i5 4460
8 GB RAM Nvidia GTX 950
AMD R7 370
Version 11 2 GB available space

ℹ️ 설치 안내 (Installation Process)

  • DRONAI SIMULATION 실행
========== 들어가기 전에 ==========
시뮬레이션은 기본전으로 dronai.linearjun.com 서버에 연결이 된다. 서버 주소는 RUNTIME내에서는 변경 불가능하다.


========== 실행 방법 ==========
1. 프로젝트를 클론 받거나 [다운로드 페이지](https://osamhack2021.github.io/app_web_dronai_62bn)에서 클라이언트를 다운 받는다.

2. Simulation.zip 의 압축을 푼다
   L 프로젝트를 클론 받았다면 result 폴더 안에서 Simulation.zip 을 찾을 수 있다.

3. DRONAI.exe를 실행시킨다


========== 조작 방법 ==========
- 마우스 우클릭을 통해 카메라를 회전 시킬 수 있다. 
- 마우스 휠을 통해 카메라 줌 인아웃이 가능하다
- ESC 키를 통해 UI에 접근이 가능하다. (ESC를 다시 누르면 꺼진다)
- TAB 키를 통해 Camera Focus Change UI에 접근할 수 있다. (TAB을 다시 누르면 꺼진다)
  • API 서버 실행
$ cd ./WEB\(BE\)/
$ yarn
$ yarn typeorm migration:run    #DB를 생성하는 명령어, 최초 구동시 한번만 실행하면 된다.
$ yarn dev
  • DASHBOARD FRONTEND 실행
$ cd ./WEB\(FE\)/
$ yarn
$ yarn start

🧑‍🤝‍🧑 팀 정보 (Team Information)

Profile Name Role E-mail Github
김준영 TEAM LEADER
Client and Full stack Developer
Including algo, logic, simulation and more
admin@linearjun.com github
강건구 Algo & Logic
Client Developer
kdr06006@naver.com github
한충현 Front End
Web Developer
kd4aqqjr@naver.com github
고건우 Product Manager
AI Researcher
coreax7@gmail.com github

📜 저작권 및 사용권 정보 (Copyleft / End User License)

This project is licensed under the terms of the MIT license.

About

드론 군집체계 관리 콘솔 개발 프로젝트

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published