FlightGear Jo, Heeseung
FlightGear 2.10 FlightGear 에서 Http, UDP 프로토콜을실행할수있는환경을설명한문서 1. FlightGear 실행 2. FlightGear Http 통신 3. FlightGear Protocol 구조 4. FlightGear 와통신하기위한 Client Server 간의구조 5. FlightGear UDP 통신실행예제 3
FlightGear 실행 FlightGear http://flightgear.org 추가적인 aircraft, scenery 등을다운로드가능 FlightGear 실행 Wizard 모드와 command line 모드로실행가능 4
FlightGear 실행 비행기이륙절차 (Aircraft c172p 기준 ) v : 뷰모드전환 s : 시동키 9, 3 : throttle 조종 shift + b : 브레이크해제 0, enter : 바퀴좌우조종 8, 2, 4, 6 : 비행기의상하좌우조종 5 : 상하좌우정위치 h : HUD on/off 5
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 6 6
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" - 프로그램데이터텍스쳐경로 7
FlightGear 실행 지도설치 http://www.flightgear.org/legacy-downloads/sceneryv2.10.html - 원하는부분의지도를선택 - 한국은 e120n30.tgz flightgear 중 install&uninstall Scenery 실행 flightgear 재실행후공항선택에서원하는곳선택 8 8
FlightGear 실행 Multi play and google map 연동 Hostname: mpserver01.flightgear.org Callsign: 자신 ID in: 5000 out: 5000 브라우져로아래주소접속 http://mpmap01.flightgear.org/ 9 9
FlightGear 실행 실행파라메터 fgfs.exe --fg-root="c:\program Files\FlightGear\data" - -timeofday=noon --aircraft=f-14b --httpd=5500 접속 http://localhost:5500/gui/ 10
FlightGear Http 통신 FlightGear 는가상의 Tree 구조를만들어관리 Tree 내각하위노드는 FlightGear 설정정보를저장 이하위노드들내정보를이용하면 FlightGear 를조종하거나, 정보를받아올수있음 RPM, ft, elevator 이들정보를바꾸려면 post method 를이용하여변경가능 11 11
FlightGear Http 통신 현재비행기의정보를웹페이지를이용해서확인하는화면 Elevator : 위아래상하를조종 - Return float(-1.0f~1.0f) Rudder : 활주로를달릴시에좌측과우측조종 - Return float(-1.0f~1.0f) Aileron : 날개좌측우측을조종 - Return float(-1.0f~1.0f) 12 12
FlightGear Http 통신 현재비행기의정보를웹페이지를이용해서확인하는화면 Magnetos : 키회전단계 - 1(Power Off),2(Power On),3(Start) Return int(1,2,3) throttle : 비행기프로펠러를빠르게 - Return float(-1.0f~1.0f) 13 13
FlightGear Http 통신 현재비행기의정보를수정하는화면 (using get Method) Aileron : 날개우측 +0.5-0.5 로수정하는화면 Starter : 0, 1 - 실질적으로엔진이시동걸리는부분 - Magneto 와연동해서동작 - 1 일경우 Start(magneto 가 3 으로돌려진상태야시동이걸림 ) 14 14
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 15 15
FlightGear Protocol 구조 FlightGear 파라메터 Http는 5500 포트를사용 UDP 통신포트 - 5011 : FlightGear 내정보를가져올때 E.g)RPM, ft, throttle - 5010 : FlightGear 에입력을할때 E.g)aileron, rudder, elevator 16 16
FlightGear Protocol 구조 FlightGear 는 input_protocol.xml 과 output_protocol.xml 를이용해서입력과출력을통신 Input_protocol.xml output_protocol.xml 17
FlightGear Protocol 구조 Xml 파일경로 : C:\Program Files\FlightGear\data\Protocol 18 18
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> 19 19
FlightGear Protocol 구조 FlightGear 가상트리는 XML 과 1:1 대응 Format 에맞게통신하고자하는 xml 을수정 20 20
FlightGear Protocol 구조 FlightGear 가상트리는 XML 과 1:1 대응 Format 에맞게통신하고자하는 xml 을수정 21 21
FlightGear 와통신하기위한 Client Server 간의구조 UDP 통신은데이터를입력하거나출력할때 xml 문서를거쳐서통신 FlightGear UDP Client Port : 5011 Input_protoc ol.xml UDP Server While Http Server Port : 5500 UDP Server Port : 5010 output_proto col.xml recv Port : 5000 send Port : 5010 Internet browser 22 22
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> 23 23
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; 24 24
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> 25 25
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); } 26 26