# RMCOD2026_Sentry **Repository Path**: cod_-control/rmcod2026_-sentry ## Basic Information - **Project Name**: RMCOD2026_Sentry - **Description**: COD26 赛季哨兵电控代码 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2025-07-17 - **Last Updated**: 2025-12-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RMCOD2026_Sentry ## 介绍 25赛季舵轮哨兵代码 ## 环境依赖 - 开发工具:Keil V5.38a,VsCode - 软件环境:Window11 - 硬件环境:达妙H7(STM32H723VGT6) - 编译工具:Arm Compiler V6.22,C/C++编译 ## 使用说明 开发的任务主要放置在文件夹Task内的Contr0l_Task ## Chassis重要文件 ### 舵轮解算 ``` // 舵向轮解算 Chassis_Info->Target.Chassis_Angle[0] = atan2f((Control_Info.Move.Vx - Control_Info.Move.Vw * sin45 * R), (Control_Info.Move.Vy + Control_Info.Move.Vw * sin45 * R)) * RadiansToDegrees; Chassis_Info->Target.Chassis_Angle[1] = atan2f((Control_Info.Move.Vx + Control_Info.Move.Vw * sin45 * R), (Control_Info.Move.Vy + Control_Info.Move.Vw * sin45 * R)) * RadiansToDegrees; Chassis_Info->Target.Chassis_Angle[2] = atan2f((Control_Info.Move.Vx + Control_Info.Move.Vw * sin45 * R), (Control_Info.Move.Vy - Control_Info.Move.Vw * sin45 * R)) * RadiansToDegrees; Chassis_Info->Target.Chassis_Angle[3] = atan2f((Control_Info.Move.Vx - Control_Info.Move.Vw * sin45 * R), (Control_Info.Move.Vy - Control_Info.Move.Vw * sin45 * R)) * RadiansToDegrees; // 行进轮解算 Chassis_Info->Target.Chassis_Velocity[0] = sqrtf(powf(Control_Info.Move.Vx - Control_Info.Move.Vw * sin45, 2.f) + powf(Control_Info.Move.Vy - Control_Info.Move.Vw * sin45, 2.f)); Chassis_Info->Target.Chassis_Velocity[1] = sqrtf(powf(Control_Info.Move.Vx - Control_Info.Move.Vw * sin45, 2.f) + powf(Control_Info.Move.Vy + Control_Info.Move.Vw * sin45, 2.f)); Chassis_Info->Target.Chassis_Velocity[2] = sqrtf(powf(Control_Info.Move.Vx + Control_Info.Move.Vw * sin45, 2.f) + powf(Control_Info.Move.Vy + Control_Info.Move.Vw * sin45, 2.f)); Chassis_Info->Target.Chassis_Velocity[3] = sqrtf(powf(Control_Info.Move.Vx + Control_Info.Move.Vw * sin45, 2.f) + powf(Control_Info.Move.Vy - Control_Info.Move.Vw * sin45, 2.f)); } ``` ### 3508角度轮校准 ``` Chassis_Cal(Chassis_Info_Typedef *Chassis_Info) ``` ### FDcan3板间通信的接受 ``` if(*Identifier==0X400) { REMOTO_CTRL.rc_lost =(CAN_RX_Buffer[0]>>4); REMOTO_CTRL.rc.s[0]=((CAN_RX_Buffer[0]>>2)&0x03); REMOTO_CTRL.rc.s[1]=(CAN_RX_Buffer[0]&0x03); REMOTO_CTRL.rc.ch[3]=(int16_t )(CAN_RX_Buffer[1]<<8) | CAN_RX_Buffer[2]; REMOTO_CTRL.rc.ch[2]=(int16_t )((CAN_RX_Buffer[3]<<8) | CAN_RX_Buffer[4]); REMOTO_CTRL.rc.ch[0]=(int16_t )(CAN_RX_Buffer[5]<<8) | CAN_RX_Buffer[6]; REMOTO_CTRL.rc.ch[4]=(int16_t )((CAN_RX_Buffer[7]<<8) | CAN_RX_Buffer[8]); UART.Yaw_Angle_test[0] =CAN_RX_Buffer[9]; UART.Yaw_Angle_test[1] =CAN_RX_Buffer[10]; UART.Yaw_Angle_test[2] =CAN_RX_Buffer[11]; UART.Yaw_Angle_test[3] =CAN_RX_Buffer[12]; UART.Yaw_Gyro_test [0] =CAN_RX_Buffer[13]; UART.Yaw_Gyro_test [1] =CAN_RX_Buffer[14]; UART.Yaw_Gyro_test [2] =CAN_RX_Buffer[15]; UART.Yaw_Gyro_test [3] =CAN_RX_Buffer[16]; Gimbal.Yaw_Angle = bit8TOfloat32_commit(UART.Yaw_Angle_test ); Gimbal.Yaw_Gyro = bit8TOfloat32_commit(UART.Yaw_Gyro_test ); } ``` ## Gimbal重要文件 ### 保持摩擦轮转速一定 ``` //保持弹频 if(systick%121==0){ if (Control_Info->Gimbal.Target.Shoot_Speed!= Control_Info->Gimbal.Target.Shoot_Speed_last){ Control_Info->Gimbal.Shoot.Fire_Trigger += SpeedAdapt(Control_Info->Gimbal.Target.Shoot_Speed, 22.0f, 24.0f,0.5, 0.5); Control_Info->Gimbal.Target.Shoot_Speed += Control_Info->Gimbal.Shoot.Fire_Trigger; } else{ Control_Info->Gimbal.Shoot.Fire_Trigger = 0; } Control_Info->Gimbal.Target.Shoot_Speed_last= Control_Info->Gimbal.Target.Shoot_Speed; } //限制摩擦轮转速在5900到6500之间 VAL_LIMIT(Control_Info->Gimbal.Target.Shoot_Speed,5900,6500); ``` ### FDcan3板间通信的发送 ``` FDCAN3_TxFrame.Header.Identifier=0X400; Yaw_Ange = (uint8_t *)&INS_Info.Yaw_Angle; Yaw_Gyro = (uint8_t *)&INS_Info.Yaw_Gyro; CAN_FD_Tx_Buffer[0] = (uint8_t) ((remote_ctrl.rc_lost)<<4 | (remote_ctrl.rc.s[0])<<2 | (remote_ctrl.rc.s[1])); CAN_FD_Tx_Buffer[1] = (uint8_t) (remote_ctrl.rc.ch[3]>> 8); CAN_FD_Tx_Buffer[2] = (uint8_t) (remote_ctrl.rc.ch[3] ); CAN_FD_Tx_Buffer[3] = (uint8_t) (remote_ctrl.rc.ch[2] >>8); CAN_FD_Tx_Buffer[4] = (uint8_t) (remote_ctrl.rc.ch[2]); CAN_FD_Tx_Buffer[5] = (uint8_t) (remote_ctrl.rc.ch[0] >>8); CAN_FD_Tx_Buffer[6] = (uint8_t) (remote_ctrl.rc.ch[0]); CAN_FD_Tx_Buffer[7] = (uint8_t) (remote_ctrl.rc.ch[4] >>8); CAN_FD_Tx_Buffer[8] = (uint8_t) (remote_ctrl.rc.ch[4]); CAN_FD_Tx_Buffer[9] = *Yaw_Ange; CAN_FD_Tx_Buffer[10] = *(Yaw_Ange + 1); CAN_FD_Tx_Buffer[11] = *(Yaw_Ange + 2); CAN_FD_Tx_Buffer[12] = *(Yaw_Ange + 3); CAN_FD_Tx_Buffer[13] = *Yaw_Gyro; CAN_FD_Tx_Buffer[14] = *(Yaw_Gyro + 1); CAN_FD_Tx_Buffer[15] = *(Yaw_Gyro + 2); CAN_FD_Tx_Buffer[16] = *(Yaw_Gyro + 3); HAL_FDCAN_AddMessageToTxFifoQ(FDCAN3_TxFrame.hcan,&FDCAN3_TxFrame.Header,CAN_FD_Tx_Buffer); ``` ## 参考开源 [2025RoboMaster辽宁科技大学COD战队电控通用控制系统(达妙MC02 STM32H723VGT6)](https://gitee.com/wangcaofan/cod-h7-template) ## 联系方式 QQ:1634789078