1、解算参数组增加算法版本配置

This commit is contained in:
weidong 2024-04-18 23:09:55 +08:00
parent 40ae325fe6
commit 2f8d570d19
8 changed files with 146 additions and 25 deletions

View File

@ -16,4 +16,5 @@ public class GnssGroupCalc {
Float auto_threshold; Float auto_threshold;
Integer device_num; Integer device_num;
Boolean auto_upload; Boolean auto_upload;
Short ver;
} }

View File

@ -14,7 +14,7 @@ import java.util.*;
* 6. * 6.
*/ */
public class FocusCalculator1 implements FocusCalculator{ public class FocusCalculator1 implements FocusCalculator{
private final Logger logger = LoggerFactory.getLogger(FocusCalculator1.class); final Logger logger = LoggerFactory.getLogger(FocusCalculator1.class);
// b562算法相关b562固定解的点计算球心初始半径迭代步长最少点数 // b562算法相关b562固定解的点计算球心初始半径迭代步长最少点数
final List<double[]> pointList = Collections.synchronizedList(new ArrayList<>()); final List<double[]> pointList = Collections.synchronizedList(new ArrayList<>());

View File

@ -15,6 +15,8 @@ public class FocusCalculator2 extends FocusCalculator1{
final static int MAX_B562_NUM = 3600; final static int MAX_B562_NUM = 3600;
final static int B562_EXPIRED_HOUR = 2; final static int B562_EXPIRED_HOUR = 2;
final List<LocalDateTime> pointTimeList = Collections.synchronizedList(new ArrayList<>()); final List<LocalDateTime> pointTimeList = Collections.synchronizedList(new ArrayList<>());
final List<double[]> pointAuxList = Collections.synchronizedList(new ArrayList<>());
final List<LocalDateTime> pointTimeAuxList = Collections.synchronizedList(new ArrayList<>());
/** /**
* 构建计算器如果tilt0和position0是null那么计算过程将不考虑与tilts数据融合 * 构建计算器如果tilt0和position0是null那么计算过程将不考虑与tilts数据融合
@ -25,7 +27,6 @@ public class FocusCalculator2 extends FocusCalculator1{
public FocusCalculator2(double height, Tilt tilt0, double[] position0){ public FocusCalculator2(double height, Tilt tilt0, double[] position0){
super(height,tilt0,position0); super(height,tilt0,position0);
iterStep = 0.2; iterStep = 0.2;
gravityMaxCount = MAX_B562_NUM;
} }
public FocusCalculator2(){ public FocusCalculator2(){
@ -35,6 +36,8 @@ public class FocusCalculator2 extends FocusCalculator1{
@Override @Override
public void reset(){ public void reset(){
//pointList.clear(); //pointList.clear();
pointAuxList.clear();
pointTimeAuxList.clear();
counterNoB562 = 0; counterNoB562 = 0;
counterNoFixed = 0; counterNoFixed = 0;
counterFixedResult = 0; counterFixedResult = 0;
@ -47,10 +50,28 @@ public class FocusCalculator2 extends FocusCalculator1{
@Override @Override
public void addXyz(double[] xyz){ public void addXyz(double[] xyz){
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
if((int)xyz[3] == UBXUtil.NO_B562) counterNoB562++;
else if((int)xyz[3] == UBXUtil.NO_FIX_RESULT) counterNoFixed++;
else {
counterFixedResult ++;
if (filter(xyz)) {
pointAuxList.add(xyz);
pointTimeAuxList.add(now);
}
if (pointAuxList.size() > gravityMaxCount) {
pointAuxList.remove(0);
pointTimeAuxList.remove(0);
}
}
}
/*public void addXyz(double[] xyz){
LocalDateTime now = LocalDateTime.now();
Iterator<LocalDateTime> iterPointTime = pointTimeList.iterator(); Iterator<LocalDateTime> iterPointTime = pointTimeList.iterator();
Iterator<double[]> iterPoint = pointList.iterator(); Iterator<double[]> iterPoint = pointList.iterator();
while(iterPointTime.hasNext() && iterPoint.hasNext()){ while(iterPointTime.hasNext() && iterPoint.hasNext()){
LocalDateTime pointTime = iterPointTime.next(); LocalDateTime pointTime = iterPointTime.next();
iterPoint.next();
if(now.isAfter(pointTime.plusHours(B562_EXPIRED_HOUR))){ if(now.isAfter(pointTime.plusHours(B562_EXPIRED_HOUR))){
iterPointTime.remove(); iterPointTime.remove();
iterPoint.remove(); iterPoint.remove();
@ -73,11 +94,32 @@ public class FocusCalculator2 extends FocusCalculator1{
pointTimeList.remove(0); pointTimeList.remove(0);
} }
} }
} }*/
public double[] resultB562(double[] lastResult){ public double[] resultB562(double[] lastResult){
if(counterFixedResult<30) return null; if(counterFixedResult<50) return null;
else return super.resultB562(lastResult); // 把本轮的固定解添加到pointList一起解算
int totalNum = pointList.size()+pointAuxList.size();
LocalDateTime latestTime = pointTimeAuxList.get(pointTimeAuxList.size()-1);
Iterator<LocalDateTime> iterPointTime = pointTimeList.iterator();
Iterator<double[]> iterPoint = pointList.iterator();
while(iterPointTime.hasNext() && iterPoint.hasNext()){
LocalDateTime pointTime = iterPointTime.next();
iterPoint.next();
if(totalNum>MAX_B562_NUM || latestTime.isAfter(pointTime.plusHours(B562_EXPIRED_HOUR))){
iterPointTime.remove();
iterPoint.remove();
totalNum--;
}
else{
break;
}
}
pointList.addAll(pointAuxList);
pointTimeList.addAll(pointTimeAuxList);
logger.debug("point list: {},{},{},{}",pointTimeList.get(0),pointTimeAuxList.get(pointTimeAuxList.size()-1),pointTimeList.size(),pointList.size());
// 求pointList的重心
return super.resultB562(lastResult);
} }
@Override @Override

View File

@ -75,14 +75,14 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService {
//todo 创建FocusCalculator对象需获取该测站的杆长度上一小时的Tilt平均值上一小时的测站相对坐标融合值ekfResult //todo 创建FocusCalculator对象需获取该测站的杆长度上一小时的Tilt平均值上一小时的测站相对坐标融合值ekfResult
FocusCalculator focusCalculator; FocusCalculator focusCalculator;
/*if(groupCalc!=null && groupCalc.getVer() == 2){ if(groupCalc!=null && groupCalc.getVer() == 2){
focusCalculator = calculatorMap.computeIfAbsent(deviceId, focusCalculator = calculatorMap.computeIfAbsent(deviceId,
s -> new FocusCalculator2(200,tiltMap.get(deviceId),positionMap.get(deviceId))); s -> new FocusCalculator2(200,tiltMap.get(deviceId),positionMap.get(deviceId)));
} }
else {*/ else {
focusCalculator = calculatorMap.computeIfAbsent(deviceId, focusCalculator = calculatorMap.computeIfAbsent(deviceId,
s -> new FocusCalculator1(200, tiltMap.get(deviceId),positionMap.get(deviceId))); s -> new FocusCalculator1(200, tiltMap.get(deviceId),positionMap.get(deviceId)));
//} }
// 读取惯导 // 读取惯导
Tilt tilt = message.getTilt(); Tilt tilt = message.getTilt();

View File

@ -83,6 +83,7 @@ CREATE TABLE IF NOT EXISTS `gnssgroupcalc` (
`auto_filter` bit(1) DEFAULT 0, `auto_filter` bit(1) DEFAULT 0,
`filter_min_hour` int DEFAULT NULL COMMENT '最小平滑窗口', `filter_min_hour` int DEFAULT NULL COMMENT '最小平滑窗口',
`auto_threshold` float DEFAULT NULL, `auto_threshold` float DEFAULT NULL,
`ver` smallint DEFAULT 1 COMMENT '算法版本',
`device_num` int DEFAULT 0, `device_num` int DEFAULT 0,
`auto_upload` bit(1) DEFAULT 0, `auto_upload` bit(1) DEFAULT 0,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
@ -143,6 +144,9 @@ CREATE TABLE IF NOT EXISTS `gnssdevicelocationrecords` (
`r9250e` double DEFAULT NULL, `r9250e` double DEFAULT NULL,
`r9250n` double DEFAULT NULL, `r9250n` double DEFAULT NULL,
`r9250d` double DEFAULT NULL, `r9250d` double DEFAULT NULL,
/*`m9250e` double DEFAULT NULL,
`m9250n` double DEFAULT NULL,
`m9250d` double DEFAULT NULL,*/
`rpose` double DEFAULT NULL COMMENT '相对位置东E', `rpose` double DEFAULT NULL COMMENT '相对位置东E',
`rposn` double DEFAULT NULL COMMENT '相对位置北N', `rposn` double DEFAULT NULL COMMENT '相对位置北N',
`rposd` double DEFAULT NULL COMMENT '相对位置天D', `rposd` double DEFAULT NULL COMMENT '相对位置天D',

View File

@ -143,6 +143,7 @@
**/ **/
var cfg2_cols = [ var cfg2_cols = [
{field: 'id', title: '组号', sort: true}, {field: 'id', title: '组号', sort: true},
{field: 'ver', title: '算法版本'},
{field: 'filter_hour', title: '滤波周期(小时)'}, {field: 'filter_hour', title: '滤波周期(小时)'},
{field: 'xy_threshold', title: '水平异常门限(mm)'}, {field: 'xy_threshold', title: '水平异常门限(mm)'},
{field: 'z_threshold', title: '垂直异常门限(mm)'}, {field: 'z_threshold', title: '垂直异常门限(mm)'},

View File

@ -23,6 +23,15 @@
<input type="number" name="id" id="id" lay-verify="required" lay-reqtext="不能为空" placeholder="请输入组号" value="" class="layui-input"> <input type="number" name="id" id="id" lay-verify="required" lay-reqtext="不能为空" placeholder="请输入组号" value="" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item">
<label class="layui-form-label">算法版本</label>
<div class="layui-input-inline">
<select name="ver" id="ver" lay-filter="ver">
<option value="1">1</option>
<option value="2">2</option>
</select>
</div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label required">滤波周期(小时)</label> <label class="layui-form-label required">滤波周期(小时)</label>
<div class="layui-input-block"> <div class="layui-input-block">
@ -133,6 +142,7 @@
$('#filter_min_hour').val(data.filter_min_hour); $('#filter_min_hour').val(data.filter_min_hour);
$('#auto_threshold').val(data.auto_threshold); $('#auto_threshold').val(data.auto_threshold);
$('#auto_upload').val(data.auto_upload?'1':'0'); $('#auto_upload').val(data.auto_upload?'1':'0');
$('#ver').val(data.ver);
form.render(); form.render();
} }
</script> </script>

View File

@ -2,11 +2,15 @@ package com.imdroid.beidou.test_device.task;
import com.imdroid.beidou.test_device.service.UDPClient; import com.imdroid.beidou.test_device.service.UDPClient;
import com.imdroid.common.util.ByteUtil; import com.imdroid.common.util.ByteUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
public class BeidouDevice { public class BeidouDevice {
@ -22,23 +26,24 @@ public class BeidouDevice {
public void run(){ public void run(){
try{ try{
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_1xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_2xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_3xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_4xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_5xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_6xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_1.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_2.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_1xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_2xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_3xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_4xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_5xx.log");
executeAsD342("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_6xx.log");
//execute("C:\\Users\\wd\\Desktop\\log\\b562_2412270_1xx.log"); //execute("C:\\Users\\wd\\Desktop\\log\\b562_2412270_1xx.log");
//execute("C:\\Users\\wd\\Desktop\\log\\b562_2412270_2xx.log"); //execute("C:\\Users\\wd\\Desktop\\log\\b562_2412270_2xx.log");
//execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_1xx.log");
//execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_2xx.log");
//execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_3xx.log");
//execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_4xx.log");
//execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_5xx.log");
//execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_6xx.log");
execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_1.log");
execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_2.log");
execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_1xx.log");
execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_2xx.log");
execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_3xx.log");
execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_4xx.log");
execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_5xx.log");
execute("C:\\Users\\wd\\Desktop\\log\\b562_2412254_0416_6xx.log");
} }
catch (Exception e){ catch (Exception e){
@ -66,9 +71,9 @@ public class BeidouDevice {
Date time = sdf.parse(arrs[0] + " " + arrs[1]); Date time = sdf.parse(arrs[0] + " " + arrs[1]);
if (lastTime!=0 && Math.abs(time.getTime() - lastTime) > 60 * 1000) {//超过1分钟为一个周期 if (lastTime!=0 && Math.abs(time.getTime() - lastTime) > 60 * 1000) {//超过1分钟为一个周期
System.out.println(time+" cycle "+cycleCount+", b562 num "+b562Count);
Thread.sleep(30 * 1000); Thread.sleep(30 * 1000);
cycleCount++; cycleCount++;
System.out.println(time+" cycle "+cycleCount+", b562 num "+b562Count);
} }
udpClient.sendData(ByteUtil.hexStringTobyte(arrs[2])); udpClient.sendData(ByteUtil.hexStringTobyte(arrs[2]));
b562Count++; b562Count++;
@ -84,4 +89,62 @@ public class BeidouDevice {
if(fr!=null) fr.close(); if(fr!=null) fr.close();
} }
} }
public void executeAsD342(String dataFileName) throws IOException {
// d3 51 length device_id(4bytes) seq(2bytes) year mon day hour minute
FileReader fr=null;
BufferedReader br=null;
byte[] d342Head = new byte[]{(byte) 0xd3,(byte) 0x42};
ByteBuf dataBuffer = Unpooled.buffer();
ByteBuf sendBuffer = Unpooled.buffer();
try {
fr = new FileReader(dataFileName);
br = new BufferedReader(fr);
String line = "";
String[] arrs = null;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime lastTime=null;
int b562Count = 0;
while ((line = br.readLine()) != null) {
arrs = line.split(" ");
if(arrs.length != 3) continue;
LocalDateTime time = LocalDateTime.parse(arrs[0] + " " + arrs[1],formatter);
dataBuffer.writeBytes(ByteUtil.hexStringTobyte(arrs[2]));
b562Count++;
if((b562Count%10)==0 ||
(lastTime!=null && time.isAfter(lastTime.plusMinutes(1)))) {
sendBuffer.writeBytes(d342Head);
sendBuffer.writeShort(dataBuffer.readableBytes()+11);
String deviceId = arrs[2].substring(4*2,8*2);
sendBuffer.writeBytes(ByteUtil.hexStringTobyte(deviceId));
sendBuffer.writeShort(b562Count);
byte[] byteTime = new byte[]{(byte) (time.getYear() - 2000), (byte) time.getMonthValue(), (byte) time.getDayOfMonth(), (byte) time.getHour(), (byte) time.getMinute()};
sendBuffer.writeBytes(byteTime);
sendBuffer.writeBytes(dataBuffer);
byte[] data = new byte[sendBuffer.readableBytes()];
sendBuffer.getBytes(0,data);
udpClient.sendData(data);
Thread.sleep(100);
sendBuffer.clear();
dataBuffer.clear();
}
if ((b562Count%100)==0) {
System.out.println(time+" b562 num "+b562Count);
}
}
br.close();
fr.close();
}
catch (Exception e){
e.printStackTrace();
if(br!=null) br.close();
if(fr!=null) fr.close();
}
}
} }