前端ID
This commit is contained in:
parent
81423a8ad3
commit
26fa0dfb97
@ -15,7 +15,7 @@ import java.util.List;
|
||||
public class PositionMapItemSynDTO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31007")
|
||||
private Long id;
|
||||
private String id;
|
||||
|
||||
@Schema(description = "坐标x轴")
|
||||
private Double x;
|
||||
|
@ -5,8 +5,10 @@ import cn.hutool.json.JSONUtil;
|
||||
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
||||
import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
|
||||
import cn.iocoder.yudao.module.system.api.robot.dto.*;
|
||||
import cn.iocoder.yudao.module.system.api.robot.processor.RequestProcessor;
|
||||
import cn.iocoder.yudao.module.system.api.robot.vo.RobotInformationVO;
|
||||
import cn.iocoder.yudao.module.system.config.ratelimiter.SystemRateLimiter;
|
||||
import cn.iocoder.yudao.module.system.constant.area.FloorAreaConstant;
|
||||
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
|
||||
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
|
||||
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
|
||||
@ -20,6 +22,7 @@ import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@ -52,13 +55,14 @@ public class RobotStatusApiImpl implements RobotStatusApi {
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
@SystemRateLimiter(time = 1, count = 150, keyArg = "robotStatusUpdate",message = "机器人上报点位超过限流")
|
||||
@SystemRateLimiter(time = 1, count = 150, keyArg = "robotStatusUpdate", message = "机器人上报点位超过限流")
|
||||
public void robotStatusUpdate(RobotPoseStatusDTO robotStatusDataDTO) {
|
||||
updateRobotPosed(robotStatusDataDTO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新点位信息
|
||||
*
|
||||
* @param robotStatusDataDTO
|
||||
*/
|
||||
private void updateRobotPosed(RobotPoseStatusDTO robotStatusDataDTO) {
|
||||
@ -99,6 +103,11 @@ public class RobotStatusApiImpl implements RobotStatusApi {
|
||||
}
|
||||
robotInformationVO.setPose2d(robotStatusDataPoseDTO);
|
||||
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
String value = FloorAreaConstant.FLOOR_AREA_ROBOT + floorZoneDTO.getFloor() + "-" + floorZoneDTO.getArea();
|
||||
map.put(robotNo, robotInformationVO);
|
||||
redisUtil.hmset(value, map, 20);
|
||||
|
||||
// 合并请求 - 这里接受到的数据都丢给 RequestProcessor - 再整合数据通过WebSocket丢给前端
|
||||
processor.handleRequest(floorZoneDTO.getFloor() + "_" + floorZoneDTO.getArea(),
|
||||
robotStatusDataDTO.getMac(), JSONUtil.toJsonStr(robotInformationVO));
|
||||
@ -106,7 +115,7 @@ public class RobotStatusApiImpl implements RobotStatusApi {
|
||||
}
|
||||
|
||||
private void sendToPP(RobotStatusDataPoseDTO robotStatusDataPoseDTO) {
|
||||
taskExecutor.execute(()->{
|
||||
taskExecutor.execute(() -> {
|
||||
commonApi.commonMethod(robotStatusDataPoseDTO, PathPlanningTopicConstant.AGV_POSE);
|
||||
});
|
||||
}
|
||||
|
@ -1,8 +1,7 @@
|
||||
package cn.iocoder.yudao.module.system.api.robot;
|
||||
package cn.iocoder.yudao.module.system.api.robot.processor;
|
||||
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@ -46,7 +45,7 @@ public class RequestProcessor {
|
||||
private void sendData(String map, Map<String, String> data) {
|
||||
// -- 发送给对应的websocket
|
||||
// System.out.println("key:" + map + "发送数据:" + data);
|
||||
log.info("key:" + map + "发送数据:" + data);
|
||||
// log.info("key:" + map + "发送数据:" + data);
|
||||
webSocketSenderApi.sendObject(map, "map_push", data);
|
||||
}
|
||||
|
@ -0,0 +1,59 @@
|
||||
/*
|
||||
package cn.iocoder.yudao.module.system.api.robot.processor;
|
||||
|
||||
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
|
||||
import cn.iocoder.yudao.module.system.constant.area.FloorAreaConstant;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
|
||||
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapService;
|
||||
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
*/
|
||||
/**
|
||||
* 3D推送车辆信息
|
||||
*//*
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ThreeDRequestProcessor {
|
||||
|
||||
private final ConcurrentHashMap<String, ConcurrentHashMap<String, String>> cache = new ConcurrentHashMap<>();
|
||||
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
||||
|
||||
@Resource
|
||||
private PositionMapService positionMapService;
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
@Resource
|
||||
public WebSocketSenderApi webSocketSenderApi;
|
||||
|
||||
public ThreeDRequestProcessor() {
|
||||
// 每秒执行一次 - 处理并发送数据 - 避免数据丢失
|
||||
scheduler.scheduleAtFixedRate(this::processAndSend, 300, 300, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
private void processAndSend() {
|
||||
List<PositionMapDO> allMap = positionMapService.getAllMap();
|
||||
for (PositionMapDO map : allMap) {
|
||||
String key = FloorAreaConstant.FLOOR_AREA_ROBOT + map.getFloor() + "-" + map.getArea();
|
||||
Map<Object, Object> data = redisUtil.hmget(key);
|
||||
System.out.println("3D发送数据 "+ JSON.toJSONString(data));
|
||||
webSocketSenderApi.sendObject(key, "3d_map_robot", data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
*/
|
@ -0,0 +1,12 @@
|
||||
package cn.iocoder.yudao.module.system.constant.area;
|
||||
|
||||
public class FloorAreaConstant {
|
||||
|
||||
//楼层区域的KEY,通过这个KEY,可以查这个楼层下所有的机器人
|
||||
//仅限给WEBSOCKET推送给前端使用,缓存15秒
|
||||
public static String FLOOR_AREA_ROBOT = "floor:area:robot";
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.camera;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
@ -13,6 +15,7 @@ import com.alibaba.excel.annotation.*;
|
||||
public class RobotCameraRespVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30856")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
@ExcelProperty("主键ID")
|
||||
private Long id;
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.chargelog;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
@ -14,6 +16,7 @@ public class RobotChargeLogRespVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6554")
|
||||
@ExcelProperty("主键ID")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "AGV编号")
|
||||
|
@ -1,6 +1,8 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.detail;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@ -9,6 +11,7 @@ import java.time.LocalDateTime;
|
||||
@Data
|
||||
public class RobotTaskDetailLogResoVO {
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26224")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "任务号")
|
||||
|
@ -1,5 +1,7 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.mapstop;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
@ -14,6 +16,7 @@ public class RobotMapStopRespVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1220")
|
||||
@ExcelProperty("主键ID")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "急停仓库点位地图表id", example = "20550")
|
||||
|
@ -2,10 +2,11 @@ package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
@ -14,6 +15,7 @@ import java.util.Set;
|
||||
@ExcelIgnoreUnannotated
|
||||
public class RobotInformationPageRespVO {
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21881")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
@ExcelProperty("主键ID")
|
||||
private Long id;
|
||||
|
||||
|
@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.camera.RobotCameraAddVO;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
@ -17,6 +19,7 @@ public class RobotInformationRespVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21881")
|
||||
@ExcelProperty("主键ID")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "车辆类型表id", example = "28234")
|
||||
|
@ -1,6 +1,8 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
|
||||
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.camera.RobotCameraAddVO;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.hibernate.validator.constraints.Range;
|
||||
@ -16,6 +18,7 @@ import java.util.Set;
|
||||
public class RobotInformationSaveReqVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21881")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "车辆类型表id", example = "28234")
|
||||
|
@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@ -14,6 +16,7 @@ public class RobotModelRespVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15571")
|
||||
@ExcelProperty("主键ID")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "车辆类型", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
|
@ -1,5 +1,7 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
@ -14,6 +16,7 @@ public class RobotTaskAutoMoveRespVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30110")
|
||||
@ExcelProperty("主键ID")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "机器人任务主表id", example = "24553")
|
||||
|
@ -1,5 +1,7 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
|
||||
@ -13,6 +15,7 @@ public class RobotTaskDetailRespVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26224")
|
||||
@ExcelProperty("主键ID")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "机器人任务主表id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9241")
|
||||
|
@ -1,6 +1,8 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
|
||||
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
@ -17,6 +19,7 @@ public class RobotTaskRespVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15306")
|
||||
@ExcelProperty("主键ID")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "是否拼接任务(0:不拼接、1:拼接)", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
|
@ -1,5 +1,7 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
@ -14,6 +16,7 @@ public class RobotWarnCodeMappingRespVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15754")
|
||||
@ExcelProperty("主键ID")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "告警等级 (1,2,3,4)")
|
||||
|
@ -1,5 +1,7 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
@ -14,6 +16,7 @@ public class RobotWarnMsgRespVO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26180")
|
||||
@ExcelProperty("主键ID")
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "AGV编号")
|
||||
|
@ -185,7 +185,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
relatedPathNode.setType(PathTypeEnum.INIT.getType());
|
||||
relatedPathNode.setControl_nodes(positionMapItemSynDTOS);
|
||||
|
||||
log.info("synchronousAllItem----doing");
|
||||
log.info("synchronousAllItem----doing :{}",JSON.toJSONString(relatedPathNode));
|
||||
commonApi.commonMethod(relatedPathNode, PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_NODE);
|
||||
}
|
||||
|
||||
@ -347,7 +347,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
.y(Double.valueOf(positionMapItemDO.getActualLocationY()))
|
||||
.sortNum(positionMapItemDO.getSortNum())
|
||||
.yaw(Double.parseDouble(positionMapItemDO.getLocationYaw()))
|
||||
.id(positionMapItemDO.getId()).build();
|
||||
.id(positionMapItemDO.getId()+"").build();
|
||||
|
||||
PositionMapItemPathDTO PositionMapItemPathDTO = new PositionMapItemPathDTO();
|
||||
PositionMapItemPathDTO.setFloor(positionMapDO.getFloor());
|
||||
@ -418,7 +418,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
.y(Double.valueOf(positionMapItemDO.getActualLocationY()))
|
||||
.sortNum(positionMapItemDO.getSortNum())
|
||||
.yaw(Double.parseDouble(positionMapItemDO.getLocationYaw()))
|
||||
.id(positionMapItemDO.getId()).build();
|
||||
.id(positionMapItemDO.getId()+"").build();
|
||||
|
||||
PositionMapItemPathDTO PositionMapItemPathDTO = new PositionMapItemPathDTO();
|
||||
PositionMapItemPathDTO.setFloor(positionMapDO.getFloor());
|
||||
|
@ -18,7 +18,7 @@ import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO;
|
||||
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotRcsHeartBeatDTO;
|
||||
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotSimulationPoseDTO;
|
||||
import cn.iocoder.yudao.module.mqtt.enums.task.ExecutionTypeEnum;
|
||||
import cn.iocoder.yudao.module.system.api.robot.RequestProcessor;
|
||||
import cn.iocoder.yudao.module.system.api.robot.processor.RequestProcessor;
|
||||
import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO;
|
||||
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
|
||||
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO;
|
||||
|
@ -348,7 +348,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|
||||
|
||||
pathPlanning.setReleaseGroupId("POINT_" + v.getPositionMapItemId());
|
||||
pathPlanning.setReleaseLocationNumber(releaseLocationNumberConfig);
|
||||
pathPlanning.setReleasePointId(v.getPositionMapItemId());
|
||||
pathPlanning.setWaitIds(Collections.singletonList(v.getPositionMapItemId() + ""));
|
||||
|
||||
String key = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId();
|
||||
redisUtil.set(key, JSON.toJSONString(pathPlanning), taskChcheTime);
|
||||
|
Loading…
Reference in New Issue
Block a user