添加了一个云台搜寻模式
This commit is contained in:
parent
f121d4057a
commit
b78aa02d9b
@ -50,6 +50,18 @@ static double poly(double x) {
|
||||
return 0.420757*pow(x,3) + -2.27122*pow(x,2) + 4.13016*x + -1.98984;
|
||||
}
|
||||
|
||||
static uint8_t g_scan_active = 0;
|
||||
static float g_scan_pitch_center = 0.0f;
|
||||
static float g_scan_pitch_dir = 1.0f;
|
||||
static float g_scan_yaw_dir = 1.0f;
|
||||
|
||||
#define GIMBAL_SCAN_YAW_SPEED (0.55f)
|
||||
#define GIMBAL_SCAN_PITCH_SPEED (0.35f)
|
||||
#define GIMBAL_SCAN_PITCH_AMPLITUDE (0.18f)
|
||||
#define GIMBAL_SCAN_YAW_EDGE_MARGIN (0.16f)
|
||||
#define GIMBAL_SCAN_PITCH_EDGE_MARGIN (0.12f)
|
||||
#define GIMBAL_SCAN_EDGE_SLOW_BAND (0.26f)
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@ -250,6 +262,68 @@ int8_t Gimbal_UpdateIMU(Gimbal_t *gimbal, const Gimbal_IMU_t *imu){
|
||||
|
||||
Gimbal_SetMode(g, g_cmd->mode);
|
||||
|
||||
if (g_cmd->ctrl_mode == GIMBAL_MODE_SCAN) {
|
||||
float yaw_speed_scale = 1.0f;
|
||||
float pitch_speed_scale = 1.0f;
|
||||
float yaw_abs = g->feedback.motor.yaw_6020_motor_feedback.rotor_abs_angle;
|
||||
float pitch_abs = g->feedback.motor.pitch_4310_motor_feedback.rotor_abs_angle;
|
||||
|
||||
if (!g_scan_active) {
|
||||
g_scan_active = 1;
|
||||
g_scan_pitch_center = g->feedback.imu.eulr.pit;
|
||||
g_scan_pitch_dir = 1.0f;
|
||||
g_scan_yaw_dir = 1.0f;
|
||||
}
|
||||
|
||||
if (yaw_abs >= g->limit.yaw_6020.max - GIMBAL_SCAN_YAW_EDGE_MARGIN) {
|
||||
g_scan_yaw_dir = -1.0f;
|
||||
} else if (yaw_abs <= g->limit.yaw_6020.min + GIMBAL_SCAN_YAW_EDGE_MARGIN) {
|
||||
g_scan_yaw_dir = 1.0f;
|
||||
}
|
||||
|
||||
if (pitch_abs >= g->limit.pitch_4310.max - GIMBAL_SCAN_PITCH_EDGE_MARGIN) {
|
||||
g_scan_pitch_dir = -1.0f;
|
||||
} else if (pitch_abs <= g->limit.pitch_4310.min + GIMBAL_SCAN_PITCH_EDGE_MARGIN) {
|
||||
g_scan_pitch_dir = 1.0f;
|
||||
}
|
||||
|
||||
{
|
||||
float yaw_dist_to_edge_max = g->limit.yaw_6020.max - yaw_abs;
|
||||
float yaw_dist_to_edge_min = yaw_abs - g->limit.yaw_6020.min;
|
||||
float yaw_min_dist = (yaw_dist_to_edge_max < yaw_dist_to_edge_min) ? yaw_dist_to_edge_max : yaw_dist_to_edge_min;
|
||||
if (yaw_min_dist < GIMBAL_SCAN_EDGE_SLOW_BAND) {
|
||||
if (yaw_min_dist < 0.0f) yaw_min_dist = 0.0f;
|
||||
yaw_speed_scale = 0.25f + 0.75f * (yaw_min_dist / GIMBAL_SCAN_EDGE_SLOW_BAND);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
float pitch_dist_to_edge_max = g->limit.pitch_4310.max - pitch_abs;
|
||||
float pitch_dist_to_edge_min = pitch_abs - g->limit.pitch_4310.min;
|
||||
float pitch_min_dist = (pitch_dist_to_edge_max < pitch_dist_to_edge_min) ? pitch_dist_to_edge_max : pitch_dist_to_edge_min;
|
||||
if (pitch_min_dist < GIMBAL_SCAN_EDGE_SLOW_BAND) {
|
||||
if (pitch_min_dist < 0.0f) pitch_min_dist = 0.0f;
|
||||
pitch_speed_scale = 0.25f + 0.75f * (pitch_min_dist / GIMBAL_SCAN_EDGE_SLOW_BAND);
|
||||
}
|
||||
}
|
||||
|
||||
if (g->feedback.imu.eulr.pit >= g_scan_pitch_center + GIMBAL_SCAN_PITCH_AMPLITUDE) {
|
||||
g_scan_pitch_dir = -1.0f;
|
||||
} else if (g->feedback.imu.eulr.pit <= g_scan_pitch_center - GIMBAL_SCAN_PITCH_AMPLITUDE) {
|
||||
g_scan_pitch_dir = 1.0f;
|
||||
}
|
||||
|
||||
g_cmd->delta_yaw_6020 = g_scan_yaw_dir * GIMBAL_SCAN_YAW_SPEED * yaw_speed_scale;
|
||||
g_cmd->delta_pitch_4310 = g_scan_pitch_dir * GIMBAL_SCAN_PITCH_SPEED * pitch_speed_scale;
|
||||
g_cmd->yaw_vel = 0.0f;
|
||||
g_cmd->yaw_accl = 0.0f;
|
||||
g_cmd->pit_vel = 0.0f;
|
||||
g_cmd->pit_accl = 0.0f;
|
||||
} else {
|
||||
g_scan_active = 0;
|
||||
g_scan_yaw_dir = 1.0f;
|
||||
}
|
||||
|
||||
/*处理小yaw轴控制命令*/
|
||||
float delta_yaw_6020 = 10.0f*g_cmd->delta_yaw_6020 * g->dt;
|
||||
|
||||
@ -319,6 +393,11 @@ switch (g_cmd->ctrl_mode) {
|
||||
g->setpoint.eulr.pit = g->setpoint.eulr.pit;
|
||||
break;
|
||||
|
||||
case GIMBAL_MODE_SCAN:
|
||||
g->setpoint.eulr.yaw = g->setpoint.eulr.yaw;
|
||||
g->setpoint.eulr.pit = g->setpoint.eulr.pit;
|
||||
break;
|
||||
|
||||
case GIMBAL_MODE_AI:
|
||||
g->setpoint.eulr.yaw = g_cmd->set_yaw;
|
||||
g->setpoint.eulr.pit = g_cmd->set_pitch;
|
||||
|
||||
@ -116,6 +116,7 @@ extern "C"
|
||||
{
|
||||
GIMBAL_MODE_REMOTE,
|
||||
GIMBAL_MODE_AI,
|
||||
GIMBAL_MODE_SCAN,
|
||||
}GIMBAL_Ctrl_mode_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@ -64,31 +64,19 @@ osMessageQueueGet(task_runtime.msgq.gimbal.ai.g_cmd,&ai_gimbal_result_cmd,NULL,
|
||||
|
||||
osMessageQueueGet(task_runtime.msgq.gimbal.cmd, &cmd_gimbal, NULL, 0);
|
||||
|
||||
if(ai_gimbal_result_cmd.mode==0){
|
||||
cmd_gimbal.set_pitch =gimbal_imu.eulr.pit;
|
||||
cmd_gimbal.set_yaw=gimbal_imu.eulr.yaw;
|
||||
|
||||
if (cmd_gimbal.ctrl_mode == GIMBAL_MODE_AI) {
|
||||
if (ai_gimbal_result_cmd.mode == 0) {
|
||||
cmd_gimbal.ctrl_mode = GIMBAL_MODE_SCAN;
|
||||
} else {
|
||||
cmd_gimbal.ctrl_mode = GIMBAL_MODE_AI;
|
||||
cmd_gimbal.set_pitch = ai_gimbal_result_cmd.gimbal_t.setpoint.pit;
|
||||
cmd_gimbal.set_yaw = ai_gimbal_result_cmd.gimbal_t.setpoint.yaw;
|
||||
cmd_gimbal.yaw_vel = ai_gimbal_result_cmd.gimbal_t.vel.yaw;
|
||||
cmd_gimbal.yaw_accl = ai_gimbal_result_cmd.gimbal_t.accl.yaw;
|
||||
cmd_gimbal.pit_vel = ai_gimbal_result_cmd.gimbal_t.vel.pit;
|
||||
cmd_gimbal.pit_accl = ai_gimbal_result_cmd.gimbal_t.accl.pit;
|
||||
}
|
||||
}
|
||||
if(ai_gimbal_result_cmd.mode==1)
|
||||
{
|
||||
cmd_gimbal.set_pitch=ai_gimbal_result_cmd.gimbal_t.setpoint.pit;
|
||||
cmd_gimbal.set_yaw=ai_gimbal_result_cmd.gimbal_t.setpoint.yaw;
|
||||
cmd_gimbal.yaw_vel=ai_gimbal_result_cmd.gimbal_t.vel.yaw;
|
||||
cmd_gimbal.yaw_accl=ai_gimbal_result_cmd.gimbal_t.accl.yaw;
|
||||
cmd_gimbal.pit_vel=ai_gimbal_result_cmd.gimbal_t.vel.pit;
|
||||
cmd_gimbal.pit_accl=ai_gimbal_result_cmd.gimbal_t.accl.pit;
|
||||
|
||||
}
|
||||
if(ai_gimbal_result_cmd.mode==2){
|
||||
cmd_gimbal.set_pitch=ai_gimbal_result_cmd.gimbal_t.setpoint.pit;
|
||||
cmd_gimbal.set_yaw=ai_gimbal_result_cmd.gimbal_t.setpoint.yaw;
|
||||
cmd_gimbal.yaw_vel=ai_gimbal_result_cmd.gimbal_t.vel.yaw;
|
||||
cmd_gimbal.yaw_accl=ai_gimbal_result_cmd.gimbal_t.accl.yaw;
|
||||
cmd_gimbal.pit_vel=ai_gimbal_result_cmd.gimbal_t.vel.pit;
|
||||
cmd_gimbal.pit_accl=ai_gimbal_result_cmd.gimbal_t.accl.pit;
|
||||
|
||||
}
|
||||
|
||||
|
||||
Gimbal_UpdateFeedback(&gimbal);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user