refactor: remove remote control, zero-force mode and emergency stop

- Remove RC_ctrl_t and RemoteControlInit from robot_cmd.c
- Delete GIMBAL_ZERO_FORCE, gimbal_mode_e, Robot_Status_e from robot_def.h
- Remove EmergencyHandler and robot_state from robot_cmd.c
- Remove emergency commands from master_machine.h
- Remove remote_control and can_comm from CMakeLists.txt
This commit is contained in:
2026-05-30 01:14:00 +08:00
parent 3e77eed2bb
commit d56254d190
5 changed files with 9 additions and 100 deletions
-3
View File
@@ -89,7 +89,6 @@ target_sources(${CMAKE_PROJECT_NAME} PRIVATE
modules/imu/ins_task.c modules/imu/ins_task.c
# modules - communication # modules - communication
modules/master_machine/master_machine.c modules/master_machine/master_machine.c
modules/remote/remote_control.c
modules/timachine/board_comm.c modules/timachine/board_comm.c
# modules - motor # modules - motor
modules/motor/DMmotor/dmmotor.c modules/motor/DMmotor/dmmotor.c
@@ -135,8 +134,6 @@ target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
modules/master_machine modules/master_machine
modules/motor/DMmotor modules/motor/DMmotor
modules/motor modules/motor
modules/remote
modules/can_comm
modules/message_center modules/message_center
modules/daemon modules/daemon
modules/alarm modules/alarm
+5 -69
View File
@@ -3,7 +3,6 @@
#include "robot_cmd.h" #include "robot_cmd.h"
/* module */ /* module */
#include "controller.h" #include "controller.h"
#include "remote_control.h"
#include "ins_task.h" #include "ins_task.h"
#include "message_center.h" #include "message_center.h"
#include "general_def.h" #include "general_def.h"
@@ -36,12 +35,6 @@ static Subscriber_t *gimbal_feed_sub;
static Gimbal_Ctrl_Cmd_s gimbal_cmd_send; static Gimbal_Ctrl_Cmd_s gimbal_cmd_send;
static Gimbal_Upload_Data_s gimbal_fetch_data; static Gimbal_Upload_Data_s gimbal_fetch_data;
/* ---- 遥控器 ---- */
static RC_ctrl_t *rc_data;
/* ---- 机器人状态 ---- */
static Robot_Status_e robot_state;
/* ---- 激光 ---- */ /* ---- 激光 ---- */
static void laser_on(void) static void laser_on(void)
{ {
@@ -56,7 +49,6 @@ static void laser_off(void)
/* ---- 视觉 PID 和卡尔曼滤波器重置 ---- */ /* ---- 视觉 PID 和卡尔曼滤波器重置 ---- */
static void VisionPIDReset(void) static void VisionPIDReset(void)
{ {
/* 清零积分项和上次误差 */
vision_yaw_pid.Iout = 0; vision_yaw_pid.Iout = 0;
vision_yaw_pid.ITerm = 0; vision_yaw_pid.ITerm = 0;
vision_yaw_pid.Last_Err = 0; vision_yaw_pid.Last_Err = 0;
@@ -75,7 +67,6 @@ static void VisionPIDReset(void)
vision_pitch_pid.Output = 0; vision_pitch_pid.Output = 0;
vision_pitch_pid.Last_Dout = 0; vision_pitch_pid.Last_Dout = 0;
/* 重置滤波器状态: x = [0, 0], P = diag(5, 5) */
memset(yaw_error_kf.xhat_data, 0, yaw_error_kf.xhatSize * sizeof(float)); memset(yaw_error_kf.xhat_data, 0, yaw_error_kf.xhatSize * sizeof(float));
memset(yaw_error_kf.P_data, 0, yaw_error_kf.xhatSize * yaw_error_kf.xhatSize * sizeof(float)); memset(yaw_error_kf.P_data, 0, yaw_error_kf.xhatSize * yaw_error_kf.xhatSize * sizeof(float));
memset(pitch_error_kf.xhat_data, 0, pitch_error_kf.xhatSize * sizeof(float)); memset(pitch_error_kf.xhat_data, 0, pitch_error_kf.xhatSize * sizeof(float));
@@ -89,17 +80,16 @@ static void VisionPIDReset(void)
filtered_pitch_error = 0; filtered_pitch_error = 0;
} }
/* ---- 模式切换处理 ---- */ /* ---- 模式切换 ---- */
static void SwitchToAutoMode(void) static void SwitchToAutoMode(void)
{ {
if (current_mode == VISION_MODE_AUTO) if (current_mode == VISION_MODE_AUTO)
return; return;
/* 同步角度参考值为当前 IMU 角度 */
gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle; gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle;
gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data->Pitch; gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data->Pitch;
vision_data.manual_updated = 0; // 清除手动数据残留 vision_data.manual_updated = 0;
VisionPIDReset(); VisionPIDReset();
current_mode = VISION_MODE_AUTO; current_mode = VISION_MODE_AUTO;
LOGINFO("[CMD] switched to AUTO mode"); LOGINFO("[CMD] switched to AUTO mode");
@@ -113,7 +103,7 @@ static void SwitchToManualMode(void)
gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle; gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle;
gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data->Pitch; gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data->Pitch;
vision_data.auto_updated = 0; // 清除自动数据残留 vision_data.auto_updated = 0;
current_mode = VISION_MODE_MANUAL; current_mode = VISION_MODE_MANUAL;
LOGINFO("[CMD] switched to MANUAL mode"); LOGINFO("[CMD] switched to MANUAL mode");
} }
@@ -178,8 +168,6 @@ static void VisionKalmanFilterInit()
void RobotCMDInit() void RobotCMDInit()
{ {
rc_data = RemoteControlInit(&huart5);
gimbal_cmd_pub = PubRegister("gimbal_cmd", sizeof(Gimbal_Ctrl_Cmd_s)); gimbal_cmd_pub = PubRegister("gimbal_cmd", sizeof(Gimbal_Ctrl_Cmd_s));
gimbal_feed_sub = SubRegister("gimbal_feed", sizeof(Gimbal_Upload_Data_s)); gimbal_feed_sub = SubRegister("gimbal_feed", sizeof(Gimbal_Upload_Data_s));
@@ -204,16 +192,12 @@ void RobotCMDInit()
VisionKalmanFilterInit(); VisionKalmanFilterInit();
Vision_Uart_Init(&huart10); Vision_Uart_Init(&huart10);
robot_state = ROBOT_READY;
laser_off(); laser_off();
} }
/* ---- 自动 / 视觉追踪模式 ---- */ /* ---- 自动 / 视觉追踪模式 ---- */
static void VisionTrackingSet() static void VisionTrackingSet()
{ {
gimbal_cmd_send.gimbal_mode = GIMBAL_GYRO_MODE;
if (vision_data.auto_updated) if (vision_data.auto_updated)
{ {
vision_data.auto_updated = 0; vision_data.auto_updated = 0;
@@ -242,32 +226,15 @@ static void VisionTrackingSet()
gimbal_cmd_send.pitch = gimbal_pitch_ref; gimbal_cmd_send.pitch = gimbal_pitch_ref;
} }
/* ---- 手动模式 ---- */ /* ---- 手动模式: 上位机角度参考 ---- */
static void ManualModeSet() static void ManualModeSet()
{ {
if (vision_data.manual_updated && vision_data.zero_force) if (vision_data.manual_updated)
{ {
/* 零力子模式 */
vision_data.manual_updated = 0; vision_data.manual_updated = 0;
gimbal_cmd_send.gimbal_mode = GIMBAL_ZERO_FORCE;
gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle;
gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data->Pitch;
}
else if (vision_data.manual_updated)
{
/* 上位机角度参考 */
vision_data.manual_updated = 0;
gimbal_cmd_send.gimbal_mode = GIMBAL_GYRO_MODE;
gimbal_yaw_ref = vision_data.yaw_ref; gimbal_yaw_ref = vision_data.yaw_ref;
gimbal_pitch_ref = vision_data.pitch_ref; gimbal_pitch_ref = vision_data.pitch_ref;
} }
else
{
/* 遥控器 */
gimbal_cmd_send.gimbal_mode = GIMBAL_GYRO_MODE;
gimbal_yaw_ref -= 0.0025f * (float)rc_data[TEMP].rc.rocker_r_;
gimbal_pitch_ref += 0.00125f * (float)rc_data[TEMP].rc.rocker_r1;
}
if (gimbal_pitch_ref > 30.0f) if (gimbal_pitch_ref > 30.0f)
gimbal_pitch_ref = 30.0f; gimbal_pitch_ref = 30.0f;
@@ -278,43 +245,12 @@ static void ManualModeSet()
gimbal_cmd_send.pitch = gimbal_pitch_ref; gimbal_cmd_send.pitch = gimbal_pitch_ref;
} }
/* ---- 急停 ---- */
static void EmergencyHandler()
{
if (switch_is_down(rc_data[TEMP].rc.switch_right))
{
robot_state = ROBOT_STOP;
gimbal_cmd_send.gimbal_mode = GIMBAL_ZERO_FORCE;
gimbal_cmd_send.yaw = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle;
gimbal_cmd_send.pitch = gimbal_fetch_data.gimbal_imu_data->Pitch;
laser_off();
}
if (!switch_is_down(rc_data[TEMP].rc.switch_right) && robot_state == ROBOT_STOP)
{
robot_state = ROBOT_READY;
gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle;
gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data->Pitch;
LOGINFO("[CMD] reinstate, robot ready");
}
}
void RobotCMDTask() void RobotCMDTask()
{ {
SubGetMessage(gimbal_feed_sub, &gimbal_fetch_data); SubGetMessage(gimbal_feed_sub, &gimbal_fetch_data);
/* 优先处理串口命令 (模式切换 / 激光等) */
ProcessCommand(); ProcessCommand();
EmergencyHandler();
if (robot_state == ROBOT_STOP)
{
PubPushMessage(gimbal_cmd_pub, (void *)&gimbal_cmd_send);
return;
}
/* 根据当前模式执行控制 */
if (current_mode == VISION_MODE_AUTO) if (current_mode == VISION_MODE_AUTO)
VisionTrackingSet(); VisionTrackingSet();
else else
+2 -11
View File
@@ -84,17 +84,8 @@ void GimbalTask()
{ {
SubGetMessage(gimbal_sub, &gimbal_cmd_recv); SubGetMessage(gimbal_sub, &gimbal_cmd_recv);
if (gimbal_cmd_recv.gimbal_mode == GIMBAL_ZERO_FORCE) DMMotorSetRef(yaw_motor, gimbal_cmd_recv.yaw);
{ DMMotorSetRef(pitch_motor, gimbal_cmd_recv.pitch);
/* 零力模式: 保持当前IMU角度, 电机不主动出力 */
DMMotorSetRef(yaw_motor, gimbal_IMU_data->YawTotalAngle);
DMMotorSetRef(pitch_motor, gimbal_IMU_data->Pitch);
}
else
{
DMMotorSetRef(yaw_motor, gimbal_cmd_recv.yaw);
DMMotorSetRef(pitch_motor, gimbal_cmd_recv.pitch);
}
gimbal_feedback_data.gimbal_imu_data = gimbal_IMU_data; gimbal_feedback_data.gimbal_imu_data = gimbal_IMU_data;
PubPushMessage(gimbal_pub, (void *)&gimbal_feedback_data); PubPushMessage(gimbal_pub, (void *)&gimbal_feedback_data);
-15
View File
@@ -24,13 +24,6 @@
#pragma pack(1) #pragma pack(1)
/* 机器人状态 */
typedef enum
{
ROBOT_STOP = 0,
ROBOT_READY,
} Robot_Status_e;
/* 应用状态 */ /* 应用状态 */
typedef enum typedef enum
{ {
@@ -39,19 +32,11 @@ typedef enum
APP_ERROR, APP_ERROR,
} App_Status_e; } App_Status_e;
/* 云台模式 */
typedef enum
{
GIMBAL_ZERO_FORCE = 0,
GIMBAL_GYRO_MODE,
} gimbal_mode_e;
/* ---- CMD 发布给 gimbal 的控制数据 ---- */ /* ---- CMD 发布给 gimbal 的控制数据 ---- */
typedef struct typedef struct
{ {
float yaw; // yaw 目标角度 (degrees, multi-turn) float yaw; // yaw 目标角度 (degrees, multi-turn)
float pitch; // pitch 目标角度 (degrees) float pitch; // pitch 目标角度 (degrees)
gimbal_mode_e gimbal_mode;
} Gimbal_Ctrl_Cmd_s; } Gimbal_Ctrl_Cmd_s;
/* ---- gimbal 发布给 CMD 的反馈数据 ---- */ /* ---- gimbal 发布给 CMD 的反馈数据 ---- */
+2 -2
View File
@@ -38,8 +38,8 @@
/* 命令码 */ /* 命令码 */
#define VISION_CMD_SWITCH_AUTO 0x01 #define VISION_CMD_SWITCH_AUTO 0x01
#define VISION_CMD_SWITCH_MANUAL 0x02 #define VISION_CMD_SWITCH_MANUAL 0x02
#define VISION_CMD_LASER_ON 0x03 #define VISION_CMD_LASER_ON 0x03
#define VISION_CMD_LASER_OFF 0x04 #define VISION_CMD_LASER_OFF 0x04
/* 工作模式 */ /* 工作模式 */
typedef enum typedef enum