1、优化自适应周期的判断

2、修改位置的字段名:初始位置ipos,相对位置rpos,辅助计算位置aux
3、修改状态按部门搜索的bug
This commit is contained in:
weidong 2024-01-23 21:18:07 +08:00
parent f70ef35096
commit dcd6c2f73d
14 changed files with 135 additions and 88 deletions

View File

@ -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;

View File

@ -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";

View File

@ -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<GnssCalcData> 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{

View File

@ -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) + "!";

View File

@ -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);

View File

@ -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++;
}

View File

@ -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<GnssCalcData> 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<GnssCalcData> 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;
}

View File

@ -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){

View File

@ -111,6 +111,12 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>com.imdroid</groupId>
<artifactId>sec-common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>

View File

@ -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;

View File

@ -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

View File

@ -69,13 +69,34 @@
<script src="../js/lay-module/echarts/echartsTheme.js" charset="utf-8"></script>
<script src="../js/lay-module/echarts/echarts.js" charset="utf-8"></script>
<script src="../lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script th:inline="none">
<script th:inline="javascript">
layui.use(['form', 'table','laydate','element'], function () {
var $ = layui.$,
form = layui.form,
table = layui.table,
laydate = layui.laydate;
var searchDeviceId = false;
var data_cols = [
{field: 'deviceid', title: '设备号'},
{field: 'createtime', title: '产生时间', width:'18%', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'updatetime', title: '上报时间', width:'18%', templet: "<div>{{d.updatetime==null?'':layui.util.toDateString(d.updatetime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'b562e', title: '原始东', templet: "<div>{{d.b562e.toFixed(2)}}</div>"},
{field: 'b562n', title: '原始北', templet: "<div>{{d.b562n.toFixed(2)}}</div>"},
{field: 'b562d', title: '原始天', templet: "<div>{{d.b562d.toFixed(2)}}</div>"},
{field: 'rpose', title: '相对东', templet: "<div>{{d.rpose==null?'':d.rpose.toFixed(2)}}</div>"},
{field: 'rposn', title: '相对北', templet: "<div>{{d.rposn==null?'':d.rposn.toFixed(2)}}</div>"},
{field: 'rposd', title: '相对天', templet: "<div>{{d.rposd==null?'':d.rposd.toFixed(2)}}</div>"},
{field: 'auxe', title: '辅助东', templet: "<div>{{d.auxe==null?'':d.auxe.toFixed(2)}}</div>"},
{field: 'auxn', title: '辅助北', templet: "<div>{{d.auxn==null?'':d.auxn.toFixed(2)}}</div>"},
{field: 'auxd', title: '辅助天', templet: "<div>{{d.auxd==null?'':d.auxd.toFixed(2)}}</div>"},
{field: 'enabled', title: '有效',templet: '#enabledTrans'},
{field: 'pps', title: '平均延迟'}
];
if([[${role}]] != "ADMIN" && [[${role}]] != "SUPER_ADMIN") {
cfg_cols[9].hide = true;
cfg_cols[10].hide = true;
cfg_cols[11].hide = true;
}
/**
* 初始化表单,要加上,不然刷新部分组件可能会不加载
*/
@ -95,19 +116,9 @@
url: '/gnss/data/list_calc',
toolbar: '#toolbarDemo', //开启头部工具栏
defaultToolbar: ['filter'],
cols: [[
{field: 'deviceid', title: '设备号'},
{field: 'createtime', title: '产生时间', width:'18%', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'updatetime', title: '上报时间', width:'18%', templet: "<div>{{d.updatetime==null?'':layui.util.toDateString(d.updatetime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'b562e', title: '原始东', templet: "<div>{{d.b562e.toFixed(2)}}</div>"},
{field: 'b562n', title: '原始北', templet: "<div>{{d.b562n.toFixed(2)}}</div>"},
{field: 'b562d', title: '原始天', templet: "<div>{{d.b562d.toFixed(2)}}</div>"},
{field: 'rb562e', title: '相对东', templet: "<div>{{d.rb562e==null?'':d.rb562e.toFixed(2)}}</div>"},
{field: 'rb562n', title: '相对北', templet: "<div>{{d.rb562n==null?'':d.rb562n.toFixed(2)}}</div>"},
{field: 'rb562d', title: '相对天', templet: "<div>{{d.rb562d==null?'':d.rb562d.toFixed(2)}}</div>"},
{field: 'enabled', title: '有效',templet: '#enabledTrans'},
{field: 'pps', title: '平均延迟'}
]],
cols: [
data_cols
],
limits: [10, 15, 20, 25, 50, 100],
limit: 15,
page: true,
@ -167,15 +178,15 @@
var baseFD = 0;
for(var i=chartData.length-1; i>=0; i--){
if(chartData[i].rb562e!=null) {
if(chartData[i].rpose!=null) {
if(isBaseSet) {
t[count] = chartData[i].createtime;
e[count] = chartData[i].b562e-baseE;
n[count] = chartData[i].b562n-baseN;
d[count] = chartData[i].b562d-baseD;
fe[count] = Number(chartData[i].rb562e) - baseFE;
fn[count] = Number(chartData[i].rb562n) - baseFN;
fd[count] = Number(chartData[i].rb562d) - baseFD;
fe[count] = Number(chartData[i].rpose) - baseFE;
fn[count] = Number(chartData[i].rposn) - baseFN;
fd[count] = Number(chartData[i].rposd) - baseFD;
count++;
}
else{
@ -183,9 +194,9 @@
baseE = Number(chartData[i].b562e);
baseN = Number(chartData[i].b562n);
baseD = Number(chartData[i].b562d);
baseFE = Number(chartData[i].rb562e);
baseFN = Number(chartData[i].rb562n);
baseFD = Number(chartData[i].rb562d);
baseFE = Number(chartData[i].rpose);
baseFN = Number(chartData[i].rposn);
baseFD = Number(chartData[i].rposd);
}
}
else{

View File

@ -27,7 +27,7 @@
<div class="layui-inline" th:if="${role=='SUPER_ADMIN' || role=='ADMIN'}">
<label class="layui-form-label">所属部门</label>
<div class="layui-input-inline">
<select name="n_tenantid" id="n_tenantid" lay-search="">
<select name="n_d.tenantid" id="n_d.tenantid" lay-search="">
<option value="">全部</option>
<option th:each="item : ${tenant_list}" th:text="${item.name}" th:value="${item.id}"></option>
</select>

View File

@ -126,21 +126,21 @@
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">初始位置 东</label>
<label class="layui-form-label">初始位置(mm)</label>
<div class="layui-input-block">
<input type="text" name="b562e" id="b562e" class="layui-input">
<input type="text" name="ipose" id="ipose" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="b562n" id="b562n" class="layui-input">
<input type="text" name="iposn" id="iposn" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="b562d" id="b562d" class="layui-input">
<input type="text" name="iposd" id="iposd" class="layui-input">
</div>
</div>
</div>
@ -190,9 +190,9 @@
'deviceid':$('#deviceid').val()
},
success: function (result) {
$('#b562e').val(result.b562e);
$('#b562n').val(result.b562n);
$('#b562d').val(result.b562d);
$('#ipose').val(result.ipose);
$('#iposn').val(result.iposn);
$('#iposd').val(result.iposd);
},
error: function () {
console.log("ajax error");
@ -222,9 +222,9 @@
$('#fwd_group_id2').val(data.fwd_group_id2);
$('#opmode').val(data.opmode);
$('#fwddeviceid').val(data.fwddeviceid);
$('#b562e').val(data.b562e);
$('#b562n').val(data.b562n);
$('#b562d').val(data.b562d);
$('#ipose').val(data.ipose);
$('#iposn').val(data.iposn);
$('#iposd').val(data.iposd);
form.render();
}
</script>