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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 5265a7d..c522def 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 @@ -1,12 +1,11 @@ package com.casic.missiles.modular.robot.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +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.stereotype.Service; @@ -78,6 +77,11 @@ } @Override + public void updateCostMap(String robotId, AppCostmapResponseDTO msg) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg); + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; @@ -95,5 +99,4 @@ return currId; } - -} +} \ No newline at end of file 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 5265a7d..c522def 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 @@ -1,12 +1,11 @@ package com.casic.missiles.modular.robot.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +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.stereotype.Service; @@ -78,6 +77,11 @@ } @Override + public void updateCostMap(String robotId, AppCostmapResponseDTO msg) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg); + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; @@ -95,5 +99,4 @@ return currId; } - -} +} \ No newline at end of file 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -import com.casic.missiles.modular.robot.service.IRobotInfoService; -import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; -import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 5265a7d..c522def 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 @@ -1,12 +1,11 @@ package com.casic.missiles.modular.robot.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +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.stereotype.Service; @@ -78,6 +77,11 @@ } @Override + public void updateCostMap(String robotId, AppCostmapResponseDTO msg) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg); + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; @@ -95,5 +99,4 @@ return currId; } - -} +} \ No newline at end of file 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -import com.casic.missiles.modular.robot.service.IRobotInfoService; -import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; -import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 5265a7d..c522def 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 @@ -1,12 +1,11 @@ package com.casic.missiles.modular.robot.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +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.stereotype.Service; @@ -78,6 +77,11 @@ } @Override + public void updateCostMap(String robotId, AppCostmapResponseDTO msg) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg); + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; @@ -95,5 +99,4 @@ return currId; } - -} +} \ No newline at end of file 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -import com.casic.missiles.modular.robot.service.IRobotInfoService; -import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; -import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} 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 609a4af..4646c2c 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 @@ -18,9 +18,11 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; @@ -47,17 +49,19 @@ public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; private final IRobotInfoService robotInfoService; + private final IRobotCacheService cacheService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService, @Lazy IRobotCacheService cacheService) { this.dictService = dictService; this.robotInfoService = robotInfoService; + this.cacheService = cacheService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status" , status); - query.eq("robot_id" , robotId); + query.set("conn_status", status); + query.eq("robot_id", robotId); update(query); } @@ -71,29 +75,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); } @@ -125,11 +129,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id" , robotId); + query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id", robotId); update(query); } } @@ -148,8 +152,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message" , msg.getP()); - query.eq("robot_id" , robotId); + query.set("process_message", msg.getP()); + query.eq("robot_id", robotId); update(query); } } @@ -168,8 +172,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_nav_pause", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -182,8 +186,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_stop_navtrack", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -191,16 +195,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id" , currRouteId); - query.set("curr_task_id" , currTaskId); - query.eq("robot_id" , robotId); + query.set("curr_route_id", currRouteId); + query.set("curr_task_id", currTaskId); + query.eq("robot_id", robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotId); + query.eq("robot_id", robotId); return getOne(query); } @@ -210,11 +214,11 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}" , responseDTO.getMsg()); + log.info("速度信息保存:{}", responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id" , robotId); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); update(query); } } @@ -224,7 +228,7 @@ RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("急停状态保存:{}" , responseDTO.getMsg()); + log.info("急停状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); @@ -243,14 +247,14 @@ //电压下限 45V 电压上限 58.8V 估算电量 if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); - log.info("电压状态保存:{}" , responseDTO.getMsg()); + log.info("电压状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); query.set(RobotStatusInfo::getVoltage, v); //计算电量 - Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); query.eq(RobotStatusInfo::getRobotId, robotId); update(query); } @@ -258,6 +262,16 @@ } + @Override + public void saveCostMap(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + cacheService.updateCostMap(robotId, responseDTO.getMsg()); + log.info("----------------------------------------------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); + } + } + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { String json = new String(message.getPayload()); if (json.startsWith("\"")) { @@ -266,7 +280,7 @@ if (json.endsWith("\"")) { json = json.substring(0, json.length() - 1); } - json = json.replaceAll("\\\\" , ""); + 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/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 5265a7d..c522def 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 @@ -1,12 +1,11 @@ package com.casic.missiles.modular.robot.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +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.stereotype.Service; @@ -78,6 +77,11 @@ } @Override + public void updateCostMap(String robotId, AppCostmapResponseDTO msg) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg); + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; @@ -95,5 +99,4 @@ return currId; } - -} +} \ No newline at end of file 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -import com.casic.missiles.modular.robot.service.IRobotInfoService; -import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; -import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} 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 609a4af..4646c2c 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 @@ -18,9 +18,11 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; @@ -47,17 +49,19 @@ public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; private final IRobotInfoService robotInfoService; + private final IRobotCacheService cacheService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService, @Lazy IRobotCacheService cacheService) { this.dictService = dictService; this.robotInfoService = robotInfoService; + this.cacheService = cacheService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status" , status); - query.eq("robot_id" , robotId); + query.set("conn_status", status); + query.eq("robot_id", robotId); update(query); } @@ -71,29 +75,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); } @@ -125,11 +129,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id" , robotId); + query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id", robotId); update(query); } } @@ -148,8 +152,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message" , msg.getP()); - query.eq("robot_id" , robotId); + query.set("process_message", msg.getP()); + query.eq("robot_id", robotId); update(query); } } @@ -168,8 +172,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_nav_pause", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -182,8 +186,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_stop_navtrack", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -191,16 +195,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id" , currRouteId); - query.set("curr_task_id" , currTaskId); - query.eq("robot_id" , robotId); + query.set("curr_route_id", currRouteId); + query.set("curr_task_id", currTaskId); + query.eq("robot_id", robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotId); + query.eq("robot_id", robotId); return getOne(query); } @@ -210,11 +214,11 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}" , responseDTO.getMsg()); + log.info("速度信息保存:{}", responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id" , robotId); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); update(query); } } @@ -224,7 +228,7 @@ RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("急停状态保存:{}" , responseDTO.getMsg()); + log.info("急停状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); @@ -243,14 +247,14 @@ //电压下限 45V 电压上限 58.8V 估算电量 if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); - log.info("电压状态保存:{}" , responseDTO.getMsg()); + log.info("电压状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); query.set(RobotStatusInfo::getVoltage, v); //计算电量 - Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); query.eq(RobotStatusInfo::getRobotId, robotId); update(query); } @@ -258,6 +262,16 @@ } + @Override + public void saveCostMap(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + cacheService.updateCostMap(robotId, responseDTO.getMsg()); + log.info("----------------------------------------------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); + } + } + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { String json = new String(message.getPayload()); if (json.startsWith("\"")) { @@ -266,7 +280,7 @@ if (json.endsWith("\"")) { json = json.substring(0, json.length() - 1); } - json = json.replaceAll("\\\\" , ""); + 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/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 5265a7d..c522def 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 @@ -1,12 +1,11 @@ package com.casic.missiles.modular.robot.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +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.stereotype.Service; @@ -78,6 +77,11 @@ } @Override + public void updateCostMap(String robotId, AppCostmapResponseDTO msg) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg); + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; @@ -95,5 +99,4 @@ return currId; } - -} +} \ No newline at end of file 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -import com.casic.missiles.modular.robot.service.IRobotInfoService; -import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; -import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} 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 609a4af..4646c2c 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 @@ -18,9 +18,11 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; @@ -47,17 +49,19 @@ public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; private final IRobotInfoService robotInfoService; + private final IRobotCacheService cacheService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService, @Lazy IRobotCacheService cacheService) { this.dictService = dictService; this.robotInfoService = robotInfoService; + this.cacheService = cacheService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status" , status); - query.eq("robot_id" , robotId); + query.set("conn_status", status); + query.eq("robot_id", robotId); update(query); } @@ -71,29 +75,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); } @@ -125,11 +129,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id" , robotId); + query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id", robotId); update(query); } } @@ -148,8 +152,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message" , msg.getP()); - query.eq("robot_id" , robotId); + query.set("process_message", msg.getP()); + query.eq("robot_id", robotId); update(query); } } @@ -168,8 +172,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_nav_pause", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -182,8 +186,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_stop_navtrack", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -191,16 +195,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id" , currRouteId); - query.set("curr_task_id" , currTaskId); - query.eq("robot_id" , robotId); + query.set("curr_route_id", currRouteId); + query.set("curr_task_id", currTaskId); + query.eq("robot_id", robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotId); + query.eq("robot_id", robotId); return getOne(query); } @@ -210,11 +214,11 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}" , responseDTO.getMsg()); + log.info("速度信息保存:{}", responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id" , robotId); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); update(query); } } @@ -224,7 +228,7 @@ RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("急停状态保存:{}" , responseDTO.getMsg()); + log.info("急停状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); @@ -243,14 +247,14 @@ //电压下限 45V 电压上限 58.8V 估算电量 if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); - log.info("电压状态保存:{}" , responseDTO.getMsg()); + log.info("电压状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); query.set(RobotStatusInfo::getVoltage, v); //计算电量 - Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); query.eq(RobotStatusInfo::getRobotId, robotId); update(query); } @@ -258,6 +262,16 @@ } + @Override + public void saveCostMap(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + cacheService.updateCostMap(robotId, responseDTO.getMsg()); + log.info("----------------------------------------------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); + } + } + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { String json = new String(message.getPayload()); if (json.startsWith("\"")) { @@ -266,7 +280,7 @@ if (json.endsWith("\"")) { json = json.substring(0, json.length() - 1); } - json = json.replaceAll("\\\\" , ""); + 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/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 f26904b..9b481ce 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 @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,13 +19,17 @@ import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.*; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import com.casic.missiles.modular.robot.opt.instruct.dto.TargetPointRequest; import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.util.WordUtil; import lombok.SneakyThrows; @@ -63,13 +68,15 @@ private final ITaskHeatMapService taskHeatMapService; private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + private final IBaseRobotService baseRobotService; + @Value("${casic.file.uploadPath}") private String uploadPath; @Value("${casic.doc.temp}") private String docTemp; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -77,6 +84,7 @@ this.taskHeatMapService = taskHeatMapService; this.algorithmService = algorithmService; this.cacheService = cacheService; + this.baseRobotService = baseRobotService; } /** @@ -135,8 +143,11 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); - taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); + if (taskInfo != null) { + RobotInfo robotInfo = cacheService.getRobotInfo(taskInfo.getRobotId()); + taskInfo.setRobotName(robotInfo.getRobotName()); + } } @Transactional @@ -172,6 +183,7 @@ Long currTaskId = taskInfo.getId(); statusInfoService.updateCurrTask(robotId, currRouteId, 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); @@ -191,13 +203,22 @@ update(updateWrapper); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); } - //清空任务缓存 + robotCacheClean(robotId); + //清空机器当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + + } + + /** + * 关闭任务清空缓存信息 + * + * @param robotId + */ + private void robotCacheClean(String robotId) { CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); } /** @@ -213,7 +234,7 @@ Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); //缓存当前点位信息 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); @@ -229,7 +250,7 @@ Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 @@ -248,6 +269,7 @@ GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //TO-DO 障碍物判定信息 @@ -256,28 +278,78 @@ pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - - //存储算法估算栅格信息 + //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + //机器人寻点指令下发 + sendTargetPoint(robotInfo, response); } + //是否触发停止状态 if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //机器人停止指令下发 + SoftwareStopRequest request = new SoftwareStopRequest(); + request.setRobotId(robotInfo.getId()); + //设置为急停 + request.setControl(1); + baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + //循迹任务结束 + closeTask(null, robotId); } } } } + /** + * 机器人目标栅格设定 + * + * @param robotInfo 机器人信息 + * @param response 算法输出数据 + */ + private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response) { + //读取已设置巡点目标信息 + PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId()); + //巡点 + if (response.getPointNextDTO() != null && !response.getPointNextDTO().equals(nextDTO)) { + GridPointDTO gridPointDTO = GridPointDTO.convertGridPoint(response.getPointNextDTO()); + //得到寻源栅格数据,转换为栅格目标点位 + GridPointDTO gridCenterPoint = algorithmService.convertGridCenterPoint(gridPointDTO, robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); + TargetPointRequest request = new TargetPointRequest(); + request.setX(Convert.toStr(gridCenterPoint.getX())); + request.setY(Convert.toStr(gridCenterPoint.getY())); + request.setZ("0"); + + request.setRobotId(robotInfo.getId()); + //执行巡点指令 + baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT); + //重设寻点点位 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId(), response.getPointNextDTO()); + } + + } + + /** + * 任务相关图片保存 + * + * @param imgDTO + */ @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + } updateWrapper.set(TaskInfo::getHeatImg, path); updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); } @@ -287,6 +359,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=report.docx"); @@ -319,7 +392,7 @@ if (CollectionUtil.isNotEmpty(records)) { for (AlarmRecord record : records) { //栅格信息转换 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize(),robotInfo); record.setX(pointDTO.getX()); record.setY(pointDTO.getY()); record.setIndex(index); 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 5265a7d..c522def 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 @@ -1,12 +1,11 @@ package com.casic.missiles.modular.robot.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +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.stereotype.Service; @@ -78,6 +77,11 @@ } @Override + public void updateCostMap(String robotId, AppCostmapResponseDTO msg) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg); + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; @@ -95,5 +99,4 @@ return currId; } - -} +} \ No newline at end of file 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -import com.casic.missiles.modular.robot.service.IRobotInfoService; -import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; -import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} 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 609a4af..4646c2c 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 @@ -18,9 +18,11 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; @@ -47,17 +49,19 @@ public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; private final IRobotInfoService robotInfoService; + private final IRobotCacheService cacheService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService, @Lazy IRobotCacheService cacheService) { this.dictService = dictService; this.robotInfoService = robotInfoService; + this.cacheService = cacheService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status" , status); - query.eq("robot_id" , robotId); + query.set("conn_status", status); + query.eq("robot_id", robotId); update(query); } @@ -71,29 +75,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); } @@ -125,11 +129,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id" , robotId); + query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id", robotId); update(query); } } @@ -148,8 +152,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message" , msg.getP()); - query.eq("robot_id" , robotId); + query.set("process_message", msg.getP()); + query.eq("robot_id", robotId); update(query); } } @@ -168,8 +172,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_nav_pause", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -182,8 +186,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_stop_navtrack", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -191,16 +195,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id" , currRouteId); - query.set("curr_task_id" , currTaskId); - query.eq("robot_id" , robotId); + query.set("curr_route_id", currRouteId); + query.set("curr_task_id", currTaskId); + query.eq("robot_id", robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotId); + query.eq("robot_id", robotId); return getOne(query); } @@ -210,11 +214,11 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}" , responseDTO.getMsg()); + log.info("速度信息保存:{}", responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id" , robotId); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); update(query); } } @@ -224,7 +228,7 @@ RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("急停状态保存:{}" , responseDTO.getMsg()); + log.info("急停状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); @@ -243,14 +247,14 @@ //电压下限 45V 电压上限 58.8V 估算电量 if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); - log.info("电压状态保存:{}" , responseDTO.getMsg()); + log.info("电压状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); query.set(RobotStatusInfo::getVoltage, v); //计算电量 - Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); query.eq(RobotStatusInfo::getRobotId, robotId); update(query); } @@ -258,6 +262,16 @@ } + @Override + public void saveCostMap(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + cacheService.updateCostMap(robotId, responseDTO.getMsg()); + log.info("----------------------------------------------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); + } + } + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { String json = new String(message.getPayload()); if (json.startsWith("\"")) { @@ -266,7 +280,7 @@ if (json.endsWith("\"")) { json = json.substring(0, json.length() - 1); } - json = json.replaceAll("\\\\" , ""); + 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/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 f26904b..9b481ce 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 @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,13 +19,17 @@ import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.*; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import com.casic.missiles.modular.robot.opt.instruct.dto.TargetPointRequest; import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.util.WordUtil; import lombok.SneakyThrows; @@ -63,13 +68,15 @@ private final ITaskHeatMapService taskHeatMapService; private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + private final IBaseRobotService baseRobotService; + @Value("${casic.file.uploadPath}") private String uploadPath; @Value("${casic.doc.temp}") private String docTemp; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -77,6 +84,7 @@ this.taskHeatMapService = taskHeatMapService; this.algorithmService = algorithmService; this.cacheService = cacheService; + this.baseRobotService = baseRobotService; } /** @@ -135,8 +143,11 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); - taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); + if (taskInfo != null) { + RobotInfo robotInfo = cacheService.getRobotInfo(taskInfo.getRobotId()); + taskInfo.setRobotName(robotInfo.getRobotName()); + } } @Transactional @@ -172,6 +183,7 @@ Long currTaskId = taskInfo.getId(); statusInfoService.updateCurrTask(robotId, currRouteId, 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); @@ -191,13 +203,22 @@ update(updateWrapper); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); } - //清空任务缓存 + robotCacheClean(robotId); + //清空机器当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + + } + + /** + * 关闭任务清空缓存信息 + * + * @param robotId + */ + private void robotCacheClean(String robotId) { CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); } /** @@ -213,7 +234,7 @@ Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); //缓存当前点位信息 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); @@ -229,7 +250,7 @@ Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 @@ -248,6 +269,7 @@ GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //TO-DO 障碍物判定信息 @@ -256,28 +278,78 @@ pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - - //存储算法估算栅格信息 + //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + //机器人寻点指令下发 + sendTargetPoint(robotInfo, response); } + //是否触发停止状态 if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //机器人停止指令下发 + SoftwareStopRequest request = new SoftwareStopRequest(); + request.setRobotId(robotInfo.getId()); + //设置为急停 + request.setControl(1); + baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + //循迹任务结束 + closeTask(null, robotId); } } } } + /** + * 机器人目标栅格设定 + * + * @param robotInfo 机器人信息 + * @param response 算法输出数据 + */ + private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response) { + //读取已设置巡点目标信息 + PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId()); + //巡点 + if (response.getPointNextDTO() != null && !response.getPointNextDTO().equals(nextDTO)) { + GridPointDTO gridPointDTO = GridPointDTO.convertGridPoint(response.getPointNextDTO()); + //得到寻源栅格数据,转换为栅格目标点位 + GridPointDTO gridCenterPoint = algorithmService.convertGridCenterPoint(gridPointDTO, robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); + TargetPointRequest request = new TargetPointRequest(); + request.setX(Convert.toStr(gridCenterPoint.getX())); + request.setY(Convert.toStr(gridCenterPoint.getY())); + request.setZ("0"); + + request.setRobotId(robotInfo.getId()); + //执行巡点指令 + baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT); + //重设寻点点位 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId(), response.getPointNextDTO()); + } + + } + + /** + * 任务相关图片保存 + * + * @param imgDTO + */ @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + } updateWrapper.set(TaskInfo::getHeatImg, path); updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); } @@ -287,6 +359,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=report.docx"); @@ -319,7 +392,7 @@ if (CollectionUtil.isNotEmpty(records)) { for (AlarmRecord record : records) { //栅格信息转换 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize(),robotInfo); record.setX(pointDTO.getX()); record.setY(pointDTO.getY()); record.setIndex(index); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java index dc6683f..2e62229 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.DetectorInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 5265a7d..c522def 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 @@ -1,12 +1,11 @@ package com.casic.missiles.modular.robot.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +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.stereotype.Service; @@ -78,6 +77,11 @@ } @Override + public void updateCostMap(String robotId, AppCostmapResponseDTO msg) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg); + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; @@ -95,5 +99,4 @@ return currId; } - -} +} \ No newline at end of file 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -import com.casic.missiles.modular.robot.service.IRobotInfoService; -import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; -import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} 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 609a4af..4646c2c 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 @@ -18,9 +18,11 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; @@ -47,17 +49,19 @@ public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; private final IRobotInfoService robotInfoService; + private final IRobotCacheService cacheService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService, @Lazy IRobotCacheService cacheService) { this.dictService = dictService; this.robotInfoService = robotInfoService; + this.cacheService = cacheService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status" , status); - query.eq("robot_id" , robotId); + query.set("conn_status", status); + query.eq("robot_id", robotId); update(query); } @@ -71,29 +75,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); } @@ -125,11 +129,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id" , robotId); + query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id", robotId); update(query); } } @@ -148,8 +152,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message" , msg.getP()); - query.eq("robot_id" , robotId); + query.set("process_message", msg.getP()); + query.eq("robot_id", robotId); update(query); } } @@ -168,8 +172,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_nav_pause", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -182,8 +186,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_stop_navtrack", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -191,16 +195,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id" , currRouteId); - query.set("curr_task_id" , currTaskId); - query.eq("robot_id" , robotId); + query.set("curr_route_id", currRouteId); + query.set("curr_task_id", currTaskId); + query.eq("robot_id", robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotId); + query.eq("robot_id", robotId); return getOne(query); } @@ -210,11 +214,11 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}" , responseDTO.getMsg()); + log.info("速度信息保存:{}", responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id" , robotId); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); update(query); } } @@ -224,7 +228,7 @@ RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("急停状态保存:{}" , responseDTO.getMsg()); + log.info("急停状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); @@ -243,14 +247,14 @@ //电压下限 45V 电压上限 58.8V 估算电量 if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); - log.info("电压状态保存:{}" , responseDTO.getMsg()); + log.info("电压状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); query.set(RobotStatusInfo::getVoltage, v); //计算电量 - Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); query.eq(RobotStatusInfo::getRobotId, robotId); update(query); } @@ -258,6 +262,16 @@ } + @Override + public void saveCostMap(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + cacheService.updateCostMap(robotId, responseDTO.getMsg()); + log.info("----------------------------------------------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); + } + } + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { String json = new String(message.getPayload()); if (json.startsWith("\"")) { @@ -266,7 +280,7 @@ if (json.endsWith("\"")) { json = json.substring(0, json.length() - 1); } - json = json.replaceAll("\\\\" , ""); + 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/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 f26904b..9b481ce 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 @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,13 +19,17 @@ import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.*; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import com.casic.missiles.modular.robot.opt.instruct.dto.TargetPointRequest; import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.util.WordUtil; import lombok.SneakyThrows; @@ -63,13 +68,15 @@ private final ITaskHeatMapService taskHeatMapService; private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + private final IBaseRobotService baseRobotService; + @Value("${casic.file.uploadPath}") private String uploadPath; @Value("${casic.doc.temp}") private String docTemp; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -77,6 +84,7 @@ this.taskHeatMapService = taskHeatMapService; this.algorithmService = algorithmService; this.cacheService = cacheService; + this.baseRobotService = baseRobotService; } /** @@ -135,8 +143,11 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); - taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); + if (taskInfo != null) { + RobotInfo robotInfo = cacheService.getRobotInfo(taskInfo.getRobotId()); + taskInfo.setRobotName(robotInfo.getRobotName()); + } } @Transactional @@ -172,6 +183,7 @@ Long currTaskId = taskInfo.getId(); statusInfoService.updateCurrTask(robotId, currRouteId, 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); @@ -191,13 +203,22 @@ update(updateWrapper); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); } - //清空任务缓存 + robotCacheClean(robotId); + //清空机器当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + + } + + /** + * 关闭任务清空缓存信息 + * + * @param robotId + */ + private void robotCacheClean(String robotId) { CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); } /** @@ -213,7 +234,7 @@ Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); //缓存当前点位信息 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); @@ -229,7 +250,7 @@ Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 @@ -248,6 +269,7 @@ GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //TO-DO 障碍物判定信息 @@ -256,28 +278,78 @@ pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - - //存储算法估算栅格信息 + //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + //机器人寻点指令下发 + sendTargetPoint(robotInfo, response); } + //是否触发停止状态 if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //机器人停止指令下发 + SoftwareStopRequest request = new SoftwareStopRequest(); + request.setRobotId(robotInfo.getId()); + //设置为急停 + request.setControl(1); + baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + //循迹任务结束 + closeTask(null, robotId); } } } } + /** + * 机器人目标栅格设定 + * + * @param robotInfo 机器人信息 + * @param response 算法输出数据 + */ + private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response) { + //读取已设置巡点目标信息 + PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId()); + //巡点 + if (response.getPointNextDTO() != null && !response.getPointNextDTO().equals(nextDTO)) { + GridPointDTO gridPointDTO = GridPointDTO.convertGridPoint(response.getPointNextDTO()); + //得到寻源栅格数据,转换为栅格目标点位 + GridPointDTO gridCenterPoint = algorithmService.convertGridCenterPoint(gridPointDTO, robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); + TargetPointRequest request = new TargetPointRequest(); + request.setX(Convert.toStr(gridCenterPoint.getX())); + request.setY(Convert.toStr(gridCenterPoint.getY())); + request.setZ("0"); + + request.setRobotId(robotInfo.getId()); + //执行巡点指令 + baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT); + //重设寻点点位 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId(), response.getPointNextDTO()); + } + + } + + /** + * 任务相关图片保存 + * + * @param imgDTO + */ @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + } updateWrapper.set(TaskInfo::getHeatImg, path); updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); } @@ -287,6 +359,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=report.docx"); @@ -319,7 +392,7 @@ if (CollectionUtil.isNotEmpty(records)) { for (AlarmRecord record : records) { //栅格信息转换 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize(),robotInfo); record.setX(pointDTO.getX()); record.setY(pointDTO.getY()); record.setIndex(index); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java index dc6683f..2e62229 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.DetectorInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java new file mode 100644 index 0000000..f09eece --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.robot.vo; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 路线点位信息对象VO + * + * @author lwh + * @date 2023-12-14 + */ +@Data +public class RobotPointInfoVO { + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + private Long routeId; + + public QueryWrapper genQuery() { + QueryWrapper query = new QueryWrapper<>(); + if (robotId != null) { + query.eq("robot_id", robotId); + } + if (routeId != null) { + query.eq("route_id", routeId); + } + return query; + } +} 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 5265a7d..c522def 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 @@ -1,12 +1,11 @@ package com.casic.missiles.modular.robot.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +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.stereotype.Service; @@ -78,6 +77,11 @@ } @Override + public void updateCostMap(String robotId, AppCostmapResponseDTO msg) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg); + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; @@ -95,5 +99,4 @@ return currId; } - -} +} \ No newline at end of file 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -import com.casic.missiles.modular.robot.service.IRobotInfoService; -import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; -import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} 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 609a4af..4646c2c 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 @@ -18,9 +18,11 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; @@ -47,17 +49,19 @@ public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; private final IRobotInfoService robotInfoService; + private final IRobotCacheService cacheService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService, @Lazy IRobotCacheService cacheService) { this.dictService = dictService; this.robotInfoService = robotInfoService; + this.cacheService = cacheService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status" , status); - query.eq("robot_id" , robotId); + query.set("conn_status", status); + query.eq("robot_id", robotId); update(query); } @@ -71,29 +75,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); } @@ -125,11 +129,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id" , robotId); + query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id", robotId); update(query); } } @@ -148,8 +152,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message" , msg.getP()); - query.eq("robot_id" , robotId); + query.set("process_message", msg.getP()); + query.eq("robot_id", robotId); update(query); } } @@ -168,8 +172,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_nav_pause", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -182,8 +186,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_stop_navtrack", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -191,16 +195,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id" , currRouteId); - query.set("curr_task_id" , currTaskId); - query.eq("robot_id" , robotId); + query.set("curr_route_id", currRouteId); + query.set("curr_task_id", currTaskId); + query.eq("robot_id", robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotId); + query.eq("robot_id", robotId); return getOne(query); } @@ -210,11 +214,11 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}" , responseDTO.getMsg()); + log.info("速度信息保存:{}", responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id" , robotId); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); update(query); } } @@ -224,7 +228,7 @@ RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("急停状态保存:{}" , responseDTO.getMsg()); + log.info("急停状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); @@ -243,14 +247,14 @@ //电压下限 45V 电压上限 58.8V 估算电量 if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); - log.info("电压状态保存:{}" , responseDTO.getMsg()); + log.info("电压状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); query.set(RobotStatusInfo::getVoltage, v); //计算电量 - Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); query.eq(RobotStatusInfo::getRobotId, robotId); update(query); } @@ -258,6 +262,16 @@ } + @Override + public void saveCostMap(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + cacheService.updateCostMap(robotId, responseDTO.getMsg()); + log.info("----------------------------------------------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); + } + } + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { String json = new String(message.getPayload()); if (json.startsWith("\"")) { @@ -266,7 +280,7 @@ if (json.endsWith("\"")) { json = json.substring(0, json.length() - 1); } - json = json.replaceAll("\\\\" , ""); + 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/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 f26904b..9b481ce 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 @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,13 +19,17 @@ import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.*; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import com.casic.missiles.modular.robot.opt.instruct.dto.TargetPointRequest; import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.util.WordUtil; import lombok.SneakyThrows; @@ -63,13 +68,15 @@ private final ITaskHeatMapService taskHeatMapService; private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + private final IBaseRobotService baseRobotService; + @Value("${casic.file.uploadPath}") private String uploadPath; @Value("${casic.doc.temp}") private String docTemp; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -77,6 +84,7 @@ this.taskHeatMapService = taskHeatMapService; this.algorithmService = algorithmService; this.cacheService = cacheService; + this.baseRobotService = baseRobotService; } /** @@ -135,8 +143,11 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); - taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); + if (taskInfo != null) { + RobotInfo robotInfo = cacheService.getRobotInfo(taskInfo.getRobotId()); + taskInfo.setRobotName(robotInfo.getRobotName()); + } } @Transactional @@ -172,6 +183,7 @@ Long currTaskId = taskInfo.getId(); statusInfoService.updateCurrTask(robotId, currRouteId, 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); @@ -191,13 +203,22 @@ update(updateWrapper); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); } - //清空任务缓存 + robotCacheClean(robotId); + //清空机器当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + + } + + /** + * 关闭任务清空缓存信息 + * + * @param robotId + */ + private void robotCacheClean(String robotId) { CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); } /** @@ -213,7 +234,7 @@ Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); //缓存当前点位信息 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); @@ -229,7 +250,7 @@ Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 @@ -248,6 +269,7 @@ GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //TO-DO 障碍物判定信息 @@ -256,28 +278,78 @@ pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - - //存储算法估算栅格信息 + //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + //机器人寻点指令下发 + sendTargetPoint(robotInfo, response); } + //是否触发停止状态 if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //机器人停止指令下发 + SoftwareStopRequest request = new SoftwareStopRequest(); + request.setRobotId(robotInfo.getId()); + //设置为急停 + request.setControl(1); + baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + //循迹任务结束 + closeTask(null, robotId); } } } } + /** + * 机器人目标栅格设定 + * + * @param robotInfo 机器人信息 + * @param response 算法输出数据 + */ + private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response) { + //读取已设置巡点目标信息 + PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId()); + //巡点 + if (response.getPointNextDTO() != null && !response.getPointNextDTO().equals(nextDTO)) { + GridPointDTO gridPointDTO = GridPointDTO.convertGridPoint(response.getPointNextDTO()); + //得到寻源栅格数据,转换为栅格目标点位 + GridPointDTO gridCenterPoint = algorithmService.convertGridCenterPoint(gridPointDTO, robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); + TargetPointRequest request = new TargetPointRequest(); + request.setX(Convert.toStr(gridCenterPoint.getX())); + request.setY(Convert.toStr(gridCenterPoint.getY())); + request.setZ("0"); + + request.setRobotId(robotInfo.getId()); + //执行巡点指令 + baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT); + //重设寻点点位 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId(), response.getPointNextDTO()); + } + + } + + /** + * 任务相关图片保存 + * + * @param imgDTO + */ @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + } updateWrapper.set(TaskInfo::getHeatImg, path); updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); } @@ -287,6 +359,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=report.docx"); @@ -319,7 +392,7 @@ if (CollectionUtil.isNotEmpty(records)) { for (AlarmRecord record : records) { //栅格信息转换 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize(),robotInfo); record.setX(pointDTO.getX()); record.setY(pointDTO.getY()); record.setIndex(index); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java index dc6683f..2e62229 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.DetectorInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java new file mode 100644 index 0000000..f09eece --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.robot.vo; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 路线点位信息对象VO + * + * @author lwh + * @date 2023-12-14 + */ +@Data +public class RobotPointInfoVO { + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + private Long routeId; + + public QueryWrapper genQuery() { + QueryWrapper query = new QueryWrapper<>(); + if (robotId != null) { + query.eq("robot_id", robotId); + } + if (routeId != null) { + query.eq("route_id", routeId); + } + return query; + } +} diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index bf403dd..db10efc 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=GMT%2B8 + url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 jms: pub-sub-domain: true # session: 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 aa51120..b27d2a4 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 @@ -41,4 +41,13 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; + + /** + * 障碍物栅格信息缓存 + */ + String KEY_CUR_COST_MAP_ID = "CUR_COST_MAP_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index d7ef09d..560529c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -12,9 +12,11 @@ import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; 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.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index f0413d3..9106980 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 e0f946d..2c874c2 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 @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 7da2fa0..49c57dc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 8d77492..78d5ec0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -14,6 +14,8 @@ public enum InstructCodeEnums { TRACK_LIST("/get_track_list" , "/get_track_list_response" , "获取轨迹列表" , true, new TypeReference>>() { }), + COSTMAP_RESOLUTION("/set_costmap_resolution" , "/set_costmap_resolution_response" , "设置栅格分辨率" , true, new TypeReference>() { + }), TASKPOINT_LIST("/get_taskpoint_list" , "/get_taskpoint_list_response" , "获取关键点列表" , true, new TypeReference>>() { }), //当前版本 暂不支撑 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java new file mode 100644 index 0000000..fe69a25 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/CostMapResolutionCmdHandler.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +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.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.CostMapResolutionRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 分辨率设置 + */ +@Component("COSTMAP_RESOLUTION") +public class CostMapResolutionCmdHandler extends AbstractCmdHandler { + + protected CostMapResolutionCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(CostMapResolutionRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(CostMapResolutionRequest request, ResponseDataDTO response) { + return response; + } +} 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 new file mode 100644 index 0000000..0335693 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCostMapHandler.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 障碍物栅格数据接收 + */ +@Slf4j +@Component("/app_costmap_sender") +public class AppCostMapHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public AppCostMapHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveCostMap(robotId, message); + } +} 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.java new file mode 100644 index 0000000..1c09cb9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/CostMapResolutionRequest.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 CostMapResolutionRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "分辨率设置(默认0.2 (米))", dataType = "Integer") + private Double resolution; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java new file mode 100644 index 0000000..551bafd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/AppCostmapResponseDTO.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 栅格障碍物 + */ +@Data +public class AppCostmapResponseDTO implements Serializable { + /** + * 分辨率 + */ + private Double resolution; + /** + * 宽 + */ + private Integer width; + /** + * 高 + */ + private Integer height; + /** + * 栅格原点坐标x + */ + private BigDecimal origin_x; + /** + * 栅格原点坐标Y + */ + private BigDecimal origin_y; + /** + * 障碍物栅格数据 + */ + private List data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 18e8728..ea3ac98 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; /** * 机器人缓存服务 @@ -82,4 +83,12 @@ * @return */ PoseMessageResponseDTO readRobotPoint(Long robotId); + + /** + * 更新栅格缓存数据 + * + * @param robotId 机器人ID + * @param msg 消息 + */ + void updateCostMap(String robotId, AppCostmapResponseDTO msg); } \ No newline at end of file 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; 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 java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 6ab9802..1675445 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -95,4 +95,10 @@ * @param message 消息体 */ void saveVoltageResponseMessage(String robotId, MqttMessage message); + + /** + * @param robotId 机器人障碍物栅格数据保存 + * @param message 消息体 + */ + void saveCostMap(String robotId, MqttMessage message); } 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); AlgorithmResponse response = getAlgorithmResponse(planDTO, res); //next 点位编写 - if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ - response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); - response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + if (CollectionUtil.isNotEmpty(res) && res.size() == 2) { + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ", ""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ", ""))); } return response; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 5265a7d..c522def 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 @@ -1,12 +1,11 @@ package com.casic.missiles.modular.robot.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +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.stereotype.Service; @@ -78,6 +77,11 @@ } @Override + public void updateCostMap(String robotId, AppCostmapResponseDTO msg) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_COST_MAP_ID + robotId, msg); + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; @@ -95,5 +99,4 @@ return currId; } - -} +} \ No newline at end of file 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -import com.casic.missiles.modular.robot.service.IRobotInfoService; -import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; -import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} 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 609a4af..4646c2c 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 @@ -18,9 +18,11 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; @@ -47,17 +49,19 @@ public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; private final IRobotInfoService robotInfoService; + private final IRobotCacheService cacheService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService, @Lazy IRobotCacheService cacheService) { this.dictService = dictService; this.robotInfoService = robotInfoService; + this.cacheService = cacheService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status" , status); - query.eq("robot_id" , robotId); + query.set("conn_status", status); + query.eq("robot_id", robotId); update(query); } @@ -71,29 +75,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); } @@ -125,11 +129,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id" , robotId); + query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id", robotId); update(query); } } @@ -148,8 +152,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message" , msg.getP()); - query.eq("robot_id" , robotId); + query.set("process_message", msg.getP()); + query.eq("robot_id", robotId); update(query); } } @@ -168,8 +172,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_nav_pause", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -182,8 +186,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack" , msg.getResult()); - query.eq("robot_id" , robotId); + query.set("app_stop_navtrack", msg.getResult()); + query.eq("robot_id", robotId); update(query); } } @@ -191,16 +195,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id" , currRouteId); - query.set("curr_task_id" , currTaskId); - query.eq("robot_id" , robotId); + query.set("curr_route_id", currRouteId); + query.set("curr_task_id", currTaskId); + query.eq("robot_id", robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotId); + query.eq("robot_id", robotId); return getOne(query); } @@ -210,11 +214,11 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}" , responseDTO.getMsg()); + log.info("速度信息保存:{}", responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id" , robotId); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); update(query); } } @@ -224,7 +228,7 @@ RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("急停状态保存:{}" , responseDTO.getMsg()); + log.info("急停状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); @@ -243,14 +247,14 @@ //电压下限 45V 电压上限 58.8V 估算电量 if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); - log.info("电压状态保存:{}" , responseDTO.getMsg()); + log.info("电压状态保存:{}", responseDTO.getMsg()); LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); query.set(RobotStatusInfo::getVoltage, v); //计算电量 - Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); query.eq(RobotStatusInfo::getRobotId, robotId); update(query); } @@ -258,6 +262,16 @@ } + @Override + public void saveCostMap(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + cacheService.updateCostMap(robotId, responseDTO.getMsg()); + log.info("----------------------------------------------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); + } + } + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { String json = new String(message.getPayload()); if (json.startsWith("\"")) { @@ -266,7 +280,7 @@ if (json.endsWith("\"")) { json = json.substring(0, json.length() - 1); } - json = json.replaceAll("\\\\" , ""); + 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/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 f26904b..9b481ce 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 @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,13 +19,17 @@ import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.*; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import com.casic.missiles.modular.robot.opt.instruct.dto.TargetPointRequest; import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.util.WordUtil; import lombok.SneakyThrows; @@ -63,13 +68,15 @@ private final ITaskHeatMapService taskHeatMapService; private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + private final IBaseRobotService baseRobotService; + @Value("${casic.file.uploadPath}") private String uploadPath; @Value("${casic.doc.temp}") private String docTemp; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -77,6 +84,7 @@ this.taskHeatMapService = taskHeatMapService; this.algorithmService = algorithmService; this.cacheService = cacheService; + this.baseRobotService = baseRobotService; } /** @@ -135,8 +143,11 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); - taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); + if (taskInfo != null) { + RobotInfo robotInfo = cacheService.getRobotInfo(taskInfo.getRobotId()); + taskInfo.setRobotName(robotInfo.getRobotName()); + } } @Transactional @@ -172,6 +183,7 @@ Long currTaskId = taskInfo.getId(); statusInfoService.updateCurrTask(robotId, currRouteId, 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); @@ -191,13 +203,22 @@ update(updateWrapper); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); } - //清空任务缓存 + robotCacheClean(robotId); + //清空机器当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + + } + + /** + * 关闭任务清空缓存信息 + * + * @param robotId + */ + private void robotCacheClean(String robotId) { CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); } /** @@ -213,7 +234,7 @@ Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); //缓存当前点位信息 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); @@ -229,7 +250,7 @@ Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 @@ -248,6 +269,7 @@ GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //TO-DO 障碍物判定信息 @@ -256,28 +278,78 @@ pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - - //存储算法估算栅格信息 + //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + //机器人寻点指令下发 + sendTargetPoint(robotInfo, response); } + //是否触发停止状态 if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //机器人停止指令下发 + SoftwareStopRequest request = new SoftwareStopRequest(); + request.setRobotId(robotInfo.getId()); + //设置为急停 + request.setControl(1); + baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + //循迹任务结束 + closeTask(null, robotId); } } } } + /** + * 机器人目标栅格设定 + * + * @param robotInfo 机器人信息 + * @param response 算法输出数据 + */ + private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response) { + //读取已设置巡点目标信息 + PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId()); + //巡点 + if (response.getPointNextDTO() != null && !response.getPointNextDTO().equals(nextDTO)) { + GridPointDTO gridPointDTO = GridPointDTO.convertGridPoint(response.getPointNextDTO()); + //得到寻源栅格数据,转换为栅格目标点位 + GridPointDTO gridCenterPoint = algorithmService.convertGridCenterPoint(gridPointDTO, robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); + TargetPointRequest request = new TargetPointRequest(); + request.setX(Convert.toStr(gridCenterPoint.getX())); + request.setY(Convert.toStr(gridCenterPoint.getY())); + request.setZ("0"); + + request.setRobotId(robotInfo.getId()); + //执行巡点指令 + baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT); + //重设寻点点位 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId(), response.getPointNextDTO()); + } + + } + + /** + * 任务相关图片保存 + * + * @param imgDTO + */ @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + } updateWrapper.set(TaskInfo::getHeatImg, path); updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); } @@ -287,6 +359,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=report.docx"); @@ -319,7 +392,7 @@ if (CollectionUtil.isNotEmpty(records)) { for (AlarmRecord record : records) { //栅格信息转换 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize(),robotInfo); record.setX(pointDTO.getX()); record.setY(pointDTO.getY()); record.setIndex(index); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java index dc6683f..2e62229 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.DetectorInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java new file mode 100644 index 0000000..f09eece --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.robot.vo; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 路线点位信息对象VO + * + * @author lwh + * @date 2023-12-14 + */ +@Data +public class RobotPointInfoVO { + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + private Long routeId; + + public QueryWrapper genQuery() { + QueryWrapper query = new QueryWrapper<>(); + if (robotId != null) { + query.eq("robot_id", robotId); + } + if (routeId != null) { + query.eq("route_id", routeId); + } + return query; + } +} diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index bf403dd..db10efc 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=GMT%2B8 + url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 jms: pub-sub-domain: true # session: diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index b8e78ef..029c779 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -40,8 +40,8 @@ session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 no-login-urls: /user/login,/kaptcha,/config/baseConfig - hikSdk: D:\code\robot\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\HCNetSDK.dll - hikPlay: D:\code\robot\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\PlayCtrl.dll + hikSdk: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\HCNetSDK.dll + hikPlay: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\PlayCtrl.dll algorithm: initPath: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\path\PathPlanning_init.exe planPath: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\path\PathPlanning.exe