From 8646c8b700c52bbdc0976c0ff65c2fe440c23189 Mon Sep 17 00:00:00 2001 From: weidong Date: Sat, 27 Jan 2024 16:19:03 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E7=AE=97=E6=B3=95=E5=89=94=E9=99=A4=E5=9D=8F?= =?UTF-8?q?=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/imdroid/secapi/dto/GnssGroupCalc.java | 1 + .../sideslope/calc/GNSSCalcFilterService.java | 22 +++++++++++-------- sec-beidou/src/main/resources/db/schema.sql | 1 + .../templates/page/gnss_group_cfg.html | 1 + .../page/table/gnss_add_group_calc.html | 10 +++++++++ 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroupCalc.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroupCalc.java index 899f3a67..c6a3a5ef 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroupCalc.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroupCalc.java @@ -10,6 +10,7 @@ public class GnssGroupCalc { Integer filter_hour; Float xy_threshold; Float z_threshold; + Boolean adv_filter; Boolean auto_filter; Integer filter_min_hour; Float auto_threshold; diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/GNSSCalcFilterService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/GNSSCalcFilterService.java index 06d90e18..d1131f32 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/GNSSCalcFilterService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/GNSSCalcFilterService.java @@ -33,7 +33,6 @@ public class GNSSCalcFilterService { static final float XY_THRESHOLD = 30; //水平异常点30mm static final float Z_THRESHOLD = 30; //高程异常点30mm static final float AUTO_THRESHOLD = 50; //触发自适应滤波的门限50mm - static final double MIN_CHANGE = 0.01; static class VaryFilterCycle{ public LocalDateTime startTime; @@ -64,7 +63,7 @@ public class GNSSCalcFilterService { // 平滑处理 calcFilterLocation(locationRecord, filterCycle, groupCalc.getFilter_min_hour(), - groupCalc.getXy_threshold(), groupCalc.getZ_threshold()); + groupCalc.getXy_threshold(), groupCalc.getZ_threshold(), groupCalc.getAdv_filter()); repository.insert(locationRecord); @@ -93,7 +92,7 @@ public class GNSSCalcFilterService { * 计算东北天的最近融合数据的加权平均, 刘畅20230725 copy 自 avgEND; id>20, 滤波参数6h 或 25h */ public boolean calcFilterLocation(GnssCalcData newRecord, int filterCycleHour, int minCycleHour, - float xyThreshold, float zThreshold){ + float xyThreshold, float zThreshold, boolean isAdvFilter){ String deviceId = newRecord.getDeviceid(); // 选取[newRecordTime-filterCycleHour, newRcordTime]之间的记录做平滑 // 如果这个时间段的记录数少于FILTER_MIN_RECORD_NUM,本次不做平滑 @@ -125,11 +124,16 @@ public class GNSSCalcFilterService { newRecord.setEnabled(false); //记录为坏点,下次不参与滤波 logger.info(deviceId + " abnormal gnss data"); } - else if (Math.abs(newRecord.getB562e() - record0.getB562e()) < MIN_CHANGE && - Math.abs(newRecord.getB562n() - record0.getB562n()) < MIN_CHANGE && - Math.abs(newRecord.getB562d() - record0.getB562d()) < MIN_CHANGE) { - newRecord.setEnabled(false); //如果两次解算结果相等,数据有被冻住的嫌疑,记录为坏点,下次不参与滤波 - logger.info(deviceId + " abnormal gnss data"); + else if(isAdvFilter){ + GnssCalcData record1 = null; + if(gnssDeviceLocationRecords.size()>1) record1 = gnssDeviceLocationRecords.get(1); + if(record1 == null || + Math.abs(newRecord.getB562e() - record1.getB562e()) > xyThreshold*2 || + Math.abs(newRecord.getB562n() - record1.getB562n()) > xyThreshold*2 || + Math.abs(newRecord.getB562d() - record1.getB562d()) > zThreshold*2) { + newRecord.setEnabled(false); //记录为坏点,下次不参与滤波 + logger.info(deviceId + " abnormal gnss data by adv filter"); + } } else { // 求本组和最近recordNum组原始值的平均值 @@ -234,7 +238,7 @@ public class GNSSCalcFilterService { List calcDataListToUpdate = repository.selectList(query); for(GnssCalcData calcData:calcDataListToUpdate){ calcFilterLocation(calcData, groupCalc.getFilter_hour(), groupCalc.getFilter_min_hour(), - groupCalc.getXy_threshold(), groupCalc.getZ_threshold()); + groupCalc.getXy_threshold(), groupCalc.getZ_threshold(), groupCalc.getAdv_filter()); repository.updateById(calcData); lastTime = calcData.getCreatetime(); logger.info(deviceId + " update rpos"); diff --git a/sec-beidou/src/main/resources/db/schema.sql b/sec-beidou/src/main/resources/db/schema.sql index a668575b..ab321d4a 100644 --- a/sec-beidou/src/main/resources/db/schema.sql +++ b/sec-beidou/src/main/resources/db/schema.sql @@ -77,6 +77,7 @@ CREATE TABLE IF NOT EXISTS `gnssgroupcalc` ( `filter_hour` int DEFAULT NULL COMMENT '平滑窗口', `xy_threshold` float DEFAULT NULL COMMENT '坏点水平门限', `z_threshold` float DEFAULT NULL COMMENT '坏点垂直门限', + `adv_filter` bit(1) DEFAULT 0 COMMENT '增强坏点剔除', `auto_filter` bit(1) DEFAULT 0, `filter_min_hour` int DEFAULT NULL COMMENT '最小平滑窗口', `auto_threshold` float DEFAULT NULL, diff --git a/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html b/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html index 3f5a8a28..d35c9772 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html @@ -146,6 +146,7 @@ {field: 'filter_hour', title: '滤波周期(小时)'}, {field: 'xy_threshold', title: '水平异常门限(mm)'}, {field: 'z_threshold', title: '垂直异常门限(mm)'}, + {field: 'adv_filter', title: '增强异常过滤', templet: "
{{d.adv_filter==1?'启用':'禁用'}}
"}, {field: 'auto_filter', title: '自适应滤波', templet: "
{{d.auto_filter==1?'启用':'禁用'}}
"}, {field: 'filter_min_hour', title: '最小滤波周期'}, {field: 'auto_threshold', title: '触发门限(mm)'}, diff --git a/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_calc.html b/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_calc.html index 910d74ec..fb6f98e7 100644 --- a/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_calc.html +++ b/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_calc.html @@ -41,6 +41,15 @@ +
+ +
+ +
+
@@ -119,6 +128,7 @@ $('#filter_hour').val(data.filter_hour); $('#xy_threshold').val(data.xy_threshold); $('#z_threshold').val(data.z_threshold); + $('#adv_filter').val(data.adv_filter?'1':'0'); $('#auto_filter').val(data.auto_filter?'1':'0'); $('#filter_min_hour').val(data.filter_min_hour); $('#auto_threshold').val(data.auto_threshold);