Cesium 无人机巡检实时视频投射及模拟数据采集

这篇具有很好参考价值的文章主要介绍了Cesium 无人机巡检实时视频投射及模拟数据采集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用投射做了两个功能,一个是模拟无人机巡检,展示当前无人机的实时视频流,并且展示当前无人机的拍摄轨迹及范围。 

cesium 无人机,Cesium基础,WebGL学习,JS,无人机

第二个是直接将无人机的视频投射到拍摄范围面上。

cesium 无人机,Cesium基础,WebGL学习,JS,无人机

代码都差不多,只是第二个用了实时视频做材质,并且实时计算了视频材质的朝向,不然会出现视频方向和移动方向有差异的情况。

思路:移动使用property来进行设置,让坐标和时间进行关联,视频锥体采用自定义geometry的形式,这部分代码可以参考我的另一篇文章Cesium无人机实时视频投射及关键点拍照展示_easyCesium的博客-CSDN博客

部分代码:

调用代码:

cesium 无人机,Cesium基础,WebGL学习,JS,无人机

其中做了个视角跟随的效果,即会让视角锁定在飞机正上方

cesium 无人机,Cesium基础,WebGL学习,JS,无人机

ScanRoam核心代码
1、构建property
 

createProperty(positions, times) {
    times = times || 120; // 不设置事件和速度 则默认120s播放完成
    var distance = 0;// 总距离
    var speed;
    for (var i = 0; i < positions.length - 1; i++) {
      var oneP = positions[i];
      var secP = positions[i + 1];
      var dis = Cesium.Cartesian3.distance(oneP, secP);
      distance += dis;
    }
    speed = distance / times; // (米/秒)
    this.allDistance = distance;

    this.startTime = this.viewer.clock.currentTime;
    this.endTime = Cesium.JulianDate.addSeconds(this.startTime, times, new Cesium.JulianDate());
    var property = new Cesium.SampledPositionProperty(); // 模型的property
    var oldTimes = 0;
    for (var i = 1; i < positions.length; i++) {
      var nowP = positions[i];
      var lastP = positions[i - 1];
      if (i == 1) { // 下标从1开始 此处加上第一个点
        property.addSample(this.startTime, positions[0]);
      }
      oldTimes += Cesium.Cartesian3.distance(nowP, lastP) / speed;
      var nowTime = Cesium.JulianDate.addSeconds(this.startTime, oldTimes, new Cesium.JulianDate());
      property.addSample(nowTime, nowP);
    }

    return {
      property
    }
  }

2、实时回调:        
 

start() {
    this.viewer.clock.currentTime = this.startTime;
    this.viewer.clock.shouldAnimate = true;
    this.viewer.clock.multiplier = 1;
    let last_dis = Number.MAX_VALUE;
    // 绑定时间回调
    this.viewer.clock.onTick.addEventListener(function () {
      let isthan = Cesium.JulianDate.greaterThanOrEquals(this.viewer.clock.currentTime.clone(), this.endTime.clone());
      let nowP = this.property.getValue(this.viewer.clock.currentTime.clone());
      let nextP = this.positions[this.step + 1];
      if (nextP && nowP) {
        let dis = Cesium.Cartesian3.distance(nowP.clone(), nextP.clone());
        if (dis > last_dis) {
          this.step++;
          last_dis = Number.MAX_VALUE;
        } else {
          last_dis = dis;
        }
      } else {
        this.step = this.positions.length - 1;
      }
      if (isthan) { // 结束
        if (this.endFun) this.endFun();
        return;
      }
      let orientation = this.entity.orientation.getValue(this.viewer.clock.currentTime.clone());
      let hpr = this.orientation2Hpr(nowP.clone(), orientation)
      // 设置模型姿态
      if (this.flyingFun) this.flyingFun(nowP, hpr, this.step);
    
    }, this)

  }

ConePrimitive核心代码:

getGeometry(dis, fov, aspect) {
        let positions = new Float64Array(5 * 3);
        fov = Cesium.Math.toRadians(fov / 2);
        const tanfov = Math.tan(fov);
        const halfw = tanfov * dis;
        const halfh = halfw / aspect;

        // 点0 坐标
        positions[0] = 0.0;
        positions[1] = 0.0;
        positions[2] = 0.0;

        // 点1 坐标
        positions[3] = 1.0 * halfw;
        positions[4] = 1.0 * dis;
        positions[5] = 1.0 * halfh;

        // 点2 坐标
        positions[6] = -1.0 * halfw;
        positions[7] = 1.0 * dis;
        positions[8] = 1.0 * halfh;

        // 点3 坐标
        positions[9] = -1.0 * halfw;
        positions[10] = 1.0 * dis;
        positions[11] = -1.0 * halfh;

        // 点4 坐标
        positions[12] = 1.0 * halfw;
        positions[13] = 1.0 * dis;
        positions[14] = -1.0 * halfh;


        // 创建顶点属性中的坐标
        const attributes = new Cesium.GeometryAttributes({
            position: new Cesium.GeometryAttribute({
                componentDatatype: Cesium.ComponentDatatype.DOUBLE,
                componentsPerAttribute: 3,
                values: positions
            })
        });

        // 点的索引
        const indices = new Uint16Array(18);

        indices[0] = 0;
        indices[1] = 4;

        indices[2] = 0;
        indices[3] = 1;

        indices[4] = 0;
        indices[5] = 2;

        indices[6] = 0;
        indices[7] = 3;

        indices[8] = 1;
        indices[9] = 4;

        indices[10] = 4;
        indices[11] = 1;

        indices[12] = 1;
        indices[13] = 2;

        indices[14] = 2;
        indices[15] = 3;

        indices[16] = 3;
        indices[17] = 4;


        let geometry = new Cesium.Geometry({
            attributes: attributes,
            indices: indices,
            primitiveType: Cesium.PrimitiveType.LINES,
            boundingSphere: Cesium.BoundingSphere.fromVertices(positions)
        });

        return geometry;
    }


    update(context, frameState, commandList) {
        var geometry = this.getGeometry(this.distance, this.fov, this.aspect);
        if (!geometry) {
            return;
        }
        if (this._primitive) {
            this._primitive.destroy();
            this._primitive = undefined;
        }


        let headingPitchRoll = new Cesium.HeadingPitchRoll(
            Cesium.Math.toRadians((this.heading || 0)),
            Cesium.Math.toRadians(0),
            Cesium.Math.toRadians(this.pitch || 0)
        );
        var hprmtx = Cesium.Transforms.headingPitchRollToFixedFrame(this.position.clone(), headingPitchRoll);

        this._primitive = new Cesium.Primitive({
            geometryInstances: new Cesium.GeometryInstance({
                geometry: geometry,
                attributes: {
                    color: Cesium.ColorGeometryInstanceAttribute.fromColor(this.outlineColor)
                }
            }),
            appearance: new Cesium.PerInstanceColorAppearance({
                translucent: false,
                flat: true
            }),
            modelMatrix: hprmtx,
            asynchronous: false,
            show: this.coneVisible
        });


        this.updateRectangle(hprmtx);
        this._primitive.update(context, frameState, commandList);


    }

功能体验:在线体验

 


 文章来源地址https://www.toymoban.com/news/detail-518265.html

到了这里,关于Cesium 无人机巡检实时视频投射及模拟数据采集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高速公路巡检无人机,为何成为公路巡检的主流工具

    随着无人机技术的不断发展,无人机越来越多地应用于各个领域。其中,在高速公路领域,高速公路巡检无人机已成为公路巡检的得力助手。高速公路巡检无人机之所以能够成为公路巡检中的主流工具,主要是因为其具备以下三大特性。 一、高速公路巡检无人机的高效性 高

    2024年02月14日
    浏览(86)
  • 无人机巡检输电线路是什么,怎么巡?

    1. 提高工作效率 传统的巡检模式与现实挑战:在过去,输电线路的巡检主要依赖于人工步行或车辆走访。这种方法不仅消耗大量时间,而且经常会因地形复杂、恶劣天气等自然因素遇到障碍。例如,当线路穿越山区、沼泽或森林时,巡检人员常常面临艰巨的挑战。 无人机的

    2024年02月11日
    浏览(53)
  • 无人机电力巡检系统运行流程全解读

    随着电力行业体系不断完善,保障电网运营的安全成为至关重要的任务。传统的人工巡检方式在面对电力设备广泛分布和复杂工况时显得效率低下,为了解决这一难题,无人机电力巡检系统应运而生,以智能化的运行流程,为电网安全保驾护航。 一、计划制定 电力巡检系统

    2024年01月25日
    浏览(33)
  • AidLux+无人机——AI电力巡检新模式

    近年来,航空、遥感、以及信息处理等技术迅速发展,使得无人机在电力巡检上逐渐应用开来。 无人机电力巡检作为新型电力巡检方式,不受地形地貌限制、便携易用且高效,能够极大程度降低传统巡检工作的风险和失误,提升工作效率。相关数据显示,无人机巡检比人工巡

    2024年02月12日
    浏览(44)
  • 以AI进行无人机巡检河川地貌分析

    作者:僑光科技大學 助理教授 陈纪翰 由于工业科技快速发展,环境议题一直备受讨论与重视 ;近几年,由于边缘运算、 AI 、硬件加速与无人机等技术趋于成熟,公民营机构 --尤以公部门为首--开始思考是否能借助科技的力量来进行环境工程,本文即以AI对象分割技术作为技术

    2024年01月22日
    浏览(43)
  • 无人机管控平台,推动电力巡检管理水平提升

    各地区无人机作业水平和管理水平存在参差不齐,电力巡检管理要求与业务发展水平不匹配的问题。同时,巡检数据的存储和管理分散,缺乏有效的整合与共享手段,使得内外业脱节,没有形成统一应用和闭环管理。这就导致巡检数据无法进行多维度分析和综合应用,不能为

    2024年02月14日
    浏览(35)
  • 无人机如何做到自动巡检?关键技术步骤分析

    无人机应用在电网、水利、交通、城管等巡逻巡检领域带来了巡视效率的提升。同时飞手操作的难度和门槛、野外环境的影响、巡检结果处理难度大等带来一系列的巡检问题,自动化的无人机巡检则能很好的解决这些问题,比如我们比较熟知的自动机场,它可以解决野外部署

    2024年02月07日
    浏览(40)
  • 无人机工程安全巡检:主要应用与实施策略

    1. 无人机工程安全巡检的主要应用 桥梁检查:对于高架桥和大跨径桥梁,无人机可以轻松达到桥面、桥墩和其他关键部位,检查是否有裂缝、锈蚀或其他损坏。 建筑物检查:无人机可以为建筑物提供360度的检查,特别是对于高楼或难以接近的建筑,可以检测结构裂缝、外墙

    2024年02月11日
    浏览(39)
  • 无人机在电力巡检中前瞻性应用场景

    一、线路杆塔信息自主采集         无人机自主巡检技术是利用无人机对目标对象或区域进行巡检和监测的技术。通过搭载先进传感器,该技术能够实时将数据传回控制中心,经过处理、分析和诊断。AI视觉通过分析自主确定线路,开启采集任务,通过无人机沿线飞行,在

    2024年02月21日
    浏览(39)
  • 无人机巡检路径规划:基于MATLAB蚁群算法

    无人机巡检路径规划:基于MATLAB蚁群算法 简介: 无人机巡检是一种高效且灵活的方法,用于监测和巡视大型设施、建筑物和地区。为了使无人机能够在最短的时间内覆盖目标区域并避免重复巡检,路径规划成为至关重要的问题。本文将介绍如何使用MATLAB中的蚁群算法来进行

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包