国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Cesium 根據(jù)飛機(jī)航線計(jì)算飛機(jī)的Heading(偏航角)、Pitch(俯仰角)、Roll(翻滾角)

這篇具有很好參考價(jià)值的文章主要介紹了Cesium 根據(jù)飛機(jī)航線計(jì)算飛機(jī)的Heading(偏航角)、Pitch(俯仰角)、Roll(翻滾角)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

需求

設(shè)置飛機(jī)的一些坐標(biāo)位置(經(jīng)緯度高度),插值得到更多的坐標(biāo)位置,然后飛機(jī)按照這些坐標(biāo)集合形成的航線飛行,飛機(jī)的朝向、俯仰角以及飛機(jī)轉(zhuǎn)彎時(shí)的翻轉(zhuǎn)角根據(jù)坐標(biāo)集合計(jì)算得出,而不需要手動(dòng)設(shè)置heading、pitch、roll。

坐標(biāo)插值

不知道為什么,可能是飛行速度變化太大,我用Cesium自帶的插值,計(jì)算出的航線很奇怪

// 如下代碼插值計(jì)算出的航線有問(wèn)題
property.setInterpolationOptions({ 
    interpolationDegree : 5, 
    interpolationAlgorithm : Cesium.LagrangePolynomialApproximation 
}); 

自己寫(xiě)的插值計(jì)算,效果等同于Cesium自帶的線性插值。
思路很簡(jiǎn)單,每次插值,就是取時(shí)間的中點(diǎn),兩個(gè)坐標(biāo)的中點(diǎn)。
代碼如下:

/**
 * 重新采樣this.DronePositions
 */
DetectsDrones.prototype.sameple = function () {
    for (let i = 0; i < 3; i++) {
        this.samepleOnce();
    }
}

/**
 * 重新采樣this.DronePositions
 */
DetectsDrones.prototype.samepleOnce = function () {
    for (let i = 0; i < this.DronePositions.length - 1; i += 2) {
        let pos1 = this.DronePositions[i];
        let pos2 = this.DronePositions[i + 1];
        let time1 = dayjs(pos1.time, 'YYYY-MM-DD HH:mm:ss');
        let time2 = dayjs(pos2.time, 'YYYY-MM-DD HH:mm:ss');
        let time = time1.add(time2.diff(time1) / 2.0, 'millisecond');
        let lng = (pos1.targetPosition.lng + pos2.targetPosition.lng) / 2.0;
        let lat = (pos1.targetPosition.lat + pos2.targetPosition.lat) / 2.0;
        let height = (pos1.targetPosition.height + pos2.targetPosition.height) / 2.0;
        let heading = (pos1.targetPosition.heading + pos2.targetPosition.heading) / 2.0;
        let pitch = (pos1.targetPosition.pitch + pos2.targetPosition.pitch) / 2.0;
        let roll = (pos1.targetPosition.roll + pos2.targetPosition.roll) / 2.0;
        let pos = {
            time: time.format('YYYY-MM-DD HH:mm:ss.SSS'),
            targetPosition: {
                lng: lng,
                lat: lat,
                height: height,
                heading: heading,
                pitch: pitch,
                roll: roll,
            }
        }
        this.DronePositions.splice(i + 1, 0, pos);
    }
}

根據(jù)航線坐標(biāo)集合計(jì)算heading、pitch、roll

從網(wǎng)上抄的計(jì)算heading和pitch的方法(參考博客:https://blog.csdn.net/u010447508/article/details/105562542?_refluxos=a10):

/**
 * 根據(jù)兩個(gè)坐標(biāo)點(diǎn),獲取Heading(朝向)
 * @param { Cesium.Cartesian3 } pointA 
 * @param { Cesium.Cartesian3 } pointB 
 * @returns 
 */
function getHeading(pointA, pointB) {
    //建立以點(diǎn)A為原點(diǎn),X軸為east,Y軸為north,Z軸朝上的坐標(biāo)系
    const transform = Cesium.Transforms.eastNorthUpToFixedFrame(pointA);
    //向量AB
    const positionvector = Cesium.Cartesian3.subtract(pointB, pointA, new Cesium.Cartesian3());
    //因transform是將A為原點(diǎn)的eastNorthUp坐標(biāo)系中的點(diǎn)轉(zhuǎn)換到世界坐標(biāo)系的矩陣
    //AB為世界坐標(biāo)中的向量
    //因此將AB向量轉(zhuǎn)換為A原點(diǎn)坐標(biāo)系中的向量,需乘以transform的逆矩陣。
    const vector = Cesium.Matrix4.multiplyByPointAsVector(
        Cesium.Matrix4.inverse(transform, new Cesium.Matrix4()),
        positionvector,
        new Cesium.Cartesian3()
    );
    //歸一化
    const direction = Cesium.Cartesian3.normalize(vector, new Cesium.Cartesian3());
    //heading
    let heading = Math.atan2(direction.y, direction.x) - Cesium.Math.PI_OVER_TWO;
    heading = Cesium.Math.TWO_PI - Cesium.Math.zeroToTwoPi(heading);
    return Cesium.Math.toDegrees(heading);
}

/**
 * 根據(jù)兩個(gè)坐標(biāo)點(diǎn),獲取Pitch(仰角)
 * @param { Cesium.Cartesian3 } pointA 
 * @param { Cesium.Cartesian3 } pointB 
 * @returns 
 */
function getPitch(pointA, pointB) {
    let transfrom = Cesium.Transforms.eastNorthUpToFixedFrame(pointA);
    const vector = Cesium.Cartesian3.subtract(pointB, pointA, new Cesium.Cartesian3());
    let direction = Cesium.Matrix4.multiplyByPointAsVector(Cesium.Matrix4.inverse(transfrom, transfrom), vector, vector);
    Cesium.Cartesian3.normalize(direction, direction);
    //因?yàn)閐irection已歸一化,斜邊長(zhǎng)度等于1,所以余弦函數(shù)等于direction.z
    let pitch = Cesium.Math.PI_OVER_TWO - Cesium.Math.acosClamped(direction.z);
    return Cesium.Math.toDegrees(pitch);
}

根據(jù)航線坐標(biāo)集合計(jì)算heading、pitch、roll:
代碼中this.DronePositions是無(wú)人機(jī)群的坐標(biāo)集合,坐標(biāo)放在targetPosition屬性中

/**
 * 計(jì)算無(wú)人機(jī)群的heading
 */
DetectsDrones.prototype.calcHeading = function () {
    // 清空原有heading
    this.DronePositions.map(pos => {
        pos.targetPosition.heading = undefined;
    });

    for (let i = 0; i < this.DronePositions.length - 1; i++) {
        let pos1 = this.DronePositions[i];
        let pos2 = this.DronePositions[i + 1];
        let heading = -90 + getHeading(Cesium.Cartesian3.fromDegrees(pos1.targetPosition.lng, pos1.targetPosition.lat), Cesium.Cartesian3.fromDegrees(pos2.targetPosition.lng, pos2.targetPosition.lat));
        if (!pos1.targetPosition.heading) {
            pos1.targetPosition.heading = heading;
        }
        pos2.targetPosition.heading = heading;
    }
}

/**
 * 計(jì)算無(wú)人機(jī)群的pitch
 */
DetectsDrones.prototype.calcPitch = function () {
    // 清空原有pitch
    this.DronePositions.map(pos => {
        pos.targetPosition.pitch = undefined;
    });

    for (let i = 0; i < this.DronePositions.length - 1; i++) {
        let pos1 = this.DronePositions[i];
        let pos2 = this.DronePositions[i + 1];
        let pitch = getPitch(Cesium.Cartesian3.fromDegrees(pos1.targetPosition.lng, pos1.targetPosition.lat, pos1.targetPosition.height), Cesium.Cartesian3.fromDegrees(pos2.targetPosition.lng, pos2.targetPosition.lat, pos2.targetPosition.height));
        if (!pos1.targetPosition.pitch) {
            pos1.targetPosition.pitch = pitch;
        }
        pos2.targetPosition.pitch = pitch;
    }
}

/**
 * 計(jì)算無(wú)人機(jī)群的roll(不支持轉(zhuǎn)彎大于90度)
 */
DetectsDrones.prototype.calcRoll = function () {
    // 清空原有roll
    this.DronePositions.map(pos => {
        pos.targetPosition.roll = undefined;
    });

    for (let i = 1; i < this.DronePositions.length - 1; i++) {
        let pos1 = this.DronePositions[i];
        let pos2 = this.DronePositions[i + 1];
        let deltaHeading = pos2.targetPosition.heading - pos1.targetPosition.heading;
        pos2.targetPosition.roll = deltaHeading / 1.5;
    }
}

效果

主要是飛機(jī)的朝向和轉(zhuǎn)彎時(shí)的翻滾,俯仰角這里沒(méi)體現(xiàn)。
Cesium 根據(jù)飛機(jī)航線計(jì)算飛機(jī)的Heading(偏航角)、Pitch(俯仰角)、Roll(翻滾角)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-844251.html

遇到的問(wèn)題

  1. 插值計(jì)算的問(wèn)題,就是設(shè)置的坐標(biāo)集合,是拆線,最好把它插值成平滑曲線,但是Cesium自帶的插值,有時(shí)間參數(shù),而我想僅僅通過(guò)經(jīng)緯度集合來(lái)插值。
  2. 我寫(xiě)的計(jì)算roll的方法有問(wèn)題,不支持轉(zhuǎn)彎大于90度的情況,花了一些時(shí)間,沒(méi)搞定。轉(zhuǎn)彎小于90度,湊合用,測(cè)試了幾組數(shù)據(jù)沒(méi)問(wèn)題,但仍不確定有沒(méi)有BUG。嚴(yán)格來(lái)講,根據(jù)這些參數(shù),這個(gè)roll是算不出來(lái)的,但是,該算法要求根據(jù)飛機(jī)的轉(zhuǎn)彎半徑及方向,給出一個(gè)相對(duì)合理的roll值。
    拋磚引玉,有沒(méi)有高手給個(gè)提示,插值問(wèn)題怎么解決?roll的正確的通用的計(jì)算方法?

到了這里,關(guān)于Cesium 根據(jù)飛機(jī)航線計(jì)算飛機(jī)的Heading(偏航角)、Pitch(俯仰角)、Roll(翻滾角)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 關(guān)于cesium根據(jù)地形畫(huà)區(qū)域面積并覆蓋在3d表面上

    關(guān)于cesium根據(jù)地形畫(huà)區(qū)域面積并覆蓋在3d表面上

    最近一直在研究在3d地圖上添加區(qū)域還有車(chē)輛路徑路線,很是禿然?。≡诓粩嗟陌俣劝俣仍侔俣?,終于有了一套解決辦法,先演示一下操作過(guò)程, drawLine()方法 ?drawPlane()方法 下面就來(lái)堆代碼吧。 前提是開(kāi)啟了地形檢測(cè)viewer.scene.globe.depthTestAgainstTerrain = true;一般開(kāi)啟會(huì)占用一定

    2024年02月11日
    瀏覽(19)
  • 通過(guò)mars3d1.8+cesium1.6根據(jù)坐標(biāo)獲取對(duì)應(yīng)坐標(biāo)在3dtiles模型上的高度

    在前端開(kāi)發(fā)中,使用地圖和3D模型的需求越來(lái)越常見(jiàn)。然而,對(duì)于一些開(kāi)發(fā)者來(lái)說(shuō),如何在3D模型上獲取對(duì)應(yīng)坐標(biāo)的高度可能是一個(gè)挑戰(zhàn)。在本文中,我們將介紹如何使用mars3d1.8和cesium1.6這兩個(gè)強(qiáng)大的前端庫(kù)來(lái)實(shí)現(xiàn)這一功能。 mars3d是一個(gè)基于Cesium的地圖開(kāi)發(fā)引擎,可以幫助您

    2024年02月12日
    瀏覽(20)
  • WebGIS航線編輯器(無(wú)人機(jī)航線規(guī)劃)

    WebGIS航線編輯器(無(wú)人機(jī)航線規(guī)劃)

    ? ? ? ? 無(wú)人機(jī)航點(diǎn)、航線規(guī)劃,實(shí)現(xiàn)全自動(dòng)航點(diǎn)飛行作業(yè)及飛行航拍。禁飛區(qū)、作業(yè)區(qū)功能保障飛行安全。 GIS引擎加載 const viewer = new Cesium.Viewer(\\\"cesiumContainer\\\", { ? imageryProvider: new Cesium.IonImageryProvider({ assetId: 3872 }), }); const imageryLayers = viewer.imageryLayers; const nightLayer = imageryL

    2024年04月15日
    瀏覽(21)
  • Cesium屏幕中心、相機(jī)坐標(biāo)和距離計(jì)算

    moveRotation方法參數(shù)中第一個(gè)參數(shù)step是移動(dòng)步長(zhǎng),第二個(gè)參數(shù)i是判斷是否是俯仰角還是航向角進(jìn)行繞中心點(diǎn)進(jìn)行翻滾,entity可以另外分離出來(lái)做一個(gè)方法,這樣避免每次調(diào)用moveRotation方法都生成一個(gè)entity覆蓋物。 該方法的參數(shù)distance接受正負(fù)數(shù),對(duì)應(yīng)上升和下降

    2024年01月18日
    瀏覽(23)
  • 【計(jì)算機(jī)視覺(jué) | Kaggle】飛機(jī)凝結(jié)軌跡識(shí)別 Baseline 分享和解讀(含源代碼)

    【計(jì)算機(jī)視覺(jué) | Kaggle】飛機(jī)凝結(jié)軌跡識(shí)別 Baseline 分享和解讀(含源代碼)

    比賽名稱(chēng):Google Research - Identify Contrails to Reduce Global Warming 訓(xùn)練 ML 模型以識(shí)別衛(wèi)星圖像中的尾跡 比賽類(lèi)型:計(jì)算機(jī)視覺(jué)、語(yǔ)義分割 Contrails 是“凝結(jié)軌跡”的縮寫(xiě),是在飛機(jī)發(fā)動(dòng)機(jī)排氣中形成的線狀冰晶云,由飛機(jī)飛過(guò)大氣中的超潮濕區(qū)域時(shí)產(chǎn)生。持續(xù)的尾跡對(duì)全球變暖的貢

    2024年02月14日
    瀏覽(21)
  • (5)(5.9) 推力損失和偏航不平衡警告

    (5)(5.9) 推力損失和偏航不平衡警告

    文章目錄 前言 1 潛在的推力損失 2 偏航不平衡 3 參數(shù)說(shuō)明? 如果你看到 推力損失或偏航不平衡 的警告,這個(gè)頁(yè)面概述了一些應(yīng)該做的檢查和修改來(lái)解決這個(gè)問(wèn)題。在大多數(shù)情況下,這些警告是由于錯(cuò)誤的硬件選擇或設(shè)置造成的。 這些警告是為了檢測(cè)推進(jìn)系統(tǒng)的硬件故障,如

    2023年04月17日
    瀏覽(18)
  • 【rust/egui】(五)看看template的app.rs:SidePanel、CentralPanel以及heading

    【rust/egui】(五)看看template的app.rs:SidePanel、CentralPanel以及heading

    rust新手,egui沒(méi)啥找到啥教程,這里自己記錄下學(xué)習(xí)過(guò)程 環(huán)境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:這里 側(cè)邊欄,如下圖 其定義為: 通過(guò) right() 或 left() 方法生成: 方法實(shí)現(xiàn)與 TopBottomPanel::top() 類(lèi)似: 生成時(shí)的默認(rèn)屬性值為: 我們可以將

    2024年02月11日
    瀏覽(20)
  • 第48節(jié):cesium 面交集計(jì)算(含源碼+視頻)
  • Cesium中常用的一些數(shù)學(xué)計(jì)算(矩陣、向量)用法——矩陣

    Cesium中常用的一些數(shù)學(xué)計(jì)算(矩陣、向量)用法——矩陣

    剛好本人最近在研究數(shù)字孿生模擬相關(guān)的專(zhuān)題,涉及到三維空間線代向量、矩陣相關(guān)的計(jì)算,順便重溫了一下線代,在使用的過(guò)程中遇到問(wèn)題的一些總結(jié)和實(shí)用技巧在下頭闡述,相信這篇文章能夠給短時(shí)間接觸這些API的人一些啟發(fā)。 在三維中可以把矩陣的列看出變換后的基向

    2024年02月10日
    瀏覽(37)
  • Cesium中常用的一些數(shù)學(xué)計(jì)算(矩陣、向量)用法——向量

    Cesium中常用的一些數(shù)學(xué)計(jì)算(矩陣、向量)用法——向量

    剛好本人最近在研究數(shù)字孿生模擬相關(guān)的專(zhuān)題,涉及到三維空間中跟線代相關(guān)的計(jì)算,順便重溫了一下現(xiàn)代,在使用的過(guò)程中遇到的一些總結(jié)和實(shí)用技巧在下頭闡述,相信這篇文章能夠給短時(shí)間接觸這些API的人一些啟發(fā)。 不同人看向量存在著差異。物理專(zhuān)業(yè)學(xué)生的視角,向量

    2024年02月10日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包