diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionRobotController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionRobotController.java index 3a72807..485d022 100644 --- a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionRobotController.java +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionRobotController.java @@ -172,5 +172,38 @@ public class InspectionRobotController extends BaseController return success(inspectionRobotService.syncRobotStatus(robotId)); } + /** + * 获取机器人实时位置 + */ + @ApiOperation("获取机器人实时位置") + @PreAuthorize("@ss.hasPermi('inspection:robot:query')") + @GetMapping("/{robotId}/location") + public AjaxResult getRobotRealtimeLocation(@PathVariable String robotId) + { + AgvCommand.AgvRobotLocation location = inspectionRobotService.getRobotRealtimeLocation(robotId); + return success(location); + } + + /** + * 导航到指定位置(坐标) + */ + @ApiOperation("导航到指定位置") + @PreAuthorize("@ss.hasPermi('inspection:robot:edit')") + @Log(title = "导航到指定位置", businessType = BusinessType.OTHER) + @PostMapping("/{robotId}/navigate-to-position") + public AjaxResult navigateToPosition( + @PathVariable @ApiParam("机器人ID") String robotId, + @RequestParam @ApiParam("X坐标(米)") Double x, + @RequestParam @ApiParam("Y坐标(米)") Double y, + @RequestParam(required = false) @ApiParam("朝向角(弧度)") Double theta, + @RequestParam(required = false) @ApiParam("任务ID") String taskId + ) + { + AgvCommand.RobotGoTargetResData result = inspectionRobotService.navigateToPosition( + robotId, x, y, theta, taskId + ); + return success(result); + } + } diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/EdgeAgvService.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/EdgeAgvService.java index 161bc0e..a1c8e69 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/EdgeAgvService.java +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/EdgeAgvService.java @@ -79,6 +79,20 @@ public interface EdgeAgvService { AgvCommand.RobotGoTargetResData robotGoTarget(EdgeCommonVO edgeCommonVO, String sourceId, String targetId, String taskId, String operation, Double jackHeight); + /** + * 自由导航到指定坐标位置(命令码3051,使用freego参数) + * 直接导航到指定的X、Y坐标和角度,不依赖站点 + * 注意:此命令会取消当前正在执行的任务,仅支持双轮差速底盘 + * + * @param edgeCommonVO 边缘通用参数 + * @param freeGoPoint 自由导航目标点(包含x、y、theta) + * @param taskId 任务ID(可选,建议提供) + * @return 导航任务下发结果 + */ + AgvCommand.RobotGoTargetResData robotGoTargetWithFreeGo(EdgeCommonVO edgeCommonVO, + AgvCommand.FreeGoPoint freeGoPoint, + String taskId); + /** * 暂停当前导航任务(命令码3001) * 暂停AGV当前正在执行的导航任务,AGV将减速停止 diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/impl/EdgeAgvServiceImpl.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/impl/EdgeAgvServiceImpl.java index 4062a92..19a3893 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/impl/EdgeAgvServiceImpl.java +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/impl/EdgeAgvServiceImpl.java @@ -156,6 +156,46 @@ public class EdgeAgvServiceImpl implements EdgeAgvService { return result; } + @Override + public AgvCommand.RobotGoTargetResData robotGoTargetWithFreeGo(EdgeCommonVO edgeCommonVO, + AgvCommand.FreeGoPoint freeGoPoint, + String taskId) { + if (freeGoPoint == null) { + throw new GlobalException("自由导航目标点不能为空"); + } + + AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( + edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); + + // 构建请求数据,使用freego参数 + AgvCommand.RobotGoTargetReqData.Builder dataBuilder = AgvCommand.RobotGoTargetReqData.newBuilder() + .setSourceId("SELF_POSITION") // 从当前位置开始 + .setId("SELF_POSITION") // 不使用站点ID + .setFreego(freeGoPoint); // 设置自由导航点 + + // 设置可选参数 + if (StrUtil.isNotBlank(taskId)) { + dataBuilder.setTaskId(taskId); + } + + + + AgvCommand.RobotGoTargetCommand.Request request = AgvCommand.RobotGoTargetCommand.Request.newBuilder() + .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) + .setData(dataBuilder.build()) + .build(); + + AgvCommand.RobotGoTargetResData result = executeGrpcCall(() -> stub.robotGoTarget(request)).getData(); + + if (result.getRetCode() != 0) { + throw new GlobalException("自由导航任务下发失败: " + result.getErrMsg()); + } + + + + return result; + } + @Override public AgvCommand.RobotTaskPauseCommand.Feedback.Result robotTaskPause(EdgeCommonVO edgeCommonVO) { AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( diff --git a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionRobotService.java b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionRobotService.java index 523796e..e3c14be 100644 --- a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionRobotService.java +++ b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionRobotService.java @@ -98,4 +98,25 @@ public interface IInspectionRobotService extends IService */ InspectionRobot syncRobotStatus(String robotId); + /** + * 获取机器人实时位置 + * + * @param robotId 机器人ID + * @return 机器人位置信息(包含X、Y坐标、角度、当前站点等) + */ + AgvCommand.AgvRobotLocation getRobotRealtimeLocation(String robotId); + + /** + * 导航到指定位置(坐标) + * + * @param robotId 机器人ID + * @param x X坐标(米) + * @param y Y坐标(米) + * @param theta 朝向角(弧度) + * @param taskId 任务ID(可选) + * @return 导航任务下发结果 + */ + AgvCommand.RobotGoTargetResData navigateToPosition(String robotId, Double x, Double y, + Double theta, String taskId); + } \ No newline at end of file diff --git a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionRobotServiceImpl.java b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionRobotServiceImpl.java index 46a5364..d5f5e65 100644 --- a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionRobotServiceImpl.java +++ b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionRobotServiceImpl.java @@ -332,4 +332,63 @@ public class InspectionRobotServiceImpl extends ServiceImpl