比较完善的,手动,雷达,运球
This commit is contained in:
parent
866e4de877
commit
67960d2805
2
MDK-ARM/.vscode/keil-assistant.log
vendored
2
MDK-ARM/.vscode/keil-assistant.log
vendored
@ -479,3 +479,5 @@
|
|||||||
|
|
||||||
[info] Log at : 2025/6/27|16:40:58|GMT+0800
|
[info] Log at : 2025/6/27|16:40:58|GMT+0800
|
||||||
|
|
||||||
|
[info] Log at : 2025/6/28|01:22:24|GMT+0800
|
||||||
|
|
||||||
|
3
MDK-ARM/.vscode/settings.json
vendored
3
MDK-ARM/.vscode/settings.json
vendored
@ -97,6 +97,7 @@
|
|||||||
"gimbal_task.h": "c",
|
"gimbal_task.h": "c",
|
||||||
"gimgal.h": "c",
|
"gimgal.h": "c",
|
||||||
"navi.h": "c",
|
"navi.h": "c",
|
||||||
"up.h": "c"
|
"up.h": "c",
|
||||||
|
"bsp_usart.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -158,47 +158,17 @@
|
|||||||
<Ww>
|
<Ww>
|
||||||
<count>0</count>
|
<count>0</count>
|
||||||
<WinNumber>1</WinNumber>
|
<WinNumber>1</WinNumber>
|
||||||
<ItemText>NUC_send,0x0A</ItemText>
|
<ItemText>tar_angle</ItemText>
|
||||||
</Ww>
|
</Ww>
|
||||||
<Ww>
|
<Ww>
|
||||||
<count>1</count>
|
<count>1</count>
|
||||||
<WinNumber>1</WinNumber>
|
<WinNumber>1</WinNumber>
|
||||||
<ItemText>SendBuffer,0x10</ItemText>
|
<ItemText>huart->ErrorCode</ItemText>
|
||||||
</Ww>
|
</Ww>
|
||||||
<Ww>
|
<Ww>
|
||||||
<count>2</count>
|
<count>2</count>
|
||||||
<WinNumber>1</WinNumber>
|
<WinNumber>1</WinNumber>
|
||||||
<ItemText>chassis,0x0A</ItemText>
|
<ItemText>error_code</ItemText>
|
||||||
</Ww>
|
|
||||||
<Ww>
|
|
||||||
<count>3</count>
|
|
||||||
<WinNumber>1</WinNumber>
|
|
||||||
<ItemText>cmd_fromnuc,0x0A</ItemText>
|
|
||||||
</Ww>
|
|
||||||
<Ww>
|
|
||||||
<count>4</count>
|
|
||||||
<WinNumber>1</WinNumber>
|
|
||||||
<ItemText>nucbuf,0x10</ItemText>
|
|
||||||
</Ww>
|
|
||||||
<Ww>
|
|
||||||
<count>5</count>
|
|
||||||
<WinNumber>1</WinNumber>
|
|
||||||
<ItemText>UP,0x0A</ItemText>
|
|
||||||
</Ww>
|
|
||||||
<Ww>
|
|
||||||
<count>6</count>
|
|
||||||
<WinNumber>1</WinNumber>
|
|
||||||
<ItemText>tar_angle</ItemText>
|
|
||||||
</Ww>
|
|
||||||
<Ww>
|
|
||||||
<count>7</count>
|
|
||||||
<WinNumber>1</WinNumber>
|
|
||||||
<ItemText>up_cmd</ItemText>
|
|
||||||
</Ww>
|
|
||||||
<Ww>
|
|
||||||
<count>8</count>
|
|
||||||
<WinNumber>1</WinNumber>
|
|
||||||
<ItemText>a,0x0A</ItemText>
|
|
||||||
</Ww>
|
</Ww>
|
||||||
</WatchWindow1>
|
</WatchWindow1>
|
||||||
<Tracepoint>
|
<Tracepoint>
|
||||||
|
Binary file not shown.
@ -32,9 +32,14 @@ int8_t Chassis_UpdateFeedback(Chassis_t *c, const CAN_t *can) {
|
|||||||
//
|
//
|
||||||
// c->sick_cali.sick_dis[i]=can->sickfed.raw_dis[i] / 10; //没使用原值
|
// c->sick_cali.sick_dis[i]=can->sickfed.raw_dis[i] / 10; //没使用原值
|
||||||
// }
|
// }
|
||||||
c->sick_cali.sick_dis[0]=can->sickfed.raw_dis[0] ;
|
c->sick_cali.sick_dis[0]=(fp32)(can->sickfed.raw_dis[0]) ;
|
||||||
c->sick_cali.sick_dis[1]=can->sickfed.raw_dis[1]+50 ; //有点误差,手动补偿
|
c->sick_cali.sick_dis[1]=(fp32)(can->sickfed.raw_dis[1]+26) ; //有点误差,手动补偿
|
||||||
c->sick_cali.sick_dis[2]=can->sickfed.raw_dis[2] ;
|
c->sick_cali.sick_dis[2]=(fp32)(can->sickfed.raw_dis[2] );
|
||||||
|
|
||||||
|
// c->vofa_send[7] =c->sick_cali.sick_dis[0]-c->sick_cali.sick_dis[1];
|
||||||
|
// c->vofa_send[6] = c->sick_cali.sick_dis[0];
|
||||||
|
// c->vofa_send[5] =c->sick_cali.sick_dis[1];
|
||||||
|
// c->vofa_send[4] =c->sick_cali.sick_dis[2];
|
||||||
return CHASSIS_OK;
|
return CHASSIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +65,11 @@ int8_t Chassis_init(Chassis_t *c, const Chassis_Param_t *param, float target_fre
|
|||||||
LowPassFilter2p_Init(&(c->filled[0]), target_freq, 80.0f); // 角加速度滤波
|
LowPassFilter2p_Init(&(c->filled[0]), target_freq, 80.0f); // 角加速度滤波
|
||||||
LowPassFilter2p_Init(&(c->filled[1]), target_freq, 80.0f); // w滤波
|
LowPassFilter2p_Init(&(c->filled[1]), target_freq, 80.0f); // w滤波
|
||||||
LowPassFilter2p_Init(&(c->filled[2]), target_freq, 80.0f); // y滤波
|
LowPassFilter2p_Init(&(c->filled[2]), target_freq, 80.0f); // y滤波
|
||||||
LowPassFilter2p_Init(&(c->filled[3]), target_freq, 80.0f); // x滤波
|
LowPassFilter2p_Init(&(c->filled[3]), target_freq, 80.0f);
|
||||||
|
LowPassFilter2p_Init(&(c->filled[4]), target_freq, 80.0f);
|
||||||
|
LowPassFilter2p_Init(&(c->filled[5]), target_freq, 80.0f);
|
||||||
|
LowPassFilter2p_Init(&(c->filled[6]), target_freq, 80.0f);
|
||||||
|
LowPassFilter2p_Init(&(c->filled[7]), target_freq, 80.0f);
|
||||||
|
|
||||||
c->sick_cali .sickparam=c->param ->sickparam ;
|
c->sick_cali .sickparam=c->param ->sickparam ;
|
||||||
|
|
||||||
@ -89,9 +98,7 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
|
|||||||
c->pos088.bmi088.filtered_gyro.z = LowPassFilter2p_Apply(&(c->filled[0]), c->pos088.bmi088.gyro.z);
|
c->pos088.bmi088.filtered_gyro.z = LowPassFilter2p_Apply(&(c->filled[0]), c->pos088.bmi088.gyro.z);
|
||||||
|
|
||||||
/*初始数据*/
|
/*初始数据*/
|
||||||
c->move_vec.Vw = 0;
|
|
||||||
c->move_vec.Vx = 0;
|
|
||||||
c->move_vec.Vy = 0;
|
|
||||||
c->NUC_send.send[0] = 0;
|
c->NUC_send.send[0] = 0;
|
||||||
c->sick_cali.is_reach = 0;
|
c->sick_cali.is_reach = 0;
|
||||||
|
|
||||||
@ -118,7 +125,9 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
|
|||||||
c->NUC_send.send[0] = (c->sick_cali.is_reach == 1) ? 1 : 0;
|
c->NUC_send.send[0] = (c->sick_cali.is_reach == 1) ? 1 : 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
c->move_vec.Vw = 0;
|
||||||
|
c->move_vec.Vx = 0;
|
||||||
|
c->move_vec.Vy = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -135,7 +144,12 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
|
|||||||
// c->NUC_send.send[0] = 1;
|
// c->NUC_send.send[0] = 1;
|
||||||
break;
|
break;
|
||||||
case AUTO_MID360_Pitch:
|
case AUTO_MID360_Pitch:
|
||||||
|
c->move_vec.Vw = ctrl->cmd_MID360.posw * 1000;
|
||||||
|
c->move_vec.Vy = -ctrl->cmd_MID360.posy * 1000;
|
||||||
|
c->move_vec.Vx = -ctrl->cmd_MID360.posx * 1000;
|
||||||
|
abs_limit_fp(&c->move_vec.Vx, 5000.0f);
|
||||||
|
abs_limit_fp(&c->move_vec.Vy, 5000.0f);
|
||||||
|
abs_limit_fp(&c->move_vec.Vw, 5000.0f);
|
||||||
break;
|
break;
|
||||||
case AUTO_MID360_Adjust:
|
case AUTO_MID360_Adjust:
|
||||||
c->move_vec.Vw = ctrl->Vw * 6000;
|
c->move_vec.Vw = ctrl->Vw * 6000;
|
||||||
@ -154,9 +168,9 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
|
|||||||
case PB_UP:
|
case PB_UP:
|
||||||
case PB_MID:
|
case PB_MID:
|
||||||
case PB_DOWN:
|
case PB_DOWN:
|
||||||
c->move_vec.Vw = ctrl->cmd_MID360.posw * 1000;
|
c->move_vec.Vw = ctrl->Vw * 6000;
|
||||||
c->move_vec.Vy = -ctrl->cmd_MID360.posy * 1000;
|
c->move_vec.Vx = ctrl->Vy * 6000;
|
||||||
c->move_vec.Vx = -ctrl->cmd_MID360.posx * 1000;
|
c->move_vec.Vy = ctrl->Vx * 6000;
|
||||||
abs_limit_fp(&c->move_vec.Vx, 5000.0f);
|
abs_limit_fp(&c->move_vec.Vx, 5000.0f);
|
||||||
abs_limit_fp(&c->move_vec.Vy, 5000.0f);
|
abs_limit_fp(&c->move_vec.Vy, 5000.0f);
|
||||||
abs_limit_fp(&c->move_vec.Vw, 5000.0f);
|
abs_limit_fp(&c->move_vec.Vw, 5000.0f);
|
||||||
@ -171,7 +185,7 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,7 +203,7 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
|
|||||||
out->motor_CHASSIS3508.as_array[i] = c->final_out.final_3508out[i];
|
out->motor_CHASSIS3508.as_array[i] = c->final_out.final_3508out[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// c->vofa_send[0] = (fp32)c->sick_cali.sick_dis[1] - c->sick_cali.sick_dis[2];
|
|
||||||
|
|
||||||
return CHASSIS_OK;
|
return CHASSIS_OK;
|
||||||
|
|
||||||
@ -206,32 +220,41 @@ sick2,左1
|
|||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
fp32 diff_yaw,diff_y,diff_x;
|
||||||
int8_t sick_calibration(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out)
|
int8_t sick_calibration(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out)
|
||||||
{
|
{
|
||||||
if (c == NULL) return CHASSIS_ERR_NULL;
|
if (c == NULL) return CHASSIS_ERR_NULL;
|
||||||
if (ctrl == NULL) return CHASSIS_ERR_NULL;
|
if (ctrl == NULL) return CHASSIS_ERR_NULL;
|
||||||
fp32 delta_w,delta_x,delta_y;
|
fp32 delta_w,delta_x,delta_y;
|
||||||
|
|
||||||
fp32 sick0 = c->sick_cali.sick_dis[0] ;
|
fp32 sick0 =LowPassFilter2p_Apply( &(c->filled[5]),c->sick_cali.sick_dis[0]) ;
|
||||||
fp32 sick1 = c->sick_cali.sick_dis[1];
|
fp32 sick1 =LowPassFilter2p_Apply( &(c->filled[6]), c->sick_cali.sick_dis[1]) ;
|
||||||
fp32 sick2 = c->sick_cali.sick_dis[2];
|
fp32 sick2 = LowPassFilter2p_Apply( &(c->filled[7]),c->sick_cali.sick_dis[2] );
|
||||||
const sickparam_t *param = &c->sick_cali.sickparam;
|
const sickparam_t *param = &c->sick_cali.sickparam;
|
||||||
|
|
||||||
fp32 diff_yaw = -(fp32)(sick1 - sick2);
|
diff_yaw = -(fp32)(sick1 - sick2);
|
||||||
fp32 diff_y = -(fp32)(sick1 - c->sick_cali.sickparam.y_set);
|
diff_y = -(fp32)(sick1 - c->sick_cali.sickparam.y_set);
|
||||||
fp32 diff_x = (fp32)(sick0 - c->sick_cali.sickparam.x_set);
|
diff_x = (fp32)(sick0 - c->sick_cali.sickparam.x_set);
|
||||||
|
|
||||||
delta_w=(&c->pid.SickCaliWzInPID, diff_yaw, 0);
|
delta_w=PID_calc(&c->pid.SickCaliWzOutPID, diff_yaw, 0);
|
||||||
delta_x=(&c->pid.SickCaliVxInPID, diff_x, 0);
|
delta_x=PID_calc(&c->pid.SickCaliVxOutPID, diff_x, 0);
|
||||||
delta_y=(&c->pid.SickCaliVyInPID, diff_y,0);
|
delta_y=PID_calc(&c->pid.SickCaliVyOutPID, diff_y,0);
|
||||||
|
|
||||||
|
if(fabs(diff_yaw)>5){
|
||||||
|
c->move_vec.Vw=PID_calc(&c->pid.SickCaliWzInPID,-delta_w,0);
|
||||||
|
// c->move_vec.Vw=delta_w;
|
||||||
|
// c->move_vec.Vx=PID_calc(&c->pid.SickCaliVxInPID,delta_x,0);
|
||||||
|
// c->move_vec.Vx=PID_calc(&c->pid.SickCaliVyInPID,delta_y,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static uint16_t reach_cnt = 0;
|
static uint16_t reach_cnt = 0;
|
||||||
if (fabsf(diff_yaw) <= param->w_error &&
|
if (fabsf(diff_yaw) <= param->w_error &&
|
||||||
fabsf(diff_x) <= param->xy_error &&
|
fabsf(diff_x) <= param->xy_error &&
|
||||||
fabsf(diff_y) <= param->xy_error) {
|
fabsf(diff_y) <= param->xy_error) {
|
||||||
reach_cnt++;
|
reach_cnt++;
|
||||||
if (reach_cnt >= 50) {
|
if (reach_cnt >= 20) {
|
||||||
|
|
||||||
c->sick_cali.is_reach = 1;
|
c->sick_cali.is_reach = 1;
|
||||||
|
|
||||||
@ -252,7 +275,7 @@ int8_t Chassis_AngleCompensate(Chassis_t *c)
|
|||||||
{
|
{
|
||||||
pian_angel=cur_angle-AngleChange(DEGREE,c->pos088.imu_eulr.yaw);
|
pian_angel=cur_angle-AngleChange(DEGREE,c->pos088.imu_eulr.yaw);
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
cur_angle=AngleChange(DEGREE,c->pos088.imu_eulr.yaw);
|
cur_angle=AngleChange(DEGREE,c->pos088.imu_eulr.yaw);
|
||||||
pian_angel=0;
|
pian_angel=0;
|
||||||
|
@ -173,7 +173,7 @@ typedef struct{
|
|||||||
|
|
||||||
fp32 vofa_send[8];
|
fp32 vofa_send[8];
|
||||||
|
|
||||||
LowPassFilter2p_t filled[6]; /* 输出滤波器滤波器数组 */
|
LowPassFilter2p_t filled[8]; /* 输出滤波器滤波器数组 */
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
int32_t sick_dis[4]; //获取到的sick激光值
|
int32_t sick_dis[4]; //获取到的sick激光值
|
||||||
|
@ -96,6 +96,14 @@ static const ConfigParam_t param ={
|
|||||||
.Pitch_angle=66,
|
.Pitch_angle=66,
|
||||||
.go_up_speed =12,
|
.go_up_speed =12,
|
||||||
.go_down_speed =5,
|
.go_down_speed =5,
|
||||||
|
},
|
||||||
|
.MID360Cfg={
|
||||||
|
|
||||||
|
.go_release_pos=-200, // GO电机发射位置
|
||||||
|
.go_up_speed=20, // GO电机上升速度
|
||||||
|
.go_down_speed=10, // GO电机下降速度
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.chassis = {/**/
|
.chassis = {/**/
|
||||||
@ -123,19 +131,21 @@ static const ConfigParam_t param ={
|
|||||||
.i_limit = 50.0f,
|
.i_limit = 50.0f,
|
||||||
.out_limit =1000.0f,
|
.out_limit =1000.0f,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
.SickCali_WInparam = {
|
.SickCali_WInparam = {
|
||||||
.p = 0.0f,
|
.p = 3.0f,
|
||||||
.i = 0.0f,
|
.i = 0.005f,
|
||||||
.d = 0.0f,
|
.d = 0.0f,
|
||||||
.i_limit = 0.0f,
|
.i_limit = 500.0f,
|
||||||
.out_limit = 0.0f,
|
.out_limit = 2000.0f,
|
||||||
},
|
},
|
||||||
.SickCali_WOutparam = {
|
.SickCali_WOutparam = {
|
||||||
.p = 0.0f,
|
.p = 18.0f,
|
||||||
.i = 0.0f,
|
.i = 0.0f,
|
||||||
.d = 0.0f,
|
.d = 0.0f,
|
||||||
.i_limit = 0.0f,
|
.i_limit = 0.0f,
|
||||||
.out_limit = 0.0f,
|
.out_limit = 1000.0f,
|
||||||
},
|
},
|
||||||
.SickCali_YInparam = {
|
.SickCali_YInparam = {
|
||||||
.p = 0.0f,
|
.p = 0.0f,
|
||||||
@ -145,11 +155,11 @@ static const ConfigParam_t param ={
|
|||||||
.out_limit = 0.0f,
|
.out_limit = 0.0f,
|
||||||
},
|
},
|
||||||
.SickCali_YOutparam = {
|
.SickCali_YOutparam = {
|
||||||
.p = 0.0f,
|
.p = 2.9f,
|
||||||
.i = 0.0f,
|
.i = 0.005f,
|
||||||
.d = 0.0f,
|
.d = 0.0f,
|
||||||
.i_limit = 0.0f,
|
.i_limit = 500.0f,
|
||||||
.out_limit = 0.0f,
|
.out_limit = 1000.0f,
|
||||||
},
|
},
|
||||||
.SickCali_XInparam = {
|
.SickCali_XInparam = {
|
||||||
.p = 0.0f,
|
.p = 0.0f,
|
||||||
@ -159,11 +169,11 @@ static const ConfigParam_t param ={
|
|||||||
.out_limit = 0.0f,
|
.out_limit = 0.0f,
|
||||||
},
|
},
|
||||||
.SickCali_XOutparam = {
|
.SickCali_XOutparam = {
|
||||||
.p = 0.0f,
|
.p = 2.9f,
|
||||||
.i = 0.0f,
|
.i = 0.0065f,
|
||||||
.d = 0.0f,
|
.d = 0.0f,
|
||||||
.i_limit = 0.0f,
|
.i_limit = 500.0f,
|
||||||
.out_limit = 0.0f,
|
.out_limit = 3000.0f,
|
||||||
},
|
},
|
||||||
.Chassis_AngleAdjust_param={
|
.Chassis_AngleAdjust_param={
|
||||||
.p = 10.0f,
|
.p = 10.0f,
|
||||||
|
@ -54,7 +54,7 @@ int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq)
|
|||||||
u->PassContext .is_init = 1;
|
u->PassContext .is_init = 1;
|
||||||
}
|
}
|
||||||
u->LaunchContext.LaunchCfg = u->param->LaunchCfg;
|
u->LaunchContext.LaunchCfg = u->param->LaunchCfg;
|
||||||
|
u->MID360Context.MID360Cfg = u->param->MID360Cfg;
|
||||||
BSP_UART_RegisterCallback(BSP_UART_RS485, BSP_UART_RX_CPLT_CB, USART6_RxCompleteCallback);//注册串口回调函数,bsp层
|
BSP_UART_RegisterCallback(BSP_UART_RS485, BSP_UART_RX_CPLT_CB, USART6_RxCompleteCallback);//注册串口回调函数,bsp层
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -181,13 +181,16 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
|
|||||||
|
|
||||||
/*部分数据更新*/
|
/*部分数据更新*/
|
||||||
static int is_pitch=1;
|
static int is_pitch=1;
|
||||||
posss=CurveChange(LowPassFilter2p_Apply(&u->filled[0],c->pos),3,4,&u->PitchContext.Curve);
|
posss=CurveChange(LowPassFilter2p_Apply(&u->filled[0],c->pos),3.4,4.2,&u->MID360Context.Curve);
|
||||||
// if (u->PitchContext.Curve == CURVE_58) {
|
// if (u->PitchContext.Curve == CURVE_58) {
|
||||||
// target->Pitch_angle = 58;
|
// target->Pitch_angle = 58;
|
||||||
// } else {
|
// } else {
|
||||||
// target->Pitch_angle = 66;
|
// target->Pitch_angle = 66;
|
||||||
// }
|
// }
|
||||||
|
u->vofa_send [2] = c->pos;
|
||||||
|
u->vofa_send [3] = LowPassFilter2p_Apply(&u->filled[0],c->pos);
|
||||||
|
u->vofa_send [4] =1;
|
||||||
|
|
||||||
switch (c->CMD_CtrlType )
|
switch (c->CMD_CtrlType )
|
||||||
{
|
{
|
||||||
case RCcontrol: //在手动模式下
|
case RCcontrol: //在手动模式下
|
||||||
@ -205,8 +208,7 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
|
|||||||
} //初始上电
|
} //初始上电
|
||||||
//LaunchCfg->go_up_speed=15;
|
//LaunchCfg->go_up_speed=15;
|
||||||
target->Pitch_angle =LaunchCfg->Pitch_angle;
|
target->Pitch_angle =LaunchCfg->Pitch_angle;
|
||||||
|
target->go_pull_speed=LaunchCfg->go_up_speed;
|
||||||
|
|
||||||
target->Shoot_M2006_angle=LaunchCfg->m2006_init;
|
target->Shoot_M2006_angle=LaunchCfg->m2006_init;
|
||||||
u->PitchContext .PitchState = PITCH_PREPARE; //状态更新
|
u->PitchContext .PitchState = PITCH_PREPARE; //状态更新
|
||||||
u->LaunchContext.LaunchState = Launch_Stop;
|
u->LaunchContext.LaunchState = Launch_Stop;
|
||||||
@ -235,54 +237,15 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AUTO:
|
case AUTO:
|
||||||
/*自动下数据更新,根据距离切换俯仰角,如需自动调整,放在*/
|
UP_AUTO_Control(u,out,c);
|
||||||
// if (u->PitchContext.Curve == CURVE_58) {
|
|
||||||
// target->Pitch_angle = 58;
|
|
||||||
// } else {
|
|
||||||
// target->Pitch_angle = 66;
|
|
||||||
// }
|
|
||||||
|
|
||||||
switch(c-> CMD_mode)
|
|
||||||
{
|
|
||||||
case AUTO_MID360_Pitch:
|
|
||||||
|
|
||||||
if (u->PitchContext .PitchState ==PITCH_PREPARE || u->PitchContext .PitchState ==PITCH_COMPLETE)
|
|
||||||
{
|
|
||||||
u->PitchContext .PitchState=PITCH_START;//置标志位用于启动投篮
|
|
||||||
}
|
|
||||||
/*根据距离实时计算所需pos*/
|
|
||||||
if(c->pos){
|
|
||||||
pitch_cfg ->go_release_pos=
|
|
||||||
CurveChange(LowPassFilter2p_Apply(&u->filled[0],c->pos),3,4,&u->PitchContext.Curve);
|
|
||||||
}
|
|
||||||
else pitch_cfg ->go_release_pos=0 ;
|
|
||||||
Pitch_Process(u,out,c);
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case AUTO_MID360:
|
|
||||||
target->Shoot_M2006_angle =LaunchCfg ->m2006_init ;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
break ;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
break ;
|
break ;
|
||||||
case PASS_BALL:
|
case PASS_BALL:
|
||||||
// if (u->PitchContext.Curve == CURVE_58) {
|
|
||||||
// target->Pitch_angle = 58;
|
|
||||||
// } else {
|
|
||||||
// target->Pitch_angle = 66;
|
|
||||||
// }
|
|
||||||
Pass_Process(u,out,c);
|
Pass_Process(u,out,c);
|
||||||
break;
|
break;
|
||||||
case RELAXED:
|
case RELAXED:
|
||||||
// target->go_shoot= pitch_cfg .
|
// target->go_shoot= pitch_cfg .
|
||||||
target->Pitch_angle = 58;
|
target->Pitch_angle = 58;
|
||||||
target->go_shoot = -210.0f;
|
target->go_shoot = -190.0f;
|
||||||
// target->Pitch_angle = 58;
|
// target->Pitch_angle = 58;
|
||||||
|
|
||||||
|
|
||||||
@ -385,14 +348,14 @@ int8_t Pass_Process(UP_t *u,CAN_Output_t *out,CMD_t *c)
|
|||||||
PassCfg_t *PassCfg = &u->PassContext.PassCfg;
|
PassCfg_t *PassCfg = &u->PassContext.PassCfg;
|
||||||
PassState_t *state = &u->PassContext.PassState;
|
PassState_t *state = &u->PassContext.PassState;
|
||||||
up_motor_target_t *target=&u->motor_target ;
|
up_motor_target_t *target=&u->motor_target ;
|
||||||
LaunchContext_t *LaunchContext = &u->LaunchContext;
|
LaunchContext_t *LaunchContext = &u->LaunchContext;
|
||||||
|
|
||||||
Pass_Sequence_Check(u,c);
|
Pass_Sequence_Check(u,c);
|
||||||
|
|
||||||
if(c->pos) //
|
if(c->pos) //
|
||||||
{
|
{
|
||||||
PassCfg ->go_release_pos =
|
PassCfg ->go_release_pos =
|
||||||
CurveChange(LowPassFilter2p_Apply(&u->filled[0],c->pos),3,4,&u->PitchContext.Curve);
|
CurveChange(LowPassFilter2p_Apply(&u->filled[0],c->pos),3,4,&u->PassContext.Curve);
|
||||||
|
|
||||||
}
|
}
|
||||||
switch (*state) { //遥控器按键进行状态切换
|
switch (*state) { //遥控器按键进行状态切换
|
||||||
@ -426,3 +389,42 @@ int8_t Pass_Process(UP_t *u,CAN_Output_t *out,CMD_t *c)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int8_t UP_AUTO_Control(UP_t *u,CAN_Output_t *out,CMD_t *c){
|
||||||
|
/*自动下数据更新,根据距离切换俯仰角,如需自动调整,放在*/
|
||||||
|
up_motor_target_t *target=&u->motor_target ;
|
||||||
|
LaunchContext_t *LaunchContext = &u->LaunchContext;
|
||||||
|
MID360Context_t *MID360Context=&u->MID360Context;
|
||||||
|
MID360Cfg_t *MID360Cfg = &u->MID360Context.MID360Cfg;
|
||||||
|
MID360Cfg->go_release_pos=CurveChange(LowPassFilter2p_Apply(&u->filled[0],c->pos)+0.15,3.2,4.3,&u->MID360Context.Curve);
|
||||||
|
if (u->MID360Context.Curve == CURVE_58) {
|
||||||
|
target->Pitch_angle = 58;
|
||||||
|
} else {
|
||||||
|
target->Pitch_angle = 66;
|
||||||
|
}
|
||||||
|
|
||||||
|
LaunchContext->LaunchCfg.go_up_speed=MID360Cfg->go_up_speed;
|
||||||
|
LaunchContext->LaunchCfg.go_down_speed=MID360Cfg->go_down_speed;
|
||||||
|
|
||||||
|
|
||||||
|
switch(c-> CMD_mode)
|
||||||
|
{
|
||||||
|
|
||||||
|
case AUTO_MID360_Pitch:
|
||||||
|
if(MID360Context->IsLaunch==0){
|
||||||
|
MID360Context->IsLaunch=1;
|
||||||
|
LaunchContext->LaunchState = Launch_PREPARE;
|
||||||
|
}
|
||||||
|
Pitch_Launch_Sequence(u,LaunchContext,u->motorfeedback.go_data.Pos,MID360Cfg->go_release_pos,out);
|
||||||
|
|
||||||
|
break ;
|
||||||
|
|
||||||
|
case AUTO_MID360:
|
||||||
|
target->Shoot_M2006_angle= LaunchContext->LaunchCfg.m2006_init;
|
||||||
|
MID360Context->IsLaunch=0;
|
||||||
|
break ;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -51,6 +51,7 @@ typedef enum {
|
|||||||
|
|
||||||
}LaunchState_t;
|
}LaunchState_t;
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
||||||
LaunchCfg_t LaunchCfg;
|
LaunchCfg_t LaunchCfg;
|
||||||
LaunchState_t LaunchState;
|
LaunchState_t LaunchState;
|
||||||
} LaunchContext_t;
|
} LaunchContext_t;
|
||||||
@ -60,8 +61,7 @@ typedef struct {
|
|||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
||||||
PITCH_PREPARE, // 准备阶段
|
PITCH_PREPARE, // 准备阶段
|
||||||
PITCH_START, //启动,拉扳机
|
PITCH_START, //启动,拉扳机
|
||||||
|
|
||||||
PITCH_WAIT, // 发射等待
|
PITCH_WAIT, // 发射等待
|
||||||
PITCH_COMPLETE // 完成
|
PITCH_COMPLETE // 完成
|
||||||
|
|
||||||
@ -79,7 +79,6 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
PitchState_t PitchState;
|
PitchState_t PitchState;
|
||||||
PitchCfg_t PitchConfig;
|
PitchCfg_t PitchConfig;
|
||||||
CurveType Curve; //当前函数,雷达距离->pos
|
|
||||||
uint8_t is_init ;
|
uint8_t is_init ;
|
||||||
} PitchContext_t;
|
} PitchContext_t;
|
||||||
|
|
||||||
@ -108,6 +107,26 @@ typedef struct {
|
|||||||
uint8_t is_init ;
|
uint8_t is_init ;
|
||||||
} PassContext_t;
|
} PassContext_t;
|
||||||
|
|
||||||
|
/*雷达自动*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
fp32 go_release_pos; // GO电机发射位置
|
||||||
|
fp32 go_up_speed; // GO电机上升速度
|
||||||
|
fp32 go_down_speed; // GO电机下降速度
|
||||||
|
|
||||||
|
} MID360Cfg_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
MID360Cfg_t MID360Cfg;
|
||||||
|
|
||||||
|
CurveType Curve; //当前函数,雷达距离->pos
|
||||||
|
int IsLaunch; //是否在发射过程
|
||||||
|
} MID360Context_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
||||||
BMI088_t bmi088;
|
BMI088_t bmi088;
|
||||||
@ -133,7 +152,7 @@ typedef struct
|
|||||||
LaunchCfg_t LaunchCfg;
|
LaunchCfg_t LaunchCfg;
|
||||||
PitchCfg_t PitchCfg;
|
PitchCfg_t PitchCfg;
|
||||||
PassCfg_t PassCfg;
|
PassCfg_t PassCfg;
|
||||||
|
MID360Cfg_t MID360Cfg;
|
||||||
|
|
||||||
GO_MotorCmd_t go_cmd;
|
GO_MotorCmd_t go_cmd;
|
||||||
}UP_Param_t;
|
}UP_Param_t;
|
||||||
@ -175,7 +194,9 @@ typedef struct{
|
|||||||
/*投篮过程*/
|
/*投篮过程*/
|
||||||
PitchContext_t PitchContext;
|
PitchContext_t PitchContext;
|
||||||
/*传球过程*/
|
/*传球过程*/
|
||||||
PassContext_t PassContext;
|
PassContext_t PassContext;
|
||||||
|
/*自动过程*/
|
||||||
|
MID360Context_t MID360Context;
|
||||||
CMD_t *cmd;
|
CMD_t *cmd;
|
||||||
|
|
||||||
struct{
|
struct{
|
||||||
@ -232,6 +253,7 @@ int8_t Pitch_Process(UP_t *u, CAN_Output_t *out,CMD_t *c);
|
|||||||
int8_t Pass_Sequence_Check(UP_t *u,CMD_t *c);
|
int8_t Pass_Sequence_Check(UP_t *u,CMD_t *c);
|
||||||
int8_t Pass_Process(UP_t *u,CAN_Output_t *out,CMD_t *c);
|
int8_t Pass_Process(UP_t *u,CAN_Output_t *out,CMD_t *c);
|
||||||
int8_t Pitch_Launch_Sequence(UP_t *u, LaunchContext_t *LaunchContext,fp32 StartPos,fp32 EndPos,CAN_Output_t *out);
|
int8_t Pitch_Launch_Sequence(UP_t *u, LaunchContext_t *LaunchContext,fp32 StartPos,fp32 EndPos,CAN_Output_t *out);
|
||||||
|
int8_t UP_AUTO_Control(UP_t *u,CAN_Output_t *out,CMD_t *c);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -62,25 +62,27 @@ int8_t GO_SendData( GO_MotorData_t *go_data,GO_MotorCmd_t *go_cmd,float pos, flo
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 计算58度曲线
|
// 计算66度曲线(偏上)
|
||||||
static float curve_58(float d) {
|
// 计算66度曲线(偏上)
|
||||||
return 0.448f * d * d + 24.8604f * d - 177.99552f;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 计算66度曲线
|
|
||||||
static float curve_66(float d) {
|
static float curve_66(float d) {
|
||||||
return 8.84935f * d * d - 10.5424f * d - 126.791f;
|
return 4.0310f * d * d + 8.9026f * d -139.5156;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 计算58度曲线(偏下)
|
||||||
|
// 计算58度曲线(偏下)
|
||||||
|
static float curve_58(float d) {
|
||||||
|
return -1.9776f * d * d + 42.8499f * d - 204.2442f;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
曲线切换,用于距离和pos拟合
|
曲线切换,用于距离和pos拟合
|
||||||
迟滞区x-y
|
迟滞区x-y
|
||||||
曲线x重合区,根据当前函数和变化方向切换
|
曲线x重合区,根据当前函数和变化方向切换
|
||||||
*/
|
*/
|
||||||
|
int abdddd=0;
|
||||||
float CurveChange(float d, float x, float y, CurveType *cs)
|
float CurveChange(float d, float x, float y, CurveType *cs)
|
||||||
{
|
{
|
||||||
|
if (d<3.2) abdddd++;
|
||||||
if (*cs == CURVE_66) {
|
if (*cs == CURVE_66) {
|
||||||
if (d > y) {
|
if (d > y) {
|
||||||
*cs = CURVE_58;
|
*cs = CURVE_58;
|
||||||
|
@ -2,177 +2,181 @@
|
|||||||
#include "crc16.h"
|
#include "crc16.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "error_detect.h"
|
#include "error_detect.h"
|
||||||
static volatile uint32_t drop_message = 0;
|
volatile uint32_t drop_message = 0;
|
||||||
|
|
||||||
static osThreadId_t thread_alert;
|
static osThreadId_t thread_alert;
|
||||||
|
|
||||||
uint8_t nucbuf[31];
|
uint8_t nucbuf[25];
|
||||||
char SendBuffer[7];
|
char SendBuffer[7];
|
||||||
|
|
||||||
|
static void NUC_CBLTCallback(void)
|
||||||
static void NUC_IdleCallback(void) {
|
{
|
||||||
osThreadFlagsSet(thread_alert,SIGNAL_NUC_RAW_REDY);
|
osThreadFlagsSet(thread_alert, SIGNAL_NUC_RAW_REDY);
|
||||||
detect_hook(NUC_TOE);
|
// detect_hook(NUC_TOE);
|
||||||
}
|
}
|
||||||
int8_t NUC_Init(NUC_t *nuc){
|
static void NUC_ERRORCALLBACK(void)
|
||||||
if(nuc == NULL) return DEVICE_ERR_NULL;
|
{
|
||||||
if((thread_alert = osThreadGetId()) == NULL ) return DEVICE_ERR_NULL;
|
NUC_Restart();
|
||||||
BSP_UART_RegisterCallback(BSP_UART_NUC,BSP_UART_IDLE_LINE_CB,
|
uint32_t error_code = HAL_UART_GetError(BSP_UART_GetHandle(BSP_UART_NUC));
|
||||||
NUC_IdleCallback);
|
// osThreadFlagsSet(thread_alert, SIGNAL_NUC_ERROR);
|
||||||
|
|
||||||
return DEVICE_OK;
|
|
||||||
}
|
}
|
||||||
int8_t NUC_StartReceiving() {
|
int8_t NUC_Init(NUC_t *nuc)
|
||||||
if (HAL_UARTEx_ReceiveToIdle_DMA(BSP_UART_GetHandle(BSP_UART_NUC),
|
{
|
||||||
|
if (nuc == NULL)
|
||||||
|
return DEVICE_ERR_NULL;
|
||||||
|
if ((thread_alert = osThreadGetId()) == NULL)
|
||||||
|
return DEVICE_ERR_NULL;
|
||||||
|
BSP_UART_RegisterCallback(BSP_UART_NUC, BSP_UART_RX_CPLT_CB,
|
||||||
|
NUC_CBLTCallback);
|
||||||
|
BSP_UART_RegisterCallback(BSP_UART_NUC, BSP_UART_ERROR_CB,
|
||||||
|
NUC_ERRORCALLBACK);
|
||||||
|
return DEVICE_OK;
|
||||||
|
}
|
||||||
|
int8_t NUC_StartReceiving()
|
||||||
|
{
|
||||||
|
if (HAL_UART_Receive_DMA(BSP_UART_GetHandle(BSP_UART_NUC),
|
||||||
(uint8_t *)nucbuf,
|
(uint8_t *)nucbuf,
|
||||||
sizeof(nucbuf)) == HAL_OK)
|
sizeof(nucbuf)) == HAL_OK)
|
||||||
return DEVICE_OK;
|
return DEVICE_OK;
|
||||||
return DEVICE_ERR;
|
return DEVICE_ERR;
|
||||||
}
|
}
|
||||||
int8_t NUC_StartSending(fp32 *data) {
|
int8_t NUC_StartSending(fp32 *data)
|
||||||
|
{
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
|
||||||
float x[1];
|
|
||||||
char data[4];
|
|
||||||
}instance;
|
|
||||||
|
|
||||||
|
|
||||||
// for (int i = 0; i < 1; i++) {
|
|
||||||
instance.x[0] = data[0];
|
|
||||||
// }
|
|
||||||
|
|
||||||
SendBuffer[0] = 0xFC; //帧头
|
|
||||||
SendBuffer[1] = 0x01; //控制帧
|
|
||||||
for(int i = 2; i < 6; i++)
|
|
||||||
{
|
{
|
||||||
SendBuffer[i] = instance.data[i-2];
|
float x[1];
|
||||||
}
|
char data[4];
|
||||||
SendBuffer[6] = 0xFD; //帧尾
|
} instance;
|
||||||
|
|
||||||
if (HAL_UART_Transmit_DMA(BSP_UART_GetHandle(BSP_UART_NUC),
|
// for (int i = 0; i < 1; i++) {
|
||||||
(uint8_t *)SendBuffer,
|
instance.x[0] = data[0];
|
||||||
sizeof(SendBuffer)) == HAL_OK)
|
// }
|
||||||
|
|
||||||
|
SendBuffer[0] = 0xFC; // 帧头
|
||||||
|
SendBuffer[1] = 0x01; // 控制帧
|
||||||
|
for (int i = 2; i < 6; i++)
|
||||||
|
{
|
||||||
|
SendBuffer[i] = instance.data[i - 2];
|
||||||
|
}
|
||||||
|
SendBuffer[6] = 0xFD; // 帧尾
|
||||||
|
|
||||||
|
if (HAL_UART_Transmit_DMA(BSP_UART_GetHandle(BSP_UART_NUC),
|
||||||
|
(uint8_t *)SendBuffer,
|
||||||
|
sizeof(SendBuffer)) == HAL_OK)
|
||||||
return DEVICE_OK;
|
return DEVICE_OK;
|
||||||
return DEVICE_ERR;
|
return DEVICE_ERR;
|
||||||
}
|
}
|
||||||
int8_t NUC_Restart(void) {
|
int8_t NUC_Restart(void)
|
||||||
|
{
|
||||||
__HAL_UART_DISABLE(BSP_UART_GetHandle(BSP_UART_NUC));
|
__HAL_UART_DISABLE(BSP_UART_GetHandle(BSP_UART_NUC));
|
||||||
__HAL_UART_ENABLE(BSP_UART_GetHandle(BSP_UART_NUC));
|
__HAL_UART_ENABLE(BSP_UART_GetHandle(BSP_UART_NUC));
|
||||||
return DEVICE_OK;
|
return DEVICE_OK;
|
||||||
}
|
}
|
||||||
bool_t NUC_WaitDmaCplt(void) {
|
bool_t NUC_WaitDmaCplt(void)
|
||||||
|
{
|
||||||
return (osThreadFlagsWait(SIGNAL_NUC_RAW_REDY, osFlagsWaitAll,50) ==
|
return (osThreadFlagsWait(SIGNAL_NUC_RAW_REDY, osFlagsWaitAll, 20) ==
|
||||||
SIGNAL_NUC_RAW_REDY);
|
SIGNAL_NUC_RAW_REDY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int8_t NUC_RawParse(CMD_NUC_t *n)
|
||||||
int8_t NUC_RawParse(CMD_NUC_t *n){
|
{
|
||||||
if(n ==NULL) return DEVICE_ERR_NULL;
|
if (n == NULL)
|
||||||
union
|
return DEVICE_ERR_NULL;
|
||||||
{
|
union
|
||||||
float x[5];
|
{
|
||||||
char data[20];
|
float x[5];
|
||||||
}instance;
|
char data[20];
|
||||||
if(nucbuf[0]!=HEAD) goto error; //发送ID不是底盘
|
} instance;
|
||||||
else{
|
if (nucbuf[0] != HEAD)
|
||||||
n->status_fromnuc =nucbuf[1];
|
goto error; // 发送ID不是底盘
|
||||||
n->ctrl_status =nucbuf[2];
|
else
|
||||||
|
{
|
||||||
|
n->status_fromnuc = nucbuf[1];
|
||||||
|
n->ctrl_status = nucbuf[2];
|
||||||
switch (n->status_fromnuc)
|
switch (n->status_fromnuc)
|
||||||
{
|
{
|
||||||
case VISION://控制帧0x02
|
case VISION: // 控制帧0x02
|
||||||
/* 协议格式
|
/* 协议格式
|
||||||
0xFF HEAD
|
0xFF HEAD
|
||||||
0x02 控制帧
|
0x02 控制帧
|
||||||
0x01 相机帧
|
0x01 相机帧
|
||||||
vx fp32
|
vx fp32
|
||||||
vy fp32
|
vy fp32
|
||||||
wz fp32
|
wz fp32
|
||||||
0xFE TAIL
|
0xFE TAIL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
instance.data[3] = nucbuf[3];
|
||||||
instance.data[3] = nucbuf[3];
|
instance.data[2] = nucbuf[4];
|
||||||
instance.data[2] = nucbuf[4];
|
instance.data[1] = nucbuf[5];
|
||||||
instance.data[1] = nucbuf[5];
|
instance.data[0] = nucbuf[6];
|
||||||
instance.data[0] = nucbuf[6];
|
n->camera.data1 = instance.x[0]; //
|
||||||
n->camera .data1 = instance.x[0]; //
|
instance.data[7] = nucbuf[7];
|
||||||
instance.data[7] = nucbuf[7];
|
instance.data[6] = nucbuf[8];
|
||||||
instance.data[6] = nucbuf[8];
|
instance.data[5] = nucbuf[9];
|
||||||
instance.data[5] = nucbuf[9];
|
instance.data[4] = nucbuf[10];
|
||||||
instance.data[4] = nucbuf[10];
|
n->camera.data2 = instance.x[1]; //
|
||||||
n->camera .data2 = instance.x[1];//
|
instance.data[11] = nucbuf[11];
|
||||||
instance.data[11] = nucbuf[11];
|
instance.data[10] = nucbuf[12];
|
||||||
instance.data[10] = nucbuf[12];
|
instance.data[9] = nucbuf[13];
|
||||||
instance.data[9] = nucbuf[13];
|
instance.data[8] = nucbuf[14];
|
||||||
instance.data[8] = nucbuf[14];
|
n->camera.data3 = instance.x[2]; //
|
||||||
n->camera .data3 = instance.x[2];//
|
|
||||||
break;
|
break;
|
||||||
case MID ://控制帧0x08
|
case MID: // 控制帧0x08
|
||||||
/* 协议格式
|
/* 协议格式
|
||||||
0xFF HEAD
|
0xFF HEAD
|
||||||
0x09 控制帧
|
0x09 控制帧
|
||||||
0x01 相机帧
|
0x01 相机帧
|
||||||
vx fp32
|
vx fp32
|
||||||
vy fp32
|
vy fp32
|
||||||
wz fp32
|
wz fp32
|
||||||
0xFE TAIL
|
0xFE TAIL
|
||||||
*/
|
*/
|
||||||
if(nucbuf[24]!=TAIL)goto error;
|
if (nucbuf[24] != TAIL)
|
||||||
instance.data[3] = nucbuf[6];
|
goto error;
|
||||||
instance.data[2] = nucbuf[5];
|
instance.data[3] = nucbuf[6];
|
||||||
instance.data[1] = nucbuf[4];
|
instance.data[2] = nucbuf[5];
|
||||||
instance.data[0] = nucbuf[3];
|
instance.data[1] = nucbuf[4];
|
||||||
|
instance.data[0] = nucbuf[3];
|
||||||
n->MID360.vx = instance.x[0]; //
|
n->MID360.vx = instance.x[0]; //
|
||||||
instance.data[7] = nucbuf[10];
|
instance.data[7] = nucbuf[10];
|
||||||
instance.data[6] = nucbuf[9];
|
instance.data[6] = nucbuf[9];
|
||||||
instance.data[5] = nucbuf[8];
|
instance.data[5] = nucbuf[8];
|
||||||
instance.data[4] = nucbuf[7];
|
instance.data[4] = nucbuf[7];
|
||||||
n->MID360.vy = instance.x[1];//
|
n->MID360.vy = instance.x[1]; //
|
||||||
instance.data[11] = nucbuf[14];
|
instance.data[11] = nucbuf[14];
|
||||||
instance.data[10] = nucbuf[13];
|
instance.data[10] = nucbuf[13];
|
||||||
instance.data[9] = nucbuf[12];
|
instance.data[9] = nucbuf[12];
|
||||||
instance.data[8] = nucbuf[11];
|
instance.data[8] = nucbuf[11];
|
||||||
n->MID360.wz = instance.x[2];//
|
n->MID360.wz = instance.x[2]; //
|
||||||
instance.data[15] = nucbuf[18];
|
instance.data[15] = nucbuf[18];
|
||||||
instance.data[14] = nucbuf[17];
|
instance.data[14] = nucbuf[17];
|
||||||
instance.data[13] = nucbuf[16];
|
instance.data[13] = nucbuf[16];
|
||||||
instance.data[12] = nucbuf[15];
|
instance.data[12] = nucbuf[15];
|
||||||
n->MID360.pos = instance.x[3];//
|
n->MID360.pos = instance.x[3]; //
|
||||||
instance.data[19] = nucbuf[22];
|
instance.data[19] = nucbuf[22];
|
||||||
instance.data[18] = nucbuf[21];
|
instance.data[18] = nucbuf[21];
|
||||||
instance.data[17] = nucbuf[20];
|
instance.data[17] = nucbuf[20];
|
||||||
instance.data[16] = nucbuf[19];
|
instance.data[16] = nucbuf[19];
|
||||||
n->MID360.angle = instance.x[4];//
|
n->MID360.angle = instance.x[4]; //
|
||||||
|
|
||||||
|
n->MID360.flag = nucbuf[23]; //
|
||||||
|
|
||||||
n->MID360.flag = nucbuf[23];//
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return DEVICE_OK;
|
return DEVICE_OK;
|
||||||
}
|
}
|
||||||
error:
|
error:
|
||||||
drop_message++;
|
drop_message++;
|
||||||
return DEVICE_ERR;
|
NUC_Restart();
|
||||||
|
return DEVICE_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t NUC_HandleOffline(CMD_NUC_t *cmd)
|
int8_t NUC_HandleOffline(CMD_NUC_t *cmd)
|
||||||
{
|
{
|
||||||
if(cmd == NULL) return DEVICE_ERR_NULL;
|
if (cmd == NULL)
|
||||||
// memset(cmd, 0, sizeof(*cmd));
|
return DEVICE_ERR_NULL;
|
||||||
return 0;
|
// memset(cmd, 0, sizeof(*cmd));
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,5 +33,7 @@ int8_t NUC_StartSending(fp32 *data) ;
|
|||||||
bool_t NUC_WaitDmaCplt(void);
|
bool_t NUC_WaitDmaCplt(void);
|
||||||
int8_t NUC_RawParse(CMD_NUC_t *n);
|
int8_t NUC_RawParse(CMD_NUC_t *n);
|
||||||
int8_t NUC_HandleOffline(CMD_NUC_t *cmd);
|
int8_t NUC_HandleOffline(CMD_NUC_t *cmd);
|
||||||
|
int8_t NUC_Restart(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ int a=0;
|
|||||||
void Task_nuc(void *argument){
|
void Task_nuc(void *argument){
|
||||||
(void)argument; /**/
|
(void)argument; /**/
|
||||||
|
|
||||||
// osDelay(TASK_INIT_DELAY_NUC);
|
osDelay(TASK_INIT_DELAY_NUC);
|
||||||
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_NUC;
|
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_NUC;
|
||||||
|
|
||||||
NUC_Init(&nuc_raw);
|
NUC_Init(&nuc_raw);
|
||||||
@ -35,8 +35,8 @@ void Task_nuc(void *argument){
|
|||||||
#endif
|
#endif
|
||||||
a++;
|
a++;
|
||||||
NUC_StartReceiving();
|
NUC_StartReceiving();
|
||||||
NUC_StartSending(NUC_send.send);
|
// NUC_StartSending(NUC_send.send);
|
||||||
NUC_StartSending (send);
|
// NUC_StartSending (send);
|
||||||
if (NUC_WaitDmaCplt()){
|
if (NUC_WaitDmaCplt()){
|
||||||
NUC_RawParse(&cmd_fromnuc);
|
NUC_RawParse(&cmd_fromnuc);
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
#define TASK_FREQ_UP (900u)
|
#define TASK_FREQ_UP (900u)
|
||||||
|
|
||||||
#define TASK_FREQ_CTRL_CMD (500u)
|
#define TASK_FREQ_CTRL_CMD (500u)
|
||||||
#define TASK_FREQ_NUC (200u)
|
#define TASK_FREQ_NUC (500u)
|
||||||
#define TASK_FREQ_CAN (1000u)
|
#define TASK_FREQ_CAN (1000u)
|
||||||
#define TASK_FREQ_RC (1000u)
|
#define TASK_FREQ_RC (1000u)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user