From 3e94ac253aed43bb8c034b30c9c782aeaddb43ad Mon Sep 17 00:00:00 2001 From: weidong Date: Thu, 2 May 2024 16:50:48 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E7=AE=97=E6=B3=953=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AF=B9=E5=9F=BA=E7=AB=99=E7=9A=84GGA=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sideslope/bd/FocusCalculator3.java | 2 +- .../java/com/imdroid/sideslope/bd/Gga.java | 15 ++++++++---- .../calc/SingleLineGNSSCalcService.java | 21 +++++++++++----- .../executor/D331RtcmMessageExecutor.java | 24 +++++++++++++------ .../executor/D341LocationMessageExecutor.java | 2 +- .../sideslope/message/D331RtcmMessage.java | 4 ++++ .../imdroid/sideslope/web/ApiController.java | 1 + 7 files changed, 49 insertions(+), 20 deletions(-) diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator3.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator3.java index 390dc52c..762cb795 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator3.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator3.java @@ -36,7 +36,7 @@ public class FocusCalculator3 extends FocusCalculator1{ double[] xyz = new double[]{gga.getLongitude()*scale, gga.getLatitude()*scale, gga.getAltitude()*1000, gga.getQuality()}; - if(gga.getQuality() == 4) { + if(gga.isFixed()) { counterFixedResult++; pointList.add(xyz); } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/Gga.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/Gga.java index a0d5b09c..3e6fdb9d 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/Gga.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/Gga.java @@ -17,23 +17,23 @@ public class Gga { /** * 纬度 */ - private double latitude; + private double latitude=0; /** * 经度 */ - private double longitude; + private double longitude=0; /** * 海拔 */ - private double altitude; + private double altitude=0; /** * GPS状态,0初始化,1单点定位,2码差分,3无效PPS,4固定解,5浮点解,6正在估算7,人工输入固定值,8模拟模式,9WAAS差分 */ - private int quality; - private int satellitesInUsed; + private int quality=0; + private int satellitesInUsed=0; public Gga() { } @@ -152,4 +152,9 @@ public class Gga { this.quality = status; } + public boolean isFixed(){ + //Possible values for quality: 0 = No fix, 1 = autonomous GNSS fix, 2 = differential GNSS fix, 4 = RTK fixed, 5 = RTK float, 6 = + //estimated/dead reckoning fix + return (quality==1 || quality==2 || quality==4); + } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java index cd53016a..42b88294 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java @@ -89,9 +89,11 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { // 读取惯导 Tilt tilt = message.getTilt(); - focusCalculator.addTilt(tilt); - if (logger.isDebugEnabled()) { - logger.debug("测站" + deviceId + "惯导单次解析结果:{}", tilt); + if(tilt != null) { + focusCalculator.addTilt(tilt); + if (logger.isDebugEnabled()) { + logger.debug("测站" + deviceId + "惯导单次解析结果:{}", tilt); + } } // 延迟 @@ -99,9 +101,11 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { // 单次b562 double[] doubles = message.getB562_loc();//unit: mm - focusCalculator.addXyz(doubles,message.getCreateTime()); - if (logger.isDebugEnabled()) { - logger.debug("测站" + deviceId + "的b562单次解析结果:{}", Arrays.toString(doubles)); + if(doubles !=null) { + focusCalculator.addXyz(doubles, message.getCreateTime()); + if (logger.isDebugEnabled()) { + logger.debug("测站" + deviceId + "的b562单次解析结果:{}", Arrays.toString(doubles)); + } } // 单次GGA @@ -256,4 +260,9 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { calculatorMap.clear(); logger.info("group paras changed"); } + + public void refreshGroupCalc(String deviceId){ + calculatorMap.remove(deviceId); + logger.info("device paras changed"); + } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java index 33de5dc8..34e56959 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java @@ -1,9 +1,12 @@ package com.imdroid.sideslope.executor; +import com.imdroid.common.util.ThreadManager; import com.imdroid.secapi.client.BeidouClient; import com.imdroid.secapi.dto.GnssDevice; import com.imdroid.sideslope.bd.Gga; +import com.imdroid.sideslope.calc.GNSSDataCalcService; import com.imdroid.sideslope.message.D331RtcmMessage; +import com.imdroid.sideslope.message.D341LocationMessage; import com.imdroid.sideslope.sal.Device; import com.imdroid.sideslope.sal.DeviceService; import com.imdroid.sideslope.server.DeviceChannel; @@ -31,6 +34,8 @@ public class D331RtcmMessageExecutor implements Executor private DeviceService deviceService; @Autowired private BeidouClient beidouClient; + @Autowired + private GNSSDataCalcService gnssCalcService; @Override public Void execute(D331RtcmMessage message) { @@ -68,17 +73,22 @@ public class D331RtcmMessageExecutor implements Executor Gga gga = message.getGga(); if(gga != null) { device1.updateSatelitesNum(gga.getSatellitesInUsed()); - if(gga.getQuality()>0 && gga.getQuality()<6) { + if(gga.isFixed()) { device1.setLatitude(gga.getLatitude()); device1.setLongitude(gga.getLongitude()); device1.setAltitude(gga.getAltitude()); } - /*logger.info(message.getId()+ - " lat: "+gga.getLatitude()+ - " lon:"+gga.getLongitude()+ - " alt: "+gga.getAltitude()+ - " sat: "+gga.getSatellitesInUsed()+ - " quality: "+gga.getQuality());*/ + // 借D341做GGA的统计分析 + D341LocationMessage d341Message = new D341LocationMessage(); + d341Message.setGga(gga); + d341Message.setId(message.getId()); + d341Message.setTenantId(message.getTenantId()); + d341Message.setPps(message.getPps()); + d341Message.setTilt(message.getTilt()); + d341Message.setB562_loc(null); + ThreadManager.getFixedThreadPool().submit(() -> { + gnssCalcService.calcSingle(d341Message,true); + }); } // 收到第一个数据包,如果控制通道没连接,也通知上线 diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D341LocationMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D341LocationMessageExecutor.java index 1eff2b61..1cbba4e4 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D341LocationMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D341LocationMessageExecutor.java @@ -47,7 +47,7 @@ public class D341LocationMessageExecutor implements Executor0 && gga.getQuality()<6) { + if(gga.isFixed()) { device.setLatitude(gga.getLatitude()); device.setLongitude(gga.getLongitude()); device.setAltitude(gga.getAltitude()); diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D331RtcmMessage.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D331RtcmMessage.java index 835af0a6..a0d80e7d 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D331RtcmMessage.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D331RtcmMessage.java @@ -1,6 +1,7 @@ package com.imdroid.sideslope.message; import com.imdroid.sideslope.bd.Gga; +import com.imdroid.sideslope.bd.Tilt; import io.netty.buffer.ByteBuf; import lombok.Data; import lombok.EqualsAndHashCode; @@ -12,6 +13,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper=true) public class D331RtcmMessage extends BaseMessage { + Tilt tilt; Gga gga; int packetNum; @@ -38,6 +40,8 @@ public class D331RtcmMessage extends BaseMessage { String msg = String.format("id[%s],长度字段值[%s]效益包的消息体长度[%s]", id, this.len, src.readableBytes() - 4); WrongMessageRecorder.INSTANCE.append("receive wrong message," + msg); }*/ + this.pps = src.getUnsignedShort(pos);pos+=2; + tilt = new Tilt(src.getFloat(pos), src.getFloat(pos+4),src.getFloat(pos+8),src.getFloat(pos+12)); gga = Gga.getFrom(src); this.srcData = new byte[src.readableBytes()]; src.readBytes(this.srcData); diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java index d21d4b57..5810ffbd 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java @@ -74,6 +74,7 @@ public class ApiController { public HttpResp deviceParamChanged(String deviceId) { // 更新设备缓存 localDeviceService.refresh(deviceId); + calcService.refreshGroupCalc(deviceId); HttpResp resp = new HttpResp(); resp.setResponseMessage("succeed");