diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index c122d8d..455c4bf 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -4,9 +4,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203
+ password: 123456
druid:
max-active: 50
min-idle: 20
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index c122d8d..455c4bf 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -4,9 +4,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203
+ password: 123456
druid:
max-active: 50
min-idle: 20
diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml
index 534e2fb..67a0241 100644
--- a/casic-web/src/main/resources/config/application-test.yml
+++ b/casic-web/src/main/resources/config/application-test.yml
@@ -1,30 +1,48 @@
server:
- port: 11307
+ port: 8083
################### spring配置 ###################
spring:
datasource:
- url: jdbc:mysql://localhost:3306/casic_template?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203!
- initial-size: 2
- min-idle: 1
- jms:
- pub-sub-domain: true
-# session:
+ password: 123456
+ druid:
+ max-active: 50
+ min-idle: 20
+jms:
+ pub-sub-domain: true
+# session:
# store-type: redis
+# redis:
+# host: 111.198.10.15
+# port: 11412
+# password: ew5T4K3#203lwh
+# serializer: org.springframework.data.redis.serializer.StringRedisSerializer
+# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
casic:
- # kaptcha-open: false #是否开启登录时验证码 (true/false)
- nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/**
+ #kaptcha-open: false #是否开启登录时验证码 (true/false)
+ no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/websocket/*,/webjars/**,/v2/api-docs,/v2/api-docs-ext,/doc.html,/v2/api-docs/swagger-ui.html,/swagger-resources
#flowable数据源和多数据源配置
- flowable:
- datasource:
- url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
- username: root
- password: Casic203!
-flowable:
- checkProcessDefinitions: false #不校验process文件
+ db:
+ init:
+ enable: false
+ hikSdk: D:\robot\hiklib\HCNetSDK.dll
+ hikPlay: D:\robot\hiklib\PlayCtrl.dll
+ algorithm:
+ path: D:\robot\path\
+ initPathName: init.exe
+ planPathName: search.exe
+ doc:
+ temp: D:\robot\path\report.docx
+ config:
+ export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\
+ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\
logging:
level.root: info
level.com.casic: debug
+ level.com.casic.missiles.netty: error
+ level.com.casic.missiles.modular.neutron: error
+ level.org.springframework.web: info
file:
- path: logs/
\ No newline at end of file
+ path: D:\\robot\\logs
\ No newline at end of file
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index c122d8d..455c4bf 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -4,9 +4,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203
+ password: 123456
druid:
max-active: 50
min-idle: 20
diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml
index 534e2fb..67a0241 100644
--- a/casic-web/src/main/resources/config/application-test.yml
+++ b/casic-web/src/main/resources/config/application-test.yml
@@ -1,30 +1,48 @@
server:
- port: 11307
+ port: 8083
################### spring配置 ###################
spring:
datasource:
- url: jdbc:mysql://localhost:3306/casic_template?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203!
- initial-size: 2
- min-idle: 1
- jms:
- pub-sub-domain: true
-# session:
+ password: 123456
+ druid:
+ max-active: 50
+ min-idle: 20
+jms:
+ pub-sub-domain: true
+# session:
# store-type: redis
+# redis:
+# host: 111.198.10.15
+# port: 11412
+# password: ew5T4K3#203lwh
+# serializer: org.springframework.data.redis.serializer.StringRedisSerializer
+# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
casic:
- # kaptcha-open: false #是否开启登录时验证码 (true/false)
- nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/**
+ #kaptcha-open: false #是否开启登录时验证码 (true/false)
+ no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/websocket/*,/webjars/**,/v2/api-docs,/v2/api-docs-ext,/doc.html,/v2/api-docs/swagger-ui.html,/swagger-resources
#flowable数据源和多数据源配置
- flowable:
- datasource:
- url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
- username: root
- password: Casic203!
-flowable:
- checkProcessDefinitions: false #不校验process文件
+ db:
+ init:
+ enable: false
+ hikSdk: D:\robot\hiklib\HCNetSDK.dll
+ hikPlay: D:\robot\hiklib\PlayCtrl.dll
+ algorithm:
+ path: D:\robot\path\
+ initPathName: init.exe
+ planPathName: search.exe
+ doc:
+ temp: D:\robot\path\report.docx
+ config:
+ export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\
+ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\
logging:
level.root: info
level.com.casic: debug
+ level.com.casic.missiles.netty: error
+ level.com.casic.missiles.modular.neutron: error
+ level.org.springframework.web: info
file:
- path: logs/
\ No newline at end of file
+ path: D:\\robot\\logs
\ No newline at end of file
diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml
index 035cb1f..d3833ab 100644
--- a/casic-web/src/main/resources/config/application.yml
+++ b/casic-web/src/main/resources/config/application.yml
@@ -20,7 +20,7 @@
topic: /sensor_status,get_speed,/get_speed,/get_track_list_response,/get_track_response,/get_navigation_response
completionTimeout: 2000
redis:
- host: 192.168.1.20
+ host: localhost
port: 6379
# password: ew5T4K3#203lwh
database: 3
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index c122d8d..455c4bf 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -4,9 +4,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203
+ password: 123456
druid:
max-active: 50
min-idle: 20
diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml
index 534e2fb..67a0241 100644
--- a/casic-web/src/main/resources/config/application-test.yml
+++ b/casic-web/src/main/resources/config/application-test.yml
@@ -1,30 +1,48 @@
server:
- port: 11307
+ port: 8083
################### spring配置 ###################
spring:
datasource:
- url: jdbc:mysql://localhost:3306/casic_template?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203!
- initial-size: 2
- min-idle: 1
- jms:
- pub-sub-domain: true
-# session:
+ password: 123456
+ druid:
+ max-active: 50
+ min-idle: 20
+jms:
+ pub-sub-domain: true
+# session:
# store-type: redis
+# redis:
+# host: 111.198.10.15
+# port: 11412
+# password: ew5T4K3#203lwh
+# serializer: org.springframework.data.redis.serializer.StringRedisSerializer
+# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
casic:
- # kaptcha-open: false #是否开启登录时验证码 (true/false)
- nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/**
+ #kaptcha-open: false #是否开启登录时验证码 (true/false)
+ no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/websocket/*,/webjars/**,/v2/api-docs,/v2/api-docs-ext,/doc.html,/v2/api-docs/swagger-ui.html,/swagger-resources
#flowable数据源和多数据源配置
- flowable:
- datasource:
- url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
- username: root
- password: Casic203!
-flowable:
- checkProcessDefinitions: false #不校验process文件
+ db:
+ init:
+ enable: false
+ hikSdk: D:\robot\hiklib\HCNetSDK.dll
+ hikPlay: D:\robot\hiklib\PlayCtrl.dll
+ algorithm:
+ path: D:\robot\path\
+ initPathName: init.exe
+ planPathName: search.exe
+ doc:
+ temp: D:\robot\path\report.docx
+ config:
+ export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\
+ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\
logging:
level.root: info
level.com.casic: debug
+ level.com.casic.missiles.netty: error
+ level.com.casic.missiles.modular.neutron: error
+ level.org.springframework.web: info
file:
- path: logs/
\ No newline at end of file
+ path: D:\\robot\\logs
\ No newline at end of file
diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml
index 035cb1f..d3833ab 100644
--- a/casic-web/src/main/resources/config/application.yml
+++ b/casic-web/src/main/resources/config/application.yml
@@ -20,7 +20,7 @@
topic: /sensor_status,get_speed,/get_speed,/get_track_list_response,/get_track_response,/get_navigation_response
completionTimeout: 2000
redis:
- host: 192.168.1.20
+ host: localhost
port: 6379
# password: ew5T4K3#203lwh
database: 3
diff --git a/casic-web/src/main/resources/config/path/Mission1/admatrix.txt b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
new file mode 100644
index 0000000..ce6f742
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
@@ -0,0 +1,2 @@
+0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index c122d8d..455c4bf 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -4,9 +4,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203
+ password: 123456
druid:
max-active: 50
min-idle: 20
diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml
index 534e2fb..67a0241 100644
--- a/casic-web/src/main/resources/config/application-test.yml
+++ b/casic-web/src/main/resources/config/application-test.yml
@@ -1,30 +1,48 @@
server:
- port: 11307
+ port: 8083
################### spring配置 ###################
spring:
datasource:
- url: jdbc:mysql://localhost:3306/casic_template?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203!
- initial-size: 2
- min-idle: 1
- jms:
- pub-sub-domain: true
-# session:
+ password: 123456
+ druid:
+ max-active: 50
+ min-idle: 20
+jms:
+ pub-sub-domain: true
+# session:
# store-type: redis
+# redis:
+# host: 111.198.10.15
+# port: 11412
+# password: ew5T4K3#203lwh
+# serializer: org.springframework.data.redis.serializer.StringRedisSerializer
+# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
casic:
- # kaptcha-open: false #是否开启登录时验证码 (true/false)
- nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/**
+ #kaptcha-open: false #是否开启登录时验证码 (true/false)
+ no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/websocket/*,/webjars/**,/v2/api-docs,/v2/api-docs-ext,/doc.html,/v2/api-docs/swagger-ui.html,/swagger-resources
#flowable数据源和多数据源配置
- flowable:
- datasource:
- url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
- username: root
- password: Casic203!
-flowable:
- checkProcessDefinitions: false #不校验process文件
+ db:
+ init:
+ enable: false
+ hikSdk: D:\robot\hiklib\HCNetSDK.dll
+ hikPlay: D:\robot\hiklib\PlayCtrl.dll
+ algorithm:
+ path: D:\robot\path\
+ initPathName: init.exe
+ planPathName: search.exe
+ doc:
+ temp: D:\robot\path\report.docx
+ config:
+ export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\
+ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\
logging:
level.root: info
level.com.casic: debug
+ level.com.casic.missiles.netty: error
+ level.com.casic.missiles.modular.neutron: error
+ level.org.springframework.web: info
file:
- path: logs/
\ No newline at end of file
+ path: D:\\robot\\logs
\ No newline at end of file
diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml
index 035cb1f..d3833ab 100644
--- a/casic-web/src/main/resources/config/application.yml
+++ b/casic-web/src/main/resources/config/application.yml
@@ -20,7 +20,7 @@
topic: /sensor_status,get_speed,/get_speed,/get_track_list_response,/get_track_response,/get_navigation_response
completionTimeout: 2000
redis:
- host: 192.168.1.20
+ host: localhost
port: 6379
# password: ew5T4K3#203lwh
database: 3
diff --git a/casic-web/src/main/resources/config/path/Mission1/admatrix.txt b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
new file mode 100644
index 0000000..ce6f742
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
@@ -0,0 +1,2 @@
+0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/expandmap.txt b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
new file mode 100644
index 0000000..647a4b8
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index c122d8d..455c4bf 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -4,9 +4,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203
+ password: 123456
druid:
max-active: 50
min-idle: 20
diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml
index 534e2fb..67a0241 100644
--- a/casic-web/src/main/resources/config/application-test.yml
+++ b/casic-web/src/main/resources/config/application-test.yml
@@ -1,30 +1,48 @@
server:
- port: 11307
+ port: 8083
################### spring配置 ###################
spring:
datasource:
- url: jdbc:mysql://localhost:3306/casic_template?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203!
- initial-size: 2
- min-idle: 1
- jms:
- pub-sub-domain: true
-# session:
+ password: 123456
+ druid:
+ max-active: 50
+ min-idle: 20
+jms:
+ pub-sub-domain: true
+# session:
# store-type: redis
+# redis:
+# host: 111.198.10.15
+# port: 11412
+# password: ew5T4K3#203lwh
+# serializer: org.springframework.data.redis.serializer.StringRedisSerializer
+# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
casic:
- # kaptcha-open: false #是否开启登录时验证码 (true/false)
- nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/**
+ #kaptcha-open: false #是否开启登录时验证码 (true/false)
+ no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/websocket/*,/webjars/**,/v2/api-docs,/v2/api-docs-ext,/doc.html,/v2/api-docs/swagger-ui.html,/swagger-resources
#flowable数据源和多数据源配置
- flowable:
- datasource:
- url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
- username: root
- password: Casic203!
-flowable:
- checkProcessDefinitions: false #不校验process文件
+ db:
+ init:
+ enable: false
+ hikSdk: D:\robot\hiklib\HCNetSDK.dll
+ hikPlay: D:\robot\hiklib\PlayCtrl.dll
+ algorithm:
+ path: D:\robot\path\
+ initPathName: init.exe
+ planPathName: search.exe
+ doc:
+ temp: D:\robot\path\report.docx
+ config:
+ export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\
+ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\
logging:
level.root: info
level.com.casic: debug
+ level.com.casic.missiles.netty: error
+ level.com.casic.missiles.modular.neutron: error
+ level.org.springframework.web: info
file:
- path: logs/
\ No newline at end of file
+ path: D:\\robot\\logs
\ No newline at end of file
diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml
index 035cb1f..d3833ab 100644
--- a/casic-web/src/main/resources/config/application.yml
+++ b/casic-web/src/main/resources/config/application.yml
@@ -20,7 +20,7 @@
topic: /sensor_status,get_speed,/get_speed,/get_track_list_response,/get_track_response,/get_navigation_response
completionTimeout: 2000
redis:
- host: 192.168.1.20
+ host: localhost
port: 6379
# password: ew5T4K3#203lwh
database: 3
diff --git a/casic-web/src/main/resources/config/path/Mission1/admatrix.txt b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
new file mode 100644
index 0000000..ce6f742
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
@@ -0,0 +1,2 @@
+0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/expandmap.txt b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
new file mode 100644
index 0000000..647a4b8
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/separate_img.png b/casic-web/src/main/resources/config/path/Mission1/separate_img.png
new file mode 100644
index 0000000..8fc19f9
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/separate_img.png
Binary files differ
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index c122d8d..455c4bf 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -4,9 +4,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203
+ password: 123456
druid:
max-active: 50
min-idle: 20
diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml
index 534e2fb..67a0241 100644
--- a/casic-web/src/main/resources/config/application-test.yml
+++ b/casic-web/src/main/resources/config/application-test.yml
@@ -1,30 +1,48 @@
server:
- port: 11307
+ port: 8083
################### spring配置 ###################
spring:
datasource:
- url: jdbc:mysql://localhost:3306/casic_template?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203!
- initial-size: 2
- min-idle: 1
- jms:
- pub-sub-domain: true
-# session:
+ password: 123456
+ druid:
+ max-active: 50
+ min-idle: 20
+jms:
+ pub-sub-domain: true
+# session:
# store-type: redis
+# redis:
+# host: 111.198.10.15
+# port: 11412
+# password: ew5T4K3#203lwh
+# serializer: org.springframework.data.redis.serializer.StringRedisSerializer
+# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
casic:
- # kaptcha-open: false #是否开启登录时验证码 (true/false)
- nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/**
+ #kaptcha-open: false #是否开启登录时验证码 (true/false)
+ no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/websocket/*,/webjars/**,/v2/api-docs,/v2/api-docs-ext,/doc.html,/v2/api-docs/swagger-ui.html,/swagger-resources
#flowable数据源和多数据源配置
- flowable:
- datasource:
- url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
- username: root
- password: Casic203!
-flowable:
- checkProcessDefinitions: false #不校验process文件
+ db:
+ init:
+ enable: false
+ hikSdk: D:\robot\hiklib\HCNetSDK.dll
+ hikPlay: D:\robot\hiklib\PlayCtrl.dll
+ algorithm:
+ path: D:\robot\path\
+ initPathName: init.exe
+ planPathName: search.exe
+ doc:
+ temp: D:\robot\path\report.docx
+ config:
+ export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\
+ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\
logging:
level.root: info
level.com.casic: debug
+ level.com.casic.missiles.netty: error
+ level.com.casic.missiles.modular.neutron: error
+ level.org.springframework.web: info
file:
- path: logs/
\ No newline at end of file
+ path: D:\\robot\\logs
\ No newline at end of file
diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml
index 035cb1f..d3833ab 100644
--- a/casic-web/src/main/resources/config/application.yml
+++ b/casic-web/src/main/resources/config/application.yml
@@ -20,7 +20,7 @@
topic: /sensor_status,get_speed,/get_speed,/get_track_list_response,/get_track_response,/get_navigation_response
completionTimeout: 2000
redis:
- host: 192.168.1.20
+ host: localhost
port: 6379
# password: ew5T4K3#203lwh
database: 3
diff --git a/casic-web/src/main/resources/config/path/Mission1/admatrix.txt b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
new file mode 100644
index 0000000..ce6f742
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
@@ -0,0 +1,2 @@
+0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/expandmap.txt b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
new file mode 100644
index 0000000..647a4b8
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/separate_img.png b/casic-web/src/main/resources/config/path/Mission1/separate_img.png
new file mode 100644
index 0000000..8fc19f9
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/separate_img.png
Binary files differ
diff --git a/casic-web/src/main/resources/config/path/Mission1/separate_img.txt b/casic-web/src/main/resources/config/path/Mission1/separate_img.txt
new file mode 100644
index 0000000..e00f995
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/separate_img.txt
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+00 2.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index c122d8d..455c4bf 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -4,9 +4,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203
+ password: 123456
druid:
max-active: 50
min-idle: 20
diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml
index 534e2fb..67a0241 100644
--- a/casic-web/src/main/resources/config/application-test.yml
+++ b/casic-web/src/main/resources/config/application-test.yml
@@ -1,30 +1,48 @@
server:
- port: 11307
+ port: 8083
################### spring配置 ###################
spring:
datasource:
- url: jdbc:mysql://localhost:3306/casic_template?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203!
- initial-size: 2
- min-idle: 1
- jms:
- pub-sub-domain: true
-# session:
+ password: 123456
+ druid:
+ max-active: 50
+ min-idle: 20
+jms:
+ pub-sub-domain: true
+# session:
# store-type: redis
+# redis:
+# host: 111.198.10.15
+# port: 11412
+# password: ew5T4K3#203lwh
+# serializer: org.springframework.data.redis.serializer.StringRedisSerializer
+# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
casic:
- # kaptcha-open: false #是否开启登录时验证码 (true/false)
- nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/**
+ #kaptcha-open: false #是否开启登录时验证码 (true/false)
+ no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/websocket/*,/webjars/**,/v2/api-docs,/v2/api-docs-ext,/doc.html,/v2/api-docs/swagger-ui.html,/swagger-resources
#flowable数据源和多数据源配置
- flowable:
- datasource:
- url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
- username: root
- password: Casic203!
-flowable:
- checkProcessDefinitions: false #不校验process文件
+ db:
+ init:
+ enable: false
+ hikSdk: D:\robot\hiklib\HCNetSDK.dll
+ hikPlay: D:\robot\hiklib\PlayCtrl.dll
+ algorithm:
+ path: D:\robot\path\
+ initPathName: init.exe
+ planPathName: search.exe
+ doc:
+ temp: D:\robot\path\report.docx
+ config:
+ export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\
+ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\
logging:
level.root: info
level.com.casic: debug
+ level.com.casic.missiles.netty: error
+ level.com.casic.missiles.modular.neutron: error
+ level.org.springframework.web: info
file:
- path: logs/
\ No newline at end of file
+ path: D:\\robot\\logs
\ No newline at end of file
diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml
index 035cb1f..d3833ab 100644
--- a/casic-web/src/main/resources/config/application.yml
+++ b/casic-web/src/main/resources/config/application.yml
@@ -20,7 +20,7 @@
topic: /sensor_status,get_speed,/get_speed,/get_track_list_response,/get_track_response,/get_navigation_response
completionTimeout: 2000
redis:
- host: 192.168.1.20
+ host: localhost
port: 6379
# password: ew5T4K3#203lwh
database: 3
diff --git a/casic-web/src/main/resources/config/path/Mission1/admatrix.txt b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
new file mode 100644
index 0000000..ce6f742
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
@@ -0,0 +1,2 @@
+0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/expandmap.txt b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
new file mode 100644
index 0000000..647a4b8
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/separate_img.png b/casic-web/src/main/resources/config/path/Mission1/separate_img.png
new file mode 100644
index 0000000..8fc19f9
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/separate_img.png
Binary files differ
diff --git a/casic-web/src/main/resources/config/path/Mission1/separate_img.txt b/casic-web/src/main/resources/config/path/Mission1/separate_img.txt
new file mode 100644
index 0000000..e00f995
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/separate_img.txt
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+00 2.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/map.txt b/casic-web/src/main/resources/config/path/map.txt
index 61e2959..f44820b 100644
--- a/casic-web/src/main/resources/config/path/map.txt
+++ b/casic-web/src/main/resources/config/path/map.txt
@@ -1,36 +1,93 @@
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0
-0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
-0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0
-0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index c122d8d..455c4bf 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -4,9 +4,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203
+ password: 123456
druid:
max-active: 50
min-idle: 20
diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml
index 534e2fb..67a0241 100644
--- a/casic-web/src/main/resources/config/application-test.yml
+++ b/casic-web/src/main/resources/config/application-test.yml
@@ -1,30 +1,48 @@
server:
- port: 11307
+ port: 8083
################### spring配置 ###################
spring:
datasource:
- url: jdbc:mysql://localhost:3306/casic_template?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203!
- initial-size: 2
- min-idle: 1
- jms:
- pub-sub-domain: true
-# session:
+ password: 123456
+ druid:
+ max-active: 50
+ min-idle: 20
+jms:
+ pub-sub-domain: true
+# session:
# store-type: redis
+# redis:
+# host: 111.198.10.15
+# port: 11412
+# password: ew5T4K3#203lwh
+# serializer: org.springframework.data.redis.serializer.StringRedisSerializer
+# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
casic:
- # kaptcha-open: false #是否开启登录时验证码 (true/false)
- nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/**
+ #kaptcha-open: false #是否开启登录时验证码 (true/false)
+ no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/websocket/*,/webjars/**,/v2/api-docs,/v2/api-docs-ext,/doc.html,/v2/api-docs/swagger-ui.html,/swagger-resources
#flowable数据源和多数据源配置
- flowable:
- datasource:
- url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
- username: root
- password: Casic203!
-flowable:
- checkProcessDefinitions: false #不校验process文件
+ db:
+ init:
+ enable: false
+ hikSdk: D:\robot\hiklib\HCNetSDK.dll
+ hikPlay: D:\robot\hiklib\PlayCtrl.dll
+ algorithm:
+ path: D:\robot\path\
+ initPathName: init.exe
+ planPathName: search.exe
+ doc:
+ temp: D:\robot\path\report.docx
+ config:
+ export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\
+ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\
logging:
level.root: info
level.com.casic: debug
+ level.com.casic.missiles.netty: error
+ level.com.casic.missiles.modular.neutron: error
+ level.org.springframework.web: info
file:
- path: logs/
\ No newline at end of file
+ path: D:\\robot\\logs
\ No newline at end of file
diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml
index 035cb1f..d3833ab 100644
--- a/casic-web/src/main/resources/config/application.yml
+++ b/casic-web/src/main/resources/config/application.yml
@@ -20,7 +20,7 @@
topic: /sensor_status,get_speed,/get_speed,/get_track_list_response,/get_track_response,/get_navigation_response
completionTimeout: 2000
redis:
- host: 192.168.1.20
+ host: localhost
port: 6379
# password: ew5T4K3#203lwh
database: 3
diff --git a/casic-web/src/main/resources/config/path/Mission1/admatrix.txt b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
new file mode 100644
index 0000000..ce6f742
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
@@ -0,0 +1,2 @@
+0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/expandmap.txt b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
new file mode 100644
index 0000000..647a4b8
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/separate_img.png b/casic-web/src/main/resources/config/path/Mission1/separate_img.png
new file mode 100644
index 0000000..8fc19f9
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/separate_img.png
Binary files differ
diff --git a/casic-web/src/main/resources/config/path/Mission1/separate_img.txt b/casic-web/src/main/resources/config/path/Mission1/separate_img.txt
new file mode 100644
index 0000000..e00f995
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/separate_img.txt
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+00 2.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/map.txt b/casic-web/src/main/resources/config/path/map.txt
index 61e2959..f44820b 100644
--- a/casic-web/src/main/resources/config/path/map.txt
+++ b/casic-web/src/main/resources/config/path/map.txt
@@ -1,36 +1,93 @@
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0
-0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
-0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0
-0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
diff --git a/casic-web/src/main/resources/config/path/map2.txt b/casic-web/src/main/resources/config/path/map2.txt
new file mode 100644
index 0000000..13dc54c
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/map2.txt
@@ -0,0 +1,116 @@
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
index 3567647..c69f6ff 100644
--- a/casic-server/pom.xml
+++ b/casic-server/pom.xml
@@ -30,6 +30,11 @@
com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
+ com.casic
casic-admin-support
${admin.version}
provided
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
index a849528..4f34669 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java
@@ -29,6 +29,7 @@
String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_";
String KEY_COST_MAP = "KEY_COST_MAP";
+ String KEY_COST_MAP_HEIGHT = "KEY_COST_MAP_HEIGHT";
/**
* PSD数据ID
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
index bdfc2d0..d7736a5 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/neutron/service/impl/PsdServiceImpl.java
@@ -148,7 +148,7 @@
public void insertPsdAlarms() {
times++;
//先查询正在巡检任务信息
- List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 1);
+ List taskInfoList = iTaskInfoService.getTaskListByStatus(0, 1, 2);
List alarmRecordList = new ArrayList<>();
long currentTimes = System.currentTimeMillis();
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
index 92c8c8e..6e94193 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java
@@ -5,10 +5,7 @@
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest;
-import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse;
-import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO;
-import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.*;
/**
* 机器人操作类
@@ -76,4 +73,11 @@
void reloadPcd(RobotInfo info);
void startTrack(StartTrackRequest request);
+
+ /**
+ * 栅格寻点指令
+ * @param request 请求
+ * @return
+ */
+ ResponseDataDTO targetGrid(TargetPointRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
index 3bb475f..d8b3363 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
@@ -25,7 +26,6 @@
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +76,13 @@
@Value("${casic.file.uploadPath}")
private String filePath;
+ /**
+ * /{robotId}
+ *
+ * @param file
+ * @param robotId
+ * @return
+ */
@SneakyThrows
@ApiOperation(value = "PCD上传接口")
@PostMapping(value = "/uploadPcd")
@@ -109,7 +116,12 @@
robotInfoService.updateSpeed(robotInfo);
return ResponseDataDTO.success();
}
-
+ @ApiOperation(value = "设置任务启动模式", notes = "返回 1成功 0失败")
+ @PostMapping(value = "/setTaskMode")
+ public ResponseDataDTO setTaskMode(@RequestBody TaskModeRequest request) {
+ robotInfoService.setTaskMode(request);
+ return ResponseDataDTO.success();
+ }
@ApiOperation(value = "机器人数据更新", notes = "1.pcd重载 2.路线及关键点数据重载")
@PostMapping(value = "/reload")
public ResponseDataDTO reload(@RequestBody BaseRobotCmdDTO request) {
@@ -149,6 +161,8 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD);
}
+
+
/**
* 机器人请求id
*
@@ -161,6 +175,16 @@
return baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
}
+ @ApiOperation(value = "寻栅格指令")
+ @PostMapping(value = "/targetGrid")
+ public ResponseDataDTO targetGrid(@RequestBody TargetGridRequest request) {
+ TargetPointRequest targetPointRequest = new TargetPointRequest();
+ targetPointRequest.setRobotId(request.getRobotId());
+ targetPointRequest.setX(request.getEstimateGridX());
+ targetPointRequest.setY(request.getEstimateGridY());
+ return baseRobotService.targetGrid(targetPointRequest);
+ }
+
/**
* 机器人请求id
*
@@ -174,6 +198,7 @@
if (request.getStepLen() == null) {
request.setStepLen(2);
}
+ log.info(JSON.toJSONString(request));
baseRobotService.startTrack(request);
return ResponseDataDTO.success();
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
new file mode 100644
index 0000000..709bcd3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridDTO.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+@Data
+public class GridDTO {
+ /**
+ * 当前栅格x
+ */
+ private Integer currGridX;
+ /**
+ * 当前栅格y
+ */
+ private Integer currGridY;
+ /**
+ * 规划栅格x
+ */
+ private Integer estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private Integer estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
new file mode 100644
index 0000000..7eae335
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPushDTO.java
@@ -0,0 +1,25 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class GridPushDTO {
+ /**
+ * 当前栅格x
+ */
+ private BigDecimal currGridX;
+ /**
+ * 当前栅格y
+ */
+ private BigDecimal currGridY;
+
+ /**
+ * 规划栅格x
+ */
+ private BigDecimal estimateGridX;
+ /**
+ * 规划栅格y
+ */
+ private BigDecimal estimateGridY;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
index acbeb93..b9ad7a3 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java
@@ -23,4 +23,8 @@
private BigDecimal gridWidth;
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
private BigDecimal resolution;
+ @ApiModelProperty(value = "新设原点X", dataType = "BigDecimal")
+ private BigDecimal newX;
+ @ApiModelProperty(value = "新设原点Y", dataType = "BigDecimal")
+ private BigDecimal newY;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
new file mode 100644
index 0000000..acc38f3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/TaskEndMsg.java
@@ -0,0 +1,15 @@
+package com.casic.missiles.modular.robot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TaskEndMsg implements Serializable {
+ private String robotId;
+ private String message;
+ /**
+ * 1 正常 0 异常
+ */
+ private Integer code;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
index 90e4dcf..d5ae18a 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java
@@ -154,7 +154,46 @@
@ApiModelProperty(value = "栅格分辨率", dataType = "BigDecimal")
@TableField("resolution")
private BigDecimal resolution;
+ /**
+ * 新设定栅格原点X
+ */
+ @TableField("new_origin_x")
+ private BigDecimal newOriginX;
+ /**
+ * 新设定栅格原点Y
+ */
+ @TableField("new_origin_y")
+ private BigDecimal newOriginY;
+ /**
+ * 新设定栅格X
+ */
+ @TableField("new_grid_x")
+ private Integer newGridX;
+ /**
+ * 新设定栅格Y
+ */
+ @TableField("new_grid_y")
+ private Integer newGridY;
+
+ /**
+ * 裁剪右顶点X
+ */
+ @TableField("right_grid_x")
+ private Integer rightGridX;
+ @TableField("is_open")
+ private Integer isOpen;
+ /**
+ * 裁剪右顶点Y
+ */
+ @TableField("right_grid_y")
+ private Integer rightGridY;
+ public BigDecimal getNewX(){
+ return newOriginX;
+ }
+ public BigDecimal getNewY(){
+ return newOriginY;
+ }
@Override
public String toString() {
return "RobotInfo{"
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
index 2cb752f..3e741d7 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java
@@ -24,7 +24,10 @@
*
* @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl
*/
- HEAT_MAP("heat_map" , "机器人热力图");
+ HEAT_MAP("heat_map" , "机器人热力图"),
+ GRID("grid" , "栅格推送"),
+ TASK_END("task_end" , "任务结束");
+
/**
* 请求地址
*/
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
index 88c9f79..3c93145 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java
@@ -32,7 +32,6 @@
@Override
public void process(String robotId, String topic, MqttMessage message) {
statusInfoService.saveCostMap(robotId, message);
-
CostMapResolutionRequest costMapSet = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
if(costMapSet != null){
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CONFIG_COSTMAP_RESOLUTION_SET +robotId);
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
index 8a71e0b..06f8ae6 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java
@@ -30,10 +30,9 @@
public void process(String robotId, String topic, MqttMessage message) {
index.put(index_key, index.get("index") + 1);
- if (index.get(index_key)>30) {
+ if (index.get(index_key)>1) {
index.put(index_key, 0);
log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString());
-
statusInfoService.saveStopState(robotId, message);
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
index a9d7914..755997e 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java
@@ -39,10 +39,8 @@
index.put(index_key, index.get("index") + 1);
if (index.get(index_key) > 50) {
index.put(index_key, 0);
- log.info("----------------------电压信息反馈:{}", message);
statusInfoService.saveVoltageResponseMessage(robotId, message);
}
- sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message);
try {
RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId);
@@ -74,10 +72,12 @@
robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity());
}
}
+
//读取缓存信息
sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo);
} catch (Exception e) {
e.printStackTrace();
}
+
}
-}
+}
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
index 7940a24..40a60a1 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java
@@ -1,9 +1,13 @@
package com.casic.missiles.modular.robot.opt.impl;
import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.core.util.SpringContextHolder;
+import com.casic.missiles.model.exception.ServiceException;
import com.casic.missiles.model.response.dto.ResponseDataDTO;
+import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.IBaseRobotService;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
import com.casic.missiles.modular.robot.opt.IRobotRouteOptService;
@@ -11,6 +15,7 @@
import com.casic.missiles.modular.robot.opt.handler.IBaseCmdHandler;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO;
import com.casic.missiles.modular.robot.opt.instruct.dto.*;
+import com.casic.missiles.modular.robot.service.IAlgorithmService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.ITaskInfoService;
import com.casic.missiles.mqtt.config.MqttClientConnection;
@@ -32,11 +37,13 @@
private final IRobotRouteOptService robotRouteOptService;
private final IRobotInfoService robotInfoService;
private final ITaskInfoService taskInfoService;
+ private final IAlgorithmService algorithmService;
- public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService) {
+ public RobotOptServiceImpl(IRobotRouteOptService robotRouteOptService, @Lazy IRobotInfoService robotInfoService, ITaskInfoService taskInfoService, @Lazy IAlgorithmService algorithmService) {
this.robotRouteOptService = robotRouteOptService;
this.robotInfoService = robotInfoService;
this.taskInfoService = taskInfoService;
+ this.algorithmService = algorithmService;
}
/**
@@ -117,7 +124,7 @@
//线路关键点读取
if (requestDTO.getData() != null) {
for (RouteInfo routeInfo : requestDTO.getData()) {
- if("11-1 79-1".equals(routeInfo.getRouteName())){
+ if ("11-1 79-1".equals(routeInfo.getRouteName())) {
continue;
}
TrackPointListRequest request = new TrackPointListRequest();
@@ -141,6 +148,7 @@
//机器人pcd读取
robotInfoService.loadPcd(info);
}
+
@Transactional
@Override
public void startTrack(StartTrackRequest request) {
@@ -149,6 +157,25 @@
// this.execCmdHandler(request, InstructCodeEnums.START_TRACK);
}
+ @Override
+ public ResponseDataDTO targetGrid(TargetPointRequest request) {
+ PoseMessageResponseDTO responseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + request.getRobotId());
+ if(responseDTO==null){
+ throw new ServiceException(500,"请优先开启导航");
+ }
+ RobotInfo robotInfo = robotInfoService.getById(request.getRobotId());
+ GridPointDTO gridPointDTO = new GridPointDTO();
+ //获取栅格中心点
+ GridPointDTO pointDTO = algorithmService.convertGridCenterPoint(gridPointDTO,robotInfo.getResolution(),robotInfo);
+ request.setX(pointDTO.getX().toString());
+ request.setY(pointDTO.getY().toString());
+ request.setZ(responseDTO.getZ().toString());
+ request.setTheta(responseDTO.getTheta().toString());
+ //执行巡点指令
+ ResponseDataDTO responseDataDTO = this.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
+ return responseDataDTO;
+ }
+
public IRobotRouteOptService getRobotRouteOptService() {
return robotRouteOptService;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
new file mode 100644
index 0000000..7d69964
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TargetGridRequest.java
@@ -0,0 +1,19 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取循迹路线下发指令
+ */
+@Data
+public class TargetGridRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "栅格x坐标", dataType = "String")
+ private String estimateGridX;
+ @ApiModelProperty(value = "栅格y坐标", dataType = "String")
+ private String estimateGridY;
+ @ApiModelProperty(value = "z坐标", dataType = "String")
+ private String z;
+ @ApiModelProperty(value = "theta", dataType = "String")
+ private String theta;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
new file mode 100644
index 0000000..763656b
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/TaskModeRequest.java
@@ -0,0 +1,13 @@
+package com.casic.missiles.modular.robot.opt.instruct.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 导航下发指令
+ */
+@Data
+public class TaskModeRequest extends BaseRobotCmdDTO {
+ @ApiModelProperty(value = "控制模式 1:手动 0:自动", dataType = "String")
+ private Integer isOpen;
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
index 8c95459..89697b8 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java
@@ -6,6 +6,7 @@
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RouteInfo;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import java.util.List;
@@ -52,4 +53,6 @@
* @param dto 栅格信息
*/
void updateRobotGrid(String robotId, AppCostmapResponseDTO dto);
+
+ void setTaskMode(TaskModeRequest request);
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
index a4dbe0b..a6f5116 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java
@@ -167,24 +167,35 @@
y = y.subtract(robotInfo.getOriginY());
pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
return pointDTO;
}
/**
+ * do栅格转xy
* 根据栅格读取栅格中心点位信息
*
* @param pointDTO 栅格信息
* @return
*/
public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo) {
+
+ pointDTO.setX(pointDTO.getX().add(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().add(new BigDecimal(robotInfo.getNewGridY())));
+
GridPointDTO centerPoint = new GridPointDTO();
BigDecimal scale = resolution;
//点位转换 转换后栅格-1 从1开始计算
BigDecimal slamX = (pointDTO.getX().subtract(new BigDecimal(1))).multiply(scale);
BigDecimal slamY = (pointDTO.getY().subtract(new BigDecimal(1))).multiply(scale);
+
//中心栅格点位中心添加
centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 10, BigDecimal.ROUND_HALF_UP)));
+
//加上栅格原点坐标
centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX()));
centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY()));
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
index e2879ce..f825e84 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java
@@ -9,6 +9,8 @@
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.IRobotCacheService;
import com.casic.missiles.modular.robot.service.IRobotInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@@ -18,7 +20,8 @@
public RobotCacheServiceImpl(IRobotInfoService robotInfoService) {
this.robotInfoService = robotInfoService;
}
-
+ @Autowired
+ private RedisTemplate redisTemplate;
@Override
public synchronized boolean updateTaskId(Long robotId, Long taskId) {
//读取当前机器人任务信息
@@ -83,12 +86,14 @@
@Override
public void updateCostMap(String robotId, AppCostmapResponseDTO msg) {
- CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
+ redisTemplate.opsForValue().set(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId,msg);
+// CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg);
}
@Override
public AppCostmapResponseDTO getCostMap(String robotId) {
- return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+ return (AppCostmapResponseDTO) redisTemplate.opsForValue().get(RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
+// return CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId);
}
@Override
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
index fdded64..cdbbe89 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java
@@ -12,11 +12,13 @@
import com.casic.missiles.core.application.service.AbstractDictService;
import com.casic.missiles.modular.robot.IBaseRobotService;
import com.casic.missiles.modular.robot.dao.RobotInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO;
import com.casic.missiles.modular.robot.model.*;
import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest;
import com.casic.missiles.modular.robot.opt.instruct.dto.DataRecordRequest;
+import com.casic.missiles.modular.robot.opt.instruct.dto.TaskModeRequest;
import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO;
import com.casic.missiles.modular.robot.service.*;
import com.casic.missiles.modular.robot.utils.PcdDownUtil;
@@ -51,16 +53,18 @@
private final IDeviceInfoService deviceInfoService;
private final IRobotPointInfoService pointInfoService;
private final IBaseRobotService baseRobotService;
+ private final IAlgorithmService algorithmService;
@Value("${casic.file.uploadPath}")
private String filePath;
- public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService) {
+ public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService, @Lazy IBaseRobotService baseRobotService, @Lazy IAlgorithmService algorithmService) {
this.robotStatusInfoService = robotStatusInfoService;
this.dictService = dictService;
this.routeInfoService = routeInfoService;
this.deviceInfoService = deviceInfoService;
this.pointInfoService = pointInfoService;
this.baseRobotService = baseRobotService;
+ this.algorithmService = algorithmService;
}
@Transactional
@@ -96,15 +100,30 @@
}
if (robotInfo.getAlarmThreshold() != null) {
update.set(RobotInfo::getAlarmThreshold, robotInfo.getAlarmThreshold());
+ update.set(RobotInfo::getMaxThreshold, robotInfo.getAlarmThreshold());
}
if (robotInfo.getGridHeight() != null && robotInfo.getGridWidth() != null) {
+ RobotInfo oldRobotInfo = getById(robotInfo.getId());
update.set(RobotInfo::getGridHeight, robotInfo.getGridHeight());
update.set(RobotInfo::getGridWidth, robotInfo.getGridWidth());
update.set(RobotInfo::getResolution, robotInfo.getResolution());
+ update.set(RobotInfo::getNewOriginX, robotInfo.getNewX());
+ update.set(RobotInfo::getNewOriginY, robotInfo.getNewY());
+ //计算左下原点
+ oldRobotInfo.setNewGridX(0);
+ oldRobotInfo.setNewGridY(0);
+ GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(robotInfo.getNewX(), robotInfo.getNewY(), robotInfo.getResolution(), oldRobotInfo);
+ update.set(RobotInfo::getNewGridX, gridPointDTO.getX().intValue());
+ update.set(RobotInfo::getNewGridY, gridPointDTO.getY().intValue());
+ //计算右顶点
+ Integer rightX = robotInfo.getGridWidth().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ Integer rightY = robotInfo.getGridHeight().divide(robotInfo.getResolution(), 0, BigDecimal.ROUND_HALF_UP).intValue();
+ update.set(RobotInfo::getRightGridX, rightX);
+ update.set(RobotInfo::getRightGridY, rightY);
+
//下发障碍物栅格
sendCostMapResolution(robotInfo.getResolution(), robotInfo.getId());
- //重新生成栅格地图
- //sendChangePcd(robotInfo.getId());
+
}
update.eq(RobotInfo::getId, robotInfo.getId());
update(update);
@@ -162,6 +181,16 @@
update(lambdaUpdateWrapper);
}
+ @Override
+ public void setTaskMode(TaskModeRequest request) {
+ if (request.getRobotId() != null) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(RobotInfo::getIsOpen, request.getIsOpen());
+ lambdaUpdateWrapper.eq(RobotInfo::getId, request.getRobotId());
+ update(lambdaUpdateWrapper);
+ }
+ }
+
@Transactional
@Override
public List list(Wrapper queryWrapper) {
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
index 46b5c3b..f52940c 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -13,9 +14,9 @@
import com.casic.missiles.core.cache.CacheUtil;
import com.casic.missiles.modular.constants.RobotDictConstants;
import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper;
+import com.casic.missiles.modular.robot.dto.GridPointDTO;
import com.casic.missiles.modular.robot.model.RobotInfo;
import com.casic.missiles.modular.robot.model.RobotStatusInfo;
-import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO;
import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO;
@@ -27,7 +28,6 @@
import com.casic.missiles.modular.robot.service.IRobotInfoService;
import com.casic.missiles.modular.robot.service.IRobotStatusInfoService;
import lombok.extern.slf4j.Slf4j;
-import org.aspectj.util.FileUtil;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@@ -38,8 +38,8 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -81,6 +81,11 @@
}
private void wrapInfo(RobotStatusInfo statusInfo) {
+ // todo 报错
+ StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + statusInfo.getRobotId());
+ if (stopStateResponseDTO != null) {
+ statusInfo.setSoft(stopStateResponseDTO.getSoft());
+ }
statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType()));
//暂停状态
@@ -262,6 +267,8 @@
*/
@Value("${casic.algorithm.num:30}")
private Integer num;
+ @Value("${casic.obstacle:60}")
+ private Integer obstacle;
/**
* 机器人栅格数据
@@ -276,7 +283,6 @@
});
if (responseDTO != null && responseDTO.getMsg() != null) {
//发送栅格分辨率设定
-
cacheService.updateCostMap(robotId, responseDTO.getMsg());
robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg());
//log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg()));
@@ -290,24 +296,102 @@
} else {
dataNums.add(1);
}
+ } else {
+ dataNums.add(-1);
}
}
- writeCache(dataNums,responseDTO.getMsg().getWidth(),responseDTO.getMsg().getHeight(),robotId);
+ writeCache(dataNums, responseDTO.getMsg().getWidth(), responseDTO.getMsg().getHeight(), robotId);
}
}
}
- private void writeCache(ArrayList integers,Integer width,Integer height,String robotId) {
- List> arrays = CollectionUtil.split(integers,width);
+ private void writeCache(ArrayList integers, Integer width, Integer height, String robotId) {
+ List> arrays = CollectionUtil.split(integers, width);
ArrayList> arrayList = new ArrayList<>();
for (List array : arrays) {
- arrayList.add((ArrayList)array);
+ ArrayList list =(ArrayList)array.stream().filter(integer -> integer>=0).collect(Collectors.toList());
+ arrayList.add(list);
}
CollectionUtil.reverse(arrayList);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId, arrayList);
-// FileUtil.writeAsString(new File(path + "map.txt"), CollectionUtil.join(integers, " ").replaceAll("\\[", "").replaceAll("]", ""));
+ //写入栅格宽度
+ CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId, height);
+
+ writeCost(arrayList,width,height,robotId);
+ }
+ /**
+ * slam经纬度转换为栅格
+ *
+ * @param x slam x
+ * @param y slam y
+ */
+ public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, BigDecimal resolution, RobotInfo robotInfo) {
+ GridPointDTO pointDTO = new GridPointDTO();
+ BigDecimal scale = resolution;
+ //减去栅格原点坐标
+ x = x.subtract(robotInfo.getOriginX());
+ y = y.subtract(robotInfo.getOriginY());
+ pointDTO.setX(new BigDecimal(x.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue()+1));
+ pointDTO.setY(new BigDecimal(y.divide(scale, 3, BigDecimal.ROUND_HALF_UP).intValue() +1));
+
+ //todo 原点栅格转换,减去相对原点值
+ pointDTO.setX(pointDTO.getX().subtract(new BigDecimal(robotInfo.getNewGridX())));
+ pointDTO.setY(pointDTO.getY().subtract(new BigDecimal(robotInfo.getNewGridY())));
+ return pointDTO;
}
+ private void writeCost(ArrayList> costList,Integer width, Integer height,String robotId){
+ List strs = new ArrayList<>();
+ List strs2 = new ArrayList<>();
+ RobotInfo robotInfo = cacheService.getRobotInfo(Long.valueOf(robotId));
+ if(robotInfo==null||robotInfo.getGridWidth()==null||robotInfo.getResolution() ==null){
+ log.info("robot gridHeight is not found....");
+ return;
+ }
+
+ //计算左下角位置
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height-robotInfo.getNewGridY();
+// log.info("left point:({},{})",robotInfo.getNewGridX(),robotInfo.getNewGridY());
+ //计算右上角位置
+ Integer rightX = robotInfo.getRightGridX();
+ Integer rightY = height-robotInfo.getRightGridY();
+// log.info("right point:({},{})",rightX,rightY);
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if(i<=newY&&i>=rightY){
+ List newList = new ArrayList<>();
+ List sourceList= costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if(j>=newX&&j<=rightX){
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+
+ for (List list : newCostList) {
+ strs2.add(CollectionUtil.join(list, " "));
+ }
+
+ FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+ //行转列 为算法输入数据
+ if(CollectionUtil.isNotEmpty(newCostList)){
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
+ ArrayList ints = new ArrayList<>();
+ for (List list : newCostList) {
+ ints.add(list.get(i));
+ }
+ strs.add(CollectionUtil.join(ints, " "));
+ }
+ }
+
+ FileUtil.writeLines(strs, new File(path + "map3.txt"), "utf-8");
+ }
@Override
public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) {
UpdateWrapper query = new UpdateWrapper<>();
@@ -327,7 +411,6 @@
json = json.substring(0, json.length() - 1);
}
json = json.replaceAll("\\\\", "");
-// log.info(json);
RobotResponseDTO responseDTO = JSON.parseObject(json, cls);
return responseDTO;
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
index f1262a2..cb7aa09 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java
@@ -69,17 +69,6 @@
} catch (Exception e) {
log.error("task error", e);
}
-// if (routeId != null) {
-// RobotTrajectoryInfo info = new RobotTrajectoryInfo();
-// info.setRobotId(Long.valueOf(robotId));
-// info.setCreateTime(new Date());
-// info.setPostionX(dto.getX());
-// info.setPostionY(dto.getY());
-// info.setPostionZ(dto.getZ());
-// info.setTheta(dto.getTheta());
-// save(info);
-
-// }
}
}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
index fd49e2e..6a0e719 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java
@@ -47,6 +47,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -81,15 +82,16 @@
/**
* 5000 ms
*/
- @Value("${casic.task.duration:3000}")
+ @Value("${casic.task.duration:2000}")
private Integer stayDuration;
@Value("${casic.algorithm.path:-1}")
private String path;
/**
* 障碍物精度
*/
- @Value("${casic.obstacle:10}")
+ @Value("${casic.obstacle:60}")
private Integer obstacle;
+ private volatile AtomicInteger atomicInteger = new AtomicInteger();
public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService, ITaskGridInfoService taskGridInfoService) {
this.routeInfoService = routeInfoService;
@@ -128,7 +130,30 @@
} catch (Exception e) {
log.error(e.getMessage());
}
-
+ }
+ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, GridPushDTO gridPushDTO) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(gridPushDTO);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+ protected void sendTaskMsg(InstructStatusMsgEnums enums, String robotId, TaskEndMsg heatMap) {
+ try {
+ WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO();
+ wsMsgBaseDTO.setMsgKey(enums.getMsgKey());
+ wsMsgBaseDTO.setData(heatMap);
+ String msg = JSON.toJSONString(wsMsgBaseDTO);
+// log.info("推送{}消息:{}", enums.getRemarks(), msg);
+ webSocket.sendOneMessage(robotId, msg);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
}
@Override
@@ -187,11 +212,11 @@
private void openTask(StartTrackRequest request, String robotId) {
QueryWrapper query = new QueryWrapper<>();
- query.eq("target_id", request.getTrack_name());
- List routeInfos = routeInfoService.list(query);
- if (CollectionUtil.isEmpty(routeInfos)) {
- throw new ServiceException(500, "路线不存在,请及时更新");
- }
+// query.eq("target_id", request.getTrack_name());
+// List routeInfos = routeInfoService.list(query);
+// if (CollectionUtil.isEmpty(routeInfos)) {
+// throw new ServiceException(500, "路线不存在,请及时更新");
+// }
// RouteInfo routeInfo = routeInfos.get(0);
Integer isTask = 0;
//开启寻源任务
@@ -201,12 +226,12 @@
RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId));
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask);
//添加任务记录
- TaskInfo taskInfo = addTaskByStartTrack( robotInfo, request);
+ TaskInfo taskInfo = addTaskByStartTrack(robotInfo, request);
//No.3 更新器人执行任务信息
// Long currRouteId = routeInfo.getId();
Long currTaskId = taskInfo.getId();
- statusInfoService.updateCurrTask(robotId, currTaskId);
+ statusInfoService.updateCurrTask(robotId, currTaskId);
//算法初始化标志创建
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0);
@@ -230,7 +255,7 @@
robotCacheClean(robotId);
//清楚规划任务锁
CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_PLANING_FLAG + robotId);
- CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID+ robotId);
+ CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
//清空机器当前任务
statusInfoService.updateCurrTask(robotId, null);
}
@@ -304,7 +329,7 @@
//No.1 任务初始化
pathInit(longId, robotInfo, pointDTO, taskId, robotId, taskInfo.getStepLen());
//No.2 路线规划
- pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo,dto);
+ pathPlaning(longId, robotInfo, pointDTO, taskId, robotId, taskInfo, dto);
}
/**
@@ -329,7 +354,7 @@
* @param taskId 任务ID
* @param robotId 机器人ID
*/
- private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo,PoseMessageResponseDTO curPoint) {
+ private void pathPlaning(Long longId, RobotInfo robotInfo, GridPointDTO pointDTO, Long taskId, String robotId, TaskInfo taskInfo, PoseMessageResponseDTO curPoint) {
if (taskId != null) {
//规划节点
PointNextDTO pointNextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId);
@@ -337,12 +362,24 @@
Boolean flag = lockPlanIngFlag(robotId);
//是否到达预期栅格
if (!flag) {
- log.info("未获取到规划任务,直接结束:{}",pointDTO);
return;
}
+ log.info("curr point:{}", curPoint);
+ log.debug("curr pointGrid:{}", pointDTO);
+ log.debug("oldEstimateGrid:{}", oldEstimateGrid);
+
+ GridPushDTO gridPushDTO = new GridPushDTO();
+ gridPushDTO.setCurrGridX(pointDTO.getX());
+ gridPushDTO.setCurrGridY(pointDTO.getY());
+ if(oldEstimateGrid!=null){
+ gridPushDTO.setEstimateGridX(oldEstimateGrid.getX());
+ gridPushDTO.setEstimateGridY(oldEstimateGrid.getY());
+ }
+ sendWebSocket(InstructStatusMsgEnums.GRID, robotId, gridPushDTO);
+
try {
- log.debug("oldEstimateGrid:{}", oldEstimateGrid);
- if (pointNextDTO == null || isEquals(pointDTO, oldEstimateGrid)) {
+ if (pointNextDTO == null || oldEstimateGrid == null || isEquals(pointDTO, oldEstimateGrid, robotInfo)) {
+ atomicInteger = new AtomicInteger(0);
log.info("当前栅格变更......", pointDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO);
//算法调用获取热力图
@@ -358,19 +395,24 @@
//存储算法输出栅格信息
AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO);
CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO());
- sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
- //存储循迹任务信息
- TaskGridInfo taskGridInfo = new TaskGridInfo();
- taskGridInfo.setCreateTime(new Date());
- taskGridInfo.setUpdateTime(new Date());
- taskGridInfo.setCurGridX(pointDTO.getX().intValue());
- taskGridInfo.setCurGridY(pointDTO.getY().intValue());
- taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
- taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
- taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
- taskGridInfo.setTaskId(taskId);
- taskGridInfoService.save(taskGridInfo);
+ new Thread() {
+ @Override
+ public void run() {
+ //存储循迹任务信息
+ TaskGridInfo taskGridInfo = new TaskGridInfo();
+ taskGridInfo.setCreateTime(new Date());
+ taskGridInfo.setUpdateTime(new Date());
+ taskGridInfo.setCurGridX(pointDTO.getX().intValue());
+ taskGridInfo.setCurGridY(pointDTO.getY().intValue());
+ taskGridInfo.setNeutronCount(new BigDecimal(pathPlanDTO.getZNow()));
+ taskGridInfo.setEstimateGridX(response.getPointNextDTO().getX());
+ taskGridInfo.setEstimateGridY(response.getPointNextDTO().getY());
+ taskGridInfo.setTaskId(taskId);
+ taskGridInfoService.save(taskGridInfo);
+ sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap());
+ }
+ }.start();
try {
//停留时间阈值
@@ -381,11 +423,13 @@
//是否触发停止状态
if (!response.isEnd()) {
- log.debug("task planning-- xun dian robotId:{},taskId:{}", robotId, taskId);
//机器人寻点指令下发
- sendTargetPoint(robotInfo, response,curPoint);
+ if (robotInfo.getIsOpen() == null || robotInfo.getIsOpen() == 0) {
+ sendTargetPoint(robotInfo, response, curPoint);
+ } else {
+ log.debug("task mode isOpen:{}", robotInfo.getIsOpen());
+ }
} else {
- log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId);
//机器人停止指令下发
SoftwareStopRequest request = new SoftwareStopRequest();
request.setRobotId(robotInfo.getId());
@@ -394,6 +438,15 @@
// baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP);
//循迹任务结束
closeTask(null, robotId);
+ TaskEndMsg endMsg = new TaskEndMsg();
+ endMsg.setCode(1);
+ endMsg.setRobotId(robotId);
+ endMsg.setMessage("寻源结束");
+ sendTaskMsg(InstructStatusMsgEnums.TASK_END, robotId, endMsg);
+ }
+ } else {
+ if (!isChange(pointDTO, oldEstimateGrid)) {
+ atomicInteger.incrementAndGet();
}
}
} catch (Exception e) {
@@ -429,37 +482,56 @@
Integer initValue = cacheService.readTaskInit(longId);
//No.1 任务初始化
if (initValue != 1) {
-
//执行初始化操作
if (cacheService.updateTaskInit(longId, 1)) {
-
List> costList = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP + robotId);
List strs = new ArrayList<>();
List strs2 = new ArrayList<>();
- for (List list : costList) {
+ Integer height = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_COST_MAP_HEIGHT + robotId);
+ if (height == null) {
+ throw new ServiceException(500, "未获取到栅格宽度信息");
+ }
+ Integer newX = robotInfo.getNewGridX();
+ Integer newY = height - robotInfo.getNewGridY();
+
+ //裁剪栅格
+ List> newCostList = new ArrayList<>();
+ for (int i = 0; i < costList.size(); i++) {
+ if (i <= newY) {
+ List newList = new ArrayList<>();
+ List sourceList = costList.get(i);
+ for (int j = 0; j < sourceList.size(); j++) {
+ if (j >= newX) {
+ newList.add(sourceList.get(j));
+ }
+ }
+ newCostList.add(newList);
+ }
+ }
+ //数组转换
+ for (List list : newCostList) {
strs2.add(CollectionUtil.join(list, " "));
}
FileUtil.writeLines(strs2, new File(path + "map2.txt"), "utf-8");
+
//行转列 为算法输入数据
- if(CollectionUtil.isNotEmpty(costList)){
- CollectionUtil.reverse(costList);
- for (int i = 0; i < costList.get(0).size(); i++) {
+ if (CollectionUtil.isNotEmpty(newCostList)) {
+ CollectionUtil.reverse(newCostList);
+ for (int i = 0; i < newCostList.get(0).size(); i++) {
ArrayList ints = new ArrayList<>();
- for (List list : costList) {
+ for (List list : newCostList) {
ints.add(list.get(i));
}
strs.add(CollectionUtil.join(ints, " "));
}
-// CollectionUtil.reverse(strs);
}
-
-
FileUtil.writeLines(strs, new File(path + "map.txt"), "utf-8");
- PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
//中子源计数率读取
+ PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId, stepLen);
pathInitDTO.setZNow(cacheService.getNeutronCount(longId));
log.info("init params:{}", JSON.toJSONString(pathInitDTO));
+
//执行1次算法 初始化操作
algorithmService.pathPlanningInit(pathInitDTO);
}
@@ -551,7 +623,7 @@
* @param robotInfo 机器人信息
* @param response 算法输出数据
*/
- private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response,PoseMessageResponseDTO curPoint) {
+ private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response, PoseMessageResponseDTO curPoint) {
//读取已设置巡点目标信息
PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId());
//巡点
@@ -565,6 +637,7 @@
request.setZ(curPoint.getZ().toString());
request.setTheta(curPoint.getTheta().toString());
request.setRobotId(robotInfo.getId());
+ log.info("下发寻源点位:{}", request);
//执行巡点指令
baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT);
//重设寻点点位
@@ -632,7 +705,7 @@
//读取
Integer index = 1;
LambdaQueryWrapper taskGridQuery = new LambdaQueryWrapper<>();
- taskGridQuery.eq(TaskGridInfo::getTaskId,info.getId());
+ taskGridQuery.eq(TaskGridInfo::getTaskId, info.getId());
taskGridQuery.orderByAsc(TaskGridInfo::getCreateTime);
List taskGridInfos = taskGridInfoService.list(taskGridQuery);
if (CollectionUtil.isNotEmpty(taskGridInfos)) {
@@ -735,12 +808,29 @@
return true;
}
- private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO) {
- if(oldPointDTO==null||oldPointDTO.getX()==null){
+ /**
+ * 栅格判定方法
+ *
+ * @param pointDTO 当前栅格
+ * @param oldPointDTO 预期栅格
+ * @param robotInfo 机器信息
+ * @return
+ */
+ private boolean isEquals(GridPointDTO pointDTO, GridPointDTO oldPointDTO, RobotInfo robotInfo) {
+ if (oldPointDTO == null || oldPointDTO.getX() == null) {
return false;
}
- if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
- return true;
+ if (robotInfo.getResolution().compareTo(new BigDecimal(0.21)) > 0) {
+ //大于0.2则默认该点
+ if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) {
+ return true;
+ }
+ } else {
+ //小于0.2则可判定相邻栅格
+ if (pointDTO.getX().subtract(oldPointDTO.getX()).abs().intValue() <= 1 && pointDTO.getY().subtract(oldPointDTO.getY()).abs().intValue() <= 1) {
+ return true;
+ }
+
}
return false;
}
@@ -756,7 +846,7 @@
return pathInitDTO;
}
- private TaskInfo addTaskByStartTrack( RobotInfo robotInfo, StartTrackRequest request) {
+ private TaskInfo addTaskByStartTrack(RobotInfo robotInfo, StartTrackRequest request) {
//No.2 新增任务信息
TaskInfo taskInfo = new TaskInfo();
String currDate = DateUtil.format(new Date(), "yyyyMMdd");
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
index 467b9c2..b8eebf0 100644
--- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
+++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/AlgorithmUtils.java
@@ -44,8 +44,8 @@
ArrayList invocation = new ArrayList();
invocation.add(exePath);
- invocation.add("10");
- invocation.add("10");
+ invocation.add("36");
+ invocation.add("18");
invocation.add("5");
invocation.add("0.16");
invocation.add("Mission1");
@@ -58,8 +58,8 @@
String planning = path + "search.exe";
ArrayList planInvocation = new ArrayList();
planInvocation.add(planning);
- planInvocation.add("10");
- planInvocation.add("1.0");
+ planInvocation.add("19");
+ planInvocation.add("8");
planInvocation.add("0.2");
planInvocation.add("Mission1");
List res = invokeJob(planInvocation);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index 937b695..c793209 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -48,6 +48,11 @@
spring-boot-starter-web
+ com.casic
+ casic-cache-redis
+ ${extension.version}
+
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index c122d8d..455c4bf 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -4,9 +4,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203
+ password: 123456
druid:
max-active: 50
min-idle: 20
diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml
index 534e2fb..67a0241 100644
--- a/casic-web/src/main/resources/config/application-test.yml
+++ b/casic-web/src/main/resources/config/application-test.yml
@@ -1,30 +1,48 @@
server:
- port: 11307
+ port: 8083
################### spring配置 ###################
spring:
datasource:
- url: jdbc:mysql://localhost:3306/casic_template?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true
username: root
- password: Casic203!
- initial-size: 2
- min-idle: 1
- jms:
- pub-sub-domain: true
-# session:
+ password: 123456
+ druid:
+ max-active: 50
+ min-idle: 20
+jms:
+ pub-sub-domain: true
+# session:
# store-type: redis
+# redis:
+# host: 111.198.10.15
+# port: 11412
+# password: ew5T4K3#203lwh
+# serializer: org.springframework.data.redis.serializer.StringRedisSerializer
+# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
casic:
- # kaptcha-open: false #是否开启登录时验证码 (true/false)
- nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/**
+ #kaptcha-open: false #是否开启登录时验证码 (true/false)
+ no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/websocket/*,/webjars/**,/v2/api-docs,/v2/api-docs-ext,/doc.html,/v2/api-docs/swagger-ui.html,/swagger-resources
#flowable数据源和多数据源配置
- flowable:
- datasource:
- url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
- username: root
- password: Casic203!
-flowable:
- checkProcessDefinitions: false #不校验process文件
+ db:
+ init:
+ enable: false
+ hikSdk: D:\robot\hiklib\HCNetSDK.dll
+ hikPlay: D:\robot\hiklib\PlayCtrl.dll
+ algorithm:
+ path: D:\robot\path\
+ initPathName: init.exe
+ planPathName: search.exe
+ doc:
+ temp: D:\robot\path\report.docx
+ config:
+ export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\
+ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\
logging:
level.root: info
level.com.casic: debug
+ level.com.casic.missiles.netty: error
+ level.com.casic.missiles.modular.neutron: error
+ level.org.springframework.web: info
file:
- path: logs/
\ No newline at end of file
+ path: D:\\robot\\logs
\ No newline at end of file
diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml
index 035cb1f..d3833ab 100644
--- a/casic-web/src/main/resources/config/application.yml
+++ b/casic-web/src/main/resources/config/application.yml
@@ -20,7 +20,7 @@
topic: /sensor_status,get_speed,/get_speed,/get_track_list_response,/get_track_response,/get_navigation_response
completionTimeout: 2000
redis:
- host: 192.168.1.20
+ host: localhost
port: 6379
# password: ew5T4K3#203lwh
database: 3
diff --git a/casic-web/src/main/resources/config/path/Mission1/admatrix.txt b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
new file mode 100644
index 0000000..ce6f742
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/admatrix.txt
@@ -0,0 +1,2 @@
+0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/expandmap.txt b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
new file mode 100644
index 0000000..647a4b8
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/expandmap.txt
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/Mission1/separate_img.png b/casic-web/src/main/resources/config/path/Mission1/separate_img.png
new file mode 100644
index 0000000..8fc19f9
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/separate_img.png
Binary files differ
diff --git a/casic-web/src/main/resources/config/path/Mission1/separate_img.txt b/casic-web/src/main/resources/config/path/Mission1/separate_img.txt
new file mode 100644
index 0000000..e00f995
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/Mission1/separate_img.txt
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+00 2.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
diff --git a/casic-web/src/main/resources/config/path/map.txt b/casic-web/src/main/resources/config/path/map.txt
index 61e2959..f44820b 100644
--- a/casic-web/src/main/resources/config/path/map.txt
+++ b/casic-web/src/main/resources/config/path/map.txt
@@ -1,36 +1,93 @@
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0
-0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
-0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0
-0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
-0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
-0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
-0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
diff --git a/casic-web/src/main/resources/config/path/map2.txt b/casic-web/src/main/resources/config/path/map2.txt
new file mode 100644
index 0000000..13dc54c
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/map2.txt
@@ -0,0 +1,116 @@
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
diff --git a/casic-web/src/main/resources/config/path/map3.txt b/casic-web/src/main/resources/config/path/map3.txt
new file mode 100644
index 0000000..424cf89
--- /dev/null
+++ b/casic-web/src/main/resources/config/path/map3.txt
@@ -0,0 +1,46 @@
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0