7

現在、MATLAB/Simulink と Google Earth を使用したフライト シミュレーション プロジェクトに取り組んでいます。私がやりたいことは、MATLAB/Simulink ですべての計算とシミュレーションを行い、Google Earth で結果をリアルタイムで表示することです。

2 つのプログラムを接続するために、私は COM インターフェイスを使用していますが、MATLAB/Simulink を COM クライアントとして、Internet Explorer を COM サーバーとして使用しています。それ以前は、Google Earth API (javascript) の代わりに Google Earth COM API を使用していました。ただし、一部の機能は COM API で使用できないか制限されています (例: ピッチ、ロール)。

したがって、私は Google Earth プラグインに頼っています。Web アプリケーションがどのように見えるかの例を次に示します。

http://www.hs-augsburg.de/~bizz145/earth/fps/index3.html

DOM を使用して、Web ページに書き込むことができます。しかし、私の問題は、入力領域で行った変更をどのように更新できるかということです。COM (私の場合は onClick または onBlur) 経由でイベントのトリガーは可能ですか? Form 要素を使用してデータを Google Earth にフィードする代わりに、より良い解決策はありますか?

4

3 に答える 3

1

この問題は、xmlhttp リクエスト (以下の JavaScript) を使用して解決しました。私たちの場合、Matlab から視覚化を実行していませんでしたが、問題は同じです...新しい値をシミュレーションの視覚化にどのようにデポジットしますか。

仕組みは次のとおりです。

  1. ポート番号を選択します (この場合は 8080)
  2. 現在のモデル状態データをテキスト形式で使用して、ポート 8080 で着信要求に応答する Matlab sim をホストするマシンのコードを記述します (複数の GE グラフィック フロント エンドを同じデータ ソースに接続できるように、賢く複数のクライアントをサポートしてください)。
  3. 以下に示すように、GE ビジュアライゼーションに JavaScript を含めます。liveURL は「http://blob.com/liveData:8080」のようなものです
  4. 「frameend」イベントを取得するたびに、readUrl() を呼び出します。
  5. アニメーションを滑らかにするために、位置と姿勢のデータに単純な一次フィルターを設定します。明らかに、SPEED_TELEPORT を使用する必要があります。

この設定は私たちにとってうまくいきました。ネットワークの負荷はわずかです。

サーバーからのデータの読み取りに関連するレイテンシは約 150 ミリ秒です。これは、SIM の忠実度を真剣に考えている場合に問題になる可能性があります。GE が地形を読み込み、データを構築する際の非同期動作を考えると、真剣なリアルタイム シミュレーション科学者を満足させることはできないかもしれません。しかし、GE コミュニティがすべての地形モデリングを行ってくれることに勝るものはありません!

     xmlhttp = new XMLHttpRequest();
     var tmpArr = null;
     var liveUrlOK = false;

     function readUrl() {
        xmlhttp.onreadystatechange = postFileReady;
        xmlhttp.open('GET', liveUrl, false);
        xmlhttp.send(null);
     }

     function postFileReady() {             // function to handle asynchronous call
        document.getElementById('noData').innerHTML='No data at ' + liveUrl;
        document.getElementById('dataOK').innerHTML='';
        liveUrlOK = false;

        if (xmlhttp.readyState==4) { 
           if (xmlhttp.status==200) { 
              tmpArr = xmlhttp.responseText.split('\n');
              if (tmpArr && parseFloat(tmpArr[0])) {
                modelLatCmd     =  parseFloat(tmpArr[0]) + latBias;
                modelLngCmd     =  parseFloat(tmpArr[1]) + lngBias;
                modelAltCmd     =  parseFloat(tmpArr[2]) + altBias;
                modelHeadingCmd =  parseFloat(tmpArr[3]);
                modelTiltCmd    = -parseFloat(tmpArr[4]);
                modelRollCmd    = -parseFloat(tmpArr[5]);
                modelVel        =  parseFloat(tmpArr[6]);
                document.getElementById('noData').innerHTML='';
                document.getElementById('dataOK').innerHTML=liveUrl;
                liveUrlOK = true;
              }
           }
        }
     }
于 2012-03-19T15:22:48.720 に答える
1

はい、COM 経由で「トリガー」イベントをディスパッチできますが、その必要はありません。matlab で html ドキュメントをホストしている場合は、単に execScript() を使用して必要なメソッドを呼び出します...

% Open Plugin
h = actxcontrol('Shell.Explorer', [0 0 800 600]);
invoke(h,'Navigate2','host.html');

// trigger the behavior, rather than dispatching an event...
// arguments are: latitude, longitude, altitude, altitudeMode, heading, tilt, roll   
h.Document.parentWindow.execScript(['UpdateCamera(34, 23, 10, 0, 90, 0, 0)'], 'JavaScript');

UpdateCamera は、「host.html」の COM 可視メソッドになります。

var UpdateCamera = function() {
  var a = arguments; // the values from matlab
  var c = ge.getView().copyAsCamera(ge.ALTITUDE_ABSOLUTE);  
  var oldspeed = ge.getOptions().getFlyToSpeed();

  ge.getOptions().setFlyToSpeed(ge.SPEED_TELEPORT);

  // KmlCamera.set  
  // see http://code.google.com/apis/earth/documentation/reference/interface_kml_camera.html#a716205eab6f634b558fcde6be9c58b50 
  c.set(a[0], a[1], a[2], a[3], a[4], a[5], a[6]);
  ge.getView().setAbstractView(c);  

  ge.getOptions().setFlyToSpeed(oldspeed);                                     
}

「ジグザグ モーション」のコメントについて - 問題は、Google Earth プラグインでのアニメーションの高速化です。解決するには、次の行をホスト html に追加するだけです。

function initCB(instance) {
  ge = instance;

  // Set the FlyTo speed
  ge.getOptions().setFlyToSpeed(ge.SPEED_TELEPORT);  

  ...
}

また、アニメーションをさらにスムーズにするには、API の frameend イベントを介してアニメーションをトリガーするのが最適です。参照: http://earth-api-samples.googlecode.com/svn/trunk/examples/event-frameend.html

于 2012-01-28T22:06:56.150 に答える
0

matlab 用に xml-rpc または json-rpc サーバーをセットアップし、ajax 要求を使用して Web ページからポーリングしてみませんか。その後、JavaScript API を使用してカメラ アングルを更新できます。

于 2011-07-08T06:20:51.667 に答える