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