diff --git a/Core/Src/main.c b/Core/Src/main.c
index 244ccf3..39a953b 100644
--- a/Core/Src/main.c
+++ b/Core/Src/main.c
@@ -32,7 +32,6 @@
/* USER CODE BEGIN Includes */
#include "bsp_delay.h"
#include "bsp_can.h"
-#include "Action.h"
//#include "bsp_dwt.h"
/* USER CODE END Includes */
diff --git a/MDK-ARM/.vscode/keil-assistant.log b/MDK-ARM/.vscode/keil-assistant.log
index de52ba5..429293f 100644
--- a/MDK-ARM/.vscode/keil-assistant.log
+++ b/MDK-ARM/.vscode/keil-assistant.log
@@ -475,3 +475,5 @@ Log at : 2025/2/23|14:39:36|GMT+0800
[info] Log at : 2025/3/11|21:09:29|GMT+0800
+[info] Log at : 2025/3/28|21:47:12|GMT+0800
+
diff --git a/MDK-ARM/AUTO_CHASSIS.uvoptx b/MDK-ARM/AUTO_CHASSIS.uvoptx
index a88a95b..5fb0e6c 100644
--- a/MDK-ARM/AUTO_CHASSIS.uvoptx
+++ b/MDK-ARM/AUTO_CHASSIS.uvoptx
@@ -145,7 +145,7 @@
0
DLGUARM
-
+ (105=-1,-1,-1,-1,0)
0
@@ -195,6 +195,46 @@
1
GO_motor_info
+
+ 8
+ 1
+ cbuf[36]
+
+
+ 9
+ 1
+ dr16,0x0A
+
+
+ 10
+ 1
+ cmd,0x0A
+
+
+ 11
+ 1
+ rc_ctrl,0x0A
+
+
+ 12
+ 1
+ up_cmd,0x0A
+
+
+ 13
+ 1
+ angle
+
+
+ 14
+ 1
+ can_ZZ
+
+
+ 15
+ 1
+ flaggg,0x0A
+
@@ -1116,18 +1156,6 @@
0
0
0
- ..\User\task\nuc_task.c
- nuc_task.c
- 0
- 0
-
-
- 8
- 68
- 1
- 0
- 0
- 0
..\User\task\error_detect_task.c
error_detect_task.c
0
@@ -1135,7 +1163,7 @@
8
- 69
+ 68
1
0
0
@@ -1147,7 +1175,7 @@
8
- 70
+ 69
1
0
0
@@ -1157,6 +1185,30 @@
0
0
+
+ 8
+ 70
+ 1
+ 0
+ 0
+ 0
+ ..\User\task\cmd_task.c
+ cmd_task.c
+ 0
+ 0
+
+
+ 8
+ 71
+ 1
+ 0
+ 0
+ 0
+ ..\User\task\nuc_task.c
+ nuc_task.c
+ 0
+ 0
+
@@ -1167,7 +1219,7 @@
0
9
- 71
+ 72
1
0
0
@@ -1177,18 +1229,6 @@
0
0
-
- 9
- 72
- 1
- 0
- 0
- 0
- ..\User\task\cmd_task.c
- cmd_task.c
- 0
- 0
-
9
73
@@ -1249,18 +1289,6 @@
0
0
-
- 9
- 78
- 1
- 0
- 0
- 0
- ..\User\Algorithm\navi.c
- navi.c
- 0
- 0
-
@@ -1271,7 +1299,7 @@
0
10
- 79
+ 78
1
0
0
@@ -1283,7 +1311,7 @@
10
- 80
+ 79
1
0
0
@@ -1295,7 +1323,7 @@
10
- 81
+ 80
1
0
0
@@ -1307,7 +1335,7 @@
10
- 82
+ 81
1
0
0
@@ -1319,7 +1347,7 @@
10
- 83
+ 82
1
0
0
@@ -1331,7 +1359,7 @@
10
- 84
+ 83
1
0
0
@@ -1343,7 +1371,7 @@
10
- 85
+ 84
1
0
0
@@ -1363,7 +1391,7 @@
0
11
- 86
+ 85
1
0
0
@@ -1375,7 +1403,7 @@
11
- 87
+ 86
1
0
0
@@ -1387,7 +1415,7 @@
11
- 88
+ 87
1
0
0
@@ -1407,7 +1435,7 @@
0
12
- 89
+ 88
1
0
0
@@ -1427,7 +1455,7 @@
0
13
- 90
+ 89
1
0
0
@@ -1439,7 +1467,7 @@
13
- 91
+ 90
1
0
0
@@ -1451,7 +1479,7 @@
13
- 92
+ 91
1
0
0
@@ -1463,7 +1491,7 @@
13
- 93
+ 92
1
0
0
diff --git a/MDK-ARM/AUTO_CHASSIS.uvprojx b/MDK-ARM/AUTO_CHASSIS.uvprojx
index eee0eb5..8e40444 100644
--- a/MDK-ARM/AUTO_CHASSIS.uvprojx
+++ b/MDK-ARM/AUTO_CHASSIS.uvprojx
@@ -1208,11 +1208,6 @@
1
..\User\task\can_task.c
-
- nuc_task.c
- 1
- ..\User\task\nuc_task.c
-
error_detect_task.c
1
@@ -1228,6 +1223,67 @@
1
..\User\task\up_task.c
+
+ cmd_task.c
+ 1
+ ..\User\task\cmd_task.c
+
+
+ 2
+ 0
+ 0
+ 0
+ 0
+ 1
+ 2
+ 2
+ 2
+ 2
+ 11
+
+
+ 1
+
+
+
+ 2
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+ 2
+ 2
+ 2
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+ 0
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+
+
+
+
+
+
+
+
+
+
+
+ nuc_task.c
+ 1
+ ..\User\task\nuc_task.c
+
@@ -1238,11 +1294,6 @@
1
..\User\Algorithm\filter.c
-
- cmd_task.c
- 1
- ..\User\task\cmd_task.c
-
ahrs.c
1
@@ -1268,11 +1319,6 @@
1
..\User\Algorithm\pid.c
-
- navi.c
- 1
- ..\User\Algorithm\navi.c
-
diff --git a/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf b/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf
index 5253c10..669a09d 100644
Binary files a/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf and b/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf differ
diff --git a/User/Module/Chassis.c b/User/Module/Chassis.c
deleted file mode 100644
index 5f738e6..0000000
--- a/User/Module/Chassis.c
+++ /dev/null
@@ -1,231 +0,0 @@
-#include "Chassis.h"
-#include "gpio.h"
-#include "Action.h"
-#include "user_math.h"
-#include "bsp_buzzer.h"
-#include "bsp_delay.h"
-
-
-
-
-
-
-/*机器人坐标系,向前x,右y,上yaw
- 不同于nuc (前x,左y,上yaw) */
-/*
- x
- |
- --y
-
-
-*/
-
-static int8_t Chassis_SetCtrl(Chassis_t *c,CMD_t *ctrl){
- if (c == NULL) return CHASSIS_ERR_NULL; /*主结构体不能为空 */
- if (ctrl->C_cmd.type== c->ctrl && ctrl->C_cmd.mode== c->mode) return CHASSIS_OK; /*模式未改变直接返回*/
- //此处源代码处做了pid的reset 待添加
- c->ctrl =ctrl->C_cmd.type;
- c->mode =ctrl->C_cmd.mode;
-
- return CHASSIS_OK;
-} //设置控制模式
-
-
-/*该函数用来更新can任务获得的电机反馈值*/
-
-int8_t Chassis_UpdateFeedback(Chassis_t *c, const CAN_t *can) {
- if (c == NULL) return CHASSIS_ERR_NULL;
- if (can == NULL) return CHASSIS_ERR_NULL;
- for (uint8_t i = 0; i < 4; i++)
- {
- c->motorfeedback.rotor_rpm3508[i] = can->motor.motor3508.as_array[i].rotor_speed;
- c->motorfeedback.rotor_current3508[i] = can->motor.motor3508.as_array[i].torque_current;
- }
-
-
- c->motorfeedback.rotor_pit6020angle = can->motor.pit6020.as_array[0].rotor_ecd;
- c->motorfeedback.rotor_pit6020rpm = can->motor.pit6020.as_array[0].rotor_speed;
-
- c->motorfeedback.rotor_gimbal_yawangle = can->motor.chassis6020.as_array[0].rotor_ecd;
- c->motorfeedback.rotor_gimbal_yawrpm = can->motor.chassis6020.as_array[0].rotor_speed;
-
- c->motorfeedback.rotor_gimbal_pitchangle = can->motor.chassis6020.as_array[1].rotor_ecd;
- c->motorfeedback.rotor_gimbal_pitchrpm = can->motor.chassis6020.as_array[1].rotor_speed;
-
- c->sick_dis[0] = can->sickfed.raw_dis[0];
- c->sick_dis[1] = can->sickfed.raw_dis[1];
- c->sick_dis[2] = can->sickfed.raw_dis[2];
- c->sick_dis[3] = can->sickfed.raw_dis[3];
-
- return CHASSIS_OK;
-}
-
-
-int8_t Chassis_init(Chassis_t *c,const Chassis_Param_t *param,float target_freq)
-{
- if (c == NULL) return CHASSIS_ERR_NULL;
-
- c->param = param; /*初始化参数 */
-
- for(int i =0 ; i < 4 ; i++)
- {
- PID_init(&(c->pid.chassis_3508VecPID[i]),PID_POSITION_D,&(c->param->M3508_param)); //带D项滤波
- }
-
- PID_init((&c->pid.chassis_pitAngle6020),PID_POSITION,&(c->param->C6020pitAngle_param));//尝试位置控制角度
-
- PID_init((&c->pid.chassis_pitOmega6020),PID_POSITION,&(c->param->C6020pitOmega_param));
-
- PID_init((&c->pid.chassis_gimbal_yawAnglePID),PID_POSITION,&(c->param->Gimbal_yawAngle_param));//尝试位置控制角度
-
- PID_init((&c->pid.chassis_gimbal_yawOmegaPID),PID_POSITION,&(c->param->Gimbal_yawOmega_param));
-
- PID_init((&c->pid.chassis_gimbal_pitchAnglePID),PID_POSITION,&(c->param->Gimbal_pitchAngle_param));//尝试位置控制角度
-
- PID_init((&c->pid.chassis_gimbal_pitchOmegaPID),PID_POSITION,&(c->param->Gimbal_pitchOmega_param));
-
- PID_init(&(c->pid.chassis_NaviVxPID),PID_POSITION,&(c->param->NaviVx_param));
-
- PID_init(&(c->pid.chassis_NaviVyPID),PID_POSITION,&(c->param->NaviVy_param));
-
- PID_init(&(c->pid.chassis_NaviWzPID),PID_POSITION,&(c->param->NaviVw_param));
-
- PID_init(&(c->pid.sick_CaliforYPID),PID_POSITION,&(c->param->Sick_CaliYparam));
-
- PID_init(&(c->pid.sick_CaliforXPID),PID_POSITION,&(c->param->Sick_CaliXparam));
-
- LowPassFilter2p_Init(&(c->filled[0]),target_freq,80.0f); //给角加速度做滤波
-
-
- LowPassFilter2p_Init(&(c->filled[1]),target_freq,80.0f); //给w 做滤波
-
- LowPassFilter2p_Init(&(c->filled[2]),target_freq,80.0f); //给y做滤波
-
- LowPassFilter2p_Init(&(c->filled[3]),target_freq,80.0f); //给x 做滤波
-
- //
-
-
- return CHASSIS_OK;
-}
-
-
-void Chassis_speed_calculate(Chassis_t *c,fp32 Vx,fp32 Vy,fp32 Vw) //底盘逆运动学的解算
-{
- c->hopemotorout.OmniSpeedOut[3] = -Vx+Vy+Vw;//右前
- c->hopemotorout.OmniSpeedOut[0] = -Vx-Vy+Vw;//右后
- c->hopemotorout.OmniSpeedOut[1] = Vx-Vy+Vw;//左后
- c->hopemotorout.OmniSpeedOut[2] = Vx+Vy+Vw;//左前
-}
-
-
-//bool isArrive(fp32 real_pos,fp32 target_pos,fp32 mistake)
-//{
-// uint16_t xArrive = 0, yArrive = 0;
-// xArrive = abs_float_double(real_pos,target_pos) < mistake ? 1:0;
-// yArrive = abs_float_double(real_pos,target_pos) < mistake ? 1:0;
-// if(xArrive && yArrive) return true;
-// else return false;
-//}
-
-
-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);
-
- switch (c->ctrl)
- {
- case RC:
-
-/*
- 在cmd里对数据进行处理 包括方向和油门
- 6000为全向轮的倍率,遥控器坐标系和机器人坐标系不同*/
- c->move_vec.Vw = ctrl->Vw*6000;
- c->move_vec.Vx = -ctrl->Vy*6000;
- c->move_vec.Vy = ctrl->Vx*6000;
- if(c->mode == RC_MODE1 ){
- }
-
-
- break;
-
- case MID_NAVI:
-// //这套是全向轮的方向,一定要注意这里的xy方向
- c->move_vec.Vw =ctrl->C_navi.wz ;
- c->move_vec.Vx =ctrl->C_navi.vy ;
- c->move_vec.Vy =ctrl->C_navi.vx ;
-
- c->move_vec.Vw =LowPassFilter2p_Apply(&(c->filled[1]),c->move_vec.Vw);
- c->move_vec.Vy =LowPassFilter2p_Apply(&(c->filled[2]),c->move_vec.Vy);
- c->move_vec.Vx =LowPassFilter2p_Apply(&(c->filled[3]),c->move_vec.Vx);
-
- c->move_vec.Vw =PID_calc(&(c->pid.chassis_NaviWzPID),c->pos088.bmi088.gyro.z,c->move_vec.Vw);
- c->move_vec.Vx =PID_calc(&(c->pid.chassis_NaviVxPID),c->pos088.bmi088.accl.y,c->move_vec.Vx);
- c->move_vec.Vy =PID_calc(&(c->pid.chassis_NaviVyPID),c->pos088.bmi088.accl.x,c->move_vec.Vy);
-
- if(ctrl->status[5] ==1)
- {
- c->move_vec.Vw = c->move_vec.Vw * 0.8f;
- c->move_vec.Vx = c->move_vec.Vx * 0.5f;
- c->move_vec.Vy = c->move_vec.Vy * 0.5f;
- }
-
- break;
-
- }
-/*怎么用*/
- switch (c->mode)
- {
- case RELAXED:
- c->move_vec.Vx =0;
- c->move_vec.Vy =0;
- c->move_vec.Vw =0;
- break;
- case NORMAL:
- break;
-
- case GYRO_STAY://陀螺仪yaw修正
- c->move_vec.Vw = c->move_vec.Vw +c->pos088.bmi088.gyro.z *2000;
- break;
-
-}
-
- //电机速度限幅
-
-// abs_limit_fp(&c->move_vec.Vx,2000.0f);
-
-// abs_limit_fp(&c->move_vec.Vy,2000.0f);
-
-// abs_limit_fp(&c->move_vec.Vw,2000.0f);
- Chassis_speed_calculate(c,c->move_vec.Vx,c->move_vec.Vy,c->move_vec.Vw);
-
-
- for (uint8_t i = 0 ; i <4 ; i++)
- {
- c->final_out.final_3508out[i] = PID_calc(&(c->pid.chassis_3508VecPID[i]),c->motorfeedback.rotor_rpm3508[i],c->hopemotorout.OmniSpeedOut[i]);
-
- out->motor3508.as_array[i] = c->final_out.final_3508out[i];
- }
-
-
-// c->vofa_send[0]=c->pos088.bmi088.gyro.x;
-// c->vofa_send[1]=c->pos088.bmi088.gyro.y;
-// c->vofa_send[2]=c->pos088.bmi088.gyro.z;
-// c->vofa_send[3]=c->pos088.bmi088.accl.x;
-// c->vofa_send[4]=c->pos088.bmi088.accl.y;
-// c->vofa_send[5]=c->pos088.bmi088.accl.z;
-
- return CHASSIS_OK;
-
-}
-
-
-
-
diff --git a/User/Module/Chassis.h b/User/Module/Chassis.h
deleted file mode 100644
index d3f15ad..0000000
--- a/User/Module/Chassis.h
+++ /dev/null
@@ -1,232 +0,0 @@
-#ifndef CHASSIS_H
-
-/**
- * @brief 底盘控制类头文件
- *
- * 本头文件定义了底盘控制类的接口和数据结构,用于控制车辆的底盘。
- *
- * @param ChassisImu_t 底盘的 IMU 数据结构体
- * @param ops_t 操作数据结构体
- * @param Chassis_t 底盘数据结构体
- *
- * @brief 底盘控制类的功能包括:
- * 速度控制
- * 方向控制
- * PID 控制
- * 速度和方向的综合控制
- *
- * @attention PID 控制器的配置需要在 config 文件中设置
- *
- */
-
-
-#define CHASSIS_H
-
-#include "struct_typedef.h"
-#include "pid.h"
-#include "bmi088.h"
-#include "map.h"
-#include "user_math.h"
-#include "ahrs.h"
-#include "can_use.h"
-#include "cmd.h"
-#include "filter.h"
-#include "Action.h"
-
-#define CHASSIS_OK (0)
-#define CHASSIS_ERR (-1)
-#define CHASSIS_ERR_NULL (-2)
-#define CHASSIS_ERR_MODE (-3) /*CMD_ChassisMode_t */
-#define CHASSIS_ERR_TYPE (-4) /*Chassis_Type_t */
-
-//m3508的电机转速转换为底盘的实际速度
-#define M3508_MOTOR_RPM_TO_VECTOR 0.0008809748903494517209f
-
-
-#define M6020_MOTOR_RPM_TO_VECTOR 0.003664f
-#define PI 3.1415926535f
-
-typedef struct {
-
- BMI088_t bmi088;
-
- /*可通过该枚举类型来决定Imu的数据量纲*/
- enum {
- IMU_DEGREE,//角度值(0-360)
- IMU_RADIAN//弧度制(0-2pi)
- }angle_mode;
-
- AHRS_Eulr_t imu_eulr;//解算后存放欧拉角(弧度制)
-}ChassisImu_t;
-
-/*底盘的类型*/
-typedef enum {
- CHASSIS_TYPE_MECANUM, /* 麦轮 */
- CHASSIS_TYPE_OMNI_CROSS, /* 全向轮*/
- CHASSIS_TYPE_AGV, /* AGV舵轮 */
-} Chassis_Type_e;
-
-/*底盘的电机轮组*/
-typedef enum {
- DJI_M3508,
- DJI_G6020,
- AGV_Group,
-}Chassis_Motortype_e;
-
-
-/* 该结构体用于存取固定的一些参数 在config.c中更改后不再变化 */
-typedef struct
-{
- Chassis_Type_e chassis_type; /* */
- Chassis_Motortype_e motor_type; /**/
-
-
- /*该部分决定PID的参数整定在config中修改*/
- pid_param_t M3508_param;
- pid_param_t AngleCor_param;
- pid_param_t OmegaCor_param;
- pid_param_t DisCamera_param;
- pid_param_t ImuCor_param;
- pid_param_t C6020pitAngle_param;
- pid_param_t C6020pitOmega_param;
- pid_param_t Gimbal_yawAngle_param;
- pid_param_t Gimbal_yawOmega_param;
- pid_param_t Gimbal_pitchAngle_param;
- pid_param_t Gimbal_pitchOmega_param;
- pid_param_t NaviVx_param;
- pid_param_t NaviVy_param;
- pid_param_t NaviVw_param;
- pid_param_t Sick_CaliYparam;
- pid_param_t Sick_CaliXparam;
-
-
-
-}Chassis_Param_t;
-
-
-/*该结构体用于底盘的期望运动向量*/
-typedef struct
-{
- fp32 Vx;
- fp32 Vy;
- fp32 Vw;
- fp32 mul;//油门倍率
-}ChassisMove_Vec;
-
-
-/**
- * @brief
- *
- */
-typedef struct{
-
- uint8_t chassis_task_run; //线程的运行
-
- const Chassis_Param_t *param; //一些固定的参数
-
- ChassisImu_t pos088; //088的实时姿态
- Action_POS_t Action_pos;
- CMD_Chassis_CtrlType_e ctrl;
- CMD_Chassis_mode_e mode;
-
- ChassisMove_Vec move_vec; //由控制任务决定
-
- struct{
-
- fp32 rotor_rpm3508[4];
- fp32 rotor_current3508[4];
-
- fp32 rotor_pit6020angle;
- fp32 rotor_pit6020rpm;
-
- fp32 rotor_gimbal_yawangle;
- fp32 rotor_gimbal_yawrpm;
-
- fp32 rotor_gimbal_pitchangle;
- fp32 rotor_gimbal_pitchrpm;
-
- }motorfeedback;
-
-
- /*期望的底盘输出值*/
- struct{
- fp32 OmniSpeedOut[4];
-
- }hopemotorout;
-
-
- /*经PID计算后的实际发送给电机的实时输出值*/
- struct
- {
- fp32 final_3508out[4];
- fp32 final_pitchout;
- fp32 final_gimbal_yawout;
- fp32 final_gimbal_pitchout;
-
- }final_out;
-
- struct{
-
- pid_type_def chassis_3508VecPID[4];
- pid_type_def chassis_pitAngle6020;
- pid_type_def chassis_pitOmega6020;
- pid_type_def chassis_gimbal_yawAnglePID;
- pid_type_def chassis_gimbal_yawOmegaPID;
- pid_type_def chassis_gimbal_pitchAnglePID;
- pid_type_def chassis_gimbal_pitchOmegaPID;
- pid_type_def chassis_NaviVxPID;
- pid_type_def chassis_NaviVyPID;
- pid_type_def chassis_NaviWzPID;
- pid_type_def sick_CaliforYPID;
- pid_type_def sick_CaliforXPID;
-
- pid_type_def Action_VxPID;
- pid_type_def Action_VyPID;
- pid_type_def Action_WzPID;
- }pid;
-
- fp32 vofa_send[8];
-
- LowPassFilter2p_t filled[6]; /* 输出滤波器滤波器数组 */
-
-
- int32_t sick_dis[4]; //获取到的sick激光值
-
-
-
-}Chassis_t;
-
-/**
- * @brief
- *
- * @param c
- * @param param
- * @param mech_zero
- * @param wheelPolar
- * @return
- */
- int8_t Chassis_init(Chassis_t *c,const Chassis_Param_t *param,float target_freq);
-
-
-/**
- * \brief
-
- */
-int8_t Chassis_UpdateFeedback(Chassis_t *c, const CAN_t *can);
-
-
-/**
- * \brief
-
- */
-int8_t Chassis_Control(Chassis_t *c,CMD_t *ctrl,CAN_Output_t *out);
-
-
-
-
-
-
-/// @brief
-/// @param c
-void vesc_current_detection(Chassis_t *c);
-#endif
diff --git a/User/Module/config.h b/User/Module/config.h
index dd2b1aa..324fd11 100644
--- a/User/Module/config.h
+++ b/User/Module/config.h
@@ -1,14 +1,12 @@
#ifndef _CONFIG_H
#define _CONFIG_H
-#include "Chassis.h"
#include "can_use.h"
#include "ahrs.h"
#include "map.h"
#include "up.h"
typedef struct{
-Chassis_Param_t chassis; /**/
UP_Param_t up;
CAN_Params_t can;
AHRS_Eulr_t mech_zero[4];
diff --git a/User/Module/up.c b/User/Module/up.c
index 70c51ce..9c35bbd 100644
--- a/User/Module/up.c
+++ b/User/Module/up.c
@@ -4,102 +4,158 @@
#include "bsp_buzzer.h"
#include "bsp_delay.h"
-#define GEAR_RATIO (36) // 2006减速比
+#define GEAR_RATIO_2006 (36) // 2006减速比
+#define GEAR_RATIO_3508 (19)
+
#define CAN_MOTOR_ENC_RES 8191 // 编码器分辨率
-#define MOTOR2006_ECD_TO_ANGLE (360.0 / 8191.0 / (GEAR_RATIO)) //2006编码值转轴角度
+#define MOTOR2006_ECD_TO_ANGLE (360.0 / 8191.0 / (GEAR_RATIO_2006)) //2006编码值转轴角度
+#define MOTOR3508_ECD_TO_ANGLE (360.0 / 8191.0 / (GEAR_RATIO_3508)) //3508编码值转轴角度
+
+
+
+
+
int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq)
{
- u->param = param; /*初始化参数 */
-
+ u->param = param; /*初始化参数 */
+ /*go电机初始化*/
GO_M8010_init();
+ /*pid初始化*/
PID_init (&u->pid.VESC_5065_M1 ,PID_POSITION ,&(u->param ->VESC_5065_M1_param ));
PID_init (&u->pid.VESC_5065_M2 ,PID_POSITION ,&(u->param ->VESC_5065_M2_param ));
PID_init (&u->pid .M2006_angle ,PID_POSITION ,&(u->param->M2006_angle_param ));
PID_init (&u->pid .M2006_speed ,PID_POSITION ,&(u->param->M2006_speed_param ));
+ PID_init (&u->pid .M3508_angle ,PID_POSITION ,&(u->param->M3508_angle_param ));
+ PID_init (&u->pid .M3508_speed ,PID_POSITION ,&(u->param->M3508_speed_param ));
+
PID_init (&u->pid .GM6020_speed,PID_POSITION ,&(u->param ->UP_GM6020_speed_param ));
PID_init (&u->pid .GM6020_angle,PID_POSITION ,&(u->param ->UP_GM6020_angle_param ));
-
- u->M2006 .motor =M2006 ;
- u->M3508 .motor =M3508 ;
-
- for(int i=0;i<3;i++){
- PID_init (&u->pid .M3508_speed[i] ,PID_POSITION ,&(u->param ->M3508_speed_param ));
- }
-
- for(int i=0;i<2;i++){ //go初始位置设置为0
- u->GO_motor_info[i] = getGoPoint(i);
+
+
+ for(int i=0;i<2;i++){ //go初始位置设置为0
GO_M8010_send_data(BSP_UART_GetHandle(BSP_UART_RS485), i,u->param->go_param .rev ,u->param->go_param .T ,u->param->go_param .W ,0,u->param->go_param .K_P ,u->param->go_param .K_W );
}
+
+ /**/
+
+ u->state .Dribble_flag =Not_started_dri;
+ u->state. Pitch_flag=Not_started_Pit;
+ u->state .last_state = Not_started_dri;
+
}
-
-int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can) {
-
- u->motorfeedback .M2006_angle=can ->motor .motor3508 .as_array [0].rotor_ecd ;
- u->motorfeedback .M2006_rpm =can ->motor .motor3508 . as_array [0].rotor_speed ;
+/*can,上层状态更新*/
+int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can, CMD_t *c) {
+ for(int i=0;i<2;i++){ //go初始位置设置为0
+ u->motorfeedback .GO_motor_info [i] = getGoPoint(i);
+ }
+ u->motorfeedback .M2006 .motor =M2006;
+ u->motorfeedback .M3508 .motor =M3508;
+
u->motorfeedback .VESC_5065_M1_rpm =can ->motor .chassis5065 .as_array [0].rotor_speed ;
u->motorfeedback .VESC_5065_M2_rpm =can ->motor .chassis5065 .as_array [1].rotor_speed ;
u->motorfeedback .rotor_pit6020ecd =can ->motor .chassis6020.as_array [2].rotor_ecd ;
u->motorfeedback .rotor_pit6020rpm =can ->motor .chassis6020.as_array [2].rotor_speed ;
- for(int i=0;i<3;i++){
- u->motorfeedback .M3508_speed[i] =can ->motor .motor3508 .as_array [i+1].rotor_speed ;
+
+ for(int i=0;i<4;i++){
+ u->motorfeedback .M3508_rpm[i] =can ->motor .motor3508 .as_array [i].rotor_speed ;
+ u->motorfeedback .M3508_angle [i]=can ->motor .motor3508 .as_array [i].rotor_ecd ;
}
+
+ u->cmd =c;
+
+ return 0;
}
- int8_t cnt=0;
-/*上层电机控制*/
-int8_t UP_angle(UP_t *u, fp32 target_angle) {
+
+/*上层电机控制,使用can1的id1和2*/
+int8_t UP_angle_control(UP_t *u, fp32 target_angle,MotorType_t motor) {
// 获取当前编码器角度
-
-// switch (u->)
- float angle = u->motorfeedback.M2006_angle;
- // 初始化阶段:前50次循环记录初始值
- if (u->M2006.init_cnt < 50) {
- u->M2006.orig_angle = angle; // 记录初始编码器值
- u->M2006.last_angle = angle;
+ int8_t cnt=0;
+ fp32 angle ,delta;
+
+ switch(motor)
+ {
+ case M2006 :
+ angle = u->motorfeedback.M3508_angle[0];
+ if (u->motorfeedback .M2006 .init_cnt < 50) {
+ u->motorfeedback .M2006.orig_angle = angle; // 记录初始编码器值
+ u->motorfeedback .M2006.last_angle = angle;
- u->M2006.init_cnt++; // 初始化计数器递增
+ u->motorfeedback .M2006.init_cnt++; // 初始化计数器递增
return 0;
}
-
-
- float delta = angle - u->M2006.last_angle;
+
+ delta = angle - u->motorfeedback .M2006.last_angle;
+ delta = angle - u->motorfeedback .M2006.last_angle;
if (delta > 4096) {
- u->M2006.round_cnt--; // 逆时针跨圈
+ u->motorfeedback .M2006.round_cnt--; // 逆时针跨圈
} else if (delta < -4096) {
- u->M2006.round_cnt++; // 顺时针跨圈
+ u->motorfeedback .M2006.round_cnt++; // 顺时针跨圈
}
-
- u->M2006.last_angle = angle;
-
- // 计算总角度
- float total_angle = (u->M2006.round_cnt * 8191 + (angle - u->M2006.orig_angle)) * MOTOR2006_ECD_TO_ANGLE;
- u->M2006 .total_angle =total_angle;
+ u->motorfeedback.M2006.last_angle = angle;
+ // 计算总角度
+ float total_angle = (u->motorfeedback.M2006 .round_cnt * 8191 + (angle - u->motorfeedback.M2006.orig_angle)) * MOTOR2006_ECD_TO_ANGLE;
+ u->motorfeedback.M2006.total_angle =total_angle;
float delta_angle = PID_calc(&u->pid.M2006_angle, total_angle, target_angle);
- float delta_speed = PID_calc(&u->pid.M2006_speed, u->motorfeedback.M2006_rpm, delta_angle);
+ float delta_speed = PID_calc(&u->pid.M2006_speed, u->motorfeedback.M3508_rpm [0], delta_angle);
u->motor_target.M2006_angle = target_angle;
- u->final_out .final_2006out =delta_speed;
+ u->final_out .final_3508out [0] =delta_speed;
+
+ break ;
+
+ case M3508 :
+
+ angle = u->motorfeedback.M3508_angle[1];
+ if (u->motorfeedback .M3508 .init_cnt < 50) {
+ u->motorfeedback .M3508.orig_angle = angle; // 记录初始编码器值
+ u->motorfeedback .M3508.last_angle = angle;
+
+ u->motorfeedback .M3508.init_cnt++; // 初始化计数器递增
+ return 0;
+ }
+
+ delta = angle - u->motorfeedback .M3508.last_angle;
+ delta = angle - u->motorfeedback .M3508.last_angle;
+ if (delta > 4096) {
+ u->motorfeedback .M3508.round_cnt--; // 逆时针跨圈
+ } else if (delta < -4096) {
+ u->motorfeedback .M3508.round_cnt++; // 顺时针跨圈
+ }
+ u->motorfeedback.M3508.last_angle = angle;
+ // 计算总角度
+ total_angle = (u->motorfeedback.M3508 .round_cnt * 8191 + (angle - u->motorfeedback.M3508.orig_angle)) * MOTOR2006_ECD_TO_ANGLE;
+ u->motorfeedback.M3508.total_angle =total_angle;
+ delta_angle = PID_calc(&u->pid.M3508_angle , total_angle, target_angle);
+ delta_speed = PID_calc(&u->pid.M3508_speed , u->motorfeedback.M3508_rpm [1], delta_angle);
+
+ u->motor_target.M3508_angle = target_angle;
+ u->final_out .final_3508out[1] =delta_speed;
+
+ break ;
+
+ }
return 0;
}
-int8_t UP_M3508_speed(UP_t *u,fp32 speed)
-{
- u->motor_target .M3508_speed =speed;
- for(int i=0;i<3;i++){
- u->final_out .final_3508out [i] =
- PID_calc (&(u->pid .M3508_speed[i] ),u->motorfeedback .M3508_speed [i],speed );
- }
-
-}
+//int8_t UP_M3508_speed(UP_t *u,fp32 speed)
+//{
+// u->motor_target .M3508_speed [] =speed;
+// for(int i=0;i<3;i++){
+// u->final_out .final_3508out [i] =
+// PID_calc (&(u->pid .M3508_speed[i] ),u->motorfeedback .M3508_speed [i],speed );
+// }
+//
+//}
int8_t VESC_M5065_Control(UP_t *u,fp32 speed)
@@ -107,16 +163,17 @@ int8_t VESC_M5065_Control(UP_t *u,fp32 speed)
u->motor_target .VESC_5065_M1_rpm =speed;
u->motor_target .VESC_5065_M2_rpm =speed;
- u->final_out .final_VESC_5065_M1out =u->motor_target .VESC_5065_M1_rpm;
- u->final_out .final_VESC_5065_M2out =-u->motor_target .VESC_5065_M2_rpm;
+ u->final_out .final_VESC_5065_M1out =-u->motor_target .VESC_5065_M1_rpm;
+ u->final_out .final_VESC_5065_M2out =u->motor_target .VESC_5065_M2_rpm;
}
+
int8_t GM6020_control(UP_t *u,fp32 angle)
{
fp32 delat_speed;
- Clip(&angle,90,270);
+// Clip(&angle,90,270);
delat_speed =
PID_calc (&(u->pid .GM6020_angle ),u->motorfeedback .rotor_pit6020ecd ,(angle /360*8191));
@@ -124,6 +181,7 @@ int8_t GM6020_control(UP_t *u,fp32 angle)
PID_calc (&(u->pid .GM6020_speed ),u->motorfeedback.rotor_pit6020rpm ,delat_speed);
u->motor_target .rotor_pit6020angle =angle ;
}
+
/*go电机控制*/
int8_t GO_SendData(UP_t *u,int id,float pos)
{
@@ -133,35 +191,148 @@ int8_t GO_SendData(UP_t *u,int id,float pos)
}
+
int8_t ALL_Motor_Control(UP_t *u,CAN_Output_t *out)
{
//电机控制 ,传进can
- out ->motor3508 .as_array [0]=u->final_out .final_2006out ;
- for(int i=1;i<4;i++){
- out ->motor3508 .as_array[i]=u->final_out.final_3508out [i-1] ;
+ UP_angle_control(u,u->motor_target .M2006_angle ,M2006);
+ UP_angle_control(u,u->motor_target .M3508_angle ,M3508 );
+
+
+
+ GO_SendData(u,0 ,u->motor_target .go_shoot );
+ GO_SendData(u,1 ,u->motor_target .go_spin);
+
+
+ for(int i=0;i<4;i++){
+ out ->motor3508 .as_array[i]=u->final_out.final_3508out [i] ;
}
- out ->chassis5065 .erpm [0]=u->final_out .final_VESC_5065_M1out ;
- out ->chassis5065 .erpm [1]=u->final_out .final_VESC_5065_M2out ;
-
+ out ->chassis5065 .erpm [0]= u->final_out .final_VESC_5065_M1out ;
+ out ->chassis5065 .erpm [1]= -u->final_out .final_VESC_5065_M2out ;
out ->chassis6020 .as_array [2]=u->final_out .final_pitchout ;
+
+
}
-int8_t UP_control(UP_t *u,CAN_Output_t *out)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
{
-// if(u ==NULL) return 0;
-// if(u ==NULL) return 0;
-// UP_M2006_angle(u,2500);
- switch (u->ctrl)
+
+ if(u ==NULL) return 0;
+ if(u ==NULL) return 0;
+
+ switch (c->CMD_CtrlType )
{
- case STATE_IDLE : break ;
- case STATE_PRE_DRIBBLE : break ;
- case STATE_POST_DRIBBLE : break ;
- case STATE_PRE_LAUNCH : break ;
- case STATE_POST_LAUNCH : break ;
+ case UP_RCcontrol: //在手动模式下
+
+ switch (c->CMD_UP_mode )
+ {
+
+ case Normal :
+
+ u->state .Pitch_flag =Not_started_Pit;
+ u->state .last_state = Not_started_Pit;
+
+ u->motor_target .go_shoot =0;
+ u->motor_target .M2006_angle =-140;
+
+ break;
+
+ case Pitch_pull :
+ if(u->state .last_state == Not_started_Pit)
+ {
+
+ u->motor_target .go_shoot =-300;
+ u->motor_target .M2006_angle =-140;
+
+ if(u->motorfeedback .GO_motor_info[0]->Pos < (-4.8)) //到达位置后再扣扳机
+ {
+ u->motor_target .M2006_angle =0;
+ if(u->motorfeedback .M2006.total_angle>-5)
+ {//避免没勾上就拉
+ u->motor_target .go_shoot =0;
+ u->state .Pitch_flag = Launch_Ready ;
+ u->state .last_state = Launch_Ready;
+
+ }
+
+ }
+ }
+
+ break ;
+ case Pitch_shoot :
+ if (u->state .last_state == Launch_Ready)
+ {
+
+ u->motor_target .M2006_angle =-140;
+ u->state .Pitch_flag = Done_Pit ;
+ u->state .last_state = Done_Pit;
+
+ }
+ {
+
+ }
+ break;
+
+
+
+ }
+ break;
+
+ case MID_NAVI :
+ {
+ }
+ break ;
+
+ case PICK_t :
+ {
+ }
+
+
+ break;
+
+ default:
+ break;
}
+
+
+
+
+
+
}
+
+
diff --git a/User/Module/up.h b/User/Module/up.h
index afc21a6..6630a7b 100644
--- a/User/Module/up.h
+++ b/User/Module/up.h
@@ -5,26 +5,47 @@
#include "struct_typedef.h"
#include "pid.h"
#include "bmi088.h"
-#include "map.h"
#include "user_math.h"
#include "ahrs.h"
#include "can_use.h"
#include "cmd.h"
#include "filter.h"
-#include "Action.h"
-#include "chassis.h"
#include "vofa.h"
#include "GO_M8010_6_Driver.h"
-
-typedef enum {
- STATE_IDLE, // 空闲状态
- STATE_PRE_DRIBBLE, // 运球前
- STATE_POST_DRIBBLE, // 运球后
- STATE_PRE_LAUNCH, // 发射前
- STATE_POST_LAUNCH // 发射后
-} OperationState;
+#include "bsp_usart.h"
+
+typedef enum
+{
+ Not_started_Pit=0,//未开始
+ Launch_Ready=1, //准备发射
+ Launch_complete=2,//发射完成
+ Done_Pit=3 //已完成
+
+}Pitch_flag_t;
+
+typedef enum{
+
+ Not_started_dri=0,//未开始
+ No_ball =1, //抓上无球
+ Have_ball_F=2, //刚开始有球
+ Have_ball_S=3, //中途有球
+ Done_dri =4 //已完成
+
+}Dribble_flag_t;
+
+/*运行控制中的控制*/
+typedef struct{
+
+ /*投球过程*/
+ Pitch_flag_t Pitch_flag;
+ /*运球过程*/
+ Dribble_flag_t Dribble_flag;
+
+ int last_state;
+
+} Oper_control_state_t;
typedef struct {
@@ -52,17 +73,18 @@ typedef struct {
float K_W;
}GO_param_t;
-
+/*角度环控制电机类型*/
typedef enum {
M2006 = 1,
M3508
+
} MotorType_t;
typedef struct
{
- /*该部分决定PID的参数整定在config中修改*/
+
pid_param_t VESC_5065_M1_param;
pid_param_t VESC_5065_M2_param;
@@ -73,6 +95,8 @@ typedef struct
pid_param_t M2006_angle_param;
pid_param_t M3508_speed_param;
+ pid_param_t M3508_angle_param;
+
GO_param_t go_param;
}UP_Param_t;
@@ -80,6 +104,7 @@ typedef struct
typedef struct
{
MotorType_t motor;
+
float orig_angle;
float last_angle;
int32_t round_cnt;
@@ -93,26 +118,30 @@ typedef struct{
uint8_t up_task_run;
const UP_Param_t *param;
- UP_Imu_t pos088;
- OperationState ctrl;
- motor_angle_data M2006;
- motor_angle_data M3508;
- GO_Motorfield *GO_motor_info[GO_NUM];//存放go电机数据
-
- struct{
-
+ UP_Imu_t pos088;
+
+ /*控制及状态*/
+ CMD_t *cmd;
+ Oper_control_state_t state;//上层机构的运行状态
+
+ struct{
fp32 rotor_pit6020ecd;
fp32 rotor_pit6020rpm;
fp32 VESC_5065_M1_rpm;
fp32 VESC_5065_M2_rpm;
- fp32 M2006_rpm;
- fp32 M2006_angle;
+ motor_angle_data M2006;
+ motor_angle_data M3508;
- fp32 M3508_speed[3];
+ GO_Motorfield *GO_motor_info[GO_NUM];//存放go电机数据
+ fp32 M3508_angle[4];
+ fp32 M3508_rpm [4];
+
+ int flag;
+
}motorfeedback;
@@ -125,7 +154,10 @@ typedef struct{
fp32 VESC_5065_M2_rpm;
fp32 M2006_angle;
- fp32 M3508_speed;
+ fp32 M3508_angle;
+
+ fp32 go_shoot;
+ fp32 go_spin;
}motor_target;
@@ -133,33 +165,35 @@ typedef struct{
pid_type_def GM6020_speed;
pid_type_def GM6020_angle;
+
pid_type_def VESC_5065_M1;
pid_type_def VESC_5065_M2;
+
pid_type_def M2006_angle;
pid_type_def M2006_speed;
- pid_type_def M3508_speed[3];
+
+ pid_type_def M3508_angle;
+ pid_type_def M3508_speed;
}pid;
-
-
-
/*经PID计算后的实际发送给电机的实时输出值*/
struct
{
- fp32 final_2006out;
- fp32 final_3508out[3];
+ fp32 final_3508out[4];
fp32 final_pitchout;
fp32 final_VESC_5065_M1out;
fp32 final_VESC_5065_M2out;
+
}final_out;
LowPassFilter2p_t filled[6]; /* 输出滤波器滤波器数组 */
fp32 vofa_send[8];
+
} UP_t;
@@ -167,12 +201,12 @@ typedef struct{
int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq);
-int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can) ;
+int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can, CMD_t *c) ;
int8_t GM6020_control(UP_t *u,fp32 angle);
int8_t VESC_M5065_Control(UP_t *u,fp32 speed);
int8_t GO_SendData(UP_t *u,int id,float pos);
-int8_t UP_angle(UP_t *u, fp32 target_angle) ;
-int8_t UP_control(UP_t *u,CAN_Output_t *out);
+int8_t UP_angle_control(UP_t *u, fp32 target_angle,MotorType_t motor);
+int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c);
int8_t ALL_Motor_Control(UP_t *u,CAN_Output_t *out);
int8_t UP_M2006_angle(UP_t *u,fp32 target_angle);
int8_t UP_M3508_speed(UP_t *u,fp32 speed);
diff --git a/User/device/Action.c b/User/device/Action.c
deleted file mode 100644
index 0277d8a..0000000
--- a/User/device/Action.c
+++ /dev/null
@@ -1,203 +0,0 @@
-
-/**
- * 东北大学ACTION码盘驱动
- *
- * 本驱动采用ops_9定位系统,负责收发码盘的原始数据,并在任务中解析出相应的位置坐标。
- * 解析后的位置坐标将被交给导航处理模块,生成期望的运动向量。
- *
- * 使用手册:
- * 请参阅相关文档了解如何使用本驱动。
- *
- * 注意:
- * 本驱动仅适用于东北大学ACTION码盘。
-
- *删去Action_HandleOffline错误处理函数中对结构体清0的函数
-
- */
-
-/* Includes ----------------------------------------------------------------- */
-#include "tim.h"
-#include "Action.h"
-#include
-
-static osThreadId_t thread_alert;
-
-
-uint8_t rxbuf[RS232_FRAME_LENGTH];
-
-static void Ops10msTimerCallback(void *arg){
- (void)arg;
- osThreadFlagsSet(thread_alert,SIGNAL_OPSTIMER_REDY);
-}
-
-/* Private function -------------------------------------------------------- */
-static void ACTION_IdleCallback(void) {
- osThreadFlagsSet(thread_alert,SIGNAL_ACTION_RAW_REDY);
-}
-
-/* Exported functions ------------------------------------------------------- */
-int8_t ACTIONRECV_Init(Action_POS_t *pos){
- if(pos == NULL) return DEVICE_ERR_NULL;
-
- pos->Action_ready =0;//码盘校准标志位初始化
-
- if((thread_alert = osThreadGetId()) == NULL ) return DEVICE_ERR_NULL;
- pos->action_timer_Id =
- osTimerNew(Ops10msTimerCallback, osTimerPeriodic,NULL,NULL);
-
- osTimerStart(pos->action_timer_Id,10);//此处ticks 理解为1个tick为1ms 此处为每10ms触发一次回调函数
-
- BSP_UART_RegisterCallback(BSP_UART_ACTION,BSP_UART_IDLE_LINE_CB,
- ACTION_IdleCallback);
-
- return DEVICE_OK;
-}
-
-int8_t ACTION_StartReceiving() {
- if (HAL_UARTEx_ReceiveToIdle_DMA(BSP_UART_GetHandle(BSP_UART_ACTION),
- (uint8_t *)rxbuf,
- sizeof(rxbuf)) == HAL_OK)
- return DEVICE_OK;
- return DEVICE_ERR;
-}
-
-bool_t ACTION_WaitDmaCplt(void) {
- return(osThreadFlagsWait(SIGNAL_ACTION_RAW_REDY, osFlagsWaitAll,400) ==
- SIGNAL_ACTION_RAW_REDY);
-}
-
-
-/* *
-
-
-*/
-int8_t ACTION_Parse(Action_POS_t *pos)
-{
- if (pos == NULL) return DEVICE_ERR_NULL;
-
- static union
- {
- fp32 pos_data[3];
- char rxbuff[12];
- } pos_rxbuf;
-
-
- if (rxbuf[0] == 0x0D && rxbuf[1] == 0x0A)
- {
- if (rxbuf[26] == 0x0A && rxbuf[27] == 0x0D)
- {
-
- pos_rxbuf.rxbuff[0]=rxbuf[2];
- pos_rxbuf.rxbuff[1]=rxbuf[3];
- pos_rxbuf.rxbuff[2]=rxbuf[4];
- pos_rxbuf.rxbuff[3]=rxbuf[5];
-
-
- pos_rxbuf.rxbuff[4]=rxbuf[14];
- pos_rxbuf.rxbuff[5]=rxbuf[15];
- pos_rxbuf.rxbuff[6]=rxbuf[16];
- pos_rxbuf.rxbuff[7]=rxbuf[17];
-
-
- pos_rxbuf.rxbuff[8]=rxbuf[18];
- pos_rxbuf.rxbuff[9]=rxbuf[19];
- pos_rxbuf.rxbuff[10]=rxbuf[20];
- pos_rxbuf.rxbuff[11]=rxbuf[21];
-
-
-
- // 数据解析
- pos->pos_yaw = pos_rxbuf.pos_data[0];
- // 按照安装方向决定正负号
- pos->pos_x = pos_rxbuf.pos_data[1];
- pos->pos_y = pos_rxbuf.pos_data[2];
-
- pos ->Action_ready =1;//码盘校准完成
- }
- }
- else
- {
- return -1;
- }
- return DEVICE_OK;
-}
-
-//该函数用来计算速度(利用获取的位置来计算相应的速度)
-//此处获取的是真实的位置(mm)后每10ms做一次微分处理
-int8_t ACTION_DataRefresh(Action_POS_t *pos){
- if (pos == NULL) return DEVICE_ERR_NULL;
-
- if (osThreadFlagsGet() & SIGNAL_OPSTIMER_REDY){
- osThreadFlagsClear(SIGNAL_OPSTIMER_REDY);
- //计算每毫秒的速度 该函数每10ms调用
- pos->pos_Vx = (pos->pos_x - pos->pos_lastX) / 10;
- pos->pos_Vy = (pos->pos_y - pos->pos_lastY) / 10;
-
- pos->pos_lastX = pos->pos_x;
- pos->pos_lastY = pos->pos_y;
- }
- return DEVICE_OK;
-}
-
-
-
-int8_t Action_HandleOffline(Action_POS_t *pos) {
- if (pos == NULL) return DEVICE_ERR_NULL;
-
- (void)pos;
-
-// memset(pos, 0, sizeof(*pos));
- return 0;
-}
-
-/* 将字符串拼接 */
-void Strcat(char str1[], char str2[], uint8_t num)
-{
- int i = 0, j = 0;
-
- while (str1[i] != '\0')
- i++;
-
- for (j = 0; j < num; j++)
- {
- str1[i++] = str2[j];
- }
-}
-
-/* 该部分函数用于码盘的重定位系统 */
-/* ----------------------------- */
-
-/* 手动标定,用于校正 */
-void ACT_Calibration(void)
-{
- HAL_UART_Transmit(&huart1, (uint8_t *)"ACTR", 4, 100);
-}
-
-/* 清零 */
-/* 将当前位置设置为 (0, 0) */
-void ACT_ZeroClear(void)
-{
- HAL_UART_Transmit(&huart1, (uint8_t *)"ACT0", 4, 100);
-}
-
-/* 更新 XY 坐标 */
-/* 将当前位置更新为指定的 X 和 Y */
-void ACT_UpdateXY(float pos_x, float pos_y)
-{
- char update_xy[12] = "ACTD"; // 命令前缀为 "ACTD"
- static union
- {
- float XY[2]; // 两个浮点数表示 X 和 Y 坐标
- char data[8]; // 将浮点数视为字节数据
- } set;
-
- set.XY[0] = pos_x;
- set.XY[1] = pos_y;
-
- Strcat(update_xy, set.data, 8);
-
- HAL_UART_Transmit(&huart1, (uint8_t *)update_xy, sizeof(update_xy), 100);
-}
-
-
-
diff --git a/User/device/Action.h b/User/device/Action.h
deleted file mode 100644
index c0b8186..0000000
--- a/User/device/Action.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef _ACTION_H_
-#define _ACTION_H_
-
-#define RS232_FRAME_LENGTH 28u
-#define REF_LEN_RX_BUFF 0xFF
-
-#include
-#include "device.h"
-#include "bsp_usart.h"
-#include "cmd.h"
-
-
-typedef struct
-{
- osTimerId_t action_timer_Id;
- /*原始数据*/
- fp32 pos_x;
- fp32 pos_y;
- fp32 pos_yaw; // 航向角速度
- /*处理数据*/
- fp32 pos_Vx;
- fp32 pos_Vy;
- fp32 pos_lastX;
- fp32 pos_lastY;
-
- int Action_ready;//码盘校准标志位
-
-
-}Action_POS_t;
-
-
-
-
-
-int8_t ACTIONRECV_Init(Action_POS_t*pos);
-
-int8_t ACTION_StartReceiving(void);
-
-bool_t ACTION_WaitDmaCplt(void);
-
-int8_t ACTION_Parse(Action_POS_t*pos);
-
-int8_t ACTION_DataRefresh(Action_POS_t*pos);
-
-int8_t Action_HandleOffline(Action_POS_t *pos);
-
-void ACT_UpdateXY(float pos_x,float pos_y);
-
-void ACT_ZeroClear(void);
-
-
-
-
-
-
-
-
-#endif
-
diff --git a/User/device/GO_M8010_6_Driver.h b/User/device/GO_M8010_6_Driver.h
index 265e862..b4bab93 100644
--- a/User/device/GO_M8010_6_Driver.h
+++ b/User/device/GO_M8010_6_Driver.h
@@ -8,6 +8,7 @@ extern "C"{
#include "usart.h"
#include "string.h"
#include
+#include "user_math.h"
#define GO_NUM 2
/**
* @brief
@@ -62,7 +63,8 @@ typedef struct {
float tar_w;
float T;
float W;
- float Pos;
+ float Pos;
+
int footForce;
uint8_t buffer[17];
uint8_t Rec_buffer[16];
diff --git a/User/device/cmd.c b/User/device/cmd.c
index 997135f..3e0fbad 100644
--- a/User/device/cmd.c
+++ b/User/device/cmd.c
@@ -8,79 +8,32 @@
/* Includes ----------------------------------------------------------------- */
#include "cmd.h"
#include "gpio.h"
-
+
#include
/* Private function -------------------------------------------------------- */
/*Export function --------------------------------------------------------------*/
-int8_t CMD_Init(CMD_t *cmd){
- /*若主结构体为空 自动返回错误 */
- if(cmd == NULL) return-1;
- /**/
- cmd->C_cmd.type =RC;
- cmd->C_cmd.mode =NORMAL;
-
-return 0;
-}
-
-
-static void CMD_RcLogic(const CMD_RC_t *rc, CMD_t *cmd) {
-
- /* 将操纵杆的对应值转换为底盘的控制向量和云台变化的欧拉角 */
-
- cmd->Vx = rc->ch_r_x;
- cmd->Vy = -rc->ch_r_y;
- cmd->Vw = rc->ch_l_x;
-
- cmd->poscamear = rc->ch_l_y;
-
- cmd->key_ctrl_l = rc->sw_l;
- cmd->key_ctrl_r = rc->sw_r ;
-
-}
-
-
-
-/**
- * @brief rc失控时机器人恢复放松模式
- *
- * @param cmd 主结构体
- */
-static void CMD_RcLostLogic(CMD_t *cmd){
- /* 机器人底盘运行模式恢复至放松模式 */
- cmd->C_cmd.mode = RELAXED;
-}
-int8_t CMD_ParseRc(CMD_t *cmd,CMD_RC_t *rc){
- if (cmd == NULL) return -1;
- if (rc == NULL) return -1;
- /*c当rc丢控时,恢复机器人至默认状态 */
- if ((rc->sw_l == CMD_SW_ERR) || (rc->sw_r == CMD_SW_ERR)) {
- CMD_RcLostLogic(cmd);
- } else {
- CMD_RcLogic(rc, cmd);
- }
-return 0;
-}
-
+/*nuc数据统一到cmd*/
int8_t CMD_ParseNuc(CMD_t *cmd,CMD_NUC_t *n){
if(cmd == NULL) return -1;
if(n == NULL) return -1;
- cmd->cmd_status = n->status_fromnuc;
- cmd->raw_status = n->ctrl_status;
+ cmd->NAVI_t .cmd_status = n->status_fromnuc;
+ cmd->NAVI_t .raw_status = n->ctrl_status;
for (int i = 0; i < 7; ++i)
{ // 从最低位到最高位遍历
- cmd->status[i] = ((cmd->raw_status) & (1 << i)) ? 1 : 0;
+ cmd->NAVI_t .status[i] = ((cmd->NAVI_t .raw_status) & (1 << i)) ? 1 : 0;
}
- switch(cmd->cmd_status){
+ switch(cmd->NAVI_t .cmd_status){
+
+ case PICK :
+ cmd ->NAVI_t .pick .posx =n->pick .posx ;
+ cmd ->NAVI_t .pick .posy =n->pick .posy ;
+ cmd ->NAVI_t .pick .posw =n->pick .posw ;
- case MID:
- cmd->C_navi.vx = n->navi.vx;
- cmd->C_navi.vy = n->navi.vy;
- cmd->C_navi.wz = n->navi.wz;
break;
@@ -88,108 +41,40 @@ int8_t CMD_ParseNuc(CMD_t *cmd,CMD_NUC_t *n){
return 0;
}
-
-
-/*
- 遥控器模式重新分配
-
- 这一部分没有设置具体的模式名,后期根据需要修改
- 遥控器模式(RC):
- 左按键 --- 右按键
- mode1
- up no_mode
- mode2
-
-
- mode3
- down no_mode
- mode4
-
- mid auto_navi(0x09)雷达导航
-
-*/
-int8_t CMD_CtrlSet(CMD_t *cmd) {
+/*遥控器,上下层通用,按键控制,统一到cmd*/
+int8_t CMD_ParseRC(CMD_t *cmd,const CMD_RC_t *rc) {
if(cmd == NULL) return -1;
- if(cmd->key_ctrl_l == CMD_SW_UP)//当左拨杆打到最上面时 强制使用遥控器控制
- {
- /*遥控器模式下,右按键三种状态分配*/
- if(cmd->key_ctrl_r==CMD_SW_UP)
- {
- cmd->C_cmd.type = RC;
- cmd->C_cmd.mode = RC_MODE1;
- }
- if(cmd->key_ctrl_r==CMD_SW_MID)
- {
- cmd->C_cmd.type = RC;
- cmd->C_cmd.mode = RC_NO_MODE;
- }
- if(cmd->key_ctrl_r==CMD_SW_DOWN)//遥控器控制模式下,右拨杆上时启动
- {
- cmd->C_cmd.type = RC;
- cmd->C_cmd.mode =RC_MODE2;
- }
-
- }
- else if(cmd->key_ctrl_l ==CMD_SW_DOWN)
+ if ((rc->sw_l == CMD_SW_ERR) || (rc->sw_r == CMD_SW_ERR)) {
+ cmd->CMD_CtrlType =RELAXED;
+ }
+ else if(rc->sw_l==CMD_SW_UP)
{
- if(cmd->key_ctrl_r==CMD_SW_UP)
- {
- cmd->C_cmd.type = RC;
- cmd->C_cmd.mode = RC_MODE3;
- }
- if(cmd->key_ctrl_r==CMD_SW_MID)
- {
- cmd->C_cmd.type = RC;
- cmd->C_cmd.mode = RC_NO_MODE;
- }
- if(cmd->key_ctrl_r==CMD_SW_DOWN)//遥控器控制模式下,右拨杆上时启动
- {
- cmd->C_cmd.type = RC;
- cmd->C_cmd.mode = RC_MODE4;
- }
-
+ cmd ->CMD_CtrlType =UP_RCcontrol;
+ if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_UP_mode =Normal; //左上,右上,投篮
+ if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_UP_mode =Pitch_pull; //左上,右中,无模式
+ if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =Pitch_shoot; //左上,右上,投篮
}
- else //左按键打到中间,自动模式
- {
- if( cmd->key_ctrl_l==CMD_SW_MID ){
- cmd->C_cmd.type = MID_NAVI;
- cmd->C_cmd.mode = RC_NO_MODE;
-
- switch(cmd->cmd_status)
-{
- case MID://雷达,视觉导航
- cmd->C_cmd.type = MID_NAVI;
- break;
- }
- }
-
- }
-return 0;
-}
-//接收码盘导航的返回数据,传入cmd_t结构体
-int8_t CMD_ParseAction(CMD_t *cmd,CMD_ACTION_t *act)
-{
- if(cmd == NULL) return -1;
- if(act == NULL) return -1;
-
- if(cmd->key_ctrl_l ==CMD_SW_MID )
+
+ else if(rc->sw_l==CMD_SW_MID)
{
- if(cmd->key_ctrl_r == CMD_SW_UP)
- act->flag =1;
-
- if(cmd->key_ctrl_r == CMD_SW_DOWN )
- act->flag =-1;
- }
-
- cmd->C_navi .vx =act ->out .Vx ;
- cmd ->C_navi .vy =act ->out .Vy ;
- cmd ->C_navi .wz =act ->out .Vw ;
+ if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_CtrlType =MID_NAVI;; //左中,右上,雷达
+ if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_UP_mode =Normal; //左中,右中,无模式
+ if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =Dribble; //左中,右上,运球
-
- return 0;
+ }
+ else if(rc->sw_l==CMD_SW_DOWN)
+ {
+ cmd ->CMD_CtrlType =PICK_t;
+ if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_UP_mode =Normal; //左下,右上,投篮
+ if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_UP_mode =Normal; //左下,右中,无模式
+ if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =Normal; //左下,右上,投篮
+ }
+
+ return 0;
}
+
diff --git a/User/device/cmd.h b/User/device/cmd.h
index a412f6e..8f064b1 100644
--- a/User/device/cmd.h
+++ b/User/device/cmd.h
@@ -1,19 +1,3 @@
-/*
-
-该任务用于接收来自各个不同的控制方式所期望的控制指令 将其集中统一化后分发给各个模块
-
-*/
-
-
-/*
- 按键控制逻辑
- RC模式,左按键打到最上,右按键启用,中间无状态,上下各代表模式1、模式2
- 雷达导航,左按键打到中间,右按键禁用
- 左按键打到下面,保留,未启用
-
-*/
-
-
#ifndef _CMD_H
@@ -23,38 +7,45 @@
#define MID (0x09)
+#define PICK (0x06)
typedef enum{
- RC,//遥控器控制,左按键上
+ UP_RCcontrol,//遥控器控制,左按键上,控制上层
MID_NAVI,//雷达导航
- }CMD_Chassis_CtrlType_e;
+ PICK_t,
+ RELAXED,//异常模式
+
+ }CMD_CtrlType_t;
typedef enum{
- RELAXED,//异常模式
- NORMAL,
- GYRO_STAY,
-
- RC_MODE1,
- RC_NO_MODE,
- RC_MODE2,
-
- RC_MODE3,
- RC_MODE4,
-
- AUTO_NAVI
- }CMD_Chassis_mode_e;
-/*该结构体负责接收和解析地盘模块所需要的控制指令*/
-typedef struct{
-
- CMD_Chassis_CtrlType_e type;
-
- CMD_Chassis_mode_e mode;
-
-
-}CMD_Chassis_Ctrl_t;
-
+
+ Normal, //无模式
+ Dribble , //运球
+ Pitch_pull , //投篮
+ Pitch_shoot , //投篮
+ }CMD_UP_mode_t;
+typedef struct {
+ uint8_t status_fromnuc;
+ uint8_t ctrl_status; //取其中每一个二进制位用作通信
+ struct
+ {
+ fp32 vx;
+ fp32 vy;
+ fp32 wz;
+ }navi;
+ struct
+ {
+ fp32 posx;
+ fp32 posy;
+ fp32 posw;
+ }pick;
+ struct
+ {
+ fp32 angle;
+ }sick_cali;
+} CMD_NUC_t;
/* 拨杆位置 */
typedef enum {
CMD_SW_ERR = 0,
@@ -82,102 +73,38 @@ typedef struct {
} __attribute__((packed))CMD_RC_t;
-typedef struct
- {
- fp32 Vx;
- fp32 Vy;
- fp32 Vw;
- }OpsHopeVector_t;
-
-
-typedef struct
- {
- fp32 x;
- fp32 y;
- fp32 z;
- int cnt_point;//计数点
- }ops_point;
-
-
typedef struct {
-
- OpsHopeVector_t out;
-
- int flag;//传递flag触发标志位
-
-} CMD_ACTION_t;
-
-typedef struct {
- uint8_t status_fromnuc;
- uint8_t ctrl_status; //取其中每一个二进制位用作通信
- struct
- {
- fp32 vx;
- fp32 vy;
- fp32 wz;
- }navi;
- struct
- {
- fp32 posx;
- fp32 posy;
- fp32 posw;
- }pick;
- struct
- {
- fp32 angle;
- }sick_cali;
-} CMD_NUC_t;
-
-typedef struct{
- fp32 posy;
- fp32 posx;
- fp32 posw;
-}CMD_FOR_PICK;
-typedef struct {
- fp32 vx;
- fp32 vy;
- fp32 wz;
-
-
-}CMD_FOR_NAVI;
-
-typedef struct {
- uint8_t cmd_status;
- uint8_t raw_status;
-
- uint8_t status[7];
-
- fp32 Vx;
- fp32 Vy;
- fp32 Vw;
-
- fp32 poscamear;
-
fp32 key_ctrl_l;
fp32 key_ctrl_r;
-
- fp32 forsick_wz;
- CMD_Chassis_Ctrl_t C_cmd;
- CMD_FOR_NAVI C_navi;
+ /*视觉*/
+ struct {
+ uint8_t cmd_status;
+ uint8_t raw_status;
+ uint8_t status[7];
+ struct
+ {
+ fp32 posx;
+ fp32 posy;
+ fp32 posw;
+ }pick;
+
+ }NAVI_t;
+
+
+ CMD_UP_mode_t CMD_UP_mode;
+ CMD_CtrlType_t CMD_CtrlType;
+
} CMD_t;
-int8_t CMD_Init(CMD_t *cmd);
-
-int8_t CMD_ParseRc(CMD_t *cmd,CMD_RC_t *rc);
-
-int8_t CMD_ParseAction(CMD_t *cmd,CMD_ACTION_t *act);
-
+/*nuc数据统一到cmd*/
int8_t CMD_ParseNuc(CMD_t *cmd,CMD_NUC_t *n);
-
-int8_t CMD_SwitchStatus(CMD_t *cmd);
-
-int8_t CMD_CtrlSet(CMD_t *cmd);
+int8_t CMD_ParseRC(CMD_t *cmd,const CMD_RC_t *rc) ;
#endif
diff --git a/User/task/action_task.c b/User/task/action_task.c
deleted file mode 100644
index cae95a2..0000000
--- a/User/task/action_task.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- 码盘解析任务
-
- 处理码盘测量的实际距离
-
- 将需要的数据共享给其他的线程
-
-*/
-#include "action_task.h"
-#include "Action.h"
-#include "user_task.h"
-
-
-#ifdef DEBUG
-
-Action_POS_t pos;
-#else
-
-static Action_POS pos;
-
-#endif
-
-void Task_action(void *argument)
-{
- (void)argument;
-// osDelay(TASK_INIT_DELAY_ACTION);
-
- const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_ACTION;
-
-
- ACTIONRECV_Init(&pos);
-
-
- uint32_t tick = osKernelGetTickCount(); /* 获取当前控制任务运行频率的tick*/
-
- while (1)
- {
-#ifdef DEBUG
- /* 记录任务使用的的栈空闄*/
- task_runtime.stack_water_mark.action =
- osThreadGetStackSpace(osThreadGetId());
-#endif
- ACTION_StartReceiving();
- ACTION_DataRefresh(&pos);
-
-
-
- /* 使用下面的错误处理函数遇到一些问题
- 每10ms置标志位, ACTION_WaitDmaCplt 判断此标志位,通过后会执行速度计算
- 根据计算,任务运行频率大于中断产生频率,每一次运行判断标志位不通过,会导致结构体内数据清0的操作
- 目前的处理方法:注释掉Action_HandleOffline函数中,对结构体数据清零的函数memset
-
-
- */
-
- if(ACTION_WaitDmaCplt()){
-
- ACTION_Parse(&pos);
-
- }
- else{
- Action_HandleOffline(&pos);
- }
-
-
- //将解算后的码盘位置值放入消息队列供其他任务使用
- osMessageQueueReset(task_runtime.msgq.cmd.raw.Action);
- osMessageQueuePut(task_runtime.msgq.cmd.raw.Action,(&pos),0,0);
-
-
- tick += delay_tick; /* 计算下一个唤醒时刻*/
- osDelayUntil(tick);
- }
-}
-
diff --git a/User/task/action_task.h b/User/task/action_task.h
deleted file mode 100644
index 8b13789..0000000
--- a/User/task/action_task.h
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/User/task/chassis_task.c b/User/task/chassis_task.c
deleted file mode 100644
index e5ee151..0000000
--- a/User/task/chassis_task.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- 底盘控制任务
-*/
-/* Includes ----------------------------------------------------------------- */
-
-#include "Chassis.h"
-#include "user_task.h"
-#include "can_use.h"
-#include
-#include "up.h"
-#include "vofa.h"
-
-static CAN_t can;
-
-
-
-#ifdef DEBUG
-
-CAN_Output_t out;
-
-Chassis_t chassis ;
-
-CMD_t ctrl;
-
-UP_t upp;
-#else
-
-static CAN_Output_t out;
-
-static Chassis_t chassis;
-
-static Chassis_Ctrl_t ctrl;
-
-static UP_t upp;
-
-
-#endif
-
-
-
-/**
- * \brief 底盘任务
- *
- * \param argument
- */
-void Task_Chassis(void *argument)
-{
-
- (void)argument; /* 未使用argument,消除警告*/
- const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_UP;
-
-
- uint32_t tick = osKernelGetTickCount();
-//
-//
-//// HAL_GPIO_WritePin(FlagForUpper_GPIO_Port,FlagForUpper_Pin,GPIO_PIN_RESET); //拉低电平 避免未清除
-//
- while(1)
- {
-#ifdef DEBUG
- task_runtime.stack_water_mark.chassis = osThreadGetStackSpace(osThreadGetId());
-#endif
-
-// /*imu数据获取*/
-// osMessageQueueGet(task_runtime.msgq.imu.eulr, &chassis.pos088.imu_eulr, NULL, 0);
-//
-// osMessageQueueGet(task_runtime.msgq.imu.gyro, &chassis.pos088.bmi088.gyro,NULL, 0);
-//
-// osMessageQueueGet(task_runtime.msgq.imu.accl, &chassis.pos088.bmi088.accl,NULL, 0);
-// /*can上设备数据获取*/
-// osMessageQueueGet(task_runtime.msgq.can.feedback.CAN_feedback, &can, NULL, 0);
-//
-// osMessageQueueGet(task_runtime.msgq.cmd.raw.Action, &chassis.Action_pos , NULL, 0);
-
- /*底盘控制信息获取,目前dji遥控器*/
- osMessageQueueGet(task_runtime.msgq.cmd.chassis,&ctrl, NULL, 0);
-
- /*锁定RTOS(实时操作系统)内核,防止任务切换,直到 osKernelUnlock() 被调用*/
-// osKernelLock();
-
- /*更新电机反馈 */
- Chassis_UpdateFeedback(&chassis, &can);
-
- /*底盘控制*/
- Chassis_Control(&chassis,&ctrl,&out);
-
- /*解锁*/
-// osKernelUnlock();
-
- tick += delay_tick;
- osDelayUntil(tick);
- }
-
-}
diff --git a/User/task/chassis_task.h b/User/task/chassis_task.h
deleted file mode 100644
index 98ed1de..0000000
--- a/User/task/chassis_task.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef CHASSIS_TASK_H
-
-
-#define CHASSIS_TASK_H
-
-
-
-
-
-
-
-
-
-extern void Task_Chassis(void *argument);
-
-
-
-
-
-
-
-#endif
-
diff --git a/User/task/cmd_task.c b/User/task/cmd_task.c
index 83bd681..94730ad 100644
--- a/User/task/cmd_task.c
+++ b/User/task/cmd_task.c
@@ -4,16 +4,14 @@
#ifdef DEBUG
CMD_t cmd;
-CMD_RC_t rc_ctrl;
CMD_NUC_t Nuc;
-CMD_ACTION_t cmd_ops_out;
+CMD_RC_t rc_ctrl;
#else
static CMD_t cmd;
-static CMD_RC_t rc_ctrl;
static CMD_NUC_t Nuc;
-static CMD_ACTION_t cmd_ops_out;
+static CMD_RC_t rc_ctrl;
#endif
@@ -26,7 +24,6 @@ void Task_cmd(void *argument){
/* 计算到下一次调度任务所需要的tick数 */
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_CTRL_CMD;
/**/
- CMD_Init(&cmd);
uint32_t tick = osKernelGetTickCount(); /*控制任务运行频率的计时 */
while(1){
@@ -40,25 +37,17 @@ void Task_cmd(void *argument){
/*将各任务接收到的原始数据解析为通用的控制命令*/
-
-
- /*注意,不能将nuc和码盘导航一块使用*/
+ if(osMessageQueueGet(task_runtime.msgq.cmd.raw.rc, &rc_ctrl, 0, 0) == osOK)//遥控器
+ CMD_ParseRC(&cmd, &rc_ctrl);
if(osMessageQueueGet(task_runtime.msgq.cmd.raw.nuc, &Nuc,0 ,0) ==osOK) //nuc
CMD_ParseNuc(&cmd,&Nuc);
-
- CMD_CtrlSet(&cmd);
-
- if(osMessageQueueGet(task_runtime.msgq.cmd.raw.rc, &rc_ctrl, 0, 0) == osOK)//遥控器
- CMD_ParseRc(&cmd, &rc_ctrl);
-
- if(osMessageQueueGet(task_runtime.msgq.cmd.raw .ops_9_out , &cmd_ops_out, 0, 0) == osOK)//码盘
- CMD_ParseAction (&cmd ,&cmd_ops_out);
+
osKernelUnlock(); /* 同上 解锁RTOS内核 */
- /*将需要与其他任务共享的数据放到消息队列里 此处主要分享给底盘 后续会添加和上层机构的通信 */
- osMessageQueueReset(task_runtime.msgq.cmd.chassis);
- osMessageQueuePut(task_runtime.msgq.cmd.chassis,&cmd,0,0);
+ osMessageQueueReset(task_runtime.msgq.cmd.up_ctrl);
+
+ osMessageQueuePut(task_runtime.msgq.cmd.up_ctrl,&cmd,0,0);
tick += delay_tick; /*计算下一个唤醒时刻*/
osDelayUntil(tick); /*绝对延时 等待下一个唤醒时刻 */
diff --git a/User/task/init.c b/User/task/init.c
index 54d4c71..d2cbadb 100644
--- a/User/task/init.c
+++ b/User/task/init.c
@@ -11,7 +11,6 @@
#include "task\user_task.h"
#include "can_use.h"
#include "cmd.h"
-#include "Action.h"
/* Private typedef ---------------------------------------------------------- */
/* Private define ----------------------------------------------------------- */
@@ -86,6 +85,8 @@ void Task_Init(void *argument) {
osMessageQueueNew(3u, sizeof(CMD_RC_t), NULL);
task_runtime.msgq.cmd.raw.nuc =
osMessageQueueNew(3u,sizeof(CMD_NUC_t), NULL);
+ task_runtime.msgq.cmd.up_ctrl =
+ osMessageQueueNew(3u,sizeof(CMD_t), NULL);
osKernelUnlock();
osThreadTerminate(osThreadGetId()); /* 结束自身 */
diff --git a/User/task/navi_task.c b/User/task/navi_task.c
deleted file mode 100644
index 78dba44..0000000
--- a/User/task/navi_task.c
+++ /dev/null
@@ -1,68 +0,0 @@
-#include "user_task.h"
-#include "navi.h"
-#include "map.h"
-
-#ifdef DEBUG
-ops_t o;
-Action_POS_t pos_get;
-CMD_ACTION_t ops_out;//经过导航算法解算后输出的期望控制值
-
-#else
-
-static ops_t o;
-static Action_POS_t pos_get;
-static CMD_ACTION_t ops_out;
-
-
-#endif
-
-
-void Task_Navi(void *argument){
-
- (void)argument;
-
- const uint32_t delay_tick = osKernelGetTickFreq() /TASK_FREQ_NAVI;
-
- Action_init(&o,&(task_runtime.config.chassis_config->ops),&pos_get);
-
-
- uint32_t tick = osKernelGetTickCount(); /* 获取当前控制任务运行频率的tick*/
-
- while (1)
- {
-#ifdef DEBUG
- /* 记录任务使用的的栈空间 */
- task_runtime.stack_water_mark.action =
- osThreadGetStackSpace(osThreadGetId());
-#endif
- osMessageQueueGet(task_runtime.msgq.imu.gyro,&o.ops_gyro,NULL,0);
-
- osMessageQueueGet(task_runtime.msgq.imu.eulr,&o.ops_imu_pos,NULL,0);
-
- osMessageQueueGet(task_runtime.msgq.cmd .raw .Action ,&pos_get,NULL,0);
-
- go_path(&o,&ops_out);
-
- //将解算后的导航期望运动值放入消息队列供其他任务使用
- osMessageQueueReset(task_runtime.msgq.cmd.raw.ops_9_out);
- osMessageQueuePut(task_runtime.msgq.cmd.raw.ops_9_out,(&ops_out),0,0);
-
- tick += delay_tick; /* 计算下一个唤醒时刻*/
- osDelayUntil(tick);
- }
-
-}
-
-
-
-
-//
-//
-//
-//
-//
-//
-//
-
-
-
diff --git a/User/task/navi_task.h b/User/task/navi_task.h
deleted file mode 100644
index 6f01d09..0000000
--- a/User/task/navi_task.h
+++ /dev/null
@@ -1 +0,0 @@
-#include "navi.h"
\ No newline at end of file
diff --git a/User/task/nuc_task.c b/User/task/nuc_task.c
index 4956f3b..98d9c81 100644
--- a/User/task/nuc_task.c
+++ b/User/task/nuc_task.c
@@ -6,6 +6,8 @@
NUC_t nuc_raw;
CMD_NUC_t cmd_fromnuc;
#else
+static NUC_t nuc_raw;
+static CMD_NUC_t cmd_fromnuc;
#endif
diff --git a/User/task/up_task.c b/User/task/up_task.c
index 7634fe9..1fe2e44 100644
--- a/User/task/up_task.c
+++ b/User/task/up_task.c
@@ -10,7 +10,7 @@
#include "vofa.h"
-static CAN_t can;
+static CAN_t can;
#ifdef DEBUG
@@ -19,6 +19,7 @@ CAN_Output_t UP_CAN_out;
UP_t UP ;
+CMD_t up_cmd;
#else
@@ -27,6 +28,7 @@ static CAN_Output_t up_can_out;
static UP_t UP;
+static CMD_t up_cmd;
#endif
float aaa=0;
@@ -53,21 +55,21 @@ void Task_up(void *argument)
#ifdef DEBUG
task_runtime.stack_water_mark.up = osThreadGetStackSpace(osThreadGetId());
#endif
- UP_UpdateFeedback(&UP, &can) ;
+ UP_UpdateFeedback(&UP, &can,&up_cmd) ;
// GM6020_control(&UP, 100) ;
- UP_angle(&UP, bbb);
// UP_M3508_speed(&UP, 500);
-
-
+// UP_angle_control(&UP,0,M2006);
+//
+//
// VESC_M5065_Control(&UP, 20000);
-
- GO_SendData(&UP, 1,CCC);
- GO_SendData(&UP, 0,aaa);
-
- ALL_Motor_Control(&UP,&UP_CAN_out);
+//
+// GO_SendData(&UP, 1,CCC);
+// GO_SendData(&UP, 0,aaa);
+ UP_control(&UP,&UP_CAN_out,&up_cmd);
+ ALL_Motor_Control(&UP,&UP_CAN_out);
osDelay(1);
@@ -81,7 +83,8 @@ void Task_up(void *argument)
/*can上设备数据获取*/
osMessageQueueGet(task_runtime.msgq.can.feedback.CAN_feedback, &can, NULL, 0);
-
+ osMessageQueueGet(task_runtime.msgq.cmd .up_ctrl , &up_cmd, NULL, 0);
+
/*锁定RTOS(实时操作系统)内核,防止任务切换,直到 osKernelUnlock() 被调用*/
osKernelLock();
diff --git a/User/task/user_task.h b/User/task/user_task.h
index c045325..0741e55 100644
--- a/User/task/user_task.h
+++ b/User/task/user_task.h
@@ -42,16 +42,12 @@ typedef struct {
/* 任务 */
struct {
osThreadId_t atti_esti;
-// osThreadId_t chassis;
osThreadId_t dr16;
-// osThreadId_t action_ops;
osThreadId_t up;
+ osThreadId_t nuc;
-// osThreadId_t ai;
osThreadId_t can;
osThreadId_t cmd;
- osThreadId_t nuc;
-// osThreadId_t navi;
osThreadId_t error_detect;
} thread;
@@ -66,14 +62,12 @@ typedef struct {
struct {
struct {
osMessageQueueId_t rc;
- osMessageQueueId_t nuc;
+ osMessageQueueId_t nuc;
+
osMessageQueueId_t eulr;/*姿态结算得到的欧拉角*/
- osMessageQueueId_t Action;
- osMessageQueueId_t ops_9_out;
-
}raw;
- osMessageQueueId_t chassis;
+ osMessageQueueId_t up_ctrl;
osMessageQueueId_t status;
} cmd;
/* can任务放入、读取,电机或电容的输入输出 */
@@ -108,40 +102,29 @@ typedef struct {
UBaseType_t can;
UBaseType_t atti_esti;
UBaseType_t dr16;
- UBaseType_t action;
UBaseType_t cmd;
- UBaseType_t nuc;
- UBaseType_t navi;
UBaseType_t error_detect;
+ UBaseType_t nuc;
UBaseType_t up;
} stack_water_mark; /* stack使用 */
struct {
-// float chassis;
float can;
float atti_esti;
float r12ds;
float cmd;
- float nuc;
-// float action;
-// float navi;
float error_detect;
float up;
} freq; /* 任务运行频率 */
struct {
-// float chassis;
float can;
float atti_esti;
-// float ai;
float r12ds;
float cmd;
- float nuc;
-// float navi;
-// float action;
float error_detect;
float up;
@@ -156,21 +139,15 @@ extern const osThreadAttr_t attr_init;
extern const osThreadAttr_t attr_atti_esti;
-//extern const osThreadAttr_t attr_chassis;
-
extern const osThreadAttr_t attr_can;
extern const osThreadAttr_t attr_cmd;
-//extern const osThreadAttr_t attr_ops_9pos;
-
-extern const osThreadAttr_t attr_nuc;
-
extern const osThreadAttr_t attr_error_detect;
extern const osThreadAttr_t attr_dr16;
-//extern const osThreadAttr_t attr_navi;
+extern const osThreadAttr_t attr_nuc;
extern const osThreadAttr_t attr_up;
/* Exported functions prototypes -------------------------------------------- */
@@ -178,20 +155,14 @@ void Task_Init(void *argument);
void Task_AttiEsti(void *argument);
-//void Task_Chassis(void *argument);
-
void Task_can(void *argument);
void Task_cmd(void *argument);
-void Task_nuc(void *argument);
-
-//void Task_action(void *argument);
-
-//void Task_Navi(void *argument);
-
void Task_up(void *argument);
+void Task_nuc(void *argument);
+
void Task_error_detect(void *argument);
void Task_dr16(void *argument);