7

我目前正在使用 MATLAB/Simulink 和 Google Earth 进行飞行模拟项目。我想做的是让 MATLAB/Simulink 进行所有计算和模拟,并让 Google Earth 实时显示结果。

为了连接这两个程序,我使用 COM 接口,而 MATLAB/Simulink 作为 COM-Client 和 Internet Explorer 作为 COM-server。在此之前,我一直在使用 Google Earth COM API 而不是 Google Earth API(javascript 之一)。但是,COM API 中的某些功能不可用或受到限制(例如:俯仰、滚动)。

因此,我求助于谷歌地球插件。这是示例,Web 应用程序的外观。

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

使用 DOM,我可以写入网页。但我的问题是,如何刷新我在输入区域中所做的更改。是否可以通过 COM(在我的情况下为 onClick 或 onBlur)触发事件?有没有更好的解决方案,而不是使用表单元素将数据提供给 Google 地球?

4

3 回答 3

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 地球插件中动画的飞速。要解决,只需将以下行添加到您的主机 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 回答
1

我们使用 xmlhttp 请求(下面的javascript)解决了这个问题。在我们的例子中,我们不是从 Matlab 驱动可视化,但问题是一样的……你如何将新值存入你的模拟可视化。

这是它的工作原理。

  1. 选择一个端口号(在我们的例子中是 8080)
  2. 为托管 Matlab sim 的机器编写代码,该机器使用文本格式的当前模型状态数据响应端口 8080 上的任何传入请求(聪明并支持多个客户端,因此您可以将多个 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 回答
0

为什么不为 matlab 设置一个 xml-rpc 或 json-rpc 服务器并使用 ajax 请求从网页轮询它。然后可以使用 javascript api 更新摄像机角度。

于 2011-07-08T06:20:51.667 回答