diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssCalcData.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssCalcData.java index 61758b17..5d03cfed 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssCalcData.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssCalcData.java @@ -37,13 +37,13 @@ public class GnssCalcData { @ExcelProperty("更新时间") LocalDateTime updatetime; - @ExcelProperty("北斗位置东") + @ExcelProperty("原始位置东") Double b562e; - @ExcelProperty("北斗位置北") + @ExcelProperty("原始位置北") Double b562n; - @ExcelProperty("北斗位置天") + @ExcelProperty("原始位置天") Double b562d; @ExcelProperty("惯导位置东") @@ -55,14 +55,23 @@ public class GnssCalcData { @ExcelProperty("惯导位置天") Double r9250d; - @ExcelProperty("相对北斗位置东") - Double rb562e; + @ExcelProperty("相对位置东") + Double rpose; - @ExcelProperty("相对北斗位置北") - Double rb562n; + @ExcelProperty("相对位置北") + Double rposn; - @ExcelProperty("相对北斗位置天") - Double rb562d; + @ExcelProperty("相对位置天") + Double rposd; + + @ExcelProperty("辅助位置东") + Double auxe; + + @ExcelProperty("辅助位置北") + Double auxn; + + @ExcelProperty("辅助位置天") + Double auxd; @ExcelProperty("平均延迟") Integer pps; diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java index 152a2f48..fa804a9e 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java @@ -43,9 +43,9 @@ public class GnssDevice { private String fwd_group_id2; private Boolean syn; //组参数是否同步 private String pictures; - private Double b562e; //初始位置 - private Double b562n; //初始位置 - private Double b562d; //初始位置 + private Double ipose; //初始位置 + private Double iposn; //初始位置 + private Double iposd; //初始位置 public String getObjectName(){ return "gnssdevice"; diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java index e0c709bf..d6b48071 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java @@ -79,17 +79,17 @@ public class Forwarder { gnssQueryWrapper.ge("createtime",sendAfterTime); gnssQueryWrapper.orderByDesc("createtime"); gnssQueryWrapper.eq("enabled",true); - gnssQueryWrapper.isNotNull("rb562e"); + gnssQueryWrapper.isNotNull("rpose"); gnssQueryWrapper.last("limit 1"); GnssCalcData record = gnssDataMapper.selectOne(gnssQueryWrapper); if(record!=null) { // 替换成推送用的名字和数值 - if(device.getB562e()!=null && - device.getB562n()!=null && - device.getB562d()!=null){ - record.setRb562e(record.getRb562e()-device.getB562e()); - record.setRb562n(record.getRb562n()-device.getB562n()); - record.setRb562d(record.getRb562d()-device.getB562d()); + if(device.getIpose()!=null && + device.getIposn()!=null && + device.getIposd()!=null){ + record.setRpose(record.getRpose()-device.getIpose()); + record.setRposn(record.getRposn()-device.getIposn()); + record.setRposd(record.getRposd()-device.getIposd()); } if(useFwdId && device.getFwddeviceid()!=null && device.getFwddeviceid().trim().length()>0) { record.setDeviceid(device.getFwddeviceid()); @@ -158,7 +158,7 @@ public class Forwarder { calcDataQueryWrapper.le("createtime", fwdRecord.getEndtime()); calcDataQueryWrapper.orderByAsc("createtime"); calcDataQueryWrapper.eq("enabled",true); - calcDataQueryWrapper.isNotNull("rb562e"); + calcDataQueryWrapper.isNotNull("rpose"); List calcDataList = gnssDataMapper.selectList(calcDataQueryWrapper); // 推送记录 int sendNum = sendBatch(device, fwdRecord.getProject_id(), calcDataList); @@ -192,12 +192,12 @@ public class Forwarder { if(useFwdId && device.getFwddeviceid()!=null && device.getFwddeviceid().trim().length()>0) { calcData.setDeviceid(device.getFwddeviceid()); } - if(device.getB562e()!=null && - device.getB562n()!=null && - device.getB562d()!=null){ - calcData.setRb562e(calcData.getRb562e()-device.getB562e()); - calcData.setRb562n(calcData.getRb562n()-device.getB562n()); - calcData.setRb562d(calcData.getRb562d()-device.getB562d()); + if(device.getIpose()!=null && + device.getIposn()!=null && + device.getIposd()!=null){ + calcData.setRpose(calcData.getRpose()-device.getIpose()); + calcData.setRposn(calcData.getRposn()-device.getIposn()); + calcData.setRposd(calcData.getRposd()-device.getIposd()); } } else{ diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java index 10b4e5a6..780598a8 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java @@ -96,9 +96,9 @@ public class GXXfzForwarder extends Forwarder{ data.setDevNum(locationRecord.getDeviceid()); data.setDevtype("GNSS"); // 单位由mm转化为m - data.setX(NumberUtils.scale(locationRecord.getRb562e() * 0.001, 5)); - data.setY(NumberUtils.scale(locationRecord.getRb562n() * 0.001, 5)); - data.setZ(NumberUtils.scale(locationRecord.getRb562d() * 0.001, 5)); + data.setX(NumberUtils.scale(locationRecord.getRpose() * 0.001, 5)); + data.setY(NumberUtils.scale(locationRecord.getRposn() * 0.001, 5)); + data.setZ(NumberUtils.scale(locationRecord.getRposd() * 0.001, 5)); sendNum++; } String json = "#" + GsonUtil.toJson(xfzTcpMessage) + "!"; diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYForwarder.java index c6b856f3..52bea357 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYForwarder.java @@ -63,9 +63,9 @@ public class GZYForwarder extends Forwarder{ for(GnssCalcData locationRecord: records) { GZYData.Data tranData = new GZYData.Data(); tranData.setCollectTime(locationRecord.getCreatetime().format(formatter)); - double n = NumberUtils.scale(locationRecord.getRb562n(), 2); - double e = NumberUtils.scale(locationRecord.getRb562e(), 2); - double d = NumberUtils.scale(locationRecord.getRb562d(), 2); + double n = NumberUtils.scale(locationRecord.getRposn(), 2); + double e = NumberUtils.scale(locationRecord.getRpose(), 2); + double d = NumberUtils.scale(locationRecord.getRposd(), 2); tranData.setX(n); tranData.setY(e); tranData.setZ(d); diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java index 1b983379..f408da4c 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java @@ -106,7 +106,7 @@ public class KingMaForwarder extends Forwarder{ data.setProjectId(projectId); data.setPointId(locationRecord.getDeviceid()); data.setFlag(1); - data.setPhys(new KingMaData.Phys(locationRecord.getRb562e(),locationRecord.getRb562n(),locationRecord.getRb562d())); + data.setPhys(new KingMaData.Phys(locationRecord.getRpose(),locationRecord.getRposn(),locationRecord.getRposd())); dataList.add(data); sendNum++; } 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 38680e71..4681ed19 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 @@ -63,7 +63,7 @@ public class GNSSCalcFilterService { } // 平滑处理 - calcFilterLocation(locationRecord, filterCycle, + calcFilterLocation(locationRecord, filterCycle, groupCalc.getFilter_min_hour(), groupCalc.getXy_threshold(), groupCalc.getZ_threshold()); repository.insert(locationRecord); @@ -92,12 +92,14 @@ public class GNSSCalcFilterService { /** * 计算东北天的最近融合数据的加权平均, 刘畅20230725 copy 自 avgEND; id>20, 滤波参数6h 或 25h */ - public boolean calcFilterLocation(GnssCalcData newRecord, int filterCycleHour, float xyThreshold, float zThreshold){ + public boolean calcFilterLocation(GnssCalcData newRecord, int filterCycleHour, int minCycleHour, + float xyThreshold, float zThreshold){ String deviceId = newRecord.getDeviceid(); // 选取[newRecordTime-filterCycleHour, newRcordTime]之间的记录做平滑 // 如果这个时间段的记录数少于FILTER_MIN_RECORD_NUM,本次不做平滑 LocalDateTime newRecordTime = newRecord.getCreatetime(); LocalDateTime filterAfterTime = newRecordTime.minusHours(filterCycleHour); + LocalDateTime minCycleTime = newRecordTime.minusHours(minCycleHour); QueryWrapper query = new QueryWrapper<>(); query.eq("deviceid", deviceId); query.ge("createtime", filterAfterTime.format(dateFormatter)); @@ -130,20 +132,35 @@ public class GNSSCalcFilterService { double sumE = newRecord.getB562e(); double sumN = newRecord.getB562n(); double sumD = newRecord.getB562d(); + double msumE = sumE; + double msumN = sumN; + double msumD = sumD; int count = 1; + int minCount = 1; + for (GnssCalcData record : gnssDeviceLocationRecords) { if (record.getEnabled()) {//只选取好点参与滤波 sumE += record.getB562e(); sumN += record.getB562n(); sumD += record.getB562d(); count++; + // 计算短周期 + if(record.getCreatetime().isAfter(minCycleTime)){ + msumE = sumE; + msumN = sumN; + msumD = sumD; + minCount = count; + } } } - logger.info(deviceId + " filter records num: " + count); + logger.info(deviceId + " filter records num: " + count+", min cycle num: "+minCount); if (count >= FILTER_MIN_RECORD_NUM) { - newRecord.setRb562e(NumberUtils.scaleTwo(sumE / count)); - newRecord.setRb562n(NumberUtils.scaleTwo(sumN / count)); - newRecord.setRb562d(NumberUtils.scaleTwo(sumD / count)); + newRecord.setRpose(NumberUtils.scaleTwo(sumE / count)); + newRecord.setRposn(NumberUtils.scaleTwo(sumN / count)); + newRecord.setRposd(NumberUtils.scaleTwo(sumD / count)); + newRecord.setAuxe(NumberUtils.scaleTwo(msumE / minCount)); + newRecord.setAuxn(NumberUtils.scaleTwo(msumN / minCount)); + newRecord.setAuxd(NumberUtils.scaleTwo(msumD / minCount)); return true; } } @@ -177,13 +194,13 @@ public class GNSSCalcFilterService { queryWrapper.eq("deviceid", deviceId); queryWrapper.le("createtime",cmpTime.format(dateFormatter)); queryWrapper.eq("enabled",true); - queryWrapper.isNotNull("rb562e"); + queryWrapper.isNotNull("rpose"); queryWrapper.last("limit 1"); queryWrapper.orderByDesc("createtime"); GnssCalcData gnssCalcData = repository.selectOne(queryWrapper); if (gnssCalcData != null) { - double gapE = Math.abs(gnssCalcData.getRb562e() - curCalcData.getRb562e()); - double gapN = Math.abs(gnssCalcData.getRb562n() - curCalcData.getRb562n()); + double gapE = Math.abs(gnssCalcData.getAuxe() - curCalcData.getAuxe()); + double gapN = Math.abs(gnssCalcData.getAuxn() - curCalcData.getAuxn()); if (gapE >= groupCalc.getAuto_threshold() || gapN >= groupCalc.getAuto_threshold()) { VaryFilterCycle varyCycle1 = new VaryFilterCycle(); varyCycle1.startTime = now; @@ -195,7 +212,7 @@ public class GNSSCalcFilterService { } } - public LocalDateTime updateRb562(String deviceId, LocalDateTime afterTime){ + public LocalDateTime updateRpos(String deviceId, LocalDateTime afterTime){ // 获取平滑参数 Device gnssDevice = gnssDeviceRepository.findByDeviceId(deviceId); if(gnssDevice == null) return afterTime; @@ -214,11 +231,11 @@ public class GNSSCalcFilterService { List calcDataListToUpdate = repository.selectList(query); for(GnssCalcData calcData:calcDataListToUpdate){ - calcFilterLocation(calcData, groupCalc.getFilter_hour(), + calcFilterLocation(calcData, groupCalc.getFilter_hour(), groupCalc.getFilter_min_hour(), groupCalc.getXy_threshold(), groupCalc.getZ_threshold()); repository.updateById(calcData); lastTime = calcData.getCreatetime(); - logger.info(deviceId + " update rb562"); + logger.info(deviceId + " update rpos"); } return lastTime; } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java index 5ebf3cd5..3db35619 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java @@ -96,7 +96,7 @@ public class MultiLineGNSSCalcService { // 计算上轮结果 calcService.calSingleDone(deviceId, tenantId, lastDate); // 重算最近的 - lastDate = gnssCalcFilterService.updateRb562(deviceId,lastDate); + lastDate = gnssCalcFilterService.updateRpos(deviceId,lastDate); // 记录转发表更新为upload done FwdRecord fwdRecord = fwdRecordMap.get(deviceId); if(fwdRecord != null){ diff --git a/sec-beidou/pom.xml b/sec-beidou/pom.xml index 45932548..31db4096 100644 --- a/sec-beidou/pom.xml +++ b/sec-beidou/pom.xml @@ -111,6 +111,12 @@ ch.qos.logback logback-classic + + com.imdroid + sec-common + 1.0-SNAPSHOT + compile + diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java index 780c090e..f42a6ff8 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java @@ -3,6 +3,7 @@ package com.imdroid.beidou.controller; import com.imdroid.beidou.common.Role; import com.imdroid.beidou.entity.TenantMapper; import com.imdroid.beidou.entity.Tenant; +import com.imdroid.common.util.NumberUtils; import com.imdroid.secapi.client.RtcmClient; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -191,13 +192,13 @@ public class GnssDeviceController extends BasicController{ queryWrapper.eq("enabled",1); queryWrapper.orderByDesc("createtime"); queryWrapper.last("limit 1"); - queryWrapper.isNotNull("rb562e"); + queryWrapper.isNotNull("rpose"); GnssCalcData calcData = gnssCalcDataMapper.selectOne(queryWrapper); if(calcData != null){ JSONObject jsonObject = new JSONObject(); - jsonObject.put("b562e",calcData.getRb562e()); - jsonObject.put("b562n",calcData.getRb562n()); - jsonObject.put("b562d",calcData.getRb562d()); + jsonObject.put("ipose", NumberUtils.scaleTwo(calcData.getRpose())); + jsonObject.put("iposn",NumberUtils.scaleTwo(calcData.getRposn())); + jsonObject.put("iposd",NumberUtils.scaleTwo(calcData.getRposd())); return jsonObject; } return null; diff --git a/sec-beidou/src/main/resources/db/schema.sql b/sec-beidou/src/main/resources/db/schema.sql index dee716c8..a668575b 100644 --- a/sec-beidou/src/main/resources/db/schema.sql +++ b/sec-beidou/src/main/resources/db/schema.sql @@ -55,9 +55,9 @@ CREATE TABLE IF NOT EXISTS `gnssdevices` ( `fwd_group_id2` varchar(64) DEFAULT NULL, `syn` bit(1) DEFAULT 0 COMMENT '是否已同步', `pictures` varchar(100) DEFAULT NULL, - `b562e` double DEFAULT NULL COMMENT '初始位置东E', - `b562n` double DEFAULT NULL COMMENT '初始位置北N', - `b562d` double DEFAULT NULL COMMENT '初始位置天D', + `ipose` double DEFAULT NULL COMMENT '初始位置东E', + `iposn` double DEFAULT NULL COMMENT '初始位置北N', + `iposd` double DEFAULT NULL COMMENT '初始位置天D', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; @@ -138,9 +138,12 @@ CREATE TABLE IF NOT EXISTS `gnssdevicelocationrecords` ( `r9250e` double DEFAULT NULL, `r9250n` double DEFAULT NULL, `r9250d` double DEFAULT NULL, - `rb562e` double DEFAULT NULL COMMENT '相对北斗位置东E', - `rb562d` double DEFAULT NULL COMMENT '相对北斗位置北N', - `rb562n` double DEFAULT NULL COMMENT '相对北斗位置天D', + `rpose` double DEFAULT NULL COMMENT '相对位置东E', + `rposn` double DEFAULT NULL COMMENT '相对位置北N', + `rposd` double DEFAULT NULL COMMENT '相对位置天D', + `auxe` double DEFAULT NULL COMMENT '中间过程东E', + `auxn` double DEFAULT NULL COMMENT '中间过程北N', + `auxd` double DEFAULT NULL COMMENT '中间过程天D', `pps` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_deviceid_time` (`deviceid`,`createtime`) USING BTREE diff --git a/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html b/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html index 486a7783..8e00609e 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html @@ -69,13 +69,34 @@ -