diff --git a/MDK-ARM/R2.uvoptx b/MDK-ARM/R2.uvoptx index d65d7cf..3e2206d 100644 --- a/MDK-ARM/R2.uvoptx +++ b/MDK-ARM/R2.uvoptx @@ -180,6 +180,31 @@ 1 chassis + + 5 + 1 + UP,0x0A + + + 6 + 1 + SendBuffer + + + 7 + 1 + NUC_send + + + 8 + 1 + nuc_raw,0x0A + + + 9 + 1 + a,0x0A + 0 diff --git a/MDK-ARM/R2/R2.axf b/MDK-ARM/R2/R2.axf index 5494a3f..73ecc37 100644 Binary files a/MDK-ARM/R2/R2.axf and b/MDK-ARM/R2/R2.axf differ diff --git a/User/Module/Chassis.c b/User/Module/Chassis.c index 576c55b..ff365bd 100644 --- a/User/Module/Chassis.c +++ b/User/Module/Chassis.c @@ -3,6 +3,8 @@ #include "user_math.h" #include "bsp_buzzer.h" #include "bsp_delay.h" +#include "nuc.h" + /* 机器人坐标系,向前x,右y,上yaw 不同于nuc (前x,左y,上yaw) @@ -101,8 +103,8 @@ 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->NUC_send.send[0] = 0; + + c->sick_cali.is_reach = 0; c->vofa_send[0]= KalmanFilter(&c->extKalman[0] , c->sick_cali.sick_dis[0]); @@ -113,6 +115,17 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) { switch (c->chassis_ctrl.ctrl) { case ShootGame_Mode: //投球赛模式 + c->to_nuc.send=0; + switch(c->chassis_ctrl.mode){ + + case ShootRst: + c->move_vec.Vw = ctrl->Vw * 8000; + c->move_vec.Vx = ctrl->Vy * 8000; + c->move_vec.Vy = ctrl->Vx * 8000; + + break; + + default: if (ctrl->Vw != 0 || ctrl->Vy != 0 || ctrl->Vx != 0) { // 有遥控器输出,设置标志位1 osThreadFlagsSet(thread_alert, SHOOT_GAME_FLAG); @@ -128,66 +141,22 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) { c->move_vec.Vx = ctrl->Vy * 8000; c->move_vec.Vy = ctrl->Vx * 8000; }else { - c->move_vec.Vw = ctrl->cmd_MID360.posw * 1000; - c->move_vec.Vy = -ctrl->cmd_MID360.posy * 1000; + 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; - - case AUTO: - switch (c->chassis_ctrl.mode) { - case AUTO_MID360: - 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); - // c->NUC_send.send[0] = 1; - break; - 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; - case AUTO_MID360_Adjust: - c->move_vec.Vw = ctrl->Vw * 6000; - c->move_vec.Vx = ctrl->Vy * 6000; - c->move_vec.Vy = ctrl->Vx * 6000; - - break; - - default: - - break; - } - case PASS_BALL: - switch (c->chassis_ctrl.mode) - { - case PB_UP: - c->move_vec.Vw = ctrl->Vw * 6000; - c->move_vec.Vx = ctrl->Vy * 6000; - c->move_vec.Vy = ctrl->Vx * 6000; - break ; - case PB_MID: - case PB_DOWN: - 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; + + } + break; + + case REPOSITION: + c->to_nuc.send=1; + break; + case RELAXED: c->move_vec.Vw = 0; c->move_vec.Vx = 0; diff --git a/User/Module/Chassis.h b/User/Module/Chassis.h index 91d56cd..696c69a 100644 --- a/User/Module/Chassis.h +++ b/User/Module/Chassis.h @@ -32,6 +32,7 @@ #include "cmd.h" #include "filter.h" #include "kalman.h" +#include "nuc.h" #define CHASSIS_OK (0) #define CHASSIS_ERR (-1) @@ -103,12 +104,6 @@ typedef struct fp32 Vw; fp32 mul;//油门倍率 }ChassisMove_Vec; -typedef struct -{ - - fp32 send[4]; - -}NUC_send_t; /** * @brief @@ -194,7 +189,9 @@ typedef struct{ int is_reach; }sick_cali; - NUC_send_t NUC_send; + struct { + fp32 send; + }to_nuc; }Chassis_t; diff --git a/User/Module/up.c b/User/Module/up.c index 85abdbe..0f248e8 100644 --- a/User/Module/up.c +++ b/User/Module/up.c @@ -192,6 +192,7 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c) switch (c->CMD_CtrlType ) { case ShootGame_Mode: + UP_AUTO_Control(u,out,c); @@ -364,36 +365,45 @@ int8_t UP_AUTO_Control(UP_t *u,CAN_Output_t *out,CMD_t *c){ 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.05,3.2,4.3,&u->MID360Context.Curve); + MID360Cfg->go_release_pos=CurveChange(LowPassFilter2p_Apply(&u->filled[0],c->pos)-0.25f,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; + /*检测重置*/ + if(MID360Context->IsLaunch==0){ - - 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 ; + + switch(c-> CMD_mode) + { + + case Shooting://发射 + - case AUTO_MID360: - target->Shoot_M2006_angle= LaunchContext->LaunchCfg.m2006_init; + + break; + case ShootRst://重置发射 MID360Context->IsLaunch=0; - break ; - default: + target->Shoot_M2006_angle=LaunchContext->LaunchCfg.m2006_init; + + break ; + + + + default: break; } - + return 1; } \ No newline at end of file diff --git a/User/bsp/protocol.h b/User/bsp/protocol.h index c0d7390..7ac82bd 100644 --- a/User/bsp/protocol.h +++ b/User/bsp/protocol.h @@ -14,6 +14,8 @@ extern "C" { #define HEAD (0xFF) #define TAIL (0xFE) + + #define IMU_ID (0x01) #define CMD_ID (0x02) @@ -83,7 +85,7 @@ typedef struct __attribute__((packed)) { typedef struct __attribute__((packed)) { - uint8_t status; + float status; } Protocol_UpDataCMD_t; /* 视觉 -> 电控 上层机构数据结构体*/ diff --git a/User/device/cmd.c b/User/device/cmd.c index 267f45d..26d2215 100644 --- a/User/device/cmd.c +++ b/User/device/cmd.c @@ -136,41 +136,74 @@ int8_t CMD_DR16(CMD_t *cmd,const CMD_RC_t *rc) { cmd->key_ctrl_l = rc->dr16.sw_l; cmd->key_ctrl_r = rc->dr16.sw_r ; - if ((rc->dr16.sw_l == CMD_SW_ERR) || (rc->dr16.sw_r == CMD_SW_ERR)) { - cmd->CMD_CtrlType =RELAXED; - } - else if(rc->dr16.sw_l==CMD_SW_UP) - { - cmd ->CMD_CtrlType =ShootGame_Mode; - if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =Normal; //左上,右上,无模式 - - if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左上,右中,无模式 - - if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左上,右上,无模式 - - if(rc->dr16.res > 3000) cmd ->CMD_mode =ShootRst; - if(rc->dr16.res == 660) cmd ->CMD_mode =Shooting; - } - - else if(rc->dr16.sw_l==CMD_SW_MID) - { - - cmd ->CMD_CtrlType =RCcontrol; - if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =Normal; //左中,右中,雷达 - - if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左中,右中,无模式 - - if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左中,右下,视觉 - - } - else if(rc->dr16.sw_l==CMD_SW_DOWN) - { - cmd ->CMD_CtrlType =RCcontrol; - if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =Normal; //左下,右上,无模式 - if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode = Normal; //左下,右中,无模式 - if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左下,右上,无模式 - } - +// if ((rc->dr16.sw_l == CMD_SW_ERR) || (rc->dr16.sw_r == CMD_SW_ERR)) { +// cmd->CMD_CtrlType =RELAXED; +// } +// else if(rc->dr16.sw_l==CMD_SW_UP) +// { +// cmd ->CMD_CtrlType =ShootGame_Mode; +// if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =Shooting; //左上,右上,无模式 +// +// if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左上,右中,无模式 +// +// if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =ShootRst; //左上,右上,无模式 +// +//// if(rc->dr16.res > 3000) cmd ->CMD_mode =ShootRst; +//// if(rc->dr16.res == 660) cmd ->CMD_mode =Shooting; +// } +// +// else if(rc->dr16.sw_l==CMD_SW_MID) +// { +// +// cmd ->CMD_CtrlType =RCcontrol; +// if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =Normal; //左中,右中,雷达 +// +// if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左中,右中,无模式 +// +// if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左中,右下,视觉 +// +// } +// else if(rc->dr16.sw_l==CMD_SW_DOWN) +// { +// cmd ->CMD_CtrlType =RCcontrol; +// if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =Normal; //左下,右上,无模式 +// if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode = Normal; //左下,右中,无模式 +// if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左下,右上,无模式 +// } + +if ((rc->dr16.sw_r == CMD_SW_ERR) || (rc->dr16.sw_l == CMD_SW_ERR)) { + cmd->CMD_CtrlType = RELAXED; +} +// 右拨杆控制 CtrlType,左拨杆控制 Mode +else if (rc->dr16.sw_r == CMD_SW_UP) +{ + cmd->CMD_CtrlType = ShootGame_Mode; + + if (rc->dr16.sw_l == CMD_SW_UP) cmd->CMD_mode = Normal; // 右上,左上, + if (rc->dr16.sw_l == CMD_SW_MID) cmd->CMD_mode = ShootRst; // 右上,左中, + if (rc->dr16.sw_l == CMD_SW_DOWN) cmd->CMD_mode = Normal; // 右上,左下,无模式 + + // 可选保留遥控旋钮控制 + // if (rc->dr16.res > 3000) cmd->CMD_mode = ShootRst; + // if (rc->dr16.res == 660) cmd->CMD_mode = Shooting; +} +else if (rc->dr16.sw_r == CMD_SW_MID) +{ + cmd->CMD_CtrlType = REPOSITION; + + if (rc->dr16.sw_l == CMD_SW_UP) cmd->CMD_mode = Normal; // 右中,左上, + if (rc->dr16.sw_l == CMD_SW_MID) cmd->CMD_mode = Normal; // 右中,左中,无模式 + if (rc->dr16.sw_l == CMD_SW_DOWN) cmd->CMD_mode = Normal; // 右中,左下, +} +else if (rc->dr16.sw_r == CMD_SW_DOWN) +{ + cmd->CMD_CtrlType = RCcontrol; + + if (rc->dr16.sw_l == CMD_SW_UP) cmd->CMD_mode = Normal; // 右下,左上,无模式 + if (rc->dr16.sw_l == CMD_SW_MID) cmd->CMD_mode = Normal; // 右下,左中,无模式 + if (rc->dr16.sw_l == CMD_SW_DOWN) cmd->CMD_mode = Normal; // 右下,左下,无模式 +} + return 0; } diff --git a/User/device/cmd.h b/User/device/cmd.h index b06897e..2534832 100644 --- a/User/device/cmd.h +++ b/User/device/cmd.h @@ -13,7 +13,10 @@ typedef enum{ RCcontrol,//遥控器控制,左按键上,控制上层 + REPOSITION, //重定位 + AUTO, + PASS_BALL,//传球模式 ShootGame_Mode,//投球赛模式 diff --git a/User/device/nuc.c b/User/device/nuc.c index 4d866f7..da602d9 100644 --- a/User/device/nuc.c +++ b/User/device/nuc.c @@ -170,28 +170,34 @@ int8_t NUC_PackIMU(NUC_t *nuc, const AHRS_Quaternion_t *quat, const AHRS_Accl_t int8_t NUC_PackCMD(NUC_t *nuc, const NUC_send_t *send){ nuc->to_nuc.cmd.head = HEAD; nuc->to_nuc.cmd.id = IMU_ID; - nuc->to_nuc.cmd.type = TYPE; nuc->to_nuc.cmd.end = TAIL; - // memcpy((void *)&(nuc->to_nuc.cmd.package.status), (const void *)send,sizeof(*send)); + memcpy((void *)&(nuc->to_nuc.cmd.package.status), (const void *)send,sizeof(*send)); /*在这里添加你们的控制命令*/ return DEVICE_OK; } int8_t NUC_StartSend(NUC_t *nuc, bool cmd_update){ if (cmd_update) { +// if (HAL_UART_Transmit_DMA( +// BSP_UART_GetHandle(BSP_UART_NUC), (uint8_t *)&(nuc->to_nuc.cmd), +// sizeof(nuc->to_nuc.cmd) + sizeof(nuc->to_nuc.imu)) == HAL_OK) +/*仅发送cmd数据*/ if (HAL_UART_Transmit_DMA( BSP_UART_GetHandle(BSP_UART_NUC), (uint8_t *)&(nuc->to_nuc.cmd), - sizeof(nuc->to_nuc.cmd) + sizeof(nuc->to_nuc.imu)) == HAL_OK) + sizeof(nuc->to_nuc.cmd) ) == HAL_OK) + + return DEVICE_OK; else return DEVICE_ERR; - } else { - if (HAL_UART_Transmit_DMA(BSP_UART_GetHandle(BSP_UART_NUC), - (uint8_t *)&(nuc->to_nuc.imu), - sizeof(nuc->to_nuc.imu)) == HAL_OK) - return DEVICE_OK; - else - return DEVICE_ERR; - } + } +// else { +// if (HAL_UART_Transmit_DMA(BSP_UART_GetHandle(BSP_UART_NUC), +// (uint8_t *)&(nuc->to_nuc.imu), +// sizeof(nuc->to_nuc.imu)) == HAL_OK) +// return DEVICE_OK; +// else +// return DEVICE_ERR; +// } } diff --git a/User/device/nuc.h b/User/device/nuc.h index b80178b..70dda34 100644 --- a/User/device/nuc.h +++ b/User/device/nuc.h @@ -9,6 +9,11 @@ #include "Algorithm/ahrs.h" #include "Module/Chassis.h" +typedef struct +{ + fp32 send; + +}NUC_send_t; typedef struct { uint8_t id; @@ -25,7 +30,6 @@ typedef struct { typedef struct { uint8_t head; - uint8_t type; // 0x01 控制帧 uint8_t id; Protocol_UpDataCMD_t package; uint8_t end; diff --git a/User/task/chassis_task.c b/User/task/chassis_task.c index 5a09e1f..8997ce1 100644 --- a/User/task/chassis_task.c +++ b/User/task/chassis_task.c @@ -88,7 +88,7 @@ void Task_Chassis(void *argument) osMessageQueueReset(task_runtime.msgq.can.output.chassis3508);//清空队列 osMessageQueuePut(task_runtime.msgq.can.output.chassis3508, &out.motor_CHASSIS3508, 0, 0); //发送数据 osMessageQueueReset(task_runtime.msgq.cmd.raw.nuc_send);//清空队列 - osMessageQueuePut(task_runtime.msgq.cmd.raw.nuc_send, &chassis.NUC_send, 0, 0); //发送数据 + osMessageQueuePut(task_runtime.msgq.cmd.raw.nuc_send, &chassis.to_nuc, 0, 0); //发送数据 vofa_send[0] = chassis.vofa_send[0]; vofa_send[1] = chassis.vofa_send[1]; vofa_send[2] = chassis.vofa_send[2]; diff --git a/User/task/nuc_task.c b/User/task/nuc_task.c index c66c9ce..3167ddb 100644 --- a/User/task/nuc_task.c +++ b/User/task/nuc_task.c @@ -57,19 +57,19 @@ void Task_nuc(void *argument){ osMessageQueueGet(task_runtime.msgq.nuc.accl, &(accl), NULL, 0); osMessageQueueGet(task_runtime.msgq.nuc.gyro, &(gyro), NULL, 0); - // osMessageQueueGet(task_runtime.msgq.cmd.raw.nuc_send, &NUC_send, NULL, 0); + //osMessageQueueGet(task_runtime.msgq.cmd.raw.nuc_send, &NUC_send, NULL, 0); bool cmd_update = (osMessageQueueGet(task_runtime.msgq.cmd.raw.nuc_send, &(NUC_send), NULL, 0) == osOK); - NUC_PackIMU(&nuc_raw, &quat, &accl, &gyro); +// NUC_PackIMU(&nuc_raw, &quat, &accl, &gyro); if (cmd_update) { NUC_PackCMD(&nuc_raw,&NUC_send); + + NUC_StartSend(&nuc_raw,cmd_update); + } - - // NUC_StartSend(&nuc_raw, cmd_update); - tick += delay_tick; /* 计算下一个唤醒时刄1ķ*/ osDelayUntil(tick); }