Подача данных в плагин Google Earth из MATLAB через COM - PullRequest
7 голосов
/ 18 мая 2011

В настоящее время я работаю над проектом симуляции полета с MATLAB / Simulink и Google Earth.Я хочу, чтобы MATLAB / Simulink выполнял все вычисления и моделирования, а Google Earth отображал результат в реальном времени.

Для взаимодействия двух программ я использую интерфейс COM, тогда как MATLAB /Simulink в качестве COM-клиента и Internet Explorer в качестве COM-сервера.До этого я использовал Google Earth COM API вместо Google Earth API (javascript one).Но некоторые функции недоступны или ограничены) в COM API (например, подача, вращение).

Поэтому я прибегаю к плагину Google Планета Земля.Вот пример того, как должно выглядеть веб-приложение.

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

ИспользованиеДОМ, я могу написать на веб-странице.Но моя проблема в том, как я могу обновить изменения, которые я сделал в области ввода.Возможен ли запуск события через COM (в моем случае onClick или onBlur)?Есть ли лучшее решение вместо использования элемента Form для передачи данных в Google Earth?

Ответы [ 3 ]

1 голос
/ 29 января 2012

Да, отправка события «запуск» возможна через COM, но вам не нужно этого делать. Если вы размещаете HTML-документ в Matlab, просто используйте 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 будет видимым COM-методом в host.html - что-то вроде ...

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 Планета Земля. Чтобы решить эту проблему, просто добавьте следующие строки в ваш хост html.

function initCB(instance) {
  ge = instance;

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

  ...
}

Кроме того, чтобы еще больше сгладить анимацию, было бы оптимальным запустить анимацию через событие frameend API. См .: http://earth -api-samples.googlecode.com / svn / trunk / examples / event-frameend.html

1 голос
/ 19 марта 2012

Мы решили эту проблему с помощью запроса xmlhttp (javascript ниже).В нашем случае мы не вели визуализацию из Matlab, но проблема та же ... как вы вносите новые значения в визуализацию симуляции.

Вот как это работает.

  1. Выберите номер порта (в нашем случае 8080)
  2. Напишите код для машины, на которой установлен симулятор Matlab, который отвечает на любой входящий запрос через порт 8080 с данными о состоянии вашей текущей модели в текстовом формате (будьте умны и поддержите)несколько клиентов, так что вы можете присоединить несколько графических интерфейсов GE к одному и тому же источнику данных.)
  3. Включите JavaScript в вашу визуализацию GE, как показано ниже.LiveURL - это что-то вроде "http://blob.com/liveData:8080"
  4. Каждый раз, когда вы получаете событие 'frameend', вызывайте readUrl ().
  5. Чтобы сгладить анимацию, установите простой фильтр первого порядка для данных о положении и ориентации- очевидно, вам нужно использовать SPEED_TELEPORT

. Эта установка хорошо сработала для нас. Загрузка сети незначительна.

Задержка, связанная с чтением данных с сервера, составляет около150 мсек, что может иметь значение для вас, если вы серьезно относитесь к точности воспроизведения симов. Учитывая асинхронное поведение 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;
              }
           }
        }
     }
0 голосов
/ 08 июля 2011

Почему бы не настроить сервер xml-rpc или json-rpc для matlab и опрашивать его с веб-страницы с помощью запросов ajax.Затем угол камеры можно обновить с помощью javascript api.

...