From 6a04778c7b16327b28e52a5d9bd5864f66c0849d Mon Sep 17 00:00:00 2001 From: li-shihao-code <2469171725@qq.com> Date: Thu, 26 Feb 2026 13:54:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=8C=E5=96=84=E4=BA=86=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=A0=87=E5=AE=9A=E8=BD=A6=E9=97=B4=E7=9A=84=E7=8E=AF?= =?UTF-8?q?=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agv_calib_eu/proto/agv_calib_chassis.proto | 143 +++++++++++++++++++ agv_calib_eu/proto/agv_calib_control.proto | 156 +++++++++++++++++++++ agv_calib_eu/proto/agv_calib_sensor.proto | 104 ++++++++++++++ 3 files changed, 403 insertions(+) create mode 100644 agv_calib_eu/proto/agv_calib_chassis.proto create mode 100644 agv_calib_eu/proto/agv_calib_control.proto create mode 100644 agv_calib_eu/proto/agv_calib_sensor.proto diff --git a/agv_calib_eu/proto/agv_calib_chassis.proto b/agv_calib_eu/proto/agv_calib_chassis.proto new file mode 100644 index 0000000..16b803e --- /dev/null +++ b/agv_calib_eu/proto/agv_calib_chassis.proto @@ -0,0 +1,143 @@ +syntax = "proto3"; + +// 规范包名,确保与运控调优(control)和传感器外参(sensor)在逻辑上严格物理隔离 +package agv.calibration.chassis; + +// ========================================================= +// 核心服务:AGV 底盘底层硬件自诊与物理运动学标定代理服务 +// 部署端:Windows车端 (直连底层电机驱动器/PLC 的网关层) +// 调用端:Linux标定服务器 (掌控外部高精雷达真值) +// ========================================================= +service AgvCalibChassisService { + + // --------------------------------------------------------- + // 1. 底层硬件接管与安全熔断 + // --------------------------------------------------------- + // 强制接管底层驱动器。注意:这里不仅要切断避障,还要切断底盘的“运动学正逆解算法” + rpc SetDiagnosticMode(DiagnosticModeRequest) returns (StandardResponse); + + // 硬件级绝对急停 (直接向驱动器下发 Safe Torque Off / 机械抱死指令,无视任何上层状态) + rpc HardwareEmergencyBrake(Empty) returns (StandardResponse); + + // --------------------------------------------------------- + // 2. 原始物理开环指令下发 (对应方案 4.2 诊断 与 4.3 物理标定) + // --------------------------------------------------------- + // 允许 Linux 越过底盘协同模型,直接对指定驱动轮下发最原始的转速(RPM)或占空比 + // 核心用途:暴露真实的机械阻力差、诊断减速机卡死、测试轮胎滑移率 + rpc ExecuteRawDriveCommand(RawDriveRequest) returns (StandardResponse); + + // 允许 Linux 直接对转向机构下发绝对物理角度或往复扫频 + // 核心用途:测定舵机机械死区、往复间隙(Backlash)与静态机械零位偏差 + rpc ExecuteRawSteerCommand(RawSteerRequest) returns (StandardResponse); + + // --------------------------------------------------------- + // 3. 物理运动学本底参数持久化 (出厂定稿写值) + // --------------------------------------------------------- + // Linux 结合外部真值算出真实的物理机械参数后,下发并直接覆写到底盘驱动板 EEPROM 或底层配置中 + rpc CommitKinematicParameters(KinematicParams) returns (StandardResponse); + + // --------------------------------------------------------- + // 4. 原始硬件级高频遥测 (数字孪生健康诊断的唯一依据) + // --------------------------------------------------------- + // 🚨 严禁推流经过滤波后的数据!必须是最底层的“原始编码器 Tick”和“绝对相电流”! + rpc StreamHardwareTelemetry(Empty) returns (stream HardwareState); +} + +// ========================================================= +// 基础通用消息结构 +// ========================================================= +message Empty {} + +message StandardResponse { + bool success = 1; + string message = 2; // 异常时返回驱动器底层故障码 (如 "ERR_MOTOR_OVERCURRENT") +} + +message DiagnosticModeRequest { + enum Mode { + NORMAL_KINEMATICS = 0; // 正常模式 (底盘接收 V_x, Omega,由底层执行运动学逆解分配) + DIRECT_RAW_DRIVE = 1; // 直驱模式 (切断逆解,允许 Linux 直接独立控制左/右轮转速) + } + Mode target_mode = 1; +} + +// ========================================================= +// 2. 原始驱动指令 (发考题:逼迫底盘暴露出机械缺陷) +// ========================================================= +message RawDriveRequest { + string test_case_id = 1; // 测试用例 (如 "Slip_Test_0.5m", "Straight_Friction_Test") + + // 直接下发给电机的原始指令 (若是两驱车,后轮填 0 即可) + double fl_motor_rpm = 2; // 左前轮 (Front-Left) 目标物理转速 (RPM) + double fr_motor_rpm = 3; // 右前轮 (Front-Right) 目标物理转速 (RPM) + double rl_motor_rpm = 4; // 左后轮 (Rear-Left) 目标物理转速 (RPM) + double rr_motor_rpm = 5; // 右后轮 (Rear-Right) 目标物理转速 (RPM) + + double duration_sec = 6; // 动作维持时间,断网防飞车底线:超时底层必须自动刹车 +} + +message RawSteerRequest { + string test_case_id = 1; // 测试用例 (如 "Deadzone_Sweep_5deg") + + // 针对舵机/转向推杆的绝对物理指令 (度) + double front_steer_angle_deg = 2; + double rear_steer_angle_deg = 3; + + // 专门用于 4.2节 测定机械间隙的扫频参数 + optional double sweep_amplitude_deg = 4; // 往复抖动幅度 (度) + optional double sweep_frequency_hz = 5; // 抖动频率 (Hz) + + double duration_sec = 6; +} + +// ========================================================= +// 3. 运动学本底参数定稿载荷 (纯物理修正系数) +// ========================================================= +message KinematicParams { + // --- 1. 真实有效物理轮径 (解决“开环走直线画大弧”及闭环位移不准) --- + optional double wheel_radius_fl_m = 1; + optional double wheel_radius_fr_m = 2; + optional double wheel_radius_rl_m = 3; + optional double wheel_radius_rr_m = 4; + + // --- 2. 机械零位绝对偏差补偿 (解决“指令0度但车子斜着跑”) --- + optional double steer_zero_offset_front_deg = 5; + optional double steer_zero_offset_rear_deg = 6; + + // --- 3. 旋转几何协同参数 (解决“原地打转时车体画圆甩尾摆动”) --- + optional double effective_track_width_m = 7; // 有效轮距 (左右轮真实物理间距) + optional double effective_wheel_base_m = 8; // 有效轴距 (前后轮真实物理间距) + + // 针对四驱四转等多舵轮底盘:瞬时旋转中心(ICR)的物理几何偏移 + optional double icr_offset_x_m = 9; + optional double icr_offset_y_m = 10; +} + +// ========================================================= +// 4. 原始硬件遥测数据流 (Linux 用来排雷、熔断和算滑移率的裸数据) +// ========================================================= +message HardwareState { + int64 hardware_timestamp_us = 1; // 底层获取到脉冲那一瞬间的高精度单调系统时钟 (微秒) + + // --- A. 原始编码器反馈 (用于 4.2 阶段 Linux 计算轮胎打滑率 Slip Ratio) --- + // 🚨 严禁返回平滑后的速度(m/s),必须返回最原始的累计脉冲! + int64 encoder_ticks_fl = 2; + int64 encoder_ticks_fr = 3; + int64 encoder_ticks_rl = 4; + int64 encoder_ticks_rr = 5; + + // 实际物理舵角反馈 (度,用于 4.2 阶段比对指令下发时间,测定机械死区和相位滞后) + double actual_steer_angle_front_deg = 6; + double actual_steer_angle_rear_deg = 7; + + // --- B. 动力与负载健康状态 (用于 4.2 阶段诊断减速机干涉或刹车未放) --- + // 若维持低速所需的电流异常激增,说明机械装配存在过载阻力,Linux 将立刻熔断报警 + double current_fl_amp = 8; // 左前电机实际相电流 (安培) + double current_fr_amp = 9; + double current_rl_amp = 10; + double current_rr_amp = 11; + double current_steer_front_amp = 12;// 前转向舵机电流 + + // --- C. 驱动器底层硬件报警位 --- + uint32 driver_error_code = 13; // 0x00=健康, 0x01=过压, 0x02=堵转过流, 0x03=过热等 +} \ No newline at end of file diff --git a/agv_calib_eu/proto/agv_calib_control.proto b/agv_calib_eu/proto/agv_calib_control.proto new file mode 100644 index 0000000..ce66cdc --- /dev/null +++ b/agv_calib_eu/proto/agv_calib_control.proto @@ -0,0 +1,156 @@ +syntax = "proto3"; + +// 规范包名,确保与传感器外参标定业务(agv.calibration.sensor)严格物理与逻辑隔离 +package agv.calibration.control; + +// ========================================================= +// 核心服务:AGV 底盘运动学标定与运控参数调优代理服务 +// 部署端:Windows车端 (作为 gRPC Server) +// 调用端:Linux标定服务器 (作为 gRPC Client) +// ========================================================= +service AgvCalibControlService { + + // --------------------------------------------------------- + // 1. 权限接管与生命周期安全管控 + // --------------------------------------------------------- + // 夺取车辆控制权,强制剥夺车端原生的激光避障与自主导航逻辑 + rpc SetControlMode(ModeRequest) returns (StandardResponse); + + // 软件级最高优看门狗急停(应对网络断连、越界飞车等紧急状况,底层必须无条件抱死电机) + rpc EmergencyStop(Empty) returns (StandardResponse); + + // --------------------------------------------------------- + // 2. 运动考题下发 (开环排雷 / 闭环寻优 / 波峰对齐) + // --------------------------------------------------------- + // 【场景A: 纯物理开环】要求车端切断所有PID/运动学逆解,直接将转速/PWM透传给底层电机 + rpc ExecuteOpenLoopCmd(OpenLoopRequest) returns (StandardResponse); + + // 【场景B: 算法闭环调优】下发测试轨迹,要求车端用"它自带的"运控算法(PID/MPC)去努力追踪 + rpc FollowTestTrajectory(TrajectoryRequest) returns (StandardResponse); + + // 【场景C: 波峰时序对齐】下发极短促的阶跃加速指令,人为制造绝对速度波峰,供Linux提取Time Offset + rpc ExecuteStepResponse(StepResponseRequest) returns (StandardResponse); + + // --------------------------------------------------------- + // 3. 运控参数 AI 寻优:动态热注入与最终固化 + // --------------------------------------------------------- + // 寻优核心:将 Linux 算出的临时参数瞬间写入车端内存并立刻生效,准许开始下一圈测试 + rpc InjectTuningParameters(ControlParams) returns (StandardResponse); + + // 调优结束:通知车端将目前内存中的最高分参数,永久覆写进硬盘的 config.yaml 或注册表 + rpc CommitControlParameters(Empty) returns (StandardResponse); + + // --------------------------------------------------------- + // 4. 高频数字孪生体感上报 (50Hz) + // --------------------------------------------------------- + // 注意: 使用 server-streaming 服务端持续推流。车端被调用一次后, + // 需以 50Hz 频率疯狂向外广播自身底层状态,供 Linux 提取波峰并比对真值打分。 + rpc StreamTelemetry(Empty) returns (stream TelemetryData); +} + +// ========================================================= +// 基础通用消息结构 +// ========================================================= +message Empty {} + +message StandardResponse { + bool success = 1; + string message = 2; // 包含执行成功的回执,或底盘卡死/驱动器报错等异常原因 +} + +// ========================================================= +// 1. 模式控制结构体 +// ========================================================= +message ModeRequest { + enum Mode { + NORMAL_MODE = 0; // 正常业务模式(打开避障和导航,出厂默认状态) + OPEN_LOOP_MODE = 1; // 物理开环标定模式(切断所有算法纠偏,提线木偶状态) + TUNING_MODE = 2; // 闭环调优模式(切断环境避障,但保留原生 PID/MPC 追踪算法) + } + Mode target_mode = 1; +} + +// ========================================================= +// 2. 动作指令请求载荷 +// ========================================================= +message OpenLoopRequest { + double left_motor_cmd = 1; // 左驱动轮目标转速 (RPM) 或占空比 + double right_motor_cmd = 2; // 右驱动轮目标转速 (RPM) 或占空比 + double steering_angle = 3; // 针对单/多舵轮底盘的绝对舵角指令 (度,差速轮忽略) + + // 🚨 极度关键的安全设计:指令超时时间 + // 车端若失去网络连接,超时后必须由底层代码强制将速度归零,严防撞墙! + double duration_sec = 4; +} + +message TrajectoryPoint { + double x_m = 1; // 目标点 X 坐标 (米) + double y_m = 2; // 目标点 Y 坐标 (米) + double yaw_rad = 3; // 目标点 偏航角 (弧度) + double target_speed_ms = 4; // 到达该点时的期望线速度 (米/秒) + double curvature = 5; // 该点处的轨迹曲率 (可选项,用于辅助前瞻距离映射) +} + +message TrajectoryRequest { + string test_case_id = 1; // 考题名称,如 "Bezier_Curve_S_Speed_1.2" + repeated TrajectoryPoint path = 2; // 组成考题曲线的稠密坐标点阵列 +} + +message StepResponseRequest { + double target_velocity_ms = 1; // 极速阶跃的目标线速度 (如猛烈加速到 1.5 m/s) + double duration_sec = 2; // 阶跃维持时间 (极短,如 1~2 秒即可,用于产生绝对波峰) +} + +// ========================================================= +// 3. 待调优运控参数载荷 (支持增量式热更新) +// ========================================================= +message ControlParams { + // 采用 optional 关键字,允许 Linux 每次只修改需要微调的单个参数,其余保持原样 + + // --- 底盘物理运动学修正系数 (由 4.3 阶段开环算得) --- + optional double wheel_radius_left_ratio = 1; // 左侧真实有效轮径补偿乘数 (如 1.002) + optional double wheel_radius_right_ratio = 2; // 右侧真实有效轮径补偿乘数 (如 0.998) + optional double effective_track_width_m = 3; // 有效轮距 (m) + optional double steering_zero_offset_deg = 4; // 舵角机械零位静态偏差 (度) + + // --- 经典 PID 控制增益 --- + optional double pid_kp_lateral = 5; + optional double pid_ki_lateral = 6; + optional double pid_kd_lateral = 7; // 用于提供阻尼,抑制高频画龙震荡 + + optional double pid_kp_heading = 8; + optional double pid_ki_heading = 9; + optional double pid_kd_heading = 10; + + // --- 先进算法核心参数 --- + optional double pure_pursuit_lookahead_m = 11; // 纯追踪前瞻距离 Ld (m) + optional double mpc_weight_q_lateral = 12; // MPC Q矩阵:对横向误差的惩罚权重 + optional double mpc_weight_r_steering = 13; // MPC R矩阵:对转向电机发力剧烈度的惩罚权重 (控制平顺性) +} + +// ========================================================= +// 4. 高频遥测推流载荷 (数字孪生状态汇报) +// ========================================================= +message TelemetryData { + // 🚨 互相关对齐的核心依据: + // 必须使用 Windows 底层高精度单调时钟 (如 QueryPerformanceCounter) 的绝对微秒数。 + // 绝对禁止在车端人为做时序平滑或使用受 NTP 影响的系统时间! + int64 hardware_timestamp_us = 1; + + // --- 车端推算的内部里程计位姿 (Odom) --- + double odom_x_m = 2; + double odom_y_m = 3; + double odom_yaw_rad = 4; + + // --- 底层执行器真实物理反馈 (用于提取波峰) --- + double feedback_linear_vel_ms = 5; // 编码器解算的真实线速度 (m/s) + double feedback_angular_vel_rads = 6;// 陀螺仪或编码器解算的真实角速度 (rad/s) + + // --- 硬件健康与功耗监控 (用于 Linux 诊断干涉卡死) --- + double left_motor_current_amp = 7; // 左驱动电机实时电流 (A) + double right_motor_current_amp = 8; // 右驱动电机实时电流 (A) + double steering_motor_current_amp = 9; // 转向舵机实时电流 (A) + + // --- 算法控制输出量 (用于 Linux 识别死区或物理饱和) --- + double cmd_steering_output = 10; // 控制算法计算出的期望底层舵角指令 (度/弧度) +} \ No newline at end of file diff --git a/agv_calib_eu/proto/agv_calib_sensor.proto b/agv_calib_eu/proto/agv_calib_sensor.proto new file mode 100644 index 0000000..2295180 --- /dev/null +++ b/agv_calib_eu/proto/agv_calib_sensor.proto @@ -0,0 +1,104 @@ +syntax = "proto3"; + +// 规范包名,防止与其他业务(如底盘运控调优)的接口冲突 +package agv.calibration.sensor; + +// ========================================================= +// 核心服务:传感器自动化标定代理服务 +// 部署端:Windows车端 (Server) | 调用端:Linux服务器 (Client) +// ========================================================= +service SensorCalibrationService { + // 1. 走位调度:指挥车辆开到特定的观测点并【绝对静止】 + rpc MoveToObservationPose (PoseRequest) returns (StandardResponse); + + // 2. 同步锁存:命令车辆瞬间冻结指定传感器的当前画面/点云到内存 + rpc TriggerSyncCapture (CaptureRequest) returns (CaptureResponse); + + // 3. 大文件下载:通过凭证流式拉取图片和点云(注意:使用 stream 防爆内存) + rpc DownloadImage (DataFetchRequest) returns (stream FileChunk); + rpc DownloadPointCloud (DataFetchRequest) returns (stream FileChunk); + + // 4. 标定闭环:Linux算完矩阵后,下发给车端持久化保存(覆写配置文件) + rpc CommitCalibrationResults (CalibrationPayload) returns (StandardResponse); +} + +// ========================================================= +// 基础响应 +// ========================================================= +message StandardResponse { + bool success = 1; + string message = 2; // 成功提示或具体的报错原因(如:碰撞急停) +} + +// ========================================================= +// 1. 物理走位请求 (走) +// ========================================================= +message PoseRequest { + double target_x_m = 1; // 目标 X 坐标 (米) + double target_y_m = 2; // 目标 Y 坐标 (米) + double target_yaw_deg = 3; // 目标偏航角 (度) + bool is_relative = 4; // true: 相对当前位置移动; false: 绝对世界坐标 +} + +// ========================================================= +// 2. 触发同步抓拍请求与响应 (停与拍) +// ========================================================= +message CaptureRequest { + // 告诉车端这次要同时拍哪些传感器,例如 ["cam_front", "lidar_top"] + repeated string sensor_ids = 1; +} + +message CaptureResponse { + bool success = 1; + // 极度关键:车端打上的高精度硬件时间戳(微秒)。 + // 这是提取数据的“取件码”,保证多传感器在物理时间上的绝对对齐! + int64 capture_timestamp_us = 2; + string error_message = 3; +} + +// ========================================================= +// 3. 大文件下载请求与文件流块 (传) +// ========================================================= +message DataFetchRequest { + int64 capture_timestamp_us = 1; // 阶段2拿到的取件码 + string sensor_id = 2; // 具体要下载哪个传感器,例如 "cam_front" +} + +// 流式文件块 (规避 gRPC 单条消息默认 4MB 的内存限制) +message FileChunk { + bytes chunk_data = 1; // 文件的二进制分块(建议每次发 512KB - 1MB) + bool is_last_chunk = 2; // 是否为最后一块 + string format_ext = 3; // 格式标注,如 "png", "bmp", "pcd" +} + +// ========================================================= +// 4. 标定结果载荷(支持内参、外参灵活组合组合发回车端) (写) +// ========================================================= +message CameraIntrinsics { + string camera_id = 1; + double fx = 2; double fy = 3; + double cx = 4; double cy = 5; + repeated double dist_coeffs = 6; // 畸变系数阵列 [k1, k2, p1, p2, k3] +} + +message SensorExtrinsics { + string source_frame = 1; // 源坐标系,如 "lidar_top" 或 "cam_left" + string target_frame = 2; // 目标坐标系,如 "cam_front" 或 "base_link" + + // 平移向量 (强制规定单位为毫米 mm) + double trans_x_mm = 3; + double trans_y_mm = 4; + double trans_z_mm = 5; + + // 旋转姿态 (强制规定单位为度 degrees) + double roll_deg = 6; + double pitch_deg = 7; + double yaw_deg = 8; +} + +message CalibrationPayload { + string task_id = 1; // 标定任务流水号,用于 MES 系统追溯 + // 采用 repeated 数组:Linux 可以一次性下发多个相机的内参和多个外参 + repeated CameraIntrinsics updated_intrinsics = 2; + repeated SensorExtrinsics updated_extrinsics = 3; +} \ No newline at end of file