이 문서는 Git/GitHub/Python/Unity 가 처음인 팀원이 이 프로젝트를 자기 컴퓨터에서 처음부터 실행하기까지의 모든 절차를 담은 단계별 안내서다. 위에서부터 순서대로 따라 하면 된다. 한 단계를 건너뛰면 그다음이 안 된다.
표기 규칙
▶ 명령어: 터미널/PowerShell 에 그대로 복사·붙여넣어 실행한다.<...>: 본인 값으로 바꿔 입력하는 자리표시자(예:<유저이름>→gildong). 꺾쇠는 빼고 쓴다.- Windows 사용자는 "명령 프롬프트(cmd)" 가 아니라 PowerShell 또는 Git Bash 를 사용한다 (둘 중 아무거나).
- macOS / Linux 사용자는 기본 "터미널" 을 쓴다.
- 필수 프로그램 설치
- GitHub 계정 + Git 인증 설정
- 프로젝트 클론(다운로드)
- 대용량 자산 받기 (모델 가중치 · 데모 세션)
- Python 가상환경 + 패키지 설치
- Unity 프로젝트 열기
- 파이프라인 실행 (오프라인 재생)
- Git 일상 사용법 (pull / branch / commit / push)
- 자주 막히는 문제 (트러블슈팅)
- 참고 문서
순서대로 5 개 프로그램을 깔아야 한다. Unity Hub 와 Unity 본체는 다른 프로그램이라는 점을 잊지 말자.
- Windows: https://git-scm.com/download/win 에서 64-bit Git for Windows Setup 다운로드 후 설치. 설치 옵션은 전부 기본값으로 두면 된다. 설치하면 "Git Bash" 라는 검은 터미널이 같이 깔린다.
- macOS: 터미널에서 다음 실행.
▶ xcode-select --install
- Linux (Ubuntu):
▶ sudo apt update && sudo apt install -y git
설치 확인:
▶ git --versiongit version 2.xx.x 형식이 나오면 성공.
- Windows: https://www.python.org/downloads/release/python-3119/ 페이지 하단의 "Windows installer (64-bit)" 다운로드 후 설치.
⚠️ 설치 첫 화면의 "Add python.exe to PATH" 체크박스 반드시 켠다. - macOS:
(Homebrew 없으면 https://brew.sh 에서 먼저 설치)
▶ brew install python@3.11
- Linux (Ubuntu):
▶ sudo apt install -y python3.11 python3.11-venv python3-pip
설치 확인:
▶ python --version # Windows
▶ python3.11 --version # macOS / LinuxPython 3.11.x 가 나와야 한다.
https://unity.com/download 에서 "Download for Windows/Mac/Linux" 클릭 → Unity Hub 설치. 이건 런처일 뿐 엔진 본체가 아니다.
이 프로젝트는 정확히 이 버전이 필요하다. 다른 버전으로 열면 프로젝트가 깨질 수 있다.
- Unity Hub 실행.
- 좌측 Installs 탭 → 우상단 Install Editor 클릭.
- 상단 Archive 탭 → 화면 안내대로 "download archive" 를 눌러 브라우저에서 버전 목록 페이지를 연다.
- 6000.4.0f1 찾기 (없으면
Unity 6.x섹션을 펼친다). 페이지의 "Unity Hub" 버튼 클릭 → 자동으로 Hub 에서 설치 다이얼로그가 뜬다. - 모듈 선택 화면에서 다음 항목 체크:
- ✅ Visual Studio (또는 본인이 쓰는 IDE 모듈) — 코드 편집기 연동용.
- (선택) 한국어 언어 팩.
- 그 외 빌드 타겟(Android/iOS 등)은 본인 필요 시.
- 설치 시작 → 2 ~ 8 GB 다운로드, 10 ~ 30 분 소요.
https://code.visualstudio.com/ 에서 설치. 위 Unity 모듈로 같이 깔리는 "Visual Studio Community" 와는 다른 프로그램이지만, Python 스크립트 편집·디프 확인·간단한 Git 조작에 더 편리하다.
- https://github.com 우측 상단 Sign up → 이메일·비밀번호로 계정 생성.
- 가입 후 이메일 인증을 마친다.
이건 컴퓨터에 단 한 번만 하면 된다. 깃이 커밋에 찍는 이름·이메일을 알려주는 거다.
▶ git config --global user.name "<본인 이름>"
▶ git config --global user.email "<github 가입 이메일>"예시:
▶ git config --global user.name "Gildong Hong"
▶ git config --global user.email "gildong@example.com"GitHub 는 비밀번호로 push 를 못 한다. 대신 토큰(긴 비밀번호 같은 것)을 쓴다.
- GitHub 로그인 → 우상단 본인 프로필 사진 → Settings.
- 좌측 맨 아래 Developer settings → Personal access tokens → Tokens (classic) → Generate new token (classic).
- 설정:
- Note:
DroneVisionUnity(아무 메모나 OK). - Expiration:
90 days권장 (만료 시 재발급). - Scopes: ✅
repo만 체크.
- Note:
- Generate token 클릭 →
ghp_xxxx...로 시작하는 토큰이 한 번만 보인다. 반드시 메모장 등에 복사해 둔다. 이 페이지를 닫으면 다시는 못 본다.
저장소 소유자(팀장)에게 본인 GitHub 아이디를 알려주고 Collaborator 로 등록해 달라고 요청한다. 등록 후 본인 메일로 초대 링크가 오면 수락한다. (등록 안 돼 있으면 push 가 안 된다. clone 자체는 public 저장소면 등록 없이도 된다.)
프로젝트를 둘 곳을 정한다. 경로에 한글·공백·특수문자가 없는 곳을 강력 권장. 예:
- Windows:
C:\dev\ - macOS/Linux:
~/dev/(~는 홈 디렉토리)
폴더가 없으면 만든다:
▶ mkdir -p ~/dev # macOS / Linux
▶ mkdir C:\dev # Windows (PowerShell)해당 폴더로 이동:
▶ cd ~/dev # macOS / Linux
▶ cd C:\dev # Windows▶ git clone https://github.com/OnePersonOne1/DroneVisionUnity.git처음 push/pull/clone 시 GitHub 인증창이 뜨면:
- Username: 본인 GitHub 아이디.
- Password:
⚠️ GitHub 비밀번호 아님 — 위 2-3 에서 만든 토큰(ghp_...) 을 붙여넣는다.
clone 이 끝나면 현재 폴더에 DroneVisionUnity/ 가 생긴다. 그 안으로 이동.
▶ cd DroneVisionUnity확인:
▶ ls # macOS / Linux / Git Bash
▶ dir # Windows PowerShellREADME.md, Unity/, Python/, Models/ 등이 보여야 정상.
GitHub 는 100 MB 이상 파일을 못 올려서, 일부 자산은 Google Drive 에 따로 둔다.
- 브라우저로 https://drive.google.com/file/d/1hoCFljPKaiiLfD9MdyfQ1XfUVvRozeyT/view?usp=drive_link 접속.
- 우상단 ⬇ 다운로드 버튼 →
checkpoint_best_total.pth다운로드. - 다운받은 파일을 클론한 프로젝트의
Models/폴더로 옮긴다.- 최종 경로 예:
~/dev/DroneVisionUnity/Models/checkpoint_best_total.pth
- 최종 경로 예:
라이브 카메라 없이 미리 녹화된 데이터로 동작 확인하려면 필요.
- https://drive.google.com/file/d/1sTiMGBD5R_6A1fty9yYbVERDCs7U_Hkx/view?usp=drive_link 에서 zip 다운로드.
- 프로젝트의
output/폴더 안에서 압축 해제. 결과:DroneVisionUnity/output/20260529_122735/ ├── image/ ├── sensor/ ├── detect_offline/ └── projection/ └── projection_20260529_122735.csv
가상환경(venv) 은 이 프로젝트 전용 파이썬 패키지 보관소다. 시스템 파이썬을 더럽히지 않게 분리한다.
프로젝트 루트(DroneVisionUnity/)에서:
▶ python -m venv .venv # Windows
▶ python3.11 -m venv .venv # macOS / Linux.venv/ 폴더가 생긴다.
이 명령은 새 터미널을 열 때마다 다시 해야 한다.
- Windows (PowerShell):
만약 "실행 정책" 오류 뜨면 한 번만:
▶ .\.venv\Scripts\Activate.ps1
▶ Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
- Windows (Git Bash / cmd):
▶ source .venv/Scripts/activate # Git Bash ▶ .venv\Scripts\activate.bat # cmd
- macOS / Linux:
▶ source .venv/bin/activate
성공하면 프롬프트 앞에 (.venv) 가 붙는다.
▶ pip install --upgrade pip
▶ pip install rfdetr supervision opencv-python numpy pillowinfo_service(건물 정보 백엔드 — B 키 건물 카드, ;/' 키 화재 상황 판단) 도 쓰려면 추가로:
▶ pip install -r Python/info_service/requirements.txt설치는 10 ~ 30 분 걸릴 수 있다(특히 rfdetr 와 그 의존성인 PyTorch).
info_service 의 건물명/주소 보강은 Kakao Local API 를 쓴다. 키 없이도 동작하지만 startup 경고와 함께 "이름 미상 건물" 비중이 늘어난다. 키는 코드/파일에 하드코딩 금지 — 환경변수로만.
- 일회 사용(셸 export):
▶ export KAKAO_REST_API_KEY=<발급키> # macOS / Linux / Git Bash ▶ $env:KAKAO_REST_API_KEY="<발급키>" # Windows PowerShell
- docker compose 환경이면
.env파일 사용 (gitignored — 자동 비공개)..env.example을.env로 복사 후 본인 키 채우기:▶ cp .env.example .env # .env 를 열어 KAKAO_REST_API_KEY=... 채워 넣기docker compose up이 자동으로 env 주입.
키 발급은 https://developers.kakao.com → 앱 생성 → "REST API 키" 복사. 무료 한도 충분.
▶ python -c "import rfdetr, cv2, numpy; print('OK')"OK 만 출력되면 성공.
- Unity Hub 실행 → 좌측 Projects 탭.
- 우상단 Add (또는 Open) → Add project from disk.
- 클론한
DroneVisionUnity/Unity폴더 자체를 선택 (그 안의Assets/가 아니라 부모인Unity/). - 프로젝트 목록에
Unity항목이 추가된다. 옆에 Unity 버전이6000.4.0f1로 자동 표시되면 OK. 다른 버전으로 표시되면 좌측 버전 드롭다운에서 6000.4.0f1 선택. - 항목을 클릭해 연다. 첫 실행은 5 ~ 15 분 소요 (의존성 임포트). 진행 바가 다 차고 에디터가 뜰 때까지 기다린다.
에디터가 열리면 좌하단 Project 창에서 Assets/Scenes/SampleScene.unity 더블 클릭.
상단 중앙 ▶ 재생 버튼 클릭. Game view 가 활성화된다.
- 단일 모니터면 Game view 상단 좌측 드롭다운("Display 1") 으로 Display 1/2/3/4 전환해서 각 화면 확인.
- 키 조작은
조작법.md참고.
라이브 카메라 없이 데모 세션으로 검출 → Unity 시각화 흐름을 확인하는 시나리오.
새 터미널을 열었다면 5-2 의 활성화 명령을 다시 실행.
새 터미널 1 개 열고 venv 활성화 후 프로젝트 루트에서:
▶ cd Python
▶ python replay_offline.py --session ../output/20260529_122735 --rate 5 --loop--rate 5: 초당 5 프레임 송신.--loop: 마지막 프레임 후 처음으로 다시 돌아감.
콘솔에 [replay] sent frame ... 로그가 나오면 송신 중.
Unity Editor 에서 Play 누르면 ProjectionUdpReceiver 가 UDP 9870 에서 패킷을 받고, 인천 맵 위에 검출 마커가 뜬다.
CSV 파일을 직접 재생하는 방식은
ProjectionReplay컴포넌트도 있다. 그 경우 인스펙터의Projection Csv Path에 절대 경로 입력 필요. 예:
- Windows:
C:\dev\DroneVisionUnity\output\20260529_122735\projection\projection_20260529_122735.csv- macOS/Linux:
/home/<유저>/dev/DroneVisionUnity/output/20260529_122735/projection/projection_20260529_122735.csv
- Python: 터미널에서
Ctrl + C. - Unity: 다시 ▶ 버튼 눌러 Play 모드 종료.
Unity 의 B 키 건물 카드, ;/' 키 모의 화재 평가, 검출 화재 자동 평가 모두 Python/info_service/info_server.py 백엔드가 필요하다.
서버 기동 — 새 터미널 열고 venv 활성화 후:
▶ cd Python/info_service
▶ python info_server.pyKakao 키가 있으면 같이 (5-5 참고):
▶ KAKAO_REST_API_KEY=<발급키> python info_server.py성공 시:
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8077
[info_server] OSM 건물 5194개 (...)
[info_server] GIS 건물 2533개 (...)
[info_server] 119안전센터 57개 (...)
[info_server] Kakao=True | LLM=qwen2.5:14b avail=True
Unity 신규 컴포넌트 배치 (씬에 한 번만):
| 컴포넌트 | 역할 | 부착 위치 |
|---|---|---|
FireSim |
;/'/Del 키로 모의 화재 주입 + 좌표 등록 |
빈 GameObject 1개 |
SimClock |
KST 가상 시계 (override 가능) | (SimClockUI 가 자동 생성) |
SimClockUI |
시간대 프리셋 UI (Z 토글) | 빈 GameObject 1개 |
SituationAssessClient |
/assess HTTP 호출 + 검출 화재 자동 감지 |
빈 GameObject 1개 |
BriefingPanel |
결과 카드 (F12 토글) | 빈 GameObject 1개 |
Hierarchy 에서 빈 GameObject 5개 만들어 (또는 1개에 모아) Add Component 로 각각 추가. 인스펙터 슬롯은 비워두면 자동으로 같은 씬의 다른 컴포넌트를 찾는다.
마커 모양 / 크기 / 영구 옵션 — 세 컴포넌트가 같은 헬퍼(DetectionMarkerVisual) 를 공유. 각자 인스펙터에서 따로 조정 가능:
| 컴포넌트 | 어떤 마커 | 인스펙터 위치 |
|---|---|---|
FireSim |
;/' 모의 화재 |
Shape Settings + Fire/Smoke/Default Marker Lifetime |
ProjectionUdpReceiver |
라이브 UDP 검출 | Shape Settings + Fire/Smoke/Marker Lifetime |
ProjectionReplay |
CSV 재생 검출 | Shape Settings + Fire/Smoke/Marker Lifetime |
Shape Settings 안 필드:
- Fire Box Size = 화재 큐브 한 변 (기본 10).
- Smoke Radius / Smoke Height = 연기 원기둥 (기본 4 / 14, 반투명 회색).
- Smoke Color = 연기 색·알파 (기본 (0.5,0.5,0.5,0.45)).
- Capsule Scale = 그 외 클래스 캡슐 폭 (높이 ×5).
Lifetime: Fire Marker Lifetime / Smoke Marker Lifetime 둘 다 기본 0 (영구) — 화재 추적 위해 사라지지 않음. Marker Lifetime 은 human/vehicle 같은 그 외 클래스에만 적용 (ProjectionUdpReceiver 기본 2s, Replay/FireSim 기본 0s). 양수로 바꾸면 자동 소멸.
Build (실행파일) 시 Display 1 → 1번 모니터, Display 2 → 2번, Display 3 → 3번 자동 분배. 모니터가 4개 미만이면 Display 4 (Sensor View) 가 안 보임.
해결: [ (LeftBracket) 키 = FP ↔ Sensor 채널 swap. 누르면 1번 모니터의 FP 카메라가 Display 4 로 가고 Sensor 카메라가 1번 자리로 들어옴. 다시 누르면 원위치. MultiDisplayCoordinator.swapFpSensorKey 에서 키 변경 가능.
개발 중에는 Build 안 하고 Editor ▶ Play 가 답. Game view 상단 드롭다운으로
Display 1/2/3/4직접 전환.
동작 확인:
- Play 모드 진입.
;키 누름 → FP 카메라 중앙(십자선) 위치에 빨간 capsule (fire 마커).- ~1초 후
BriefingPanel이 자동으로 화재 평가 결과 표시:- 위험도 뱃지 (low/mid/high 색)
- 시간대 라벨 (실시간 또는 SimClock override)
- 한국어 브리핑 (LLM 가용 시) 또는 template 폴백
- 가까운 119 안전센터 top-5 (거리·차종·대수)
- 권장 차량 (✓ 충당 / ⚠ 부족)
- Z 키로 SimClock 열어 시간대 바꿔 보기 (18:00 퇴근 vs 02:00 심야) → 같은 화재에 대해 occupancy/risk/briefing 이 바뀌는지 확인.
- Del 키 누르면 모의 화재 일괄 제거.
- RF-DETR 검출에서
fire_region/smoke_region가 들어와도SituationAssessClient.includeDetectionFires가 ON 이면 자동으로 동일하게 평가됨.
Ollama 사용 (선택):
ollama serve + ollama pull qwen2.5:14b 가 떠 있으면 자연스러운 한국어 브리핑이 합성됨. 안 떠 있어도 template briefing 으로 즉시 폴백 — 화재·시간대·건물·차량 룰 출력은 동일하게 작동.
▶ cd <DroneVisionUnity 경로>
▶ git status # 내 작업 영역 깨끗한지 확인
▶ git pull origin main # 원격 최신 변경 가져오기Already up to date. 또는 변경 요약이 나오면 정상.
⚠️ 본인이 수정한 파일이 있는데 pull 하면 conflict 가 날 수 있다. 그땐 본인 변경을 먼저 commit 하거나, 안 끝났으면git stash로 임시 보관 →pull→git stash pop순서로 풀어낸다.
main 에 직접 commit 하지 말고 별도 브랜치에서 작업.
▶ git checkout -b <브랜치이름>브랜치 이름은 짧고 알아보게: feat/sensor-view, fix/agl-zero, docs/tutorial 등.
▶ git status # 어떤 파일이 바뀌었는지
▶ git diff # 어떤 내용이 바뀌었는지▶ git add <파일1> <파일2> # 특정 파일만
▶ git add . # 현재 폴더 이하 전부 (편하지만 위험)
▶ git commit -m "<메시지>"커밋 메시지는 영문/한글 자유. 간결하고 동작 중심으로:
- ❌
수정(뭘 수정했는지 모름) - ✅
드론 AGL 라벨 추가 - ✅
센서 시점 카메라 거꾸로 보정
▶ git push origin <브랜치이름> # 본인 브랜치라면
▶ git push origin main # main 에서 직접 작업했다면처음 push 시 인증창에서 GitHub 아이디 + PAT(ghp_...) 입력. macOS 는 키체인에, Windows 는 자격증명 관리자에 저장돼 다음부턴 자동.
- push 후 GitHub 저장소 페이지 접속.
- 노란 배너에 "Compare & pull request" 버튼이 뜬다. 클릭.
- 제목·설명 작성 후 Create pull request.
- 동료가 리뷰·승인 후 Merge pull request 클릭하면 본인 변경이
main으로 들어간다.
| 명령 | 동작 |
|---|---|
git status |
변경된 파일 목록 |
git diff |
변경 내용 자세히 |
git log --oneline -20 |
최근 커밋 20 개 |
git checkout <브랜치> |
브랜치 전환 |
git checkout -b <브랜치> |
새 브랜치 만들고 전환 |
git branch -a |
모든 브랜치 보기 |
git pull origin main |
원격 최신 받기 |
git push origin <브랜치> |
원격으로 보내기 |
git stash / git stash pop |
변경 임시 보관 / 복원 |
git restore <파일> |
파일 변경 취소 ( |
- A. 비밀번호 대신 PAT(
ghp_...) 을 입력. 2-3 참고.
- A. 인터넷 환경에 따라 5 ~ 30 분 걸릴 수 있다. 끊기면 같은 명령 재실행.
- A. 회사 망에서 SSL 오류면 모바일 핫스팟으로 재시도.
- A. Unity 버전이 다른 경우. Hub 에서 6000.4.0f1 설치돼 있는지 확인.
- A. 클론 경로에 한글/공백이 있으면 깨질 수 있다.
C:\dev\같은 짧은 영문 경로로 옮긴다. - A.
Unity/Library/폴더 삭제 후 재실행하면 처음부터 임포트한다(시간은 더 걸리지만 깨끗).
- A. Python
replay_offline.py가 실제로 송신 중인지 콘솔 확인. - A. UDP 포트 9870 이 방화벽에 막혀 있을 수 있다. Windows Defender 방화벽에서 Unity 와 Python 둘 다 통신 허용.
- A.
CubeGPSDisplay.altitudeReferenceBuilding슬롯이 비어 있으면 스케일이 0 이 돼 마커가 카메라 밖으로 튄다. 인스펙터에서 기준 건물(예:finally.fbx자식 중 하나) 지정.
- A. Editor 단일 모니터면 Game view 상단의 디스플레이 드롭다운에서 "Display 4" 직접 선택.
- A. 씬에
SensorViewMode컴포넌트가 부착돼 있는지 확인. 부착 후 Play 중U키로 활성화.
- A. 다른 사람이 먼저 push 한 상태.
git pull origin main --rebase로 최신을 받은 뒤 다시 push.
- A. push 전이면:
▶ git restore --staged <파일> # 스테이지에서 제거 (변경은 유지)
- A. 이미 push 됐으면 팀장에게 알려 강제 푸시 여부 결정. 혼자
--force금지.
- A. 시스템 파이썬에 깔린다. 반드시 venv 활성화(
activate) 후 진행. 잘못 깔았으면 venv 안에서 다시pip install하면 됨.
- A. 정상.
.gitignore에 등록돼 추적 대상이 아니다. 건드리지 말 것.
- A. 설치 시 "Add python.exe to PATH" 체크 누락. 파이썬 재설치하거나, Python launcher 가 깔려 있으면
py -3.11로 대체.
- A.
info_server.py가 떠 있는지 확인.▶ curl localhost:8077/health가 JSON 반환해야 정상. 안 뜨면 7-5 절차로 기동. - A. Unity Console 에
[InfoService] /building_info 실패: Cannot connect to destination host같은 메시지 있으면 백엔드 미가동. 위와 동일. - A. BriefingPanel 이 "대기 중" 메시지에서 안 바뀌면: 씬에
BuildingInfoProbe,BuildingInfoService,FireSim,SituationAssessClient,BriefingPanel다 부착됐는지 확인. 없으면 추가 (7-5). - A. Ollama 가 hang(GPU busy 등)이면 briefing_source 가
template로 자동 폴백 — 한 번 실패 후 60초간 LLM 호출 skip (INFO_LLM_FAIL_COOLDOWN으로 조정). 자연어 브리핑이 안 나와도 룰 기반 정보(차량·top-5·risk)는 정상 표시됨.
- A. 8077 포트를 다른 프로세스가 점유 중. 종료:
또는 PID 직접 종료:
▶ pkill -f "python.*info_server.py" # macOS / Linux
▶ lsof -i :8077(macOS/Linux) /▶ Get-NetTCPConnection -LocalPort 8077(Windows) 으로 PID 찾아 kill.
README.md— 프로젝트 개요·아키텍처·자산 다운로드 링크조작법.md— Unity 플레이 모드 키 매핑 전체Unity/PIPELINE_MERGE_NOTES.md— GPS↔월드 좌표 변환 규약 (개발자용)- Git 공식 입문서 (한글): https://git-scm.com/book/ko/v2
- GitHub Hello World: https://docs.github.com/ko/get-started/start-your-journey/hello-world
질문은 팀 슬랙/노션 등 정해진 채널에 올린다. 막힌 명령·에러 메시지는 전문 텍스트 그대로 캡처해서 공유하면 답변이 빠르다.