feat(agv): 扩展AGV控制协议定义,新增18个功能模块
- 添加详细的Protobuf消息定义和注释文档 - 新增基本信息查询、电池状态、位置查询等功能模块 - 增加地图上传下载、控制权管理、运动控制等核心功能 - 实现导航任务、站点管理、任务状态查询等高级特性 - 完善AGV服务接口定义,整合所有AGV相关命令 - 提供详细的API参数说明和使用注意事项
This commit is contained in:
parent
fe68120f71
commit
87d691f927
@ -19,7 +19,7 @@ import java.util.List;
|
||||
* @author cmvr-iot
|
||||
* @since 2026-06-05
|
||||
*/
|
||||
@Api(tags = "巡检任务执行日志管理")
|
||||
@Api(tags = "智能巡检-巡检任务执行日志管理")
|
||||
@RestController
|
||||
@RequestMapping("/inspection/taskLog")
|
||||
public class InspectionTaskLogController extends BaseController
|
||||
|
||||
@ -45,6 +45,15 @@ public interface EdgeAgvService {
|
||||
*/
|
||||
AgvCommand.AgvDownloadMapResult robotConfigDownloadMap(EdgeCommonVO edgeCommonVO, String mapName);
|
||||
|
||||
/**
|
||||
* 上传地图(从服务器上传地图到机器人)
|
||||
*
|
||||
* @param edgeCommonVO 边缘通用参数
|
||||
* @param mapContent 地图内容
|
||||
* @return 上传结果
|
||||
*/
|
||||
AgvCommand.AgvUploadMapResult robotConfigUploadMap(EdgeCommonVO edgeCommonVO, String mapContent);
|
||||
|
||||
|
||||
/**
|
||||
* 获取电池状态
|
||||
@ -53,4 +62,87 @@ public interface EdgeAgvService {
|
||||
* @return 电池状态
|
||||
*/
|
||||
AgvCommand.AgvBatteryStatus getBatteryStatus(EdgeCommonVO edgeCommonVO);
|
||||
|
||||
/**
|
||||
* 单点站点自动规划导航(命令码3051)
|
||||
* 从起始站点自动规划路径到目标站点,支持多种操作类型(顶升、货叉、滚筒等)
|
||||
* 注意:此命令会取消当前正在执行的任务,严禁用于多车调度场景
|
||||
*
|
||||
* @param edgeCommonVO 边缘通用参数
|
||||
* @param sourceId 起始站点ID("SELF_POSITION"表示当前位置)
|
||||
* @param targetId 目标站点ID("SELF_POSITION"表示原地执行操作)
|
||||
* @param taskId 任务ID(可选,建议提供)
|
||||
* @param operation 操作类型(如"JackLoad"顶升装载、"ForkUnload"货叉卸载等,可选)
|
||||
* @param jackHeight 顶升高度(米,仅当operation为顶升相关时有效,可选)
|
||||
* @return 导航任务下发结果
|
||||
*/
|
||||
AgvCommand.RobotGoTargetResData robotGoTarget(EdgeCommonVO edgeCommonVO, String sourceId, String targetId,
|
||||
String taskId, String operation, Double jackHeight);
|
||||
|
||||
/**
|
||||
* 暂停当前导航任务(命令码3001)
|
||||
* 暂停AGV当前正在执行的导航任务,AGV将减速停止
|
||||
*
|
||||
* @param edgeCommonVO 边缘通用参数
|
||||
* @return 暂停结果
|
||||
*/
|
||||
AgvCommand.RobotTaskPauseCommand.Feedback.Result robotTaskPause(EdgeCommonVO edgeCommonVO);
|
||||
|
||||
/**
|
||||
* 继续当前导航任务(命令码3002)
|
||||
* 恢复之前被暂停的导航任务,AGV将继续执行
|
||||
*
|
||||
* @param edgeCommonVO 边缘通用参数
|
||||
* @return 继续结果
|
||||
*/
|
||||
AgvCommand.RobotTaskResumeCommand.Feedback.Result robotTaskResume(EdgeCommonVO edgeCommonVO);
|
||||
|
||||
/**
|
||||
* 取消当前导航任务(命令码3003)
|
||||
* 完全取消当前正在执行或暂停的导航任务
|
||||
*
|
||||
* @param edgeCommonVO 边缘通用参数
|
||||
* @return 取消结果
|
||||
*/
|
||||
AgvCommand.RobotTaskCancelCommand.Feedback.Result robotTaskCancel(EdgeCommonVO edgeCommonVO);
|
||||
|
||||
/**
|
||||
* 查询当前实时导航状态(命令码1020)
|
||||
* 获取AGV当前导航任务的详细状态,包括任务进度、已经过站点、剩余站点等
|
||||
*
|
||||
* @param edgeCommonVO 边缘通用参数
|
||||
* @param simple 是否仅返回任务状态(true=仅task_status,false=全量信息)
|
||||
* @return 导航状态信息
|
||||
*/
|
||||
AgvCommand.RobotStatusTaskResData getRobotStatusTaskCurrent(EdgeCommonVO edgeCommonVO, boolean simple);
|
||||
|
||||
/**
|
||||
* 查询当前地图站点列表(命令码1301)
|
||||
* 获取当前加载地图中的所有站点信息,包括站点坐标、类型、描述等
|
||||
*
|
||||
* @param edgeCommonVO 边缘通用参数
|
||||
* @return 站点列表信息
|
||||
*/
|
||||
AgvCommand.QueryStationListResult queryStationList(EdgeCommonVO edgeCommonVO);
|
||||
|
||||
/**
|
||||
* 切换载入地图(命令码2022)
|
||||
* 将AGV切换到指定的地图,目标地图必须已存在于机器人中
|
||||
* 切换后需要等待地图加载完成才能执行导航任务
|
||||
*
|
||||
* @param edgeCommonVO 边缘通用参数
|
||||
* @param mapName 目标地图名称(必填,仅允许字母、数字、-、_)
|
||||
* @return 切换地图结果
|
||||
*/
|
||||
AgvCommand.RobotLoadMapResult robotLoadMap(EdgeCommonVO edgeCommonVO, String mapName);
|
||||
|
||||
/**
|
||||
* 查询地图载入状态(命令码1022)
|
||||
* 查询当前地图加载的状态,可用于判断地图是否加载完成
|
||||
* 状态值:0=失败,1=成功,2=加载中(加载中时禁止执行重定位操作)
|
||||
*
|
||||
* @param edgeCommonVO 边缘通用参数
|
||||
* @return 地图加载状态
|
||||
*/
|
||||
AgvCommand.RobotQueryLoadMapStatusResult queryLoadMapStatus(EdgeCommonVO edgeCommonVO);
|
||||
}
|
||||
@ -78,6 +78,28 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgvCommand.AgvUploadMapResult robotConfigUploadMap(EdgeCommonVO edgeCommonVO, String mapContent) {
|
||||
if (StrUtil.isBlank(mapContent)) {
|
||||
throw new GlobalException("地图内容不能为空");
|
||||
}
|
||||
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
|
||||
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
|
||||
AgvCommand.RobotConfigUploadMapRequestData requestData = AgvCommand.RobotConfigUploadMapRequestData.newBuilder()
|
||||
.setMapContent(mapContent)
|
||||
.build();
|
||||
AgvCommand.RobotConfigUploadMapCommand.Request request = AgvCommand.RobotConfigUploadMapCommand.Request.newBuilder()
|
||||
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
|
||||
.setData(requestData)
|
||||
.build();
|
||||
AgvCommand.AgvUploadMapResult result = executeGrpcCall(() -> stub.robotConfigUploadMap(request)).getStatus();
|
||||
|
||||
if (result.getRetCode() != 0) {
|
||||
throw new GlobalException("上传地图失败: " + result.getErrMsg());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgvCommand.AgvBatteryStatus getBatteryStatus(EdgeCommonVO edgeCommonVO) {
|
||||
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
|
||||
@ -92,6 +114,155 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
|
||||
return executeGrpcCall(() -> stub.getBatteryStatus(request)).getStatus();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgvCommand.RobotGoTargetResData robotGoTarget(EdgeCommonVO edgeCommonVO, String sourceId, String targetId,
|
||||
String taskId, String operation, Double jackHeight) {
|
||||
if (StrUtil.isBlank(sourceId)) {
|
||||
throw new GlobalException("起始站点ID不能为空");
|
||||
}
|
||||
if (StrUtil.isBlank(targetId)) {
|
||||
throw new GlobalException("目标站点ID不能为空");
|
||||
}
|
||||
|
||||
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
|
||||
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
|
||||
|
||||
// 构建请求数据
|
||||
AgvCommand.RobotGoTargetReqData.Builder dataBuilder = AgvCommand.RobotGoTargetReqData.newBuilder()
|
||||
.setSourceId(sourceId)
|
||||
.setId(targetId);
|
||||
|
||||
// 设置可选参数
|
||||
if (StrUtil.isNotBlank(taskId)) {
|
||||
dataBuilder.setTaskId(taskId);
|
||||
}
|
||||
if (StrUtil.isNotBlank(operation)) {
|
||||
dataBuilder.setOperation(operation);
|
||||
}
|
||||
if (jackHeight != null) {
|
||||
dataBuilder.setJackHeight(jackHeight);
|
||||
}
|
||||
|
||||
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(
|
||||
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
|
||||
AgvCommand.RobotTaskPauseCommand.Request request = AgvCommand.RobotTaskPauseCommand.Request.newBuilder()
|
||||
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
|
||||
.build();
|
||||
AgvCommand.RobotTaskPauseCommand.Feedback.Result result = executeGrpcCall(() -> stub.robotTaskPause(request)).getStatus();
|
||||
|
||||
if (result.getRetCode() != 0) {
|
||||
throw new GlobalException("暂停导航任务失败: " + result.getErrMsg());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgvCommand.RobotTaskResumeCommand.Feedback.Result robotTaskResume(EdgeCommonVO edgeCommonVO) {
|
||||
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
|
||||
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
|
||||
AgvCommand.RobotTaskResumeCommand.Request request = AgvCommand.RobotTaskResumeCommand.Request.newBuilder()
|
||||
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
|
||||
.build();
|
||||
AgvCommand.RobotTaskResumeCommand.Feedback.Result result = executeGrpcCall(() -> stub.robotTaskResume(request)).getStatus();
|
||||
|
||||
if (result.getRetCode() != 0) {
|
||||
throw new GlobalException("继续导航任务失败: " + result.getErrMsg());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgvCommand.RobotTaskCancelCommand.Feedback.Result robotTaskCancel(EdgeCommonVO edgeCommonVO) {
|
||||
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
|
||||
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
|
||||
AgvCommand.RobotTaskCancelCommand.Request request = AgvCommand.RobotTaskCancelCommand.Request.newBuilder()
|
||||
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
|
||||
.build();
|
||||
AgvCommand.RobotTaskCancelCommand.Feedback.Result result = executeGrpcCall(() -> stub.robotTaskCancel(request)).getStatus();
|
||||
|
||||
if (result.getRetCode() != 0) {
|
||||
throw new GlobalException("取消导航任务失败: " + result.getErrMsg());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgvCommand.RobotStatusTaskResData getRobotStatusTaskCurrent(EdgeCommonVO edgeCommonVO, boolean simple) {
|
||||
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
|
||||
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
|
||||
AgvCommand.RobotStatusTaskReqData requestData = AgvCommand.RobotStatusTaskReqData.newBuilder()
|
||||
.setSimple(simple)
|
||||
.build();
|
||||
AgvCommand.RobotStatusTaskCurrentCommand.Request request = AgvCommand.RobotStatusTaskCurrentCommand.Request.newBuilder()
|
||||
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
|
||||
.setData(requestData)
|
||||
.build();
|
||||
return executeGrpcCall(() -> stub.robotStatusTaskCurrent(request)).getData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgvCommand.QueryStationListResult queryStationList(EdgeCommonVO edgeCommonVO) {
|
||||
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
|
||||
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
|
||||
AgvCommand.QueryStationListCommand.Request request = AgvCommand.QueryStationListCommand.Request.newBuilder()
|
||||
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
|
||||
.build();
|
||||
AgvCommand.QueryStationListResult result = executeGrpcCall(() -> stub.queryStationList(request)).getStatus();
|
||||
|
||||
if (result.getRetCode() != 0) {
|
||||
throw new GlobalException("查询站点列表失败: " + result.getErrMsg());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgvCommand.RobotLoadMapResult robotLoadMap(EdgeCommonVO edgeCommonVO, String mapName) {
|
||||
if (StrUtil.isBlank(mapName)) {
|
||||
throw new GlobalException("地图名称不能为空");
|
||||
}
|
||||
|
||||
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
|
||||
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
|
||||
AgvCommand.RobotLoadMapRequestData requestData = AgvCommand.RobotLoadMapRequestData.newBuilder()
|
||||
.setMapName(mapName)
|
||||
.build();
|
||||
AgvCommand.RobotLoadMapCommand.Request request = AgvCommand.RobotLoadMapCommand.Request.newBuilder()
|
||||
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
|
||||
.setData(requestData)
|
||||
.build();
|
||||
AgvCommand.RobotLoadMapResult result = executeGrpcCall(() -> stub.robotLoadMap(request)).getStatus();
|
||||
|
||||
if (result.getRetCode() != 0) {
|
||||
throw new GlobalException("切换地图失败: " + result.getErrMsg());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgvCommand.RobotQueryLoadMapStatusResult queryLoadMapStatus(EdgeCommonVO edgeCommonVO) {
|
||||
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
|
||||
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
|
||||
AgvCommand.RobotQueryLoadMapStatusCommand.Request request = AgvCommand.RobotQueryLoadMapStatusCommand.Request.newBuilder()
|
||||
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
|
||||
.build();
|
||||
return executeGrpcCall(() -> stub.queryLoadMapStatus(request)).getStatus();
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行gRPC调用并处理异常
|
||||
*
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -24,7 +24,7 @@ public final class AgvServiceOuterClass {
|
||||
static {
|
||||
java.lang.String[] descriptorData = {
|
||||
"\n\032cmvr/api/agv_service.proto\022\010cmvr.api\032\032" +
|
||||
"cmvr/api/agv_command.proto2\252\004\n\nAgvServic" +
|
||||
"cmvr/api/agv_command.proto2\244\021\n\nAgvServic" +
|
||||
"e\022f\n\rGetStatusInfo\022).cmvr.api.GetAgvStat" +
|
||||
"usInfoCommand.Request\032*.cmvr.api.GetAgvS" +
|
||||
"tatusInfoCommand.Feedback\022m\n\020GetBatteryS" +
|
||||
@ -38,7 +38,49 @@ public final class AgvServiceOuterClass {
|
||||
"r.api.RobotConfigDownloadMapCommand.Feed" +
|
||||
"back\022a\n\014GetMapStatus\022\'.cmvr.api.RobotSta" +
|
||||
"tusMapCommand.Request\032(.cmvr.api.RobotSt" +
|
||||
"atusMapCommand.Feedbackb\006proto3"
|
||||
"atusMapCommand.Feedback\022u\n\024RobotConfigUp" +
|
||||
"loadMap\022-.cmvr.api.RobotConfigUploadMapC" +
|
||||
"ommand.Request\032..cmvr.api.RobotConfigUpl" +
|
||||
"oadMapCommand.Feedback\022f\n\017RobotConfigLoc" +
|
||||
"k\022(.cmvr.api.RobotConfigLockCommand.Requ" +
|
||||
"est\032).cmvr.api.RobotConfigLockCommand.Fe" +
|
||||
"edback\022y\n\024GetCurrentLockStatus\022/.cmvr.ap" +
|
||||
"i.RobotStatusCurrentLockCommand.Request\032" +
|
||||
"0.cmvr.api.RobotStatusCurrentLockCommand" +
|
||||
".Feedback\022o\n\022RobotMotionControl\022+.cmvr.a" +
|
||||
"pi.RobotMotionControlCommand.Request\032,.c" +
|
||||
"mvr.api.RobotMotionControlCommand.Feedba" +
|
||||
"ck\022]\n\014RobotLoadMap\022%.cmvr.api.RobotLoadM" +
|
||||
"apCommand.Request\032&.cmvr.api.RobotLoadMa" +
|
||||
"pCommand.Feedback\022y\n\022QueryLoadMapStatus\022" +
|
||||
"0.cmvr.api.RobotQueryLoadMapStatusComman" +
|
||||
"d.Request\0321.cmvr.api.RobotQueryLoadMapSt" +
|
||||
"atusCommand.Feedback\022i\n\020QueryStationList" +
|
||||
"\022).cmvr.api.QueryStationListCommand.Requ" +
|
||||
"est\032*.cmvr.api.QueryStationListCommand.F" +
|
||||
"eedback\022l\n\021RobotGoTargetList\022*.cmvr.api." +
|
||||
"RobotGoTargetListCommand.Request\032+.cmvr." +
|
||||
"api.RobotGoTargetListCommand.Feedback\022{\n" +
|
||||
"\026RobotStatusTaskCurrent\022/.cmvr.api.Robot" +
|
||||
"StatusTaskCurrentCommand.Request\0320.cmvr." +
|
||||
"api.RobotStatusTaskCurrentCommand.Feedba" +
|
||||
"ck\022{\n\026RobotStatusTaskPackage\022/.cmvr.api." +
|
||||
"RobotStatusTaskPackageCommand.Request\0320." +
|
||||
"cmvr.api.RobotStatusTaskPackageCommand.F" +
|
||||
"eedback\022`\n\rRobotGoTarget\022&.cmvr.api.Robo" +
|
||||
"tGoTargetCommand.Request\032\'.cmvr.api.Robo" +
|
||||
"tGoTargetCommand.Feedback\022i\n\020RobotContro" +
|
||||
"lStop\022).cmvr.api.RobotControlStopCommand" +
|
||||
".Request\032*.cmvr.api.RobotControlStopComm" +
|
||||
"and.Feedback\022c\n\016RobotTaskPause\022\'.cmvr.ap" +
|
||||
"i.RobotTaskPauseCommand.Request\032(.cmvr.a" +
|
||||
"pi.RobotTaskPauseCommand.Feedback\022f\n\017Rob" +
|
||||
"otTaskResume\022(.cmvr.api.RobotTaskResumeC" +
|
||||
"ommand.Request\032).cmvr.api.RobotTaskResum" +
|
||||
"eCommand.Feedback\022f\n\017RobotTaskCancel\022(.c" +
|
||||
"mvr.api.RobotTaskCancelCommand.Request\032)" +
|
||||
".cmvr.api.RobotTaskCancelCommand.Feedbac" +
|
||||
"kb\006proto3"
|
||||
};
|
||||
descriptor = com.google.protobuf.Descriptors.FileDescriptor
|
||||
.internalBuildGeneratedFileFrom(descriptorData,
|
||||
|
||||
@ -1,109 +1,161 @@
|
||||
/**
|
||||
* @file agv_command.proto
|
||||
* @brief AGV 控制相关的 Protobuf 消息定义。
|
||||
* 涵盖仙工智能(Seer)SRC 系列控制器的主要 API 命令,
|
||||
* 包括状态查询、电池、位置、地图管理、控制权、运动控制、导航任务等。
|
||||
* @note 所有命令均遵循仙工协议帧格式,通过 gRPC 服务(AgvService)对外暴露。
|
||||
*/
|
||||
|
||||
syntax = "proto3";
|
||||
|
||||
import "cmvr/api/common.proto";
|
||||
|
||||
package cmvr.api;
|
||||
|
||||
// AGV状态信息
|
||||
// ============================================================================
|
||||
// 1. 基本信息查询(命令码 1000, 0x03E8)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief AGV 基本信息响应结构。
|
||||
* @note 对应仙工 API 1000(0x03E8)的响应体,包含设备标识、软硬件版本、网络状态等。
|
||||
*/
|
||||
message AgvStatusInfo {
|
||||
optional string id = 1; // AGV ID
|
||||
optional string vehicle_id = 2; // 车辆ID
|
||||
optional string version = 3; // 软件版本
|
||||
optional string model = 4; // 型号
|
||||
optional string dsp_version = 5; // DSP版本
|
||||
optional string current_ip = 6; // 当前IP地址
|
||||
optional string mac = 7; // MAC地址
|
||||
optional int32 rssi = 8; // 信号强度
|
||||
optional int32 ret_code = 9; // 返回码
|
||||
optional string err_msg = 10; // 错误信息
|
||||
optional string id = 1; ///< AGV 设备唯一 ID
|
||||
optional string vehicle_id = 2; ///< 车辆编号(如 "agv_001")
|
||||
optional string version = 3; ///< 软件版本号
|
||||
optional string model = 4; ///< 车型型号(如 "SRC-1100")
|
||||
optional string dsp_version = 5; ///< DSP 固件版本
|
||||
optional string current_ip = 6; ///< 当前 IP 地址
|
||||
optional string mac = 7; ///< MAC 地址
|
||||
optional int32 rssi = 8; ///< Wi-Fi 信号强度(0~100)
|
||||
optional int32 ret_code = 9; ///< 返回码,0 表示成功
|
||||
optional string err_msg = 10; ///< 错误信息(失败时填充)
|
||||
}
|
||||
|
||||
// 获取AGV状态命令
|
||||
/**
|
||||
* @brief 获取 AGV 状态命令(请求/反馈)。
|
||||
* @note 请求携带设备 ID(header.device_id),反馈返回 AgvStatusInfo。
|
||||
*/
|
||||
message GetAgvStatusInfoCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
CommandHeader.Request header = 1; ///< 公共请求头,包含 device_id
|
||||
}
|
||||
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
AgvStatusInfo status = 2;
|
||||
CommandHeader.Feedback header = 1; ///< 公共响应头(success/error_message/timestamp)
|
||||
AgvStatusInfo status = 2; ///< AGV 状态信息
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ===================== 电池状态查询 =====================
|
||||
// ============================================================================
|
||||
// 2. 电池状态查询(命令码 1007, 0x03EF)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 电池状态响应结构。
|
||||
* @note 对应仙工 API 1007(0x03EF),支持简单/全量两种模式。
|
||||
*/
|
||||
message AgvBatteryStatus {
|
||||
optional double battery_level = 1; // 电池电量 [0,1]
|
||||
optional double battery_temp = 2; // 电池温度 ℃
|
||||
optional bool charging = 3; // 是否正在充电
|
||||
optional double voltage = 4; // 电压 V
|
||||
optional double current = 5; // 电流 A
|
||||
optional double max_charge_voltage = 6; // 最大充电电压,-1=不支持
|
||||
optional double max_charge_current = 7; // 最大充电电流,-1=不支持
|
||||
optional bool manual_charge = 8; // 手动充电状态
|
||||
optional bool auto_charge = 9; // 自动充电状态
|
||||
optional int32 battery_cycle = 10; // 电池循环次数
|
||||
optional string battery_user_data = 11; // 电池自定义数据
|
||||
optional string extra = 12; // 客户自定义数据
|
||||
optional int32 ret_code = 13; // 错误码
|
||||
optional string create_on = 14; // 时间戳
|
||||
optional string err_msg = 15; // 错误信息
|
||||
optional double battery_level = 1; ///< 电池电量(0~1,对应 0%~100%)
|
||||
optional double battery_temp = 2; ///< 电池温度(摄氏度)
|
||||
optional bool charging = 3; ///< 是否正在充电
|
||||
optional double voltage = 4; ///< 当前电压(V)
|
||||
optional double current = 5; ///< 当前电流(A)
|
||||
optional double max_charge_voltage = 6; ///< 最大充电电压(-1 表示不支持)
|
||||
optional double max_charge_current = 7; ///< 最大充电电流(-1 表示不支持)
|
||||
optional bool manual_charge = 8; ///< 是否连接手动充电器(仅 SRC-2000)
|
||||
optional bool auto_charge = 9; ///< 是否连接自动充电桩(仅 SRC-2000)
|
||||
optional int32 battery_cycle = 10; ///< 电池循环次数(从 BMS 读取,可能不准)
|
||||
optional string battery_user_data = 11; ///< 电池用户自定义数据
|
||||
optional string extra = 12; ///< 扩展字段(预留)
|
||||
optional int32 ret_code = 13; ///< 返回码,0 表示成功
|
||||
optional string create_on = 14; ///< 数据创建时间戳(ISO 8601)
|
||||
optional string err_msg = 15; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 电池状态请求数据。
|
||||
*/
|
||||
message RobotStatusBatteryRequestData {
|
||||
optional bool simple = 1; // true:仅简单数据 false:全量数据,默认false
|
||||
optional bool simple = 1; ///< true=仅关键数据,false=全量数据(默认 false)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 电池状态查询命令。
|
||||
*/
|
||||
message RobotStatusBatteryCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
RobotStatusBatteryRequestData data = 2;
|
||||
CommandHeader.Request header = 1; ///< 公共请求头
|
||||
RobotStatusBatteryRequestData data = 2; ///< 请求参数
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
AgvBatteryStatus status = 2;
|
||||
CommandHeader.Feedback header = 1; ///< 公共响应头
|
||||
AgvBatteryStatus status = 2; ///< 电池状态信息
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 3. 机器人位置查询(命令码 1004, 0x03EC)
|
||||
// ============================================================================
|
||||
|
||||
// ===================== 机器人位置查询 =====================
|
||||
/**
|
||||
* @brief 机器人位置响应结构。
|
||||
* @note 对应仙工 API 1004(0x03EC),返回世界坐标系下的位姿。
|
||||
*/
|
||||
message AgvRobotLocation {
|
||||
optional double x = 1; // X坐标(m)
|
||||
optional double y = 2; // Y坐标(m)
|
||||
optional double angle = 3; // 姿态角(rad)
|
||||
optional double confidence = 4; // 定位置信度[0,1]
|
||||
optional string current_station = 5; // 当前最近站点ID
|
||||
optional string last_station = 6; // 上一站点ID
|
||||
optional int32 loc_method = 7; // 定位方式
|
||||
optional int32 ret_code = 8; // 错误码
|
||||
optional string create_on = 9; // 时间戳
|
||||
optional string err_msg = 10; // 错误信息
|
||||
optional double x = 1; ///< X 坐标(米)
|
||||
optional double y = 2; ///< Y 坐标(米)
|
||||
optional double angle = 3; ///< 朝向角(弧度),逆时针为正
|
||||
optional double confidence = 4; ///< 定位置信度(0~1)
|
||||
optional string current_station = 5; ///< 当前所在站点 ID(若在站点上)
|
||||
optional string last_station = 6; ///< 上一个经过的站点 ID
|
||||
optional int32 loc_method = 7; ///< 定位方式(0=自然轮廓, 1=反光柱, 2=二维码, 3=里程计...)
|
||||
optional int32 ret_code = 8; ///< 返回码,0 表示成功
|
||||
optional string create_on = 9; ///< 时间戳
|
||||
optional string err_msg = 10; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 位置查询命令(无请求数据)。
|
||||
*/
|
||||
message RobotStatusLocCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
CommandHeader.Request header = 1; ///< 公共请求头
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
AgvRobotLocation status = 2;
|
||||
CommandHeader.Feedback header = 1; ///< 公共响应头
|
||||
AgvRobotLocation status = 2; ///< 位置信息
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ===================== 地图下载 =====================
|
||||
// ============================================================================
|
||||
// 4. 地图下载(命令码 4011, 0x0FAB)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 地图下载请求数据。
|
||||
*/
|
||||
message RobotConfigDownloadMapRequestData {
|
||||
optional string map_name = 1; // 地图名称
|
||||
optional string map_name = 1; ///< 要下载的地图名称(必填)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 地图下载响应结果。
|
||||
*/
|
||||
message AgvDownloadMapResult {
|
||||
optional int32 ret_code = 1;
|
||||
optional string create_on = 2;
|
||||
optional string err_msg = 3;
|
||||
optional string map_content = 4; // 完整地图JSON文本
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
optional string map_content = 4; ///< 地图 JSON 文件内容(成功时填充)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 地图下载命令。
|
||||
*/
|
||||
message RobotConfigDownloadMapCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
@ -116,26 +168,36 @@ message RobotConfigDownloadMapCommand {
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 5. 地图状态查询(命令码 1300, 0x0514)
|
||||
// ============================================================================
|
||||
|
||||
// 单条地图文件信息
|
||||
/**
|
||||
* @brief 单个地图文件信息。
|
||||
*/
|
||||
message MapFileInfo {
|
||||
optional string name = 1;
|
||||
optional string modified = 2;
|
||||
optional int64 size = 3;
|
||||
optional string name = 1; ///< 文件名
|
||||
optional string modified = 2; ///< 最后修改时间
|
||||
optional int64 size = 3; ///< 文件大小(字节)
|
||||
}
|
||||
|
||||
// 地图查询响应
|
||||
/**
|
||||
* @brief 地图状态响应结构。
|
||||
* @note 对应仙工 API 1300(0x0514),返回当前地图及所有地图列表。
|
||||
*/
|
||||
message AgvMapStatus {
|
||||
optional string current_map = 1;
|
||||
optional string current_map_md5 = 2;
|
||||
repeated string maps = 3;
|
||||
repeated MapFileInfo map_files_info = 4;
|
||||
optional int32 ret_code = 5;
|
||||
optional string create_on = 6;
|
||||
optional string err_msg = 7;
|
||||
optional string current_map = 1; ///< 当前加载的地图名称
|
||||
optional string current_map_md5 = 2; ///< 当前地图的 MD5 校验值
|
||||
repeated string maps = 3; ///< 所有地图名称列表
|
||||
repeated MapFileInfo map_files_info = 4; ///< 每个地图文件的详细信息
|
||||
optional int32 ret_code = 5; ///< 返回码,0 表示成功
|
||||
optional string create_on = 6; ///< 时间戳
|
||||
optional string err_msg = 7; ///< 错误信息
|
||||
}
|
||||
|
||||
// 查询地图状态命令
|
||||
/**
|
||||
* @brief 地图状态查询命令(无请求数据)。
|
||||
*/
|
||||
message RobotStatusMapCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
@ -145,3 +207,700 @@ message RobotStatusMapCommand {
|
||||
AgvMapStatus status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 6. 上传地图(命令码 4010, 0x0FAA)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 上传地图请求数据。
|
||||
*/
|
||||
message RobotConfigUploadMapRequestData {
|
||||
optional string map_content = 1; ///< 完整的地图 JSON 字符串(必填)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 上传地图响应结果。
|
||||
*/
|
||||
message AgvUploadMapResult {
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 上传地图命令。
|
||||
*/
|
||||
message RobotConfigUploadMapCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
RobotConfigUploadMapRequestData data = 2;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
AgvUploadMapResult status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 7. 抢占控制权(命令码 4005, 0x0FA5)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 抢占控制权请求数据。
|
||||
*/
|
||||
message RobotConfigLockRequestData {
|
||||
optional string nick_name = 1; ///< 抢占者昵称/标识(必填)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 抢占控制权响应结果。
|
||||
*/
|
||||
message AgvLockResult {
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 抢占控制权命令。
|
||||
*/
|
||||
message RobotConfigLockCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
RobotConfigLockRequestData data = 2;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
AgvLockResult status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 8. 查询当前控制权所有者(命令码 1060, 0x0424)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 当前控制权所有者响应结构。
|
||||
* @note 对应仙工 API 1060(0x0424)。
|
||||
*/
|
||||
message AgvCurrentLockStatus {
|
||||
optional bool locked = 1; ///< 是否被锁定(有持有者)
|
||||
optional string ip = 2; ///< 持有者 IP 地址
|
||||
optional int32 port = 3; ///< 持有者端口
|
||||
optional uint32 type = 4; ///< 持有者类型(0=default, 2=roboshop, 0xDD=srd)
|
||||
optional string nick_name = 5; ///< 持有者昵称
|
||||
optional int64 time_t = 6; ///< 锁定时间戳(Unix 秒)
|
||||
optional string desc = 7; ///< 描述信息
|
||||
optional int32 ret_code = 8; ///< 返回码,0 表示成功
|
||||
optional string create_on = 9; ///< 时间戳
|
||||
optional string err_msg = 10; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 查询控制权命令(无请求数据)。
|
||||
*/
|
||||
message RobotStatusCurrentLockCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
AgvCurrentLockStatus status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 9. 开环速度运动控制(命令码 2010, 0x07DA)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 开环速度运动控制请求数据。
|
||||
* @note 命令码 2010(0x07DA)。下发后会强制取消当前自动导航任务。
|
||||
* 多舵轮设备仅 vx/vy/w 生效;steer/real_steer 仅单舵轮设备有效。
|
||||
* duration = -1 表示持续运行直到下一次指令。
|
||||
*/
|
||||
message RobotMotionControlRequestData {
|
||||
optional double vx = 1; ///< X 方向线速度(m/s)
|
||||
optional double vy = 2; ///< Y 方向线速度(m/s)
|
||||
optional double w = 3; ///< 角速度(rad/s),逆时针为正
|
||||
optional double steer = 4; ///< 舵轮转向角(单舵轮,单位 rad)
|
||||
optional double real_steer = 5; ///< 实际舵轮角度(单舵轮,优先级高于 steer)
|
||||
optional int64 duration = 6; ///< 持续时间(ms),-1 表示一直运行
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 开环运动控制响应结果。
|
||||
*/
|
||||
message RobotMotionControlResult {
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 开环运动控制命令。
|
||||
*/
|
||||
message RobotMotionControlCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
RobotMotionControlRequestData data = 2;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
RobotMotionControlResult status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 10. 切换载入地图(命令码 2022, 0x07E6)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 切换地图请求数据。
|
||||
* @note 命令码 2022(0x07E6)。目标地图必须已存在于机器人中。
|
||||
*/
|
||||
message RobotLoadMapRequestData {
|
||||
optional string map_name = 1; ///< 目标地图名称(必填,仅字母数字-_)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 切换地图响应结果。
|
||||
*/
|
||||
message RobotLoadMapResult {
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 切换地图命令。
|
||||
*/
|
||||
message RobotLoadMapCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
RobotLoadMapRequestData data = 2;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
RobotLoadMapResult status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 11. 查询地图载入状态(命令码 1022, 0x03FE)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 地图载入状态响应。
|
||||
* @note 命令码 1022(0x03FE)。loadmap_status: 0=失败, 1=成功, 2=载入中。
|
||||
* 载入中(2)时禁止执行重定位操作。
|
||||
*/
|
||||
message RobotQueryLoadMapStatusResult {
|
||||
optional int32 loadmap_status = 1; ///< 0=失败, 1=成功, 2=载入中
|
||||
optional int32 ret_code = 2; ///< 返回码,0 表示成功
|
||||
optional string create_on = 3; ///< 时间戳
|
||||
optional string err_msg = 4; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 查询地图载入状态命令(无请求数据)。
|
||||
*/
|
||||
message RobotQueryLoadMapStatusCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
RobotQueryLoadMapStatusResult status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 12. 查询站点列表(命令码 1301, 0x0515)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 单个站点信息。
|
||||
*/
|
||||
message StationItem {
|
||||
optional string id = 1; ///< 站点唯一 ID
|
||||
optional string type = 2; ///< 站点类型(如 "LocationMark", "ChargePoint")
|
||||
optional double x = 3; ///< X 坐标(米)
|
||||
optional double y = 4; ///< Y 坐标(米)
|
||||
optional double r = 5; ///< 朝向角(弧度)
|
||||
optional string desc = 6; ///< 描述信息
|
||||
optional string executor = 7; ///< 执行器信息
|
||||
optional string prepoint = 8; ///< 前置点 ID
|
||||
optional string recfile = 9; ///< 识别文件路径
|
||||
optional bool spin = 10; ///< 是否允许自旋
|
||||
optional bool use_down_pgv = 11; ///< 是否使用下视 PGV
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 站点列表响应结果。
|
||||
*/
|
||||
message QueryStationListResult {
|
||||
repeated StationItem stations = 1; ///< 站点列表
|
||||
optional int32 ret_code = 2; ///< 返回码,0 表示成功
|
||||
optional string create_on = 3; ///< 时间戳
|
||||
optional string err_msg = 4; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 查询站点列表命令(无请求数据)。
|
||||
*/
|
||||
message QueryStationListCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
QueryStationListResult status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 13. 指定路径导航(命令码 3066, 0x0BFA)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 单段导航任务单元。
|
||||
* @note 用于 3066 命令的 move_task_list 数组。
|
||||
* source_id 和 id 之间必须有直接路径,不可跳点。
|
||||
*/
|
||||
message MoveTaskItem {
|
||||
optional string task_id = 1; ///< 任务唯一 ID(必填)
|
||||
optional string source_id = 2; ///< 起始站点 ID(必填)
|
||||
optional string id = 3; ///< 目标站点 ID(必填)
|
||||
optional string operation = 4; ///< 到达后执行的动作(如 "JackLoad")
|
||||
optional double jack_height = 5; ///< 顶升高度(米)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 指定路径导航请求数据。
|
||||
*/
|
||||
message RobotGoTargetListRequestData {
|
||||
repeated MoveTaskItem move_task_list = 1; ///< 导航任务序列(顺序执行)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 指定路径导航响应结果。
|
||||
* @note ret_code=0 仅表示指令被接收,不表示执行完成。
|
||||
*/
|
||||
message RobotGoTargetListResult {
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功接收
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 指定路径导航命令。
|
||||
*/
|
||||
message RobotGoTargetListCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
RobotGoTargetListRequestData data = 2;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
RobotGoTargetListResult status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 14. 查询当前实时导航状态(命令码 1020, 0x03FC)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 1020 命令请求数据。
|
||||
*/
|
||||
message RobotStatusTaskReqData {
|
||||
optional bool simple = 1; ///< true=仅返回 task_status,false=全量
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 导航任务中的料箱信息。
|
||||
*/
|
||||
message NavContainerItem {
|
||||
optional string container_name = 1; ///< 料箱名称
|
||||
optional string desc = 2; ///< 描述
|
||||
optional string goods_id = 3; ///< 绑定的货物 ID
|
||||
optional bool has_goods = 4; ///< 是否已绑定货物
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 1020 命令响应数据。
|
||||
*/
|
||||
message RobotStatusTaskResData {
|
||||
optional int32 task_status = 1; ///< 0=NONE, 1=WAITING, 2=RUNNING, 3=SUSPENDED, 4=COMPLETED, 5=FAILED, 6=CANCELED
|
||||
optional int32 task_type = 2; ///< 0=无, 1=自由导航到坐标, 2=自由导航到站点, 3=路径导航到站点, 7=平动转动
|
||||
optional string target_id = 3; ///< 目标站点 ID(task_type 为 2/3 时)
|
||||
repeated double target_point = 4; ///< 目标坐标 [x, y, r](task_type 为 1 时)
|
||||
repeated string finished_path = 5; ///< 已经过的站点列表
|
||||
repeated string unfinished_path = 6; ///< 尚未经过的站点列表
|
||||
optional string move_status_info = 7; ///< 附加信息(如错误描述)
|
||||
repeated NavContainerItem containers = 8; ///< 料箱信息
|
||||
optional int32 ret_code = 9; ///< 返回码,0 表示成功
|
||||
optional string create_on = 10; ///< 时间戳
|
||||
optional string err_msg = 11; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 查询当前导航状态命令。
|
||||
*/
|
||||
message RobotStatusTaskCurrentCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
RobotStatusTaskReqData data = 2;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
RobotStatusTaskResData data = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 15. 批量查询任务状态(命令码 1110, 0x0456)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 1110 命令请求数据。
|
||||
*/
|
||||
message QueryTaskStatusPackageReqData {
|
||||
repeated string task_ids = 1; ///< 要查询的任务 ID 列表;为空则查所有未完成 + 最近一条完成
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 单条任务状态项。
|
||||
*/
|
||||
message SingleTaskStatusItem {
|
||||
optional string task_id = 1; ///< 任务 ID
|
||||
optional int32 status = 2; ///< 状态码(同 task_status)
|
||||
optional int32 type = 3; ///< 任务类型(同 task_type)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 任务状态包(包含最近完成和所有未完成的任务)。
|
||||
*/
|
||||
message TaskStatusPackage {
|
||||
optional string closest_target = 1; ///< 最近站点 ID
|
||||
optional string source_name = 2; ///< 起点站点名称
|
||||
optional string target_name = 3; ///< 终点站点名称
|
||||
optional double percentage = 4; ///< 任务进度百分比(0~100)
|
||||
optional double distance = 5; ///< 剩余距离(米)
|
||||
optional string info = 6; ///< 附加信息
|
||||
repeated SingleTaskStatusItem task_status_list = 7; ///< 所有任务状态列表
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 1110 命令响应数据。
|
||||
*/
|
||||
message QueryTaskStatusPackageResData {
|
||||
optional TaskStatusPackage task_status_package = 1; ///< 任务状态包
|
||||
optional int32 ret_code = 2; ///< 返回码,0 表示成功
|
||||
optional string create_on = 3; ///< 时间戳
|
||||
optional string err_msg = 4; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 批量查询任务状态命令。
|
||||
*/
|
||||
message RobotStatusTaskPackageCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
QueryTaskStatusPackageReqData data = 2;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
QueryTaskStatusPackageResData data = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 16. 单点站点自动规划导航(命令码 3051, 0x0BEB)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief DI(数字输入)点位。
|
||||
*/
|
||||
message DIItem {
|
||||
int32 id = 1; ///< DI 编号
|
||||
bool status = 2; ///< 状态(true=高电平, false=低电平)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DO(数字输出)点位。
|
||||
*/
|
||||
message DOItem {
|
||||
int32 id = 1; ///< DO 编号
|
||||
bool status = 2; ///< 状态(true=高电平, false=低电平)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 音频播放参数。
|
||||
*/
|
||||
message SoundArgs {
|
||||
optional string name = 1; ///< 音频文件名
|
||||
optional int32 loop = 2; ///< 循环次数(0=播放一次, 1=循环)
|
||||
optional int32 stop = 3; ///< 1=停止播放
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief WaitDI 动作参数。
|
||||
*/
|
||||
message WaitDIArgs {
|
||||
repeated DIItem DI = 1; ///< 需要等待的 DI 条件列表
|
||||
optional double timeout = 2; ///< 超时时间(秒),0 表示无限等待
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief SetDO 动作参数。
|
||||
*/
|
||||
message SetDOArgs {
|
||||
repeated DOItem do_list = 1; ///< 要设置的 DO 列表
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief PGV(二维码)二次定位参数。
|
||||
*/
|
||||
message PgvParam {
|
||||
optional bool use_pgv = 1; ///< 是否使用上视 PGV
|
||||
optional bool use_down_pgv = 2; ///< 是否使用下视 PGV
|
||||
optional double pgv_adjust_dist = 3; ///< 最大调整半径(米)
|
||||
optional double pgv_adjust_cx = 4; ///< 二维码坐标系 X 偏移(米)
|
||||
optional double pgv_adjust_cy = 5; ///< 二维码坐标系 Y 偏移(米)
|
||||
optional double pgv_x_adjust = 6; ///< 仅调整 X 方向误差(米)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 自由导航目标点(坐标 + 朝向)。
|
||||
*/
|
||||
message FreeGoPoint {
|
||||
double x = 1; ///< X 坐标(米)
|
||||
double y = 2; ///< Y 坐标(米)
|
||||
double theta = 3; ///< 朝向角(弧度)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 脚本自定义参数。
|
||||
*/
|
||||
message ScriptArgs {
|
||||
map<string, string> str_kv = 1; ///< 字符串键值对
|
||||
map<string, double> num_kv = 2; ///< 数字键值对
|
||||
repeated DOItem do_list = 3; ///< DO 列表
|
||||
repeated DIItem di_list = 4; ///< DI 列表
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 3051 命令请求数据(单点站点自动规划导航)。
|
||||
* @warning 严禁用于多车调度场景,仅限单车测试/验证。
|
||||
* 下发此任务会取消当前正在执行的任务(不排队)。
|
||||
* 成功下发后会自动清除指定的 warning/error 报错码。
|
||||
* 自由导航(freego)仅支持双轮差速底盘。
|
||||
*/
|
||||
message RobotGoTargetReqData {
|
||||
// -------- 必填字段 --------
|
||||
string source_id = 1; ///< 起始站点 ID("SELF_POSITION" 表示当前位置)
|
||||
string id = 2; ///< 目标站点 ID("SELF_POSITION" 表示原地执行 operation)
|
||||
optional string task_id = 3; ///< 任务 ID(建议提供)
|
||||
|
||||
// -------- 运动通用参数 --------
|
||||
optional double angle = 4; ///< 目标点朝向角(弧度)
|
||||
optional string method = 5; ///< "forward"(正走)或 "backward"(倒走)
|
||||
optional double max_speed = 6; ///< 最大线速度(m/s),0 使用默认
|
||||
optional double max_wspeed = 7; ///< 最大角速度(rad/s)
|
||||
optional double max_acc = 8; ///< 最大加速度(m/s²)
|
||||
optional double max_wacc = 9; ///< 最大角加速度(rad/s²)
|
||||
optional int64 duration = 10; ///< 到达后等待时间(毫秒)
|
||||
optional int32 orientation = 11; ///< 全向车保持的角度(暂不使用)
|
||||
optional bool spin = 12; ///< 是否随动(托盘旋转)
|
||||
optional int64 delay = 13; ///< 延迟结束导航状态(毫秒),缺省 0
|
||||
optional int32 start_rot_dir = 14; ///< 起步旋转方向:-1=顺时针, 0=就近, 1=逆时针
|
||||
optional int32 end_rot_dir = 15; ///< 到点旋转方向:-1=顺时针, 0=就近, 1=逆时针
|
||||
optional double reach_dist = 16; ///< 到点位置精度(米)
|
||||
optional double reach_angle = 17; ///< 到点角度精度(弧度)
|
||||
optional string skill_name = 18; ///< 技能名称:"Action" 或 "GotoSpecifiedPose"
|
||||
|
||||
// -------- PGV --------
|
||||
optional PgvParam pgv = 19; ///< 二次定位参数
|
||||
|
||||
// -------- 设备动作 --------
|
||||
optional string operation = 20; ///< 操作类型(JackLoad/ForkUnload/RollerLoad/HookLoad/WaitDI/SetDO/sound/Script 等)
|
||||
optional double jack_height = 21; ///< 顶升高度(米)
|
||||
optional double start_height = 22; ///< 货叉起步前举升高度(米)
|
||||
optional double end_height = 23; ///< 货叉到点后举升高度(米)
|
||||
optional double fork_mid_height = 24; ///< 货叉行走过程中举升高度(米)
|
||||
optional double fork_dist = 25; ///< 货叉前移距离(米)
|
||||
optional string direction = 26; ///< 方向:"left"/"right"/"front"/"back"
|
||||
optional bool recognize = 27; ///< 是否启用视觉识别
|
||||
optional string recfile = 28; ///< 识别文件路径(如 "shelf/s0002.shelf")
|
||||
|
||||
// -------- 音频 --------
|
||||
optional SoundArgs sounds_args = 29; ///< 音频参数
|
||||
|
||||
// -------- WaitDI / SetDO --------
|
||||
optional WaitDIArgs wait_di_args = 30; ///< WaitDI 参数
|
||||
optional SetDOArgs set_do_args = 31; ///< SetDO 参数
|
||||
|
||||
// -------- 脚本 --------
|
||||
optional string script_name = 32; ///< 脚本文件名
|
||||
optional ScriptArgs script_args = 33; ///< 脚本参数
|
||||
optional int32 script_stage = 34; ///< 执行阶段:0=导航前, 1=导航中, 2=导航后, 3=脚本控制导航
|
||||
|
||||
// -------- 原地旋转(GoByOdometer) --------
|
||||
optional double move_angle = 35; ///< 旋转角度(弧度)
|
||||
optional double speed_w = 36; ///< 旋转角速度(rad/s)
|
||||
optional int32 loc_mode = 37; ///< 定位模式:1=激光定位, 0=里程定位
|
||||
|
||||
// -------- 自由导航(仅双轮差速) --------
|
||||
optional FreeGoPoint freego = 38; ///< 自由导航目标(若提供则忽略 id 字段)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 3051 命令响应数据。
|
||||
*/
|
||||
message RobotGoTargetResData {
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功接收
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 单点导航命令。
|
||||
*/
|
||||
message RobotGoTargetCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
RobotGoTargetReqData data = 2;
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
RobotGoTargetResData data = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 17. 停止开环运动(命令码 2000, 0x07D0)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 停止开环运动请求数据(无业务字段)。
|
||||
* @note 命令码 2000(0x07D0)。下发零速度指令,终止当前持续运动。
|
||||
*/
|
||||
message RobotControlStopRequestData
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 停止开环运动响应结果。
|
||||
*/
|
||||
message RobotControlStopResult
|
||||
{
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 停止开环运动命令。
|
||||
*/
|
||||
message RobotControlStopCommand
|
||||
{
|
||||
message Request
|
||||
{
|
||||
CommandHeader.Request header = 1;
|
||||
RobotControlStopRequestData data = 2;
|
||||
}
|
||||
message Feedback
|
||||
{
|
||||
CommandHeader.Feedback header = 1;
|
||||
RobotControlStopResult status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 18. 暂停/继续/取消导航任务(命令码 3001/3002/3003)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 暂停当前导航任务(命令码 3001, 0x0BB9)。
|
||||
* @note 请求无业务数据。
|
||||
*/
|
||||
message RobotTaskPauseCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
// 无 data 字段
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
/**
|
||||
* @brief 暂停结果。
|
||||
*/
|
||||
message Result {
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
}
|
||||
Result status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 继续当前导航任务(命令码 3002, 0x0BBA)。
|
||||
* @note 请求无业务数据。
|
||||
*/
|
||||
message RobotTaskResumeCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
// 无 data 字段
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
/**
|
||||
* @brief 继续结果。
|
||||
*/
|
||||
message Result {
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
}
|
||||
Result status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 取消当前导航任务(命令码 3003, 0x0BBB)。
|
||||
* @note 请求无业务数据。
|
||||
*/
|
||||
message RobotTaskCancelCommand {
|
||||
message Request {
|
||||
CommandHeader.Request header = 1;
|
||||
// 无 data 字段
|
||||
}
|
||||
message Feedback {
|
||||
CommandHeader.Feedback header = 1;
|
||||
/**
|
||||
* @brief 取消结果。
|
||||
*/
|
||||
message Result {
|
||||
optional int32 ret_code = 1; ///< 返回码,0 表示成功
|
||||
optional string create_on = 2; ///< 时间戳
|
||||
optional string err_msg = 3; ///< 错误信息
|
||||
}
|
||||
Result status = 2;
|
||||
}
|
||||
}
|
||||
@ -1,3 +1,8 @@
|
||||
/**
|
||||
* @file agv_service.proto
|
||||
* @brief 定义AGV服务的gRPC接口,聚合所有AGV相关命令。
|
||||
* 服务端实现类为 gRPCAGVServiceImpl。
|
||||
*/
|
||||
syntax = "proto3";
|
||||
|
||||
import "cmvr/api/agv_command.proto";
|
||||
@ -14,6 +19,56 @@ service AgvService {
|
||||
|
||||
rpc RobotConfigDownloadMap(RobotConfigDownloadMapCommand.Request) returns (RobotConfigDownloadMapCommand.Feedback);
|
||||
|
||||
|
||||
rpc GetMapStatus(RobotStatusMapCommand.Request) returns (RobotStatusMapCommand.Feedback);
|
||||
|
||||
|
||||
rpc RobotConfigUploadMap(RobotConfigUploadMapCommand.Request) returns (RobotConfigUploadMapCommand.Feedback);
|
||||
|
||||
// 抢占机器人控制权
|
||||
rpc RobotConfigLock(RobotConfigLockCommand.Request) returns (RobotConfigLockCommand.Feedback);
|
||||
|
||||
// 查询当前控制权所有者
|
||||
rpc GetCurrentLockStatus(RobotStatusCurrentLockCommand.Request) returns (RobotStatusCurrentLockCommand.Feedback);
|
||||
|
||||
// 开环速度运动控制
|
||||
rpc RobotMotionControl(RobotMotionControlCommand.Request) returns (RobotMotionControlCommand.Feedback);
|
||||
|
||||
// 切换载入地图 命令码2022
|
||||
rpc RobotLoadMap(RobotLoadMapCommand.Request) returns (RobotLoadMapCommand.Feedback);
|
||||
|
||||
|
||||
// 查询地图载入状态 命令码1022
|
||||
rpc QueryLoadMapStatus(RobotQueryLoadMapStatusCommand.Request) returns (RobotQueryLoadMapStatusCommand.Feedback);
|
||||
|
||||
|
||||
// 查询当前地图站点列表 命令码1301
|
||||
rpc QueryStationList(QueryStationListCommand.Request) returns (QueryStationListCommand.Feedback);
|
||||
|
||||
|
||||
// 指定路径导航 命令码3066
|
||||
rpc RobotGoTargetList(RobotGoTargetListCommand.Request) returns (RobotGoTargetListCommand.Feedback);
|
||||
|
||||
// 查询当前导航状态 1020 robot_status_task_req
|
||||
// 1020 查询当前实时导航 robot_status_task_req
|
||||
rpc RobotStatusTaskCurrent(RobotStatusTaskCurrentCommand.Request) returns (RobotStatusTaskCurrentCommand.Feedback);
|
||||
|
||||
// 批量查询任务状态 1110 robot_status_task_status_package_req
|
||||
rpc RobotStatusTaskPackage(RobotStatusTaskPackageCommand.Request) returns (RobotStatusTaskPackageCommand.Feedback);
|
||||
|
||||
|
||||
// 3051 单点站点自动规划导航 robot_task_gotarget_req 0x0BEB
|
||||
rpc RobotGoTarget(RobotGoTargetCommand.Request) returns (RobotGoTargetCommand.Feedback);
|
||||
|
||||
|
||||
|
||||
// 0x07D0 停止开环运动
|
||||
rpc RobotControlStop(RobotControlStopCommand.Request) returns (RobotControlStopCommand.Feedback);
|
||||
|
||||
// 暂停当前导航任务 命令码 3001 (0x0BB9)
|
||||
rpc RobotTaskPause(RobotTaskPauseCommand.Request) returns (RobotTaskPauseCommand.Feedback);
|
||||
// 继续当前导航任务 命令码 3002 (0x0BBA)
|
||||
rpc RobotTaskResume(RobotTaskResumeCommand.Request) returns (RobotTaskResumeCommand.Feedback);
|
||||
// 取消当前导航任务 命令码 3003 (0x0BBB)
|
||||
rpc RobotTaskCancel(RobotTaskCancelCommand.Request) returns (RobotTaskCancelCommand.Feedback);
|
||||
}
|
||||
@ -204,19 +204,21 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
|
||||
throw new GlobalException("地图文件路径不存在");
|
||||
}
|
||||
|
||||
// TODO: 从文件路径读取地图内容
|
||||
// 这里需要根据实际存储方式实现
|
||||
// 从文件路径读取地图内容
|
||||
String mapContent = readMapFile(map.getMapFilePath());
|
||||
if (StrUtil.isBlank(mapContent)) {
|
||||
throw new GlobalException("地图文件内容为空");
|
||||
}
|
||||
|
||||
EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
|
||||
edgeCommonVO.setTerminalId(robot.getTerminalId());
|
||||
edgeCommonVO.setDeviceId(robot.getRobotCode());
|
||||
|
||||
// cmvr.api.AgvCommand.AgvUploadMapResult result = edgeAgvService.robotConfigUploadMap(edgeCommonVO, mapContent);
|
||||
//
|
||||
// if (result.getRetCode() != 0) {
|
||||
// throw new GlobalException("上传地图失败: " + result.getErrMsg());
|
||||
// }
|
||||
AgvCommand.AgvUploadMapResult result = edgeAgvService.robotConfigUploadMap(edgeCommonVO, mapContent);
|
||||
|
||||
if (result.getRetCode() != 0) {
|
||||
throw new GlobalException("上传地图失败: " + result.getErrMsg());
|
||||
}
|
||||
|
||||
return "上传成功";
|
||||
}
|
||||
@ -240,7 +242,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
|
||||
edgeCommonVO.setTerminalId(robot.getTerminalId());
|
||||
edgeCommonVO.setDeviceId(robot.getRobotCode());
|
||||
|
||||
cmvr.api.AgvCommand.AgvDownloadMapResult result = edgeAgvService.robotConfigDownloadMap(edgeCommonVO, mapName);
|
||||
AgvCommand.AgvDownloadMapResult result = edgeAgvService.robotConfigDownloadMap(edgeCommonVO, mapName);
|
||||
|
||||
// 保存地图到数据库
|
||||
// InspectionMap inspectionMap = new InspectionMap();
|
||||
@ -248,20 +250,17 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
|
||||
// inspectionMap.setMapName(mapName);
|
||||
// inspectionMap.setMapSourceRobotId(robotId);
|
||||
// inspectionMap.setMapSourceName(mapName);
|
||||
//
|
||||
// // TODO: 将地图内容保存到文件系统,并返回文件路径
|
||||
// // String filePath = saveMapToFile(result.getMapContent(), mapName);
|
||||
// // inspectionMap.setMapFilePath(filePath);
|
||||
//
|
||||
|
||||
// TODO: 将地图内容保存到文件系统,并返回文件路径
|
||||
// String filePath = saveMapToFile(result.getMapContent(), mapName);
|
||||
// inspectionMap.setMapFilePath(filePath);
|
||||
|
||||
// inspectionMap.setStatus("0");
|
||||
// inspectionMap.setCreateTime(DateUtils.getNowDate());
|
||||
// inspectionMap.setCreateBy(SecurityUtils.getUsername());
|
||||
//
|
||||
// inspectionMapMapper.insertInspectionMap(inspectionMap);
|
||||
|
||||
|
||||
|
||||
|
||||
return result.getMapContent();
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user