cmvr-es/protos/cmvr/msgs/agv.proto

311 lines
10 KiB
Protocol Buffer
Raw Normal View History

syntax = "proto3";
package cmvr.msgs;
2026-07-07 15:54:09 +08:00
// AGV 在地图平面坐标系中的二维位姿。
message AgvPose2d {
2026-07-07 15:54:09 +08:00
// X 坐标,单位:米。
double x = 1;
2026-07-07 15:54:09 +08:00
// Y 坐标,单位:米。
double y = 2;
2026-07-07 15:54:09 +08:00
// 航向角,单位:弧度,逆时针为正。
double theta = 3;
}
2026-07-07 15:54:09 +08:00
// AGV 车体坐标系下的平面速度。
message AgvVelocity {
2026-07-07 15:54:09 +08:00
// 车体 X 方向线速度,单位:米/秒。
double vx = 1;
2026-07-07 15:54:09 +08:00
// 车体 Y 方向线速度,单位:米/秒。
double vy = 2;
2026-07-07 15:54:09 +08:00
// 绕 Z 轴角速度,单位:弧度/秒。
double wz = 3;
}
2026-07-07 15:54:09 +08:00
// AGV 电池状态。
message AgvBatteryState {
2026-07-07 15:54:09 +08:00
// 电量比例,范围:[0, 1],例如 0.8 表示 80%。
double percentage = 1;
2026-07-07 15:54:09 +08:00
// 电池电压,单位:伏特。
double voltage = 2;
2026-07-07 15:54:09 +08:00
// 电池电流,单位:安培;正负号含义由具体 AGV 适配器保持一致。
double current = 3;
2026-07-07 15:54:09 +08:00
// 电池温度,单位:摄氏度。
double temperature = 4;
2026-07-07 15:54:09 +08:00
// 是否正在充电。
bool charging = 5;
}
2026-07-07 15:54:09 +08:00
// 导航任务的通用运动约束和执行选项。
message AgvMotionOptions {
2026-07-07 15:54:09 +08:00
// 最大线速度,单位:米/秒0 表示使用 AGV 默认值。
double max_speed = 1;
2026-07-07 15:54:09 +08:00
// 最大角速度,单位:弧度/秒0 表示使用 AGV 默认值。
double max_angular_speed = 2;
2026-07-07 15:54:09 +08:00
// 最大线加速度,单位:米/秒^20 表示使用 AGV 默认值。
double max_acceleration = 3;
2026-07-07 15:54:09 +08:00
// 最大角加速度,单位:弧度/秒^20 表示使用 AGV 默认值。
double max_angular_acceleration = 4;
2026-07-07 15:54:09 +08:00
// 到达目标点的距离容差单位0 表示使用 AGV 默认值。
double reach_distance = 5;
2026-07-07 15:54:09 +08:00
// 到达目标角度的角度容差单位弧度0 表示使用 AGV 默认值。
double reach_angle = 6;
2026-07-07 15:54:09 +08:00
// 速度比例,范围通常为 [0, 1]1 表示不降速。
double speed_ratio = 7;
2026-07-07 15:54:09 +08:00
// 是否异步执行true 表示下发任务后立即返回。
bool asynchronous = 8;
}
2026-07-07 15:54:09 +08:00
// AGV 适配器扩展参数。用于传递厂商或控制器特有的参数。
message AgvAdapterParams {
2026-07-07 15:54:09 +08:00
// 参数键值表。键和值都使用字符串,具体含义由 AGV 适配器解释。
map<string, string> values = 1;
}
2026-07-07 15:54:09 +08:00
// AGV 当前运行状态快照。
message AgvRuntimeState {
2026-07-07 15:54:09 +08:00
// 状态采样时间Unix 时间戳,单位:秒。
double timestamp = 1;
2026-07-07 15:54:09 +08:00
// 运行模式,取值对应服务端内部 AgvMode 枚举的整数值。
int32 mode = 2;
2026-07-07 15:54:09 +08:00
// 是否已连接 AGV 控制器。
bool connected = 3;
2026-07-07 15:54:09 +08:00
// 是否已定位成功。
bool localized = 4;
2026-07-07 15:54:09 +08:00
// AGV 是否处于运动状态。
bool moving = 5;
2026-07-07 15:54:09 +08:00
// AGV 是否处于故障状态。
bool fault = 6;
2026-07-07 15:54:09 +08:00
// AGV 是否处于急停状态。
bool emergency_stopped = 7;
2026-07-07 15:54:09 +08:00
// 当前地图坐标系下的二维位姿。
AgvPose2d pose = 8;
2026-07-07 15:54:09 +08:00
// 当前车体速度。
AgvVelocity velocity = 9;
2026-07-07 15:54:09 +08:00
// 当前电池状态。
AgvBatteryState battery = 10;
2026-07-07 15:54:09 +08:00
// 当前加载地图名称;为空表示未知或控制器未返回。
string current_map = 11;
2026-07-07 15:54:09 +08:00
// 当前或最近站点 id为空表示未知或当前不在站点附近。
string current_station = 12;
2026-07-07 15:54:09 +08:00
// 最近一次错误信息;为空表示无错误或未知。
string last_error = 13;
}
2026-07-07 15:54:09 +08:00
// 地图中的站点信息。
message AgvStation {
2026-07-07 15:54:09 +08:00
// 站点唯一 id。
string id = 1;
2026-07-07 15:54:09 +08:00
// 站点类型;具体枚举由地图或控制器定义。
string type = 2;
2026-07-07 15:54:09 +08:00
// 站点在地图坐标系下的二维位姿。
AgvPose2d pose = 3;
2026-07-07 15:54:09 +08:00
// 站点描述或备注。
string description = 4;
}
2026-07-07 15:54:09 +08:00
// 显式站点路径中的一段路径。
message AgvPathSegment {
2026-07-07 15:54:09 +08:00
// 起点站点 id。
string source_station = 1;
2026-07-07 15:54:09 +08:00
// 目标站点 id。
string target_station = 2;
}
2026-07-07 15:54:09 +08:00
// 地图维度请求。这里只描述上位机想要 2D、3D 还是二者都要,
// 不用于指定厂商文件格式;厂商格式必须在 AGV 适配器内部转换。
enum AgvMapDimension {
// 未指定。服务端应选择最有用的默认地图,通常是当前加载地图。
AGV_MAP_DIMENSION_UNSPECIFIED = 0;
// 只请求统一 2D 地图。
AGV_MAP_2D = 1;
// 只请求统一 3D 地图。
AGV_MAP_3D = 2;
// 在同一个流中请求统一 2D 和统一 3D 地图。
AGV_MAP_2D_AND_3D = 3;
}
// 地图流更新类型。上位机应根据该字段判断是全量、增量还是缓存重置。
enum AgvMapUpdateType {
// 未指定。
AGV_MAP_UPDATE_UNSPECIFIED = 0;
// 全量地图快照。首次请求或无法增量续传时应发送该类型。
AGV_MAP_UPDATE_SNAPSHOT = 1;
// 全量快照之后的增量更新。仅当适配器能够可靠生成差异时发送。
AGV_MAP_UPDATE_INCREMENTAL = 2;
// 上位机本地缓存已失效,应丢弃缓存并等待后续全量快照。
AGV_MAP_UPDATE_RESET = 3;
}
// 2D/3D 地图共用的语义对象类型。
enum AgvMapObjectType {
// 未指定。
AGV_MAP_OBJECT_UNSPECIFIED = 0;
// 导航站点或路径点。
AGV_MAP_OBJECT_STATION = 1;
// 路径线、禁行线、引导线等线对象。
AGV_MAP_OBJECT_LINE = 2;
// 多边形区域,例如禁行区、限速区、作业区。
AGV_MAP_OBJECT_AREA = 3;
// 二维码、天码或其他标签地标。
AGV_MAP_OBJECT_QR_TAG = 4;
// 反光板或反光柱地标。
AGV_MAP_OBJECT_REFLECTOR = 5;
// 库位、货位或储位。
AGV_MAP_OBJECT_BIN_LOCATION = 6;
// 门、电梯、充电桩等外部设备。
AGV_MAP_OBJECT_EXTERNAL_DEVICE = 7;
}
// 地图坐标系下的三维点。单位:米。
message AgvMapPoint3D {
// X 坐标,单位:米。
double x = 1;
// Y 坐标,单位:米。
double y = 2;
// Z 坐标,单位:米;纯 2D 几何可置为 0。
double z = 3;
}
// 统一 2D 地图。栅格数据按行优先排列index = y * width + x。
message AgvUnifiedMap2D {
// 坐标系名称,例如 "map"。
string frame_id = 1;
// 地图采样或更新时间Unix 时间戳,单位:秒。
double timestamp = 2;
// 栅格分辨率,单位:米/格。
double resolution = 3;
// 栅格宽度,单位:格。
uint32 width = 4;
// 栅格高度,单位:格。
uint32 height = 5;
// 栅格 (0, 0) 在世界/地图坐标系下的位姿x/y 单位theta 单位:弧度。
AgvPose2d origin = 6;
// 占据值:-1 表示未知0 表示空闲100 表示占据。
repeated int32 data = 7;
// 地图中的统一语义对象,例如站点、线、区域、标签、反光板等。
repeated AgvMapObject objects = 8;
}
// 统一 3D 点样本。坐标单位:米。
message AgvMapPointSample3D {
// X 坐标,单位:米。
double x = 1;
// Y 坐标,单位:米。
double y = 2;
// Z 坐标,单位:米。
double z = 3;
// 激光强度;无强度信息时置为 0。
float intensity = 4;
// 激光雷达线束/通道编号;无该信息时置为 0。
uint32 ring = 5;
// 相对地图时间戳的时间偏移,单位:秒;无该信息时置为 0。
double time_offset = 6;
}
// 统一 3D 体素。体素索引基于 AgvUnifiedMap3D.voxel_resolution。
message AgvMapVoxel3D {
// 体素 X 索引。
int32 x = 1;
// 体素 Y 索引。
int32 y = 2;
// 体素 Z 索引。
int32 z = 3;
// 占据概率,范围:[0, 1];未知时置为 -1。
float probability = 4;
}
// 统一 3D 平面特征。平面方程:
// normal.x * x + normal.y * y + normal.z * z + d = 0。
message AgvMapPlane3D {
// 平面中心点,单位:米。
AgvMapPoint3D center = 1;
// 平面单位法向量。
AgvMapPoint3D normal = 2;
// 平面方程偏移量,单位:米。
double d = 3;
// 平面特征近似半径,单位:米。
double radius = 4;
}
// 统一语义对象。几何点均使用地图坐标系,单位:米。
message AgvMapObject {
// 对象稳定 id 或名称。
string id = 1;
// 对象类型。
AgvMapObjectType type = 2;
// 对象几何点。点对象使用 1 个点,线对象使用多个点,区域对象使用多边形顶点。
repeated AgvMapPoint3D points = 3;
// 朝向角,单位:弧度;不适用时置为 0。
double heading = 4;
// 额外归一化属性。为兼容不同 AGV属性值统一使用字符串。
map<string, string> properties = 5;
}
// 统一 3D 地图。虽然内部包含点、体素、平面和语义对象,
// 但对上位机来说它仍然是唯一的 3D 地图格式。
message AgvUnifiedMap3D {
// 坐标系名称,例如 "map"。
string frame_id = 1;
// 地图采样或更新时间Unix 时间戳,单位:秒。
double timestamp = 2;
// 体素分辨率,单位:米/体素;没有体素数据时置为 0。
double voxel_resolution = 3;
// 统一点云点样本。
repeated AgvMapPointSample3D points = 4;
// 统一占据体素。
repeated AgvMapVoxel3D voxels = 5;
// 统一平面特征。
repeated AgvMapPlane3D planes = 6;
// 统一 3D 语义对象,例如站点、区域、标签、地标等。
repeated AgvMapObject objects = 7;
}
// 地图流中的单条更新。AGV 适配器必须先把厂商地图转换成 map_2d 或 map_3d
// 再通过该消息发送给上位机。
message AgvUnifiedMapUpdate {
// 实际发送的地图 id 或名称。请求 map_name 为空时AGV 可选择当前或最近地图。
string map_id = 1;
// 建图或地图流会话 id。
string session_id = 2;
// 会话内单调递增序号,从 0 或 1 开始均可,但同一会话内必须保持递增。
uint64 sequence = 3;
// 用于断点续传或增量订阅的不透明令牌。
string resume_token = 4;
// 本条更新的数据维度。
AgvMapDimension dimension = 5;
// 本条更新是全量、增量还是缓存重置。
AgvMapUpdateType update_type = 6;
// 坐标系名称,例如 "map"。
string frame_id = 7;
// 本条更新产生时间Unix 时间戳,单位:秒。
double timestamp = 8;
// 是否为全量快照的第一条消息。
bool snapshot_begin = 9;
// 是否为全量快照的最后一条消息。
bool snapshot_end = 10;
// 大地图分片发送时的分片序号,从 0 开始。
uint32 chunk_index = 11;
// 大地图分片总数0 表示未知或连续流。
uint32 chunk_count = 12;
oneof payload {
// 统一 2D 地图或 2D 地图增量。
AgvUnifiedMap2D map_2d = 20;
// 统一 3D 地图或 3D 地图增量。
AgvUnifiedMap3D map_3d = 21;
}
}
// 当前导航任务状态。
message AgvNavigationStatus {
2026-07-07 15:54:09 +08:00
// 导航状态,取值对应服务端内部 AgvTaskState 枚举的整数值。
int32 state = 1;
2026-07-07 15:54:09 +08:00
// 导航任务类型,取值对应服务端内部 AgvTaskType 枚举的整数值。
int32 type = 2;
2026-07-07 15:54:09 +08:00
// 当前任务进度,范围:[0, 1];未知时置为 0。
double progress = 3;
2026-07-07 15:54:09 +08:00
// 状态描述或错误信息。
string message = 4;
}