FLIGHTGEAR Jo, Heeseung
INDEX 1. FlightGear 실행 2. FlightGear Http 통신 3. FlightGear Protocol 구조 4. FlightGear와통신하기위한 Client Server간의구조 5. FlightGear UDP통신실행예제 2
FLIGHTGEAR 실행 FlightGear http://flightgear.org 추가적인 aircraft, scenery 등을다운로드가능 FlightGear 실행 Wizard 모드와 command line 모드로실행가능 3
FLIGHTGEAR 실행비행기이륙절차 (Aircraft c172p 기준 ) v : 뷰모드전환 s : 시동키 9, 3 : throttle 조종 shift + b : 브레이크해제 0, enter : 바퀴좌우조종 8, 2, 4, 6 : 비행기의상하좌우조종 5 : 상하좌우정위치 h : HUD on/off 4
FLIGHTGEAR 실행 비행기이륙절차 (F-14b 기준 ) v : 뷰모드전환 Tomcat Controls -> Fuel and Stores : Tank 의연료를가득으로조정 9, 3 : throttle 조종 shift + b : 브레이크해제 0, enter : 바퀴좌우조종 8, 2, 4, 6 : 비행기의상하좌우조종 5 : 상하좌우정위치 g : 바퀴 on/off 5 5
FLIGHTGEAR 실행 FlightGear 파라메터 Airport=KSFO - 공항 Runway=01L - 활주로 Aircraft=c172p - 비행모델 prop:/sim/rendering/shaders/quality-level=0 - 자신의컴퓨터가실행되지않을경우환경을최하로낮추는것 컴퓨터환경이좋지않을경우권장 fg-root="c:\program Files\FlightGear\data" - 프로그램데이터실행경로 fg-scenery="c:\program Files\FlightGear\data\Scenery" - 프로그램데이터텍스쳐경로 6
FLIGHTGEAR 실행 지도설치 http://www.flightgear.org/legacy-downloads/sceneryv2.10.html - 원하는부분의지도를선택 - 한국은 e120n30.tgz flightgear 중 install&uninstall Scenery 실행 flightgear 재실행후공항선택에서원하는곳선택 7 7
FLIGHTGEAR 실행 Multi play and google map 연동 Hostname: mpserver01.flightgear.org Callsign: 자신ID in: 5000 out: 5000 브라우져로아래주소접속 http://mpmap01.flightgear.org/ 참고 http://flightradar24.com 8 8
FLIGHTGEAR 실행 실행파라메터 fgfs.exe --fg-root="c:\program Files\FlightGear\data" --timeofday=noon --aircraft=f-14b --httpd=5500 접속 http://localhost:5500/gui/ 9
FLIGHTGEAR HTTP 통신 FlightGear 는가상의 Tree 구조를만들어관리 Tree 내각하위노드는 FlightGear 설정정보를저장 이하위노드들내정보를이용하면 FlightGear 를조종하거나, 정보를받아올수있음 RPM, ft, elevator 이들정보를바꾸려면 post method 를이용하여변경가능 10 10
FLIGHTGEAR HTTP 통신 현재비행기의정보를웹페이지를이용해서확인하는화면 Elevator : 위아래상하를조종 - Return float(-1.0f~1.0f) Rudder : 활주로를달릴시에좌측과우측조종 - Return float(-1.0f~1.0f) Aileron : 날개좌측우측을조종 - Return float(-1.0f~1.0f) 11 11
FLIGHTGEAR HTTP 통신 현재비행기의정보를웹페이지를이용해서확인하는화면 Magnetos : 키회전단계 - 1(Power Off),2(Power On),3(Start) Return int(1,2,3) Throttle : 비행기프로펠러를빠르게 - Return float(-1.0f~1.0f) 12 12
FLIGHTGEAR HTTP 통신 현재비행기의정보를수정하는화면 (using get Method) Aileron : 날개우측 +0.5-0.5 로수정하는화면 Starter : 0, 1 - 실질적으로엔진이시동걸리는부분 - Magneto 와연동해서동작 - 1 일경우 Start(magneto 가 3 으로돌려진상태야시동이걸림 ) 13 13
FLIGHTGEAR PROTOCOL 구조 실행파라메터 fgfs.exe --fg-root="c:\program Files\FlightGear\data" --timeofday=noon --aircraft=f-14b --httpd=5500 --generic=socket,out,40,192.168.1.1,5011,udp,output_protocol --generic=socket,in,50,0.0.0.0,5010,udp,input_protocol 14 14
FLIGHTGEAR PROTOCOL 구조 FlightGear 파라메터 Http는 5500 포트를사용 UDP 통신포트 - 5011 : FlightGear 내정보를가져올때 E.g)RPM, ft, throttle - 5010 : FlightGear 에입력을할때 E.g)aileron, rudder, elevator 15 15
FLIGHTGEAR PROTOCOL 구조 FlightGear 는 input_protocol.xml 과 output_protocol.xml 를이용해서입력과출력을통신 Input_protocol.xml output_protocol.xml 16
FLIGHTGEAR PROTOCOL 구조 Xml 파일경로 : C:\Program Files\FlightGear\data\Protocol 17 17
FLIGHTGEAR PROTOCOL 구조 Xml 포맷 e.g. rpm 타입이 float 이고 engines/engine 에위치해있는경우 <chunk> <name>trees/tree/property</name> <node>trees/tree/property</node> <type>float</type> <formant>%f</format> </chunk> 18 18
FLIGHTGEAR PROTOCOL 구조 FlightGear 가상트리는 XML 과 1:1 대응 Format 에맞게통신하고자하는 xml 을수정 19 19
FLIGHTGEAR PROTOCOL 구조 FlightGear 가상트리는 XML 과 1:1 대응 Format 에맞게통신하고자하는 xml 을수정 20 20
FLIGHTGEAR 와통신하기위한 CLIENT SERVER 간의구조 UDP 통신은데이터를입력하거나출력할때 xml 문서를거쳐서통신 FlightGear UDP Client Port : 5011 Input_protocol. xml UDP Server While Http Server Port : 5500 UDP Server Port : 5010 output_protocol. xml recv Port : 5000 send Port : 5010 Internet browser 21 21
FLIGHTGEAR UDP 통신실행예제 FlightGear 로 input FlightGear\data\Protocol\input_protocol.xml <?xml version="1.0"?> <PropertyList> <generic> <input> <line_separator>newline</line_separator> <var_separator>tab</var_separator> <chunk> <name>/controls/flight/aileron</name> <node>/controls/flight/aileron</node> <type>float</type> <format>%f</format> </chunk> <chunk> <name>/controls/flight/elevator</name> <node>/controls/flight/elevator</node> <type>float</type> <format>%f</format> </chunk> </input> </generic> </PropertyList> 22 22
FLIGHTGEAR UDP 통신실행예제 FlightGear 로 input #include<sys/socket.h> #include<arpa/inet.h> #include<sys/types.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #define PORT 5010 int main(int argc,char*argv[]) { int sd,n; char buf[256]; struct sockaddr_in sin; sd=socket(af_inet,sock_dgram,0); memset(&sin,0,sizeof(sin)); sin.sin_family=af_inet; sin.sin_port=htons(port); sin.sin_addr.s_addr=inet_addr("192.168.1.1"); sprintf(buf,"0.0\t0.0\n"); sendto(sd,buf,strlen(buf),0,(struct sockaddr *)&sin,sizeof(sin)); printf("send: %s\n",buf); } return 0; 23 23
FLIGHTGEAR UDP 통신실행예제 FlightGear 에서 output FlightGear\data\Protocol\output_protocol.xml <?xml version="1.0"?> <PropertyList> <generic> <output> <line_separator>newline</line_separator> <var_separator>tab</var_separator> <chunk> <name>/engines/engine/rpm</name> <node>/engines/engine/rpm</node> <type>float</type> <format>%f</format> </chunk> <chunk> <name>/instrumentation/altimeter/indicated-altitude-ft</name> <node>/instrumentation/altimeter/indicated-altitude-ft</node> <type>float</type> <format>%f</format> </chunk> </output> </generic> </PropertyList> 24 24
FLIGHTGEAR UDP 통신실행예제 FlightGear 에서 output #include<arpa/inet.h> #include<sys/types.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #define PORT 5011 int main(int argc,char*argv[]) { char buf[256]; struct sockaddr_in sin,cli; int sd,clientlen=sizeof(cli); } while(1){ if( recvfrom(sd,buf,255,0, (struct sockaddr *)&cli,&clientlen)==-1 ){ perror("recvfrom"); exit(1); } } return 0; printf("**from CLIENT: %s\n",inet_ntoa(cli.sin_addr)); printf("**from CLIENT: %s\n",buf); if( (sd=socket(af_inet,sock_dgram,0))==-1 ){ perror("sd"); exit(1); } memset(&sin,0,sizeof(sin)); sin.sin_family=af_inet; sin.sin_port=htons(port); sin.sin_addr.s_addr=inet_addr("0.0.0.0"); if( bind(sd,(struct sockaddr *)&sin,sizeof(sin)) ){ perror("bind"); exit(1); } 25 25