导航卫星系统实时可视化平台开发

导航卫星系统实时可视化平台开发

随着我国对北斗卫星导航系统的大力发展,北斗导航系统已经跻身国际四大导航系统之列。正好小编对导航系统的理论知识也有一定的掌握,这里从老牌的GPS卫星导航系统入手,做了一套导航卫星可视化系统(界面),给大家分享一下,先看下主界面。
在这里插入图片描述
主要技术分为两大块:
1)卫星轨道数据的获取计算
卫星轨道数据,是从BKG(https://igs.bkg.bund.de/)数据中心下载的rinex广播星历,通过卫星轨道计算算法公式得到外推坐标,最终生成CZML数据,在前端通过Cesium加载。这一块轨道计算基于Qt平台使用C++完成,封装成.so文件,供Java调用。
2)数据的可视化展示
数据可视化展示,后端采用的是springboot框架和postgresql数据库,前端使用Vue框架和Cesium三维地图引擎以及echart完成开发。整个服务部署在云服务器上。

卫星轨道计算

卫星数据从数据中心定时下载,然后在Qt平台下完成文件读取,数据解算,格式化输出等一系列处理。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据的可视化展示

数据可视化后端使用的是springboot框架和postgresql数据库开发。前端主要使用Vue框架和Cesium三维地图引擎以及echart开发。后端主要包括使用quartz定时任务框架对卫星数据定时下载,调用Qt生成的动态链接库计算卫星外推坐标。采用rabbitmq消息中间件将计算的卫星外推坐标推送到前端。

定时任务

 /**
     * 在构造函数中创建调度器,加载任务
     **/
    public void init() throws SchedulerException {
        //1 创建调度器 必须从容器中拿,如果new的话,则无法注入,还是脱离了spring容器
        this.scheduler = schedulerFactoryBean.getScheduler();
        //2 创建JobDetail实例,并与PrintWordsJob类绑定(Job执行的内容)
        this.jobDetail = JobBuilder.newJob(ephDWJob.getClass())
                .withIdentity("ephJobDetailDataDownLoadIdentity", "ephJobDetailDataDownLoadIdentityGroup1")
                .usingJobData("ephJobDetailDataDownLoadJobData", "ephJobDetailDataDownLoadValue")
                .build();
        //3 构建触发trigger实例,每隔1s执行一次
        // 根据不同环境启用不同的任务策略
        String cronSchedule = "0 */10 * * * ?";
        switch (SpringUtil.getActiveProfiles()[0]){
            case "test":
            case "dev":
                cronSchedule = "31 42 * * * ?";
                break;
            case "prod":
                cronSchedule = "0 20 */2 * * ?";
                break;
        }
        this.cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity("ephTriggerDownLoadIdentity", "ephTriggerDownLoadIdentityGroup1")
                .usingJobData("ephTriggerDownLoadJobData", "ephTriggerDownLoadDataValue")
                //.withSchedule(CronScheduleBuilder.cronSchedule("55 56 23 * * ?")) //每秒钟执行一次
                //.withSchedule(CronScheduleBuilder.cronSchedule("0 20 */2 * * ?")) //每两个小时的第20分钟0秒执行一次
                .withSchedule(CronScheduleBuilder.cronSchedule(cronSchedule)) //每5分钟的第0秒执行一次
                .build();
        this.triggerKey = TriggerKey.triggerKey("ephTriggerDownLoadIdentity", "ephTriggerDownLoadIdentityGroup1");
        this.jobKey = JobKey.jobKey("ephJobDetailDataDownLoadIdentity", "ephJobDetailDataDownLoadIdentityGroup1");
    }

消息推送

for(int i=0; i<czmlList.size(); i++){
                rabbitTemplate.convertAndSend(
                        "myOriDirectExchange",
                        "my.ori.direct.routing",
                        czmlList.get(i));
            }
            rabbitTemplate.convertAndSend("myOriDirectExchange",
                    "my.ori.direct.routing",
                    "1");
}

JAVA调用Qt动态链接库

public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
          "/opt/oriFolder/lib/libsatelliteEphSo.so",
          CLibrary.class);
        //获取最新的卫星列表 GPS, BD, Galileo, GLONASS
        String getSatelliteList(String ss);
        //对每一个系统的卫星做外推计算
        //32个
        String getGPSSatelliteInfoByPRN(int prn, int secondIndex);
        //61个
        String getBDSatelliteInfoByPrn(int prn, int secondIndex);
        //36个
        String getGalileoSatelliteInfoByPrn(int prn, int secondIndex);
        //24个
        String getGLONASSSatelliteInfoByPrn(int prn, int secondIndex);
        //分批将起始星历数据发送回来
        String getSateEphByPrnP1(int prn);
        String getSateEphByPrnP2(int prn);
        String getSateEphByPrnP3(int prn);
        String getSateEphByPrnP4(int prn);
        String getGPSSateEphByPRN(int prn);
        // 根据卫星类型和编号获取历元信息
        String getSatelliteEphByTypeAndPRN(String type, int prn, int flag);
}

前端使用stomp.js接收后端推送过来的数据,在Cesium中以CZML的形式加载。由于分享篇幅有限的原因,仅截出部分代码。

		cesiumInit(){
            window.viewer = new Cesium.Viewer("cesiumContent");
            this.flyHome();
        },
        flyHome(){
            window.viewer.camera.flyTo({
                destination: new Cesium.Cartesian3.fromDegrees(118, 30, 120000000),
                orientation:{
                    heading:0,
                    pitch: Cesium.Math.toRadians(-90),
                    roll:0
                },
                duration: 6
            });
        },
        /*
         *@description: websocket连接
        */
        webSocketInit(){
            if (window.WebSocket) {
                console.log("您的浏览器支持websocket");
                var ws = new WebSocket(`ws://${this.websocketUrl}:${this.websocketPort}/ws`);
                this.client = this.$stomp.over(ws);
                this.client.heartbeat.incoming = 0;
                this.client.heartbeat.outgoing = 1 * 60 * 1000;
                this.client.debug = null;
                this.connect();
            }
        },
        /*
         *@description: 连接 rabbitmq
        */
        connect() {
            let headers = {
                login: this.websocketuser,
                passcode: this.websocketpassword,
            };
            this.client.connect(headers, this.on_connected, this.on_failed);
        },
        /*
         *@description: 连接 rabbitmq 成功
        */
        on_connected(){
            console.log(`websocket已连接: ${this.websocketUrl}:${this.websocketPort}`);
            this.client.subscribe("/queue/myOriDirectQueue", this.on_rabbitMQRevCallback, this.on_failed);
        },

至此,整个可视化界面完成。系统部署在 访问地址。欢迎大家访问。PS:本来想做一套完整的可视化系统,实现数据的回看、查询、卫星的跟踪,对地面的扫描,还有卫星模型想通过Three.js用代码生成,结果越做越跑偏了,仅做了这样的一个可视化界面。不过后续也将在此基础上着重在这几个方面继续开发,同时把北斗、格洛纳斯、伽利略导航系统都囊括进来。

有喜欢的朋友欢迎收藏点赞转发,有业务需求的朋友也欢迎私信我,web全栈开发。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: 很抱歉,我作为语言模型不能为您编写代码。但是,我可以提供一些思路和建议来帮助您开始编写基于C的卫星/微惯性组合导航系统。 1. 确定需要的功能和组件:卫星/微惯性组合导航系统通常由GPS接收器、惯性测量单元(IMU)、计算单元和输出单元组成。所以您需要确定这些组件的需求和规格。 2. 选择合适的硬件平台:根据您的需求和规格,选择合适的硬件平台来支持您的卫星/微惯性组合导航系统。例如,您可以选择使用单片机或微控制器开发板,或者使用嵌入式计算机如树莓派等。 3. 编写代码:根据您确定的硬件平台和需求,使用C语言编写代码来实现卫星/微惯性组合导航系统的各个组件。例如,您可以编写GPS接收器的代码来接收卫星信号并解码数据,编写IMU的代码来获取加速度和角速度数据,编写计算单元的代码来执行导航算法,编写输出单元的代码来显示导航结果。 4. 测试和调试:完成代码编写后,进行测试和调试以确保系统正常工作并满足您的需求和规格。您可以使用仿真软件或实际硬件平台来测试和调试。 总的来说,编写基于C的卫星/微惯性组合导航系统需要您具备一定的嵌入式系统开发经验和相关知识。如果您是初学者,建议先学习C语言和嵌入式系统开发基础知识,然后再逐步深入学习相关技术和算法。 ### 回答2: 基于C语言编写卫星/微惯性组合导航系统可以通过以下步骤实现: 1. 定义数据结构:创建数据结构来存储卫星和微惯性导航系统的相关信息,例如位置、速度和加速度等。使用C语言的结构体定义相关变量。 2. 数据采集:通过传感器采集卫星和微惯性导航系统的数据。使用C语言中的输入/输出接口来读取传感器数据,并将其存储到相应的数据结构中。 3. 数据处理:对采集到的数据进行处理,包括数据滤波和校准。使用C语言中的数学运算库进行滤波处理,如卡尔曼滤波器,以提高导航系统的精度和稳定性。 4. 导航算法:实现卫星/微惯性组合导航算法。根据采集到的数据,使用C语言编写导航算法,如位置解算、姿态解算和航向解算等,以确定导航系统的当前位置和状态。 5. 导航结果输出:将导航结果输出到适当的显示设备或存储设备上。使用C语言中的输出接口将结果以可视化或数据格式输出,如显示屏、串口或文件。 6. 系统优化:进行系统性能分析和调优,以提高导航系统实时性、精度和鲁棒性。使用C语言中的调试和优化工具来识别和改进系统的性能瓶颈。 总之,基于C语言编写卫星/微惯性组合导航系统需要结合传感器数据采集、数据处理、导航算法实现和结果输出等方面的编程技能。编写的系统应该能够处理实时数据、进行导航算法计算,并将结果输出,以满足实际导航需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值