diff --git a/MDK-ARM/.vscode/keil-assistant.log b/MDK-ARM/.vscode/keil-assistant.log
index 4555934..19d8611 100644
--- a/MDK-ARM/.vscode/keil-assistant.log
+++ b/MDK-ARM/.vscode/keil-assistant.log
@@ -463,3 +463,7 @@
[info] Log at : 2025/6/14|15:14:16|GMT+0800
+[info] Log at : 2025/6/16|23:35:32|GMT+0800
+
+[info] Log at : 2025/6/18|17:47:04|GMT+0800
+
diff --git a/MDK-ARM/R2.uvoptx b/MDK-ARM/R2.uvoptx
index b1b816f..8aacd56 100644
--- a/MDK-ARM/R2.uvoptx
+++ b/MDK-ARM/R2.uvoptx
@@ -175,6 +175,86 @@
1
NUC_send,0x0A
+
+ 4
+ 1
+ pid,0x0A
+
+
+ 5
+ 1
+ pid_param,0x0A
+
+
+ 6
+ 1
+ cmd_rc,0x0A
+
+
+ 7
+ 1
+ cbuf,0x10
+
+
+ 8
+ 1
+ cmd
+
+
+ 9
+ 1
+ rc_ctrl,0x0A
+
+
+ 10
+ 1
+ valid_check,0x0A
+
+
+ 11
+ 1
+ nuc_raw,0x0A
+
+
+ 12
+ 1
+ cmd_fromnuc,0x0A
+
+
+ 13
+ 1
+ nucbuf,0x0A
+
+
+ 14
+ 1
+ LD_raw,0x0A
+
+
+ 15
+ 1
+ aeeaa,0x0A
+
+
+ 16
+ 1
+ aaaaaaaaaaaa,0x0A
+
+
+ 17
+ 1
+ valid_check,0x0A
+
+
+ 18
+ 1
+ aaaaaaaaaaaaaaaaaaaaaaaaaa,0x0A
+
+
+ 19
+ 1
+ aaaaaaaaaaaaaaaaaaa,0x0A
+
0
@@ -182,7 +262,7 @@
0
1
- 1
+ 0
0
0
0
@@ -1181,8 +1261,8 @@
0
0
0
- ..\User\Algorithm\kalman.c
- kalman.c
+ ..\User\Algorithm\user_cmsis_os2.c
+ user_cmsis_os2.c
0
0
@@ -1193,8 +1273,8 @@
0
0
0
- ..\User\Algorithm\user_cmsis_os2.c
- user_cmsis_os2.c
+ ..\User\Algorithm\kalman.c
+ kalman.c
0
0
diff --git a/MDK-ARM/R2.uvprojx b/MDK-ARM/R2.uvprojx
index 2e3293a..42309e5 100644
--- a/MDK-ARM/R2.uvprojx
+++ b/MDK-ARM/R2.uvprojx
@@ -1248,16 +1248,16 @@
1
..\User\Algorithm\ahrs.c
-
- kalman.c
- 1
- ..\User\Algorithm\kalman.c
-
user_cmsis_os2.c
1
..\User\Algorithm\user_cmsis_os2.c
+
+ kalman.c
+ 1
+ ..\User\Algorithm\kalman.c
+
user_math.c
1
diff --git a/MDK-ARM/R2/R2.axf b/MDK-ARM/R2/R2.axf
index 45fd09e..7fb4434 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 1924905..529a6e1 100644
--- a/User/Module/Chassis.c
+++ b/User/Module/Chassis.c
@@ -62,22 +62,24 @@ int8_t Chassis_init(Chassis_t *c, const Chassis_Param_t *param, float target_fre
fp32 gyro_kp = 1.0f;
fp32 PIAN = 0;
-
+fp32 pian_yaw;
void Chassis_speed_calculate(Chassis_t *c, fp32 Vx, fp32 Vy, fp32 Vw) {
fp64 Nor_Vx, Nor_Vy;
normalize_vector(Vx, Vy, &Nor_Vx, &Nor_Vy);
- c->hopemotorout.OmniSpeedOut[0] = -Nor_Vx + Nor_Vy + Vw; // 右前
- c->hopemotorout.OmniSpeedOut[1] = -Nor_Vx - Nor_Vy + Vw; // 右后
- c->hopemotorout.OmniSpeedOut[2] = Nor_Vx - Nor_Vy + Vw; // 左后
- c->hopemotorout.OmniSpeedOut[3] = Nor_Vx + Nor_Vy + Vw; // 左前
+ c->hopemotorout.OmniSpeedOut[0] = -Nor_Vx + Nor_Vy + Vw+pian_yaw; // 右前
+ c->hopemotorout.OmniSpeedOut[1] = -Nor_Vx - Nor_Vy + Vw+pian_yaw; // 右后
+ c->hopemotorout.OmniSpeedOut[2] = Nor_Vx - Nor_Vy + Vw +pian_yaw; // 左后
+ c->hopemotorout.OmniSpeedOut[3] = Nor_Vx + Nor_Vy + Vw +pian_yaw; // 左前
+
+ Chassis_AngleCompensate(c);
+
}
int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
if (c == NULL) return CHASSIS_ERR_NULL;
if (ctrl == NULL) return CHASSIS_ERR_NULL;
Chassis_SetCtrl(c, ctrl);
-
// IMU加滤波修正
c->pos088.bmi088.filtered_gyro.z = LowPassFilter2p_Apply(&(c->filled[0]), c->pos088.bmi088.gyro.z);
@@ -92,12 +94,14 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
case RCcontrol:
switch (c->chassis_ctrl.mode) {
case Normal:
- c->move_vec.Vw = ctrl->Vw * 6000;
- c->move_vec.Vx = ctrl->Vy * 6000;
- c->move_vec.Vy = ctrl->Vx * 6000;
+ c->move_vec.Vw = ctrl->Vw * 8000;
+ c->move_vec.Vx = ctrl->Vy * 8000;
+ c->move_vec.Vy = ctrl->Vx * 8000;
break;
case Pitch:
-
+ c->move_vec.Vw = ctrl->Vw * 6000;
+ c->move_vec.Vx = ctrl->Vy * 6000;
+ c->move_vec.Vy = ctrl->Vx * 6000;
break;
case UP_Adjust:
c->move_vec.Vw = ctrl->Vw * 6000;
@@ -159,6 +163,7 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
}
c->vofa_send[0] = (fp32)c->sick_cali.sick_dis[1] - c->sick_cali.sick_dis[2];
+
return CHASSIS_OK;
@@ -214,5 +219,36 @@ int8_t sick_calibration(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out)
}
+pid_type_def pid;
+pid_param_t pid_param={
+ .p = 10.0f,
+ .i = 0.00f,
+ .d = 0.00f,
+ .i_limit = 2000.0f,
+ .out_limit =5000.0f,
+};
+ fp32 cur_angle,pian_angel;
+int8_t Chassis_AngleCompensate(Chassis_t *c)
+{
+ if (c == NULL) return CHASSIS_ERR_NULL;
+// int is_in;//是否初始化
+// if(is_in==0){
+ PID_init(&pid,PID_POSITION,&pid_param);
+// is_in=1;
+// }
+
+
+
+ if((c->move_vec.Vx || c->move_vec.Vy) && (c->move_vec.Vw== 0))
+ {
+ pian_angel=cur_angle-AngleChange(DEGREE,c->pos088.imu_eulr.yaw);
+ }
+
+ else {
+ cur_angle=AngleChange(DEGREE,c->pos088.imu_eulr.yaw);
+ pian_angel=0;
+ }
+ pian_yaw = PID_calc(&pid,pian_angel,0);
+}
diff --git a/User/Module/Chassis.h b/User/Module/Chassis.h
index dd09723..e2e2e4a 100644
--- a/User/Module/Chassis.h
+++ b/User/Module/Chassis.h
@@ -189,6 +189,7 @@ int8_t Chassis_Control(Chassis_t *c,CMD_t *ctrl,CAN_Output_t *out);
int8_t sick_calibration(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) ;
+int8_t Chassis_AngleCompensate(Chassis_t *c) ;
#endif
diff --git a/User/Module/config.c b/User/Module/config.c
index 134e59f..54bbfa0 100644
--- a/User/Module/config.c
+++ b/User/Module/config.c
@@ -110,7 +110,7 @@ static const ConfigParam_t param ={
},
/*投球*/
.PitchCfg = {
- .m2006_init =-100, //释放的角度
+ .m2006_init =-150, //释放的角度
.m2006_trig =0, //可以拉住发射的角度
.go_init = -50, //仅用在go上电,初始位置
.go_pull_pos =-210,
diff --git a/User/device/can_use.c b/User/device/can_use.c
index 0f2730c..eb86332 100644
--- a/User/device/can_use.c
+++ b/User/device/can_use.c
@@ -374,9 +374,7 @@ int8_t CAN_StoreMsg(CAN_t *can, CAN_RawRx_t *can_rx) {
CAN_DJIMotor_Decode(&(can->motor.chassis_motor3508.as_array[index]), can_rx->rx_data);
detect_hook(CHASSIS3508M1_TOE + index);
break;
- case CAN_SICK_ID:
- CAN_Sick_Receive(&(can->sickfed), can_rx->rx_data);
- break;
+
default:
break;
@@ -407,7 +405,9 @@ int8_t CAN_StoreMsg(CAN_t *can, CAN_RawRx_t *can_rx) {
CAN_DJIMotor_Decode(&(can->motor.up_shoot_motor3508.as_array[index]), can_rx->rx_data);
break;
-
+ case CAN_SICK_ID:
+ CAN_Sick_Receive(&(can->sickfed), can_rx->rx_data);
+ break;
case CAN_Encoder_ID:
CAN_Encoder_Decode(&(can->Oid),can_rx->rx_data);
can->recive_flag |= 1 << 10;
diff --git a/User/device/cmd.c b/User/device/cmd.c
index f5fa1bf..7b9d47c 100644
--- a/User/device/cmd.c
+++ b/User/device/cmd.c
@@ -146,18 +146,20 @@ int8_t CMD_DR16(CMD_t *cmd,const CMD_RC_t *rc) {
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_DOWN) cmd ->CMD_mode =Chassis_Adjust; //左上,右上,手动调整
+
+ if(rc->dr16.res > 3000) cmd ->CMD_mode =UP_Adjust;
}
else if(rc->dr16.sw_l==CMD_SW_MID)
{
cmd ->CMD_CtrlType =AUTO;
- if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =AUTO_MID360; //左中,右中,雷达
+ if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =AUTO_MID360_Pitch; //左中,右中,雷达
- if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左中,右中,无模式
+ if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode =AUTO_MID360; //左中,右中,无模式
- if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =AUTO_MID360_Pitch; //左中,右下,视觉
+ if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左中,右下,视觉
}
else if(rc->dr16.sw_l==CMD_SW_DOWN)
diff --git a/User/device/device.h b/User/device/device.h
index 86a547a..897ba4f 100644
--- a/User/device/device.h
+++ b/User/device/device.h
@@ -28,8 +28,7 @@ extern "C" {
#define SIGNAL_IST8310_MAGN_RAW_REDY (1u << 9)
#define SIGNAL_ACTION_RAW_REDY (1u << 10)
#define SIGNAL_OPSTIMER_REDY (1u << 11)
-#define SIGNAL_R12DS_BUF1_REDY (1u << 12)
-#define SIGNAL_DR16_RAW_REDY (1u <<13)
+#define SIGNAL_RC_RAW_REDY (1u <<13)
#define SIGNAL_AI_RAW_REDY (1u << 15)
#define SIGNAL_KEY_REDY (1u << 16)
diff --git a/User/device/nuc.c b/User/device/nuc.c
index e309f3f..a1c723f 100644
--- a/User/device/nuc.c
+++ b/User/device/nuc.c
@@ -6,7 +6,7 @@ static volatile uint32_t drop_message = 0;
static osThreadId_t thread_alert;
-static uint8_t nucbuf[31];
+ uint8_t nucbuf[31];
static char SendBuffer[19];
diff --git a/User/device/rc.c b/User/device/rc.c
index bebd452..84c5658 100644
--- a/User/device/rc.c
+++ b/User/device/rc.c
@@ -12,8 +12,8 @@
#include "error_detect.h"
-//#define DR16
-#define LD_t
+#define DR16
+//#define LD_t
#ifdef DR16
#define FRAME_LEN 36
@@ -38,14 +38,14 @@ int8_t RC_SBUS_Init(void )
if ((thread_alert = osThreadGetId()) == NULL) return DEVICE_ERR_NULL;
BSP_UART_RegisterCallback(BSP_UART_REMOTE, BSP_UART_IDLE_LINE_CB,
- RC_SBUS_RxCpltCallback);
+ RC_RxCpltCallback);
memset(cbuf, 0, sizeof(cbuf));//初始化清空数据包
return DEVICE_OK;
}
-static void RC_SBUS_RxCpltCallback(void) {
- osThreadFlagsSet(thread_alert, SIGNAL_DR16_RAW_REDY);
+static void RC_RxCpltCallback(void) {
+ osThreadFlagsSet(thread_alert, SIGNAL_RC_RAW_REDY);
// detect_hook(DR16_TOE);
}
int8_t RC_SBUS_Restart(void) {
@@ -53,7 +53,7 @@ int8_t RC_SBUS_Restart(void) {
__HAL_UART_ENABLE(BSP_UART_GetHandle(BSP_UART_REMOTE));
return DEVICE_OK;
}
-int8_t RC_SBUS_StartDmaRecv(void) {
+int8_t RC_StartDmaRecv(void) {
if (HAL_UARTEx_ReceiveToIdle_DMA(BSP_UART_GetHandle(BSP_UART_REMOTE),
(uint8_t *)cbuf,
@@ -61,9 +61,9 @@ int8_t RC_SBUS_StartDmaRecv(void) {
return DEVICE_OK;
return DEVICE_ERR;
}
-bool RC_SBUS_WaitDmaCplt(uint32_t timeout) {
- return (osThreadFlagsWait(SIGNAL_DR16_RAW_REDY, osFlagsWaitAll, timeout) ==
- SIGNAL_DR16_RAW_REDY);
+bool RC_WaitDmaCplt(uint32_t timeout) {
+ return (osThreadFlagsWait(SIGNAL_RC_RAW_REDY, osFlagsWaitAll, timeout) ==
+ SIGNAL_RC_RAW_REDY);
}
/*乐迪数据解析 */
int8_t LD_ParseRaw( LD_raw_t *raw, LD_Data_t *LD)
@@ -197,7 +197,7 @@ int8_t DR16_ParseRaw(DR16_t *dr16)
dr16->data.ch_l_y = ((cbuf[4] >>1) | (cbuf[5] <<7));
dr16->data.sw_r = ((cbuf[5] >>4));
dr16->data.sw_l = ((cbuf[5] >> 4) & 0x000C) >> 2;
-
+ dr16->data.res= (fp32)((cbuf[16]|cbuf[17] << 8));
return 1;
}
int8_t RC_ParseRC( DR16_t *dr16,LD_raw_t *LD_raw, LD_Data_t *LD, CMD_RC_t *rc) {
@@ -220,11 +220,11 @@ int8_t RC_ParseRC( DR16_t *dr16,LD_raw_t *LD_raw, LD_Data_t *LD, CMD_RC_t *rc) {
rc->dr16.ch_l_x = 2 * ((float)dr16->data.ch_l_x - RC_CH_VALUE_MID) / full_range;
rc->dr16.ch_l_y = 2 * ((float)dr16->data.ch_l_y - RC_CH_VALUE_MID) / full_range;
- rc->dr16.sw_l = (CMD_SwitchPos_DR16_t)dr16->data.sw_l;
- rc->dr16.sw_r = (CMD_SwitchPos_DR16_t)dr16->data.sw_r;
+ rc->dr16.sw_l = (CMD_SwitchPos_t)dr16->data.sw_l;
+ rc->dr16.sw_r = (CMD_SwitchPos_t)dr16->data.sw_r;
rc->dr16.key = dr16->data.key;
-
+ rc->dr16.res = ((float)dr16->data.res - RC_CH_VALUE_MID) ;
// rc->ch_res = ((float)dr16->data.res - DR16_CH_VALUE_MID) / full_range;
diff --git a/User/device/rc.h b/User/device/rc.h
index e21aaa5..86adf4b 100644
--- a/User/device/rc.h
+++ b/User/device/rc.h
@@ -11,6 +11,10 @@
/* Exported constants ------------------------------------------------------- */
/* Exported macro ----------------------------------------------------------- */
/* Exported types ----------------------------------------------------------- */
+
+
+
+
typedef __packed struct
{
uint16_t ch_r_x : 11;
@@ -69,10 +73,10 @@ typedef __packed struct
int8_t RC_SBUS_Init(void );
-static void RC_SBUS_RxCpltCallback(void) ;
-int8_t RC_SBUS_Restart(void) ;
-int8_t RC_SBUS_StartDmaRecv(void) ;
-bool RC_SBUS_WaitDmaCplt(uint32_t timeout) ;
+static void RC_RxCpltCallback(void) ;
+int8_t RC_Restart(void) ;
+int8_t RC_StartDmaRecv(void) ;
+bool RC_WaitDmaCplt(uint32_t timeout) ;
int8_t LD_ParseRaw( LD_raw_t *raw, LD_Data_t *LD);
static bool DR16_DataCorrupted(const DR16_t *dr16) ;
int8_t DR16_ParseRaw(DR16_t *dr16);
diff --git a/User/task/rc_task.c b/User/task/rc_task.c
index b34b109..15586ef 100644
--- a/User/task/rc_task.c
+++ b/User/task/rc_task.c
@@ -20,7 +20,9 @@ LD_Data_t LD;
#else
static DR16_t dr16;
static CMD_RC_t cmd_rc;
- static RC_ctrl_t cc;
+static LD_raw_t LD_raw;
+static LD_Data_t LD;
+
#endif
@@ -31,10 +33,12 @@ static CMD_RC_t cmd_rc;
* \brief dr16接收机
*
* \param argument 未使用
- */
+ */int aaaaaaaaaaaaaaaaaaa=0;
void Task_rc(void *argument) {
(void)argument; /* 未使用,消除警告 */
+ const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_RC;
+ uint32_t tick = osKernelGetTickCount();
RC_SBUS_Init(); /* 初始化 */
while (1) {
@@ -43,17 +47,26 @@ void Task_rc(void *argument) {
task_runtime.stack_water_mark.rc = osThreadGetStackSpace(osThreadGetId());
#endif
/* 开启DMA */
- RC_SBUS_StartDmaRecv();
-
- if (RC_SBUS_WaitDmaCplt(30)) {
+ RC_StartDmaRecv();
+aaaaaaaaaaaaaaaaaaa++;
+ if (RC_WaitDmaCplt(30)) {
RC_ParseRC(&dr16,&LD_raw,&LD, &cmd_rc);
} else {
- /* 处理dr16遥控器离线 ,乐迪不可用*/
- DR16_HandleOffline(&dr16, &cmd_rc);
- LD_HandleOffline(&LD,&cmd_rc);
+ /* 处理遥控器离线*/
+
+
+
+ DR16_HandleOffline(&dr16, &cmd_rc);
+ LD_HandleOffline(&LD,&cmd_rc);
+
+
+
}
osMessageQueueReset(task_runtime.msgq.cmd.raw.rc);
osMessageQueuePut(task_runtime.msgq.cmd.raw.rc, &cmd_rc, 0, 0);
+ tick += delay_tick;
+ osDelayUntil(tick);
+
}
}
diff --git a/User/task/user_task.h b/User/task/user_task.h
index 958b2c3..81c836e 100644
--- a/User/task/user_task.h
+++ b/User/task/user_task.h
@@ -20,7 +20,6 @@
#define TASK_FREQ_CTRL_CMD (500u)
#define TASK_FREQ_NUC (500u)
#define TASK_FREQ_CAN (1000u)
-#define TASK_FREQ_R12DS (1000u)
#define TASK_FREQ_RC (1000u)
#define TASK_FREQ_ERROR_DTC (3u)