A320フラむトシミュレヌタの䜜成方法写真のストヌリヌパヌト1

みなさんこんにちは



以前の投皿で、私はボヌむングB737NBGの建蚭で埗られた貎重な経隓に぀いお曞きたした。



そのポスト以来、倚くの異なるむベントが発生したした。特に、ボヌむングはタむムプレッシャヌモヌドでの倧芏暡なオヌバヌホヌルを生き延び、最終的に゚アバスA320に関するポストを曞くこずに手がかかりたした。



ポストを2぀に分けたす。1぀は䞻にITに関するもので、もう1぀は䞻に建蚭段階のスラむドに関するものです。



行こう





入門


2012幎8月に、新しいフラむトシミュレヌタの構築を始めたばかりのプロゞェクトに参加したした。 圓時は、次のようなものでした





最初に、奇劙なこずに、私はITむンフラストラクチャを䜜成しようずしたした。



ITむンフラ


頭の䞭はすべおシンプルでした。シミュレヌタヌずしお、X-Plane 10を䜿甚しお、画像を円筒投圱に倉圢するこずができたす。



スケヌリングが必芁です。぀たり、5台のサヌバヌがあるこずを意味したす。1台はダむナミクスを蚈算し、3台は3台のプロゞェクタヌの画像を圢成し、4台目はクラむアントのビデオクリップ蚘録システムの画像を生成したす。



Project Magentaコンポヌネントは、他のほがすべおのこずを行いたす。



Projectmagenta


  1. キャビン画面に絵を描く-゚アバスグラスコックピット、 ABGC

  2. 飛行機性胜レビュヌ-pmSystems

  3. 飛行管理および誘導システムの実装-MCDU

  4. オヌトパむロット。 フラむトコントロヌルナニット、 FCUに実装

  5. 電気リモヌト航空機制埡システム、私たちの意芋では、フラむバむワむダ。 たた、サむドスティック、ペダル、゚ンゞン制埡ノブなどのコントロヌルを備えたむンタヌフェヌスも提䟛したす。 さらに、このモゞュヌルでは、倧きすぎるロヌル、危険なピッチなどを防ぐ「法埋」が蚭けられおいたす。-飛行制埡法-pmFBW

  6. 音-それらなしでそんなに。 pmSounds




䜕も忘れおいないようです。



チェックずバランスのシステム


むンフラストラクチャの蚭蚈は、ボヌむングの制限ず経隓の組み合わせから生たれたした。



ボヌむングでの経隓からの問題の1぀-ラック内のサヌバヌがほこりを収集し、それらが過熱し始める。 したがっお、最も負荷の高いコンピュヌタヌこれはX-Planeはサヌバヌルヌムに配眮する必芁がありたす。



キャブからUSBを匕き出したす-火が぀いたら、オンボヌドコンピュヌタヌが必芁です。



モバむルプラットフォヌムに搭茉されおいる堎合、SSDたたはディスクレスのいずれかです。 メモリヌ内のSSDが2回オヌバヌヒヌトしたため、ディスクレスロヌドに぀いお孊習したす。 Windowsにあるすべおの「オンボヌド」゜フトりェアは、iSCSIになりたす。



ネットワヌク経由で6台のコンピュヌタヌをダりンロヌドしたす。垯域幅が必芁です。぀たり、トランクをサポヌトするスむッチが必芁です。 遞択はD-Link DGS-1210-16で決たりたした。



X-Planeは耇数あり、それらのシナリオは、iSCSI、バックアップなどに加えお䞀臎する必芁があるため、ファむルサヌバヌたたはNASが必芁です。 䟡栌ず品質の比では、Synology RS-812 +は最倧3GBのメモリアップグレヌドを考え出したした。 同時に、トランクをサポヌトしたす。



サヌバヌルヌムはクリヌンである必芁がありたす。぀たり、ドアを閉める必芁がありたす。぀たり、リモヌトアクセスを最倧化し、IP KVMである必芁がありたす実際には、VNCを䜿甚するのが䟿利でした。



さらに、オンボヌドコンピュヌタヌが配眮されおいるコックピットスペヌスに登る際に、圌女はたったく笑わないため、少なくずも1぀はオンずオフを切り替えるこずができなければなりたせん。 そのため、「電源」ボタンを抌すこずができる鉄筋コンクリヌト䜜業装眮が必芁です。 よく知られおいる電子技術者によっお泚文されたした。䞀連の反埩の埌、電源ボタンを「抌す」こずができるEthを備えたデバむスを入手したした。

次のようになりたす。





トップボヌドは「マスタヌ」であり、「スレヌブ」はRS-485を介しお接続されたす。 各「スレヌブ」には8぀のチャンネルがあり、各チャンネルには2぀の個別の入力電源LEDずHDDを接続するためず電源ボタン甚の1぀の出力がありたす。



匊瀟のプロゞェクタヌは高䟡で垌少です。予備冷华なしでは電源を切るこずはできたせんが、入力電圧がなくなった堎合は、人に頌らずに自動的にプロゞェクタヌずオンボヌドコンピュヌタヌの電源を切る必芁がありたす。 そのため、ネットワヌクむンタヌフェむスを備えたUPSが必芁であり、プロゞェクタヌにも搭茉されおいるため、䜿甚する必芁がありたす。



䞀般に、数週間の蚭蚈の結果、次のようなスキヌムが埗られたした。





4 GBのメモリを搭茉したCeleron G540 2.5 GHzず、ギガバむトのメモリを搭茉したRadeon HD 6450チップに基づくロヌプロファむルグラフィックスカヌドを搭茉したオンボヌドコンピュヌタヌがありたす。



X-Plane甚グラフィックサヌバヌ-8GB RAMずミラヌ内に2台の500GBドラむブを搭茉したCore i5-3470。 絵を描くためのGeForce GTX 670 c 2048MBです。 オペレヌティングシステムずしお、Ubuntu 12.04 LTS 86_64があり、X-Planeは64ビットです。



ダむナミクスを蚈算するサヌバヌ-Core i7-3770のWin7_32では、統合ビデオカヌドを䜿甚したす。 ここではX-Planeは32ビットであり、モバむルプラットフォヌムずのむンタヌフェヌス甚のプラグむンは32ビットおよびWindows専甚であるため、サヌバヌはWindowsの䞋にありたす。



ケヌブルずワむダヌ


スヌパヌゎヌルは、ツむストペアず電源ケヌブルのみがキャブに入るようにシミュレヌタを構築するこずでした。 そしお、結局それは起こりたした。

220V電源ケヌブル、スむッチトランクを接続するための2぀のツむストペア、HDMI延長コヌド甚の3぀のツむストペア、およびはしごずプラットフォヌムのコントロヌルパネル甚の別のツむストペアは、倖郚からキャビンに行きたす。



私はHama HDMIを䜿甚した延長コヌド、圌らは圌らのタスクに察凊したす。



どこでもツむストペア-CAT6 FTP。



それずは別に、キャビネットず可動プラットフォヌムの間の既存のパむプにツむストペアを䜜成しお匕き䌞ばすこずにした方法を曞く䟡倀がありたす。 ケヌブルグリヌスを䜿甚しおいおも、それはばかげた䜜業でした。さらに、埌でさらに2本のパむプを延長したした。



電気


ボヌむングでは、間違った電気ネットワヌクの問題に盎面したため、今回は座っお単線図を描きたした芋぀けられたせん。

アむデアは、すべおのラむンを自動機で保護し、さらに感電から人々を保護するこずでした。



負荷蚈算によるず、キャブ党䜓プロゞェクタヌ、コンピュヌタヌ、I / Oコントロヌラヌ、機内換気、スむッチには3000VAで十分です。

5台のサヌバヌでは、NAS、スむッチ、KVMもほが同じ必芁がありたす。



倖郚タクシヌファン、むンストラクタヌステヌション、ランプドラむブは1500VA未満で枈むため、叀い1500 SmartUPSが圹立ちたした

合蚈UPSのコストは4぀です。2぀のIppon Smart Winner 3000 VAず远加のバッテリヌパック、および2぀の1500VA SmartUPSがボヌむングの改良の1぀から残っおいたす。

サヌバヌルヌムは3ワット、もう1ワット-キャビン党䜓にかかっおいたす。 キャビンずむンストラクタヌステヌションの換気口が1500にぶら䞋がっおいたすが、もう1぀は圚庫がありたす。



自埋的な゚ネルギヌ源UPSの可甚性を考えるず、人々を保護するためのRCDはUPS、぀たり 私たちの無停電装眮はシヌルドに「取り付けられおいたす」。







換気ず空調


サヌバヌルヌムは非垞に小さく、玄5平方メヌトルで、ラックからの2kWの熱ず、おそらくプラットフォヌム制埡キャビネットからの1kWがそこに割り圓おられたす。 それで、コンドミニアムを吊るしたす。



コンデはSamsung AQ12TSBNに遞ばれ、玄3.5kWの䜎枩性胜を持っおいたす。 私は自分でむンストヌルを行いたした。ツヌルず機噚の利点は以前に賌入され、囜でのコンデのむンストヌルに䜿甚されたした。

倏は正しい遞択を瀺し、サヌバヌルヌムの枩床は蚭定された19床前埌で倉動したした。



宀内機を電気パネルに掛けるのは銬鹿げた間違いだったので、排氎には特別な泚意を払わなければなりたせんでした。 パヌパヌ、過剰はありたせんでしたが、来幎の倏たでに排氎ポンプを蚭眮したす。



換気のあるキャビンでは、これはそれほど単玔ではありたせん。

私たちには2぀のボリュヌムがありたす。人々が座るコックピット自䜓ず、アむロン、プロゞェクタヌ、コンピュヌタヌがあるコックピットスペヌスです。

圓初から、私たちは空調を行わないこずに決めたした-凝瞮液には倚くの問題がありたす。



コックピットの空間では、1時間あたり玄250立方メヌトルの容量の䜎隒音ファンによっお流入ず排気が行われたした。 コンピュヌタヌ蚭眮堎所ぞの流入





フヌド-プロゞェクタヌの近く、最䞊郚写真の品質に぀いおは申し蚳ありたせん





実際、「屋根」の穎にファンを差し蟌んでも問題はありたせんが、枩床枬定ではそのような必芁性は瀺されたせん。



キャビン内の空気を埪環させるために、倖偎に倧きな2000 ccの送颚ファンがあり、フヌドは脚の䞋から連続しお立぀2぀の静かなブロックで䜜られおいたす。





圓初、蚈算によるず、私はファンの遞択を間違えたした。2000ccのスヌパヌチャヌゞャヌが埌に登堎したした。最初は250 ccのサむレントブロックがありたした。

キャビンに2000人のファンがいおも暑いので、システムをさらに改善する方法を怜蚎しおいたす。



束葉杖、束葉杖および束葉杖


圓初から、「棚」補品でさえ倚くの束葉杖で包む必芁があるこずは明らかでした。



骚接合術にはいく぀かの問題がありたした。

  1. X-Plane共有デヌタの同期
  2. プロゞェクタヌのオン/オフ自動化
  3. 倱敗したProject Magentaコンポヌネントの再起動




X-Plane同期ず起動


X-Planeデヌタを同期するために、最終的にNASからrsyncが遞択されたした。

私はNFSボヌルから盎接実行しようずしたしたが、WindowsずLinuxの䞡方、X-Planeのディレクトリ構造があるこずを考えるず、それは酔ったせん劄で発明され、各構成には独自のスクリプトず䞀般的なデヌタがあるず刀断したしたX-Planeが起動たたは再起動するたびにネットワヌク経由で同期したす。



ちなみに、ボヌルから盎接X-Planeを起動するずいうアむデアを考えながら、バむナリを線集しお、曞き蟌み甚に開いたすべおのファむルが同じディレクトリにあるようにしたした。 このステップの写真を次に瀺したす。



すべおが正垞に完了し、2日埌に曎新が行われたした。 その埌、rsyncを実行するこずにしたした。



起動スクリプトは次のようになりたした。

#!/bin/bash LOGFILE="/var/log/xplane-starter.log" log_msg () { DATE=`/bin/date` /bin/echo "$DATE: $@" >> $LOGFILE } log_msg "Starting xplane-startup.sh" while [ 1 ]; do log_msg "Rsyncing" /root/bin/rsync_64.get >> $LOGFILE /bin/sed -i".bak" '/UNSAFE/d' "/xplane.64/Output/preferences/X-Plane Screen Res.prf" /usr/bin/pactl set-card-profile 'alsa_card.pci-0000_01_00.1' 'output:hdmi-stereo-extra1' /usr/bin/xinit /root/bin/xinitrc.64 >> $LOGFILE 2>&1 & XINIT_PID=$! log_msg "xinit pid = $XINIT_PID" while [ 1 ]; do sleep 1 # Check that the process is still alive if [ -e /proc/${XINIT_PID} -a /proc/${XINIT_PID}/exe ]; then sleep 1 else log_msg "Process dead, restarting" break fi done done
      
      







X-Planeは絶察にりィンドりマネヌゞャヌを必芁ずしないため、実際の起動はxinitを介しお行われたす。

 /usr/bin/xsetroot -cursor_name top_left_arrow DISPLAY=:0.0 /usr/bin/X11/xset s 0 DISPLAY=:0.0 /usr/bin/X11/xset s noblank /root/bin/shm_wipe.sh /usr/bin/x11vnc -display :0 -ncache 10 -many & umask 0000 /xplane.64/X-Plane-x86_64 --no_crash_reporter /usr/bin/killall -9 x11vnc
      
      







shm_wipe.shは私の怠inessです。 定期的に、共有メモリの枯枇によりx11vncが起動を停止するため、未䜿甚のセグメントを芋぀けお「ほぐす」ためのむンタヌネットレシピが芋぀かりたした。



さらに、cronを介しお、X-Planeは早朝に再起動され、メモリリヌクが発生したす。 さらに、䞇が䞀に備えお、プロゞェクタヌの電源をオフにするコマンドが䞎えられたす。



Windowsでは、すべおがたずもなわけではないので、定期的に手でrsync同期を行いたす...



オンボヌドコンピュヌタヌ監芖


ProjectMagentaのフリヌズするコンポヌネントに察凊するために、PowerShellスクリプト党䜓がオンボヌドコンピュヌタヌで蚘述され、さらに.NET芁玠も蚘述されたした。



スクリプトは、倱敗したUSBデバむスの怜出から始たり、その埌、すでに他のすべおのものでカバヌされおいたした。



コンポヌネントは、このスクリプトを通じおヒヌプに起動され、プレむ䞭に誰かがドロップアりトしたかどうかを確認したす。



EHIDに぀いおは別の行で説明したす。

EHIDは、タクシヌハヌドりェアI / Oコントロヌラヌず゜フトりェアコンポヌネント間のむンタヌフェむスです。 NDAの䞋で配垃され、私はそれに眲名し、珟圚私は仕様の誇りに思う所有者です。 これたでに、X-Planeの分げ぀を䜿甚したバグのガス化に適甚したした。これに぀いおは、以䞋で説明したす。

䞀番䞋の行は、コンポヌネントA320_EHID.exeしたがっお、ボヌむングの堎合はB737_EHID.exeがあり、コックピットのすべおのコンポヌネントの「ツリヌ」ず、アナログ軞、LED、トグルスむッチ、および䞀般的なものが含たれおいたす。

各アむテムには独自の名前ず32ビットIDがありたす。



アプリケヌションはハヌドりェアに盎接アクセスしたせんが、EHIDにアクセスしたす。 通信-TCPに加えお、むベント駆動型。 ポヌリングはすべおEHIDで実装されおいるため、この抂念は人生を倧幅に簡玠化したす。



この仕様は、ハヌドりェアずEHIDの間、およびEHIDずアプリケヌションの間の2぀のレベルをカバヌしおいたす。

USB HIDの䞊にプロトコルの説明を含む䞋䜍レベルが衚瀺され、コントロヌラヌファヌムりェアにも実装されたす。



曎新シミュレヌタヌのコンポヌネントの盞互䜜甚の絵を描いた





問題は、WindowsドラむバヌずファヌムりェアのEHID実装ずの間のむンタヌフェヌスで「最埌のミス」が芋぀かったこずです。倚数のデバむスからのデヌタが同時に到着するず、EHID内で䜕か䞍思議なこずが起こり、DoSに぀ながりたす。 芋぀けるのは簡単です、神に感謝したす。EHIDはアプリケヌションリク゚ストぞの応答を停止したす。 これは、監芖の基瀎ずなるものです。



Govnokod-その1぀、蹎らないでください。

 Import-Module c:\scripts\Release\DeviceManagement.psd1 [int] $Port = 21843 $IP = "192.168.XX" $Address = [system.net.IPAddress]::Parse($IP) $LogDirs = @("C:\EHID","C:\MCDU","C:\RMCDU","C:\FBW","C:\pmSystems","C:\FCU","C:\xpuipc") Write-Host "Starting the supervisor script..." # Check if we just started $p = Get-Process -Name xpwideclient -ErrorAction silentlycontinue if (!($p)) { Write-Host "Just started" # Find and remove logfiles foreach($logdir in $LogDirs) { del $logdir\*.log -ErrorAction SilentlyContinue } del R:\*.tmp -ErrorAction SilentlyContinue # Set the routing for the goddamn windows shitty default gw to iSCSI target route delete 0.0.0.0 route add 0.0.0.0 mask 0.0.0.0 192.168.XX # Start XPUIPC Start-Process C:\xpuipc\xpwideclient.exe -WorkingDirectory "C:\xpuipc" -WindowStyle Minimized Start-Process C:\EHID\A320_EHID.exe -ArgumentList "-run" -WorkingDirectory "C:\EHID" -WindowStyle Minimized Start-Sleep -Seconds 3 } else { Write-Host "Already working" $startFlag=0 } # Cycle forever while ( 2 -ge 1) { # Clear the flag $failFlag = 0 # Get the list of the failed devices $FailedDevices = Get-WmiObject Win32_USBControllerDevice |%{[wmi]($_.Dependent)} | Where-Object {$_.Status -ne "OK"} foreach($fDevice in $FailedDevices) { # Set the flag to restart the processes $failFlag = 1 # Disable and then enable device $dDev = Get-Device | Where-Object {$_.InstanceID -eq $fDevice.DeviceID} Write-Warning "Failed device found:" $fDevice.DeviceID Disable-Device -TargetDevice $dDev -Verbose Enable-Device -TargetDevice $dDev -Verbose } # Detect hang of A320_EHID # Create IP Endpoint $End = New-Object System.Net.IPEndPoint $address, $port # Create Socket $Saddrf = [System.Net.Sockets.AddressFamily]::InterNetwork $Stype = [System.Net.Sockets.SocketType]::Stream $Ptype = [System.Net.Sockets.ProtocolType]::TCP # Create byte array [Byte[]] $Message = 0x02,0x03,0x00,0x04 $buffer = new-object System.Byte[] 8192 Try { $Sock = New-Object System.Net.Sockets.Socket $saddrf, $stype, $ptype $Sock.TTL = 26 $Sock.ReceiveBufferSize = 8192; $Sock.ReceiveTimeout = 500; $Sock.Blocking = 1; # Connect to socket $Sock.Connect($end) $Sent = $Sock.Send($Message) Start-Sleep -m 30 $Received = $Sock.Receive($buffer) $Sock.Close() } Catch [Exception] { Write-Host "Error checking EHID" $_.Exception.Message; $failFlag=1; } # Detect restart file-flag $FileExists = (Test-Path "R:\restart.txt" -PathType Leaf) if ($FileExists) { Write-Host "Restart file exists!" del R:\restart.txt $failFlag = 1 } # Restart the processes if ($failFlag -eq 1) { Write-Warning "Restarting processes" Write-Warning "Freezing..." Start-Process C:\scripts\sim_pause.exe -WorkingDirectory "C:\scripts" -WindowStyle Minimized Stop-Process -Name A320_EHID -force -ErrorAction silentlycontinue Stop-Process -Name pmFBW -force -ErrorAction SilentlyContinue Stop-Process -Name pmSystems -force -ErrorAction SilentlyContinue Stop-Process -Name MCDU -force -ErrorAction SilentlyContinue Stop-Process -Name RMCDU -force -ErrorAction SilentlyContinue Stop-Process -Name FCU -force -ErrorAction SilentlyContinue # Set start flag $startFlag=1 } if ($startFlag -eq 1) { Start-Process C:\EHID\A320_EHID.exe -ArgumentList "-run" -WorkingDirectory "C:\EHID" -WindowStyle Minimized Start-Sleep -Seconds 3 } # FIXME Workaround for the falling PM processes $p = Get-Process -Name RMCDU -ErrorAction silentlycontinue if (!($p)) { Write-Host "RMCDU dead, restarting." Start-Process C:\RMCDU\RMCDU.exe -WorkingDirectory "C:\RMCDU" -WindowStyle Minimized } $p = Get-Process -Name FCU -ErrorAction silentlycontinue if (!($p)) { Write-Host "FCU dead, restarting." Start-Process C:\FCU\FCU.exe -WorkingDirectory "C:\FCU" } $p = Get-Process -Name MCDU -ErrorAction silentlycontinue if (!($p)) { Write-Host "MCDU dead, restarting." Start-Process C:\MCDU\MCDU.exe -WorkingDirectory "C:\MCDU" } $p = Get-Process -Name pmFBW -ErrorAction silentlycontinue if (!($p)) { Write-Host "pmFBW dead, restarting." Start-Process C:\FBW\pmFBW.exe -WorkingDirectory "C:\FBW" } $p = Get-Process -Name pmSystems -ErrorAction silentlycontinue if (!($p)) { Write-Host "pmSystems dead, restarting." Start-Process C:\pmSystems\pmsystems.exe -WorkingDirectory "C:\pmSystems" } if ($startFlag -eq 1) { # Clear the flag and start the processes $startFlag = 0 Start-Sleep -Seconds 45 Write-Warning "Un-Freezing..." Start-Process C:\scripts\sim_unpause.exe -WorkingDirectory "C:\scripts" -WindowStyle Minimized } Start-Sleep -Seconds 5 }
      
      







X-Plane、Tiller、および束葉杖


ティラヌは、フロントピラヌヘッドコントロヌルハンドルです。 地䞊でのタキシングに必芁です。

2぀の方法で操瞊できたす-ティラヌずペダル。 特定の速床に達するず、ティラヌは動䜜を停止し、ペダルのみが残りたす。



問題は、X-Planeその著者によっお認められおいるようにでデヌタ参照を「倱った」こずです。 ティラヌの䜍眮を曞き蟌むこずができる内郚倉数。

さらに、ゞョむスティックがX-Planeに接続されおいない堎合、圌は私たちがキヌボヌド䞊を飛ぶ悲惚な貧匱な煮物だず信じおいるので、フロントハンドルを操䜜しおサむドステアリングホむヌルからのコマンドをオンにする必芁がありたす。



X-Plane Austin Meyerの著者この間、圌はヒステリックなダギであるこずが刀明したしたが、ごめんなさいmoiず、この件に関しお非垞に嵐のような通信を行いたした。圌はリリヌスの1぀でこのゞョむントを修正するこずを玄束したした。 埅っおいたす。



埅っおいる間に、䞀方では仮想ゞョむスティックVJoyにしがみ぀く束葉杖を曞き、もう䞀方ではネットワヌクを介しおEHIDがティラヌハンドルの䜍眮の倀を取埗したす。

X-Planeでは、単䞀の軞を割り圓おたした。これはティラヌであり、X-Planeの目には䞍正であるこずがなくなったため、サむドタヌン機胜はサむドスティックによっおオフになりたした。

この束葉杖には耇雑なものも珍しいものもないので、゜ヌスを持っおくる理由はありたせん。 私の意芋では、.NETで1時間で曞かれおいたす。



おわりに


おそらくこれに぀いお詳しく説明するので、投皿は非垞に厚くなりたした。

次の郚分では、スラむドず゚アバスの建蚭の歎史がありたす。

シヌドの堎合-この段階の写真





読んでくれおありがずう



All Articles