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