feat: add DEBUG mode with host-side PID tuning, motor enable/disable protection

- Add DEBUG mode (parallel to AUTO/MANUAL) for real-time PID parameter tuning
- New 0xA8 debug frame: 12 floats for vision/motor angle PID tuning params
- DMMotorSetMode: send zero-velocity before disable, clear PID to prevent jumps
- motor_enable topic: pub from robot_cmd, sub in gimbal, controls motor on/off
- motor_pid topic: pub from robot_cmd, sub in gimbal, updates motor angle PID
- Rename DM motor enums (DM_CMD_ENABLE_MODE/DISABLE_MODE, DM_Motor_Ctrl_Mode_e)
- SwitchToAuto/Manual: re-enable motors when switching back from DEBUG mode
- Static-allocate enable_msg/pid_tune in GimbalTask to avoid stack churn
- Add docs/host_comm_guide.md with Python Tkinter tuning GUI example
- Remove ARCHITECTURE.md
This commit is contained in:
2026-05-31 03:49:41 +08:00
parent 77a3aeb25c
commit 9b8e204ff7
10 changed files with 747 additions and 643 deletions
+35 -1
View File
@@ -9,6 +9,8 @@ static INS_t *gimbal_IMU_data;
static Publisher_t *gimbal_pub;
static Subscriber_t *gimbal_sub;
static Subscriber_t *motor_enable_sub;
static Subscriber_t *motor_pid_sub;
static Gimbal_Upload_Data_s gimbal_feedback_data;
static Gimbal_Ctrl_Cmd_s gimbal_cmd_recv;
@@ -21,6 +23,8 @@ void GimbalInit()
gimbal_pub = PubRegister("gimbal_feed", sizeof(Gimbal_Upload_Data_s));
gimbal_sub = SubRegister("gimbal_cmd", sizeof(Gimbal_Ctrl_Cmd_s));
motor_enable_sub = SubRegister("motor_enable", sizeof(Motor_Enable_s));
motor_pid_sub = SubRegister("motor_pid", sizeof(Motor_PID_Tune_s));
/* ---- Yaw: DM-G6220, CAN1, TX=0x01, RX=0xF1, Velocity模式 ---- */
DM_Motor_Init_Config_s yaw_config = {
@@ -78,6 +82,8 @@ void GimbalInit()
.mit_kp = 0, .mit_kd = 0,
};
pitch_motor = DMMotorInit(&pitch_config);
gimbal_feedback_data.gimbal_imu_data = gimbal_IMU_data;
}
void GimbalTask()
@@ -87,6 +93,34 @@ void GimbalTask()
DMMotorSetRef(yaw_motor, gimbal_cmd_recv.yaw);
DMMotorSetRef(pitch_motor, gimbal_cmd_recv.pitch);
gimbal_feedback_data.gimbal_imu_data = gimbal_IMU_data;
/* 电机使能/失能控制 */
static Motor_Enable_s enable_msg;
if (SubGetMessage(motor_enable_sub, &enable_msg))
{
if (enable_msg.enable)
{
DMMotorSetMode(DM_CMD_ENABLE_MODE, yaw_motor);
DMMotorSetMode(DM_CMD_ENABLE_MODE, pitch_motor);
}
else
{
DMMotorSetMode(DM_CMD_DISABLE_MODE, yaw_motor);
DMMotorSetMode(DM_CMD_DISABLE_MODE, pitch_motor);
}
}
/* 电机角度环 PID 调参 */
static Motor_PID_Tune_s pid_tune;
if (SubGetMessage(motor_pid_sub, &pid_tune))
{
yaw_motor->motor_controller.angle_PID.Kp = pid_tune.yaw_Kp;
yaw_motor->motor_controller.angle_PID.Ki = pid_tune.yaw_Ki;
yaw_motor->motor_controller.angle_PID.Kd = pid_tune.yaw_Kd;
pitch_motor->motor_controller.angle_PID.Kp = pid_tune.pitch_Kp;
pitch_motor->motor_controller.angle_PID.Ki = pid_tune.pitch_Ki;
pitch_motor->motor_controller.angle_PID.Kd = pid_tune.pitch_Kd;
}
PubPushMessage(gimbal_pub, (void *)&gimbal_feedback_data);
}