Browse Source

算法更新

develop
白凤吉 3 months ago
parent
commit
0c34e9d20f
  1. 4
      app/build.gradle
  2. 6
      app/src/main/assets/web/asset-manifest.json
  3. BIN
      app/src/main/assets/web/audio/ticking.wav
  4. 2
      app/src/main/assets/web/index.html
  5. 1
      app/src/main/assets/web/static/js/main.1aa0e3ca.js.map
  6. 6
      app/src/main/assets/web/static/js/main.d8dcad23.js
  7. 0
      app/src/main/assets/web/static/js/main.d8dcad23.js.LICENSE.txt
  8. 1
      app/src/main/assets/web/static/js/main.d8dcad23.js.map
  9. 70
      app/src/main/java/com/iflytop/profilometer/core/migration/algo/ProfilometerRecorder.java
  10. 2
      app/src/main/java/com/iflytop/profilometer/core/migration/algo/type/ProfilometerAlgoConfig.java
  11. 25
      app/src/main/java/com/iflytop/profilometer/core/migration/type/enums/RailProfileMeasureTaskEvent.java
  12. 12
      app/src/main/java/com/iflytop/profilometer/service/RailProfileDrawerService.java

4
app/build.gradle

@ -14,9 +14,9 @@ android {
minSdk 26
targetSdk 35
//
versionCode 19
versionCode 20
//
versionName "1.1.19"
versionName "1.1.20"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

6
app/src/main/assets/web/asset-manifest.json

@ -1,7 +1,7 @@
{
"files": {
"main.css": "/static/css/main.b5101f43.css",
"main.js": "/static/js/main.1aa0e3ca.js",
"main.js": "/static/js/main.d8dcad23.js",
"static/js/453.e7f11a48.chunk.js": "/static/js/453.e7f11a48.chunk.js",
"static/media/icon_leftR.svg": "/static/media/icon_leftR.76cd3e03bb846b0bacb0a84808f24c36.svg",
"static/media/icon_tab3_u.svg": "/static/media/icon_tab3_u.6d18cbd7c4dc6a54f745fdfcc7716050.svg",
@ -26,11 +26,11 @@
"static/media/icon_bluetooth.svg": "/static/media/icon_bluetooth.a48021d03233ba0570bf3960cddf6a65.svg",
"static/media/icon_check_s_u.svg": "/static/media/icon_check_s_u.2c5e20bec088338dc1cb2161b5cba37d.svg",
"main.b5101f43.css.map": "/static/css/main.b5101f43.css.map",
"main.1aa0e3ca.js.map": "/static/js/main.1aa0e3ca.js.map",
"main.d8dcad23.js.map": "/static/js/main.d8dcad23.js.map",
"453.e7f11a48.chunk.js.map": "/static/js/453.e7f11a48.chunk.js.map"
},
"entrypoints": [
"static/css/main.b5101f43.css",
"static/js/main.1aa0e3ca.js"
"static/js/main.d8dcad23.js"
]
}

BIN
app/src/main/assets/web/audio/ticking.wav

2
app/src/main/assets/web/index.html

@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/><title>廓形仪</title><script defer="defer" src="/static/js/main.1aa0e3ca.js"></script><link href="/static/css/main.b5101f43.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>function setupWebViewJavascriptBridge(e){if(window.WebViewJavascriptBridge)return e(WebViewJavascriptBridge);if(/android/i.test(navigator.userAgent))document.addEventListener("WebViewJavascriptBridgeReady",(function(){e(WebViewJavascriptBridge)}),!1);else{if(window.WVJBCallbacks)return window.WVJBCallbacks.push(e);window.WVJBCallbacks=[e];var i=document.createElement("iframe");i.style.display="none",i.src="https://__bridge_loaded__",document.documentElement.appendChild(i),setTimeout((function(){document.documentElement.removeChild(i)}),0)}}setupWebViewJavascriptBridge((function(e){window.bridge=e}));var SyncBridgeJS={call:function(e,i){return prompt("sync/syncBridge/"+e,i)}}</script></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/><title>廓形仪</title><script defer="defer" src="/static/js/main.d8dcad23.js"></script><link href="/static/css/main.b5101f43.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>function setupWebViewJavascriptBridge(e){if(window.WebViewJavascriptBridge)return e(WebViewJavascriptBridge);if(/android/i.test(navigator.userAgent))document.addEventListener("WebViewJavascriptBridgeReady",(function(){e(WebViewJavascriptBridge)}),!1);else{if(window.WVJBCallbacks)return window.WVJBCallbacks.push(e);window.WVJBCallbacks=[e];var i=document.createElement("iframe");i.style.display="none",i.src="https://__bridge_loaded__",document.documentElement.appendChild(i),setTimeout((function(){document.documentElement.removeChild(i)}),0)}}setupWebViewJavascriptBridge((function(e){window.bridge=e}));var SyncBridgeJS={call:function(e,i){return prompt("sync/syncBridge/"+e,i)}}</script></body></html>

1
app/src/main/assets/web/static/js/main.1aa0e3ca.js.map
File diff suppressed because it is too large
View File

6
app/src/main/assets/web/static/js/main.d8dcad23.js
File diff suppressed because it is too large
View File

0
app/src/main/assets/web/static/js/main.1aa0e3ca.js.LICENSE.txt → app/src/main/assets/web/static/js/main.d8dcad23.js.LICENSE.txt

1
app/src/main/assets/web/static/js/main.d8dcad23.js.map
File diff suppressed because it is too large
View File

70
app/src/main/java/com/iflytop/profilometer/core/migration/algo/ProfilometerRecorder.java

@ -13,12 +13,14 @@ import com.iflytop.profilometer.core.migration.algo.type.XYPoint;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ProfilometerRecorder {
//
// 状态
//
// Logger log = org.slf4j.LoggerFactory.getLogger(ProfilometerRecorder.class);
List<XYPoint> dataCache1; //曲线缓存
List<XYPoint> dataCache2; //曲线缓存
@ -45,8 +47,9 @@ public class ProfilometerRecorder {
int speedNow = 0; // 0->100(+) 用户移动滑轮的速度速度为接近100时图像可能会发生失真需要警告用户,大于100时需要停止测量
ProfilometerDrawerListener listener;
ProfilometerAlgoConfig cfg = new ProfilometerAlgoConfig();
DeviceProfile deviceProfile;
ProfilometerAlgoConfig cfg = new ProfilometerAlgoConfig();
DeviceProfile deviceProfile;
synchronized public void initialize(ProfilometerAlgoConfig config, ProfilometerDrawerListener listener) {
this.listener = listener;
@ -91,7 +94,7 @@ public class ProfilometerRecorder {
if (status == RailProfileMeasureTaskStatus.START_MEASURE) {
status = RailProfileMeasureTaskStatus.WAITING_FOR_RECORD_THE_1ST_SIDE;
// log.info("等待记录第一条曲线");
log.info("等待记录第一条曲线");
if (listener != null)
listener.onWaitingForMeasuringThe1stSide();
} else if (status == RailProfileMeasureTaskStatus.WAITING_FOR_RECORD_THE_1ST_SIDE) {
@ -102,7 +105,7 @@ public class ProfilometerRecorder {
processDataOnRecordTheFirstSide(arm1rad, arm2rad, newPoitn);
} else if (status == RailProfileMeasureTaskStatus.RECORD_THE_1ST_SIDE_FINISHED) {
status = RailProfileMeasureTaskStatus.WAITING_FOR_RECORD_THE_2ND_SIDE;
// log.info("等待记录第二条曲线 {}", firstSide.getOpposite());
log.info("等待记录第二条曲线 {}", firstSide.getOpposite());
if (listener != null)
listener.waitingForMeasuringThe2NdSide(firstSide.getOpposite());
} else if (status == RailProfileMeasureTaskStatus.WAITING_FOR_RECORD_THE_2ND_SIDE) {
@ -269,7 +272,7 @@ public class ProfilometerRecorder {
//开始测量第一条曲线
status = RailProfileMeasureTaskStatus.RECORD_THE_FIRST_SIDE;
firstSide = rad1 < 0 ? MeasureSide.LEFT : MeasureSide.RIGHT;
// log.info("开始测量第一条曲线 {}", firstSide);
log.info("开始测量第一条曲线 {}", firstSide);
if (listener != null)
listener.onStartRecordThe1stSide(firstSide);
@ -288,14 +291,17 @@ public class ProfilometerRecorder {
if (distance(lastPoint, newPoint) > getConfig().directionJudgePointDistance) {
directionJudgeCache.add(newPoint);
if (!isInStartPos(newPoint) && directionJudgeCache.size() > 4) {
XYPoint lp0 = directionJudgeCache.get(directionJudgeCache.size() - 1);
XYPoint lp1 = directionJudgeCache.get(directionJudgeCache.size() - 2);
XYPoint lp2 = directionJudgeCache.get(directionJudgeCache.size() - 3);
XYPoint runDirection1 = new XYPoint(lp0.x - lp1.x, lp0.y - lp1.y);
XYPoint runDirection2 = new XYPoint(lp1.x - lp2.x, lp1.y - lp2.y);
double ddirec = runDirection1.x * runDirection2.x + runDirection1.y * runDirection2.y;
// log.debug("ddirec: {}, speedNow: {}", ddirec, speedNow);
if (ddirec < 0) {
XYPoint lp0 = directionJudgeCache.get(directionJudgeCache.size() - 1);
XYPoint lp1 = directionJudgeCache.get(directionJudgeCache.size() - 2);
XYPoint lp2 = directionJudgeCache.get(directionJudgeCache.size() - 3);
double ddirec = calculateAngle(lp0, lp1, lp2);
// XYPoint runDirection1 = new XYPoint(lp0.x - lp1.x, lp0.y - lp1.y);
// XYPoint runDirection2 = new XYPoint(lp1.x - lp2.x, lp1.y - lp2.y);
// double ddirec = runDirection1.x * runDirection2.x + runDirection1.y * runDirection2.y;
log.debug("ddirec: {}, speedNow: {}", ddirec, speedNow);
if (ddirec > 60) {
endFlag = true;
}
}
@ -346,7 +352,7 @@ public class ProfilometerRecorder {
boolean endFlag = isEnd(rad1, rad2, newPoint);
if (endFlag) {
//测量完成
// log.info("测量完成,第一条曲线 {}", firstSide);
log.info("测量完成,第一条曲线 {}", firstSide);
status = RailProfileMeasureTaskStatus.RECORD_THE_1ST_SIDE_FINISHED;
resetContext();
if (firstSide == MeasureSide.LEFT) {
@ -376,7 +382,7 @@ public class ProfilometerRecorder {
if ((leftSideReady && newPoint.x >= 0) || rightSideReady && newPoint.x <= 0) {
//开始测量第二条曲线
status = RailProfileMeasureTaskStatus.RECORD_THE_2ND_SIDE;
// log.info("开始测量第二条曲线 {}", firstSide.getOpposite());
log.info("开始测量第二条曲线 {}", firstSide.getOpposite());
if (listener != null)
listener.onStartRecordThe2NdSide(firstSide.getOpposite());
dataCache2.add(newPoint);
@ -419,7 +425,7 @@ public class ProfilometerRecorder {
boolean endFlag = isEnd(rad1, rad2, newPoint);
if (endFlag) {
//测量完成
// log.info("测量完成,第二条曲线 {}", firstSide.getOpposite());
log.info("测量完成,第二条曲线 {}", firstSide.getOpposite());
status = RailProfileMeasureTaskStatus.FINISHED;
if (listener != null)
listener.onFinished(firstSide.getOpposite());
@ -443,7 +449,7 @@ public class ProfilometerRecorder {
// private utils
//
static private XYPoint twoAxisArmCoordTransformToXYPointV2(Double arm0Length, Double arm0Rad, Double arm1Length,
Double arm1Rad) {
Double arm1Rad) {
double x = arm0Length * Math.sin(arm0Rad) + arm1Length * Math.sin(arm0Rad + arm1Rad);
double y = arm0Length * Math.cos(arm0Rad) + arm1Length * Math.cos(arm0Rad + arm1Rad);
return new XYPoint(x, y);
@ -456,5 +462,33 @@ public class ProfilometerRecorder {
return Math.sqrt(Math.pow(p0.x - p1.x, 2) + Math.pow(p0.y - p1.y, 2));
}
// 计算两个二维向量的点积
public static double dotProduct(double[] a, double[] b) {
return a[0] * b[0] + a[1] * b[1];
}
// 计算二维向量的模长
public static double magnitude(double[] a) {
return Math.sqrt(a[0] * a[0] + a[1] * a[1]);
}
// 计算夹角单位
public static double calculateAngle(XYPoint a1, XYPoint a2, XYPoint a3) {
double[] a = {a2.x - a1.x, a2.y - a1.y};
double[] b = {a3.x - a2.x, a3.y - a2.y};
double dotProduct = dotProduct(a, b);
double magnitudeA = magnitude(a);
double magnitudeB = magnitude(b);
double cosTheta = dotProduct / (magnitudeA * magnitudeB);
// 避免浮点数误差导致的cosTheta超过-1到1的范围
cosTheta = Math.max(-1.0, Math.min(1.0, cosTheta));
// 计算弧度
double radians = Math.acos(cosTheta);
// 转换为度数
double degrees = Math.toDegrees(radians);
return degrees;
}
}

2
app/src/main/java/com/iflytop/profilometer/core/migration/algo/type/ProfilometerAlgoConfig.java

@ -3,7 +3,7 @@ package com.iflytop.profilometer.core.migration.algo.type;
public class ProfilometerAlgoConfig {
public int outlineStartRecordSigJudgeTimeThresholdMS = 400; // 开始采样静止时间判定阈值单位MS
public int startOutlineRecordingTimingJudgmentAreaHight = 30; // 开始采样静止时间判定区域高度单位mm
public int startOutlineRecordingTimingJudgmentAreaWeight = 80; // 开始采样静止时间判定区域权重单位mm
public int startOutlineRecordingTimingJudgmentAreaWeight = 95; // 开始采样静止时间判定区域权重单位mm
public double precision = 0.10; // 采样精度(mm) 当其等于0.12mm,满足测量长度13cm的情况下1500个点.
public double overSamplePrecision = 0.03; // 过采样精度(mm) 0.03mm
public double displayPrecision = 0.3; // 显示精度(影响采样时候的回调的次数)

25
app/src/main/java/com/iflytop/profilometer/core/migration/type/enums/RailProfileMeasureTaskEvent.java

@ -5,21 +5,25 @@ package com.iflytop.profilometer.core.migration.type.enums;
*/
public enum RailProfileMeasureTaskEvent {
/**
* 等待测量第一條曲綫
*/
WAITING_FOR_RECORD_THE_1ST_SIDE,
/**
* 开始测量左侧
*/
START_RECORD_LEFT,
/**
* 开始测量右侧
* 左侧完成测量
*/
START_RECORD_RIGHT,
FINISH_RECORD_LEFT,
/**
* 停止测量
* 等待测量第二条曲线
*/
END_RECORD,
WAITING_FOR_RECORD_THE_2ND_SIDE,
/**
* 左侧完成测量
* 开始测量右侧
*/
FINISH_RECORD_LEFT,
START_RECORD_RIGHT,
/**
* 右侧完成测量
*/
@ -28,12 +32,5 @@ public enum RailProfileMeasureTaskEvent {
* 完成测量
*/
FINISH_RECORD,
/**
* 测量方向错误
*/
WRONG_SIDE,
/**
* 移动超速
*/
SPEED_DETECTED,
}

12
app/src/main/java/com/iflytop/profilometer/service/RailProfileDrawerService.java

@ -72,6 +72,11 @@ public class RailProfileDrawerService implements ProfilometerDrawerListener {
log.info("等待开始测量第一条曲线");
RailProfileMeasureTaskState taskState = SystemService.getInstance().getTaskState();
taskState.setTaskStatus(RailProfileMeasureTaskStatus.WAITING_FOR_RECORD_THE_1ST_SIDE);
Map<String, Object> map = new HashMap<>();
map.put("type", "measure-event");
map.put("data", RailProfileMeasureTaskEvent.WAITING_FOR_RECORD_THE_1ST_SIDE);
WebSocketManager.send(JSONUtil.toJsonStr(map));
}
/**
@ -121,6 +126,11 @@ public class RailProfileDrawerService implements ProfilometerDrawerListener {
log.info("等待开始测量第二条曲线");
RailProfileMeasureTaskState taskState = SystemService.getInstance().getTaskState();
taskState.setTaskStatus(RailProfileMeasureTaskStatus.WAITING_FOR_RECORD_THE_2ND_SIDE);
Map<String, Object> map = new HashMap<>();
map.put("type", "measure-event");
map.put("data", RailProfileMeasureTaskEvent.WAITING_FOR_RECORD_THE_2ND_SIDE);
WebSocketManager.send(JSONUtil.toJsonStr(map));
}
/**
@ -162,6 +172,8 @@ public class RailProfileDrawerService implements ProfilometerDrawerListener {
taskState.setMeasuringRightEnd(true);
}
WebSocketManager.send(JSONUtil.toJsonStr(map));
map.put("data", RailProfileMeasureTaskEvent.FINISH_RECORD);
WebSocketManager.send(JSONUtil.toJsonStr(map));
var report = ProfilometerPulleyPointPreProcesser.processRecord(
profilometerRecorder.getConfig(),

Loading…
Cancel
Save