diff --git a/Core/Src/main.c b/Core/Src/main.c index 8fca7f2..f48044b 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/AUTO_CHASSIS.uvoptx b/MDK-ARM/AUTO_CHASSIS.uvoptx index 773efef..528face 100644 --- a/MDK-ARM/AUTO_CHASSIS.uvoptx +++ b/MDK-ARM/AUTO_CHASSIS.uvoptx @@ -1144,30 +1144,6 @@ 0 0 0 - ..\User\task\action_task.c - action_task.c - 0 - 0 - - - 8 - 72 - 1 - 0 - 0 - 0 - ..\User\task\navi_task.c - navi_task.c - 0 - 0 - - - 8 - 73 - 1 - 0 - 0 - 0 ..\User\task\r12ds_task.c r12ds_task.c 0 @@ -1183,7 +1159,7 @@ 0 9 - 74 + 72 1 0 0 @@ -1195,7 +1171,7 @@ 9 - 75 + 73 1 0 0 @@ -1207,7 +1183,7 @@ 9 - 76 + 74 1 0 0 @@ -1219,7 +1195,7 @@ 9 - 77 + 75 1 0 0 @@ -1231,7 +1207,7 @@ 9 - 78 + 76 1 0 0 @@ -1243,7 +1219,7 @@ 9 - 79 + 77 1 0 0 @@ -1253,18 +1229,6 @@ 0 0 - - 9 - 80 - 1 - 0 - 0 - 0 - ..\User\Algorithm\navi.c - navi.c - 0 - 0 - @@ -1275,7 +1239,7 @@ 0 10 - 81 + 78 1 0 0 @@ -1287,7 +1251,7 @@ 10 - 82 + 79 1 0 0 @@ -1299,7 +1263,7 @@ 10 - 83 + 80 1 0 0 @@ -1311,7 +1275,7 @@ 10 - 84 + 81 1 0 0 @@ -1323,7 +1287,7 @@ 10 - 85 + 82 1 0 0 @@ -1335,7 +1299,7 @@ 10 - 86 + 83 1 0 0 @@ -1347,19 +1311,7 @@ 10 - 87 - 1 - 0 - 0 - 0 - ..\User\device\Action.c - Action.c - 0 - 0 - - - 10 - 88 + 84 1 0 0 @@ -1379,7 +1331,7 @@ 0 11 - 89 + 85 1 0 0 @@ -1391,7 +1343,7 @@ 11 - 90 + 86 1 0 0 @@ -1403,7 +1355,7 @@ 11 - 91 + 87 1 0 0 @@ -1423,7 +1375,7 @@ 0 12 - 92 + 88 1 0 0 @@ -1443,7 +1395,7 @@ 0 13 - 93 + 89 1 0 0 @@ -1455,7 +1407,7 @@ 13 - 94 + 90 1 0 0 @@ -1467,7 +1419,7 @@ 13 - 95 + 91 1 0 0 @@ -1479,7 +1431,7 @@ 13 - 96 + 92 1 0 0 diff --git a/MDK-ARM/AUTO_CHASSIS.uvprojx b/MDK-ARM/AUTO_CHASSIS.uvprojx index 80c2dc2..77e8f73 100644 --- a/MDK-ARM/AUTO_CHASSIS.uvprojx +++ b/MDK-ARM/AUTO_CHASSIS.uvprojx @@ -1228,16 +1228,6 @@ 1 ..\User\task\dr16_task.c - - action_task.c - 1 - ..\User\task\action_task.c - - - navi_task.c - 1 - ..\User\task\navi_task.c - r12ds_task.c 1 @@ -1278,11 +1268,6 @@ 1 ..\User\Algorithm\pid.c - - navi.c - 1 - ..\User\Algorithm\navi.c - @@ -1318,11 +1303,6 @@ 1 ..\User\device\dr16.c - - Action.c - 1 - ..\User\device\Action.c - r12ds.c 1 diff --git a/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf b/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf index 56467b5..4ba7c53 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/Algorithm/navi.c b/User/Algorithm/navi.c deleted file mode 100644 index 4b898d1..0000000 --- a/User/Algorithm/navi.c +++ /dev/null @@ -1,216 +0,0 @@ -#include "navi.h" - - -//导航初始化一系列参数 -int8_t Action_init(ops_t *o , const ops_param_t *param , Action_POS_t *pos) -{ - if(o ==NULL) return DEVICE_ERR; - if(param == NULL) return DEVICE_ERR; -// while(!Action_ready) -// { -// TIM4->CCR3 = 9999;//等待全场定位初始化 -// } - -// TIM4->CCR3 = 0; - HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_SET);//接收到码盘数据后亮灯指示 -// - -// osDelay(5); - - o->param = param; - /*全场定位pid初始化*/ - //全场定位跑路径的xy方向速度环pid - PID_init(&o->pid_PosSpeed_x, PID_POSITION,(&o->param->ops_pid.pid_PosSpeed_x_param)); - PID_init(&o->pid_PosSpeed_y, PID_POSITION,(&o->param->ops_pid.pid_PosSpeed_y_param)); - /* 初始化角度纠正PID */ - PID_init(&o->pid_OutAngle,PID_POSITION,(&o->param->ops_pid.pid_OutAngle_param));//外环 - PID_init(&o->pid_InnerAngle,PID_POSITION,(&o->param->ops_pid.pid_InnerAngle_param));//内环 - //底盘xy方向位置环pid初始化 - //内环 - PID_init(&o->pid_pos_x_inner,PID_POSITION,(&o->param->ops_pid.pid_pos_x_inner_param)); - PID_init(&o->pid_pos_y_inner,PID_POSITION,(&o->param->ops_pid.pid_pos_y_inner_param)); - //外环 - PID_init(&o->pid_pos_x_out,PID_POSITION,(&o->param->ops_pid.pid_pos_x_out_param)); - PID_init(&o->pid_pos_y_out,PID_POSITION,(&o->param->ops_pid.pid_pos_y_out_param)); - - - - //底盘路径速度pid初始化 - PID_init(&o->path_speed_pid,PID_POSITION,(&o->param->ops_pid.path_speed_pid_param)); - //全场定位底盘坐标初始化 - o->chassis_pos->pos_x=0; - o->chassis_pos->pos_y=0; - o->chassis_pos->pos_lastX=0; - o->chassis_pos->pos_lastY=0; - o->chassis_map =param->path ; - o->chassis_pos = pos; - - - //设置全场定位允许的误差范围 - o->state.mistake = POS_ALLOW_MISTAKE; - o->state .angle_mistake =POS_ALLOW_ANGLE_MISTAKE ; - o->state.moveState = START; - o->state.points_num = param->path_num; - //标志位初始化 - o->POS_IS_CPT = NO; - - - - - return DEVICE_OK; -} -//利用C板imu纠正角度 -fp32 ops9_AngleCorr(ops_t *o,fp32 hope_angle) -{ - fp32 delta_angle,delta_w; - //外环角度纠正 - delta_angle = PID_calc(&o->pid_OutAngle,o->ops_imu_pos.yaw,hope_angle); - //内环速度纠正 - delta_w = -PID_calc(&o->pid_InnerAngle,o->ops_gyro.z,delta_angle); - return delta_w; -} - -//底盘xy速度计算(全场定位) -void POS_chassis_set(ops_t *o,fp32 vx_set, fp32 vy_set, fp32 yaw_angle_set){ - - - o->final_out.vx = (PID_calc(&o->pid_PosSpeed_x, o->chassis_pos->pos_Vx,vx_set));//根据遥控器的方向选择正负 - o->final_out.vy = PID_calc(&o->pid_PosSpeed_y, o->chassis_pos->pos_Vy,vy_set); - o->final_out.yaw_angle = ops9_AngleCorr(o,yaw_angle_set); - - -} - - -//定点控制 -void hold_point(ops_t *o,point_t p,fp32 yaw_angle_set) -{ - fp32 delta_x,delta_y; - fp32 delta_vx,delta_vy; - fp32 vx_set,vy_set;//x,y,w目标速度 - - //x - delta_x = PID_calc(&o->pid_pos_x_out,o->chassis_pos->pos_x,p.x); - delta_vx = PID_calc(&o->pid_pos_x_inner,o->chassis_pos->pos_Vx,delta_x); - - //y - delta_y = PID_calc(&o->pid_pos_y_out,o->chassis_pos->pos_y,p.y); - delta_vy = PID_calc(&o->pid_pos_y_inner,o->chassis_pos->pos_Vy,delta_y); - - - - - vx_set = delta_vx; - vy_set = delta_vy; - - POS_chassis_set(o,vx_set,vy_set,yaw_angle_set); -} - - - - -//判断是否到达函数(全场定位),最最后判断 -bool isArrive(point_t p,ops_t *o) -{ - uint16_t xArrive = 0, yArrive = 0, zArrive=0; - - xArrive = abs_float_double(p.x,o->chassis_pos->pos_x) < o->state.mistake ? 1:0; - yArrive = abs_float_double(p.y,o->chassis_pos->pos_y) < o->state.mistake ? 1:0; - - if(xArrive && yArrive) return true; - else return false; -} - - - - -//寻迹,跑点函数 -int8_t go_path(ops_t *o,CMD_ACTION_t *ops_out) -{ - static fp32 distance;//两点之间的距离差 - static fp32 chassis_speed_set;//底盘速度设置 - static fp32 SIN,COS;//方向解算 - static fp32 world_vx,world_vy;//x,y方向分解速度 - static fp32 chassis_vx,chassis_vy;//底盘xy分速度 - static int cnt =0 ;//计数标志位 - - static int flag_update_num;//记录flag更新,防止cnt一直变化 - - /*数据同步*/ - o->current_x =o->chassis_pos ->pos_x ; - o->current_y =o->chassis_pos ->pos_y ; - o->next_mapx = o->chassis_map[cnt].x; - o->next_mapy =o->chassis_map[cnt].y; - - - o->Navi_Mode .Trig_flag = ops_out ->flag ; - - if(o == NULL) return DEVICE_ERR; - if (ops_out == NULL) return DEVICE_ERR; - -// static fp32 yaw_angle_set = 0; - if(o->POS_IS_CPT == NO)//路径未跑完 - { - if(o->state.moveState ==START) - { - //更新路径状态 - o->state.moveState =MOVING; - } - - - distance = sqrt((o->chassis_map[cnt].x - o->chassis_pos->pos_x)*(o->chassis_map[cnt].x - o->chassis_pos->pos_x) - +(o->chassis_map[cnt].y - o->chassis_pos->pos_y)*(o->chassis_map[cnt].y - o->chassis_pos->pos_y)); - - chassis_speed_set = PID_calc(&o->path_speed_pid,-distance,0);//此处由pid计算距离得出相应的速度 - //速度分解 - SIN = (o->chassis_map[cnt].y - o->chassis_pos->pos_y)/distance; - COS = (o->chassis_map[cnt].x - o->chassis_pos->pos_x)/distance; - - world_vx = chassis_speed_set * COS; - world_vy = chassis_speed_set * SIN; - -// chassis_vx = world_vx; -// chassis_vy = world_vy; - //世界坐标转机器坐标系转换 - - chassis_vx = -world_vy*sin(o->ops_imu_pos.yaw) + world_vx*cos(o->ops_imu_pos.yaw); - chassis_vy = world_vy*cos(o->ops_imu_pos.yaw) + world_vx*sin(o->ops_imu_pos.yaw); - - } - -/*下面的逻辑按需更改,根据cnt计数器自动跑点,遥控器触发跑点等等*/ - - - if(isArrive(o->chassis_map[cnt],o)) //判断是否到达(全场定位),只涉及xy的判断 - { - /*到达点后,这里应该增加cnt增加或减小的触发方式*/ - - if (o->Navi_Mode .Trig_flag != flag_update_num) { // 只有flag发生变化时才更新cnt - if (o->Navi_Mode .Trig_flag==1) cnt++; } - else if (o->Navi_Mode .Trig_flag == -1) cnt--; - flag_update_num = o->Navi_Mode .Trig_flag; // 更新prev_flag为当前的flag状态 - } - else - { - o->POS_IS_CPT = NO; - hold_point(o,o->chassis_map[cnt],o->chassis_map[cnt].angle); //调用该函数使临近误差值快速响应 - } - if(cnt>3)//根据点数更改 - { - o->POS_IS_CPT =YES; - //到达目的地 - o->final_out .vx =0; - o->final_out .vy =0; - o->final_out.yaw_angle=0; - } - - - - - - ops_out->out.Vx= o->final_out .vx ; - ops_out->out.Vy = o->final_out .vy ; - ops_out->out.Vw = o->final_out.yaw_angle; - - return DEVICE_OK; -} diff --git a/User/Algorithm/navi.h b/User/Algorithm/navi.h deleted file mode 100644 index 5b313b0..0000000 --- a/User/Algorithm/navi.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef NAVI_H -#define NAVI_H - - -#include "Action.h" -#include "pid.h" -#include "ahrs.h" -#include "bmi088.h" -#include "map.h" - -typedef enum { - AUTO_MODE, // Զܵģʽ - MANUAL_MODE , // ģʽ - NO_MODE -} Navi_Mode_t; - -typedef struct { - - Navi_Mode_t mode; - - int Trig_flag;//أʼֵΪ㣬ֿģʽ£ֵΪ1ʹcnt+1Ϊ-1ʹcnt-1 - -} Navi_COT_MODE_t; - - -typedef struct{ - float pos_x; - float pos_y; - float last_pos_x; - float last_pos_y; -}chassis_position_t; - -typedef enum{ - YES, - NO, - NEXT1, - NEXT2 -}is_cpt_e; -typedef struct{ - pid_param_t pid_PosSpeed_x_param; - pid_param_t pid_PosSpeed_y_param; - pid_param_t pid_pos_x_out_param; - pid_param_t pid_pos_x_inner_param; - pid_param_t pid_pos_y_out_param; - pid_param_t pid_pos_y_inner_param; - pid_param_t pid_OutAngle_param; - pid_param_t pid_InnerAngle_param; - pid_param_t path_speed_pid_param; - -}ops_pid_param_t; - -typedef struct { - ops_pid_param_t ops_pid; - const point_t *path; - int8_t path_num; -}ops_param_t; - -/** - * @brief - * -*/ -typedef struct { - Action_POS_t *chassis_pos; - fp32 current_x; - fp32 current_y; - - fp32 next_mapx; - fp32 next_mapy; - const point_t *chassis_map; - const ops_param_t *param; - PathState_t state; - Navi_COT_MODE_t Navi_Mode; - - AHRS_Eulr_t ops_imu_pos; - AHRS_Gyro_t ops_gyro; - - - - pid_type_def pid_PosSpeed_x; - pid_type_def pid_PosSpeed_y; - pid_type_def pid_pos_x_out; - pid_type_def pid_pos_x_inner; - pid_type_def pid_pos_y_out; - pid_type_def pid_pos_y_inner; - pid_type_def pid_OutAngle; - pid_type_def pid_InnerAngle; - pid_type_def path_speed_pid; - - - is_cpt_e POS_IS_CPT; - - struct - { - fp32 vx; - fp32 vy; - fp32 yaw_angle; - }final_out; - -}ops_t; - - - - -int8_t Action_init(ops_t *o,const ops_param_t *param,Action_POS_t *pos); - -int8_t go_path(ops_t *o,CMD_ACTION_t *ops_out); -#endif - diff --git a/User/Module/Chassis.c b/User/Module/Chassis.c index 3acc87d..03246ce 100644 --- a/User/Module/Chassis.c +++ b/User/Module/Chassis.c @@ -1,6 +1,5 @@ #include "Chassis.h" #include "gpio.h" -#include "Action.h" #include "user_math.h" #include "bsp_buzzer.h" #include "bsp_delay.h" @@ -113,16 +112,11 @@ int8_t Chassis_init(Chassis_t *c,const Chassis_Param_t *param,float target_freq) void Chassis_speed_calculate(Chassis_t *c,fp32 Vx,fp32 Vy,fp32 Vw) //底盘逆运动学的解算 { c->hopemotorout.OmniSpeedOut[3] = -Vx+Vy+Vw;//右前 - c->hopemotorout.OmniSpeedOut[2] = -Vx-Vy+Vw;//右后 - c->hopemotorout.OmniSpeedOut[1] = Vx-Vy+Vw;//左后 + c->hopemotorout.OmniSpeedOut[1] = -Vx-Vy+Vw;//右后 + c->hopemotorout.OmniSpeedOut[2] = Vx-Vy+Vw;//左后 c->hopemotorout.OmniSpeedOut[0] = Vx+Vy+Vw;//左前 } -// v[0] = (vx_set+vy_set+vw_set)*mul + gyro_z;//左前 -// v[1] = (-vx_set+vy_set+vw_set)*mul + gyro_z;//右前 -// v[2] = (-vx_set-vy_set+vw_set)*mul + gyro_z;//右后 -// v[3] = (vx_set-vy_set+vw_set)*mul + gyro_z;//左后 - //bool isArrive(fp32 real_pos,fp32 target_pos,fp32 mistake) //{ // uint16_t xArrive = 0, yArrive = 0; diff --git a/User/Module/Chassis.h b/User/Module/Chassis.h index d3f15ad..e906470 100644 --- a/User/Module/Chassis.h +++ b/User/Module/Chassis.h @@ -31,7 +31,6 @@ #include "can_use.h" #include "cmd.h" #include "filter.h" -#include "Action.h" #define CHASSIS_OK (0) #define CHASSIS_ERR (-1) @@ -125,7 +124,6 @@ typedef struct{ const Chassis_Param_t *param; //一些固定的参数 ChassisImu_t pos088; //088的实时姿态 - Action_POS_t Action_pos; CMD_Chassis_CtrlType_e ctrl; CMD_Chassis_mode_e mode; diff --git a/User/Module/config.c b/User/Module/config.c index 5a04df7..909b2ab 100644 --- a/User/Module/config.c +++ b/User/Module/config.c @@ -193,93 +193,7 @@ static const ConfigParam_t param_chassis ={ }, - - - /*码盘导航*/ - - .ops={ - - /*导航点*/ - .path=map_point, - .path_num = point_num , - .ops_pid={ - /*路径速度*/ - .path_speed_pid_param= - { - .p = 15.1f, - .i = 0.02f, - .d = 3.2f, - .i_limit = 200.0f, - .out_limit =6000.0f, - - - }, - .pid_PosSpeed_x_param={ - .p =1.0f, - .i =0.001f, - .d =0.0f, - .i_limit =15.0f, - .out_limit =4000.0f, - }, - .pid_PosSpeed_y_param={ - .p =1.0f, - .i =0.001f, - .d =0.0f, - .i_limit =15.0f, - .out_limit =4000.0f, - }, - .pid_pos_x_out_param={ - .p =1.0f, - .i =0.001f, - .d =0.0f, - .i_limit =15.0f, - .out_limit =4000.0f, - }, - .pid_pos_x_inner_param={ - .p =2.0f, - .i =0.001f, - .d =0.0f, - .i_limit =15.0f, - .out_limit =4000.0f, - }, - .pid_pos_y_out_param={ - .p =1.0f, - .i =0.001f, - .d =0.0f, - .i_limit =15.0f, - .out_limit =4000.0f, - }, - .pid_pos_y_inner_param={ - .p =2.0f, - .i =0.001f, - .d =0.0f, - .i_limit =15.0f, - .out_limit =4000.0f, - }, - /*码盘导航陀螺仪角度纠正内外环*/ - .pid_OutAngle_param={ - .p = 5.0f, - .i = 0.0f, - .d = 0.0f, - .i_limit = 0.0f, - .out_limit =100.0f, - }, - .pid_InnerAngle_param={ - .p = 100.0f, - .i = 0.0f, - .d = 0.0f, - .i_limit = 0.0f, - .out_limit =1000.0f, - }, - - - - - }, - - - }, - + .can = { .pitch6020 = BSP_CAN_1, .motor3508 = BSP_CAN_1, @@ -293,11 +207,7 @@ const ConfigParam_t *Config_ChassisGet(void) return ¶m_chassis; } -///*获取导航地图*/ -//void set_ops_path(ConfigParam_t *config, const point_t *path, int8_t path_num) { -// config->ops.path = path; -// config->ops.path_num = path_num; -//} + /** * \brief 从Flash读取配置信息 * diff --git a/User/Module/config.h b/User/Module/config.h index 4cd4a72..9ba1c14 100644 --- a/User/Module/config.h +++ b/User/Module/config.h @@ -4,13 +4,11 @@ #include "Chassis.h" #include "can_use.h" #include "ahrs.h" -#include "navi.h" #include "map.h" typedef struct{ Chassis_Param_t chassis; /**/ -ops_param_t ops; CAN_Params_t can; AHRS_Eulr_t mech_zero[4]; diff --git a/User/bsp/bsp_action.c b/User/bsp/bsp_action.c deleted file mode 100644 index 7e024e3..0000000 --- a/User/bsp/bsp_action.c +++ /dev/null @@ -1,53 +0,0 @@ -#include "bsp_action.h" -#include "main.h" - - -extern UART_HandleTypeDef huart1; -extern DMA_HandleTypeDef hdma_usart1_rx; -void RS232_init(uint8_t *rx1_buf, uint8_t *rx2_buf, uint16_t dma_buf_num) -{ - - //enable the dma transfer for the receiver request - SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR); - - //enable idle interrupt - __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); - - //disable dma, to change the dma register - __HAL_DMA_DISABLE(&hdma_usart1_rx); - - //disable dma again but why? - //what's the condition? - while(hdma_usart1_rx.Instance->CR & DMA_SxCR_EN) - { - __HAL_DMA_DISABLE(&hdma_usart1_rx); - } - - //?? - hdma_usart1_rx.Instance->PAR = (uint32_t) & (USART1->DR); - - //memory buffer 1 - hdma_usart1_rx.Instance->M0AR = (uint32_t)(rx1_buf); - - //momory buffer 2 - hdma_usart1_rx.Instance->M1AR = (uint32_t)(rx2_buf); - - //data length - hdma_usart1_rx.Instance->NDTR = dma_buf_num; - - //enable double memory buffer - SET_BIT(hdma_usart1_rx.Instance->CR, DMA_SxCR_DBM); - - - //enable dma - __HAL_DMA_ENABLE(&hdma_usart1_rx); - -} - - - - - - - - diff --git a/User/bsp/bsp_action.h b/User/bsp/bsp_action.h deleted file mode 100644 index b72a94f..0000000 --- a/User/bsp/bsp_action.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef BSP_ACTION_H -#define BSP_ACTION_H -#include "struct_typedef.h" - -void RS232_init(uint8_t *rx1_buf, uint8_t *rx2_buf, uint16_t dma_buf_num); - -#endif - diff --git a/User/device/Action.c b/User/device/Action.c deleted file mode 100644 index c576405..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/cmd.c b/User/device/cmd.c index f0f8654..bc481bc 100644 --- a/User/device/cmd.c +++ b/User/device/cmd.c @@ -13,6 +13,17 @@ /* Private function -------------------------------------------------------- */ /*Export function --------------------------------------------------------------*/ + + + + +#ifdef dr16_t + + +#else + + +#endif int8_t CMD_Init(CMD_t *cmd){ /*若主结构体为空 自动返回错误 */ if(cmd == NULL) return-1; @@ -23,12 +34,14 @@ int8_t CMD_Init(CMD_t *cmd){ return 0; } -float aaaa; static void CMD_RcLogic(const CMD_RC_t *rc, CMD_t *cmd) { /* 将操纵杆的对应值转换为底盘的控制向量和云台变化的欧拉角 */ + +#ifdef r12ds_t + /*乐迪反馈值转换(-1 -- 1 )范围*/ if(rc->ch_x<0) cmd->Vx =map_fp32(rc->ch_x,-337,0,-1,0); else cmd->Vx =map_fp32(rc->ch_x,0,310,0,1); @@ -42,7 +55,25 @@ static void CMD_RcLogic(const CMD_RC_t *rc, CMD_t *cmd) { cmd->key_ctrl_l = rc->key [0]; cmd->key_ctrl_r = rc->key [1]; +#elif defined(dr16_t) + + 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 ; + + +#endif + + + + + } @@ -59,12 +90,15 @@ static void CMD_RcLostLogic(CMD_t *cmd){ int8_t CMD_ParseRc(CMD_t *cmd,CMD_RC_t *rc){ if (cmd == NULL) return -1; if (rc == NULL) return -1; +#ifdef dr16_t /*c当rc丢控时,恢复机器人至默认状态 */ -// if ((rc->ch_w == CMD_SW_ERR) || (rc->ch_y == CMD_SW_ERR)) { -// CMD_RcLostLogic(cmd); -// } else { + if ((rc->ch_w == CMD_SW_ERR) || (rc->ch_y == CMD_SW_ERR)) { + CMD_RcLostLogic(cmd); + } else { CMD_RcLogic(rc, cmd); -// } + } + +#endif return 0; } @@ -174,27 +208,4 @@ int8_t CMD_CtrlSet(CMD_t *cmd) { } return 0; } -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 ) - { - 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 ; - - - return 0; - -} diff --git a/User/device/cmd.h b/User/device/cmd.h index eecc6a4..d4d80c3 100644 --- a/User/device/cmd.h +++ b/User/device/cmd.h @@ -24,6 +24,14 @@ #define MID (0x09) + +/*选择遥控器,else为r12ds*/ +//#define dr16_t +#define r12ds_t + + + + typedef enum{ RC,//遥控器控制,左按键上 MID_NAVI,//雷达导航 @@ -63,54 +71,46 @@ typedef enum { CMD_SW_DOWN = 2, } CMD_SwitchPos_t; +typedef enum +{ + RC_dr16 , + RC_r12ds +}remote_type; + /*遥控器值,使用CMD_RcLogic函数传入CMD_t结构体*/ typedef struct { -// float ch_l_x; /* 遥控器左侧摇杆横轴值,上为正 */ -// float ch_l_y; /* 遥控器左侧摇杆纵轴值,右为正 */ -// float ch_r_x; /* 遥控器右侧摇杆横轴值,上为正 */ -// float ch_r_y; /* 遥控器右侧摇杆纵轴值,右为正 */ + + remote_type RC_type; +#ifdef dr16_t + + float ch_l_x; /* 遥控器左侧摇杆横轴值,上为正 */ + float ch_l_y; /* 遥控器左侧摇杆纵轴值,右为正 */ + float ch_r_x; /* 遥控器右侧摇杆横轴值,上为正 */ + float ch_r_y; /* 遥控器右侧摇杆纵轴值,右为正 */ -// float ch_res; /* 第五通道值 */ + float ch_res; /* 第五通道值 */ -// CMD_SwitchPos_t sw_r; /* 右侧拨杆位置 */ -// CMD_SwitchPos_t sw_l; /* 左侧拨杆位置 */ + CMD_SwitchPos_t sw_r; /* 右侧拨杆位置 */ + CMD_SwitchPos_t sw_l; /* 左侧拨杆位置 */ -// uint16_t key; /* 按键值 */ + uint16_t key; /* 按键值 */ -// uint16_t res; /* 保留,未启用 */ + uint16_t res; /* 保留,未启用 */ + +#else int16_t ch_x; // X轴(Channel 1) int16_t mul; // MUL(Channel 2) int16_t ch_y; // Y轴(Channel 3) int16_t ch_w; // W轴(Channel 4) int16_t key[8]; // 按键通道(Channel 5-12) + int16_t offline; +#endif } __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; @@ -121,12 +121,7 @@ typedef struct { fp32 vy; fp32 wz; }navi; - struct - { - fp32 posx; - fp32 posy; - fp32 posw; - }pick; + struct { fp32 angle; @@ -175,11 +170,8 @@ 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); - 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); diff --git a/User/device/dr16.c b/User/device/dr16.c index 20704b5..e6d316b 100644 --- a/User/device/dr16.c +++ b/User/device/dr16.c @@ -1,135 +1,137 @@ -///* -// DR16接收机 +/* + DR16接收机 -//*/ +*/ -///* Includes ----------------------------------------------------------------- */ -//#include "dr16.h" - -//#include - -//#include "bsp_usart.h" -//#include "error_detect.h" -///* Private define ----------------------------------------------------------- */ -//#define DR16_CH_VALUE_MIN (364u) -//#define DR16_CH_VALUE_MID (1024u) -//#define DR16_CH_VALUE_MAX (1684u) - -///* Private macro ------------------------------------------------------------ */ -///* Private typedef ---------------------------------------------------------- */ -///* Private variables -------------------------------------------------------- */ - -//static osThreadId_t thread_alert; -//uint8_t cbuf[36]; //此处设置为两帧字节的长度 若为一帧会出现乱码的情况 -///* Private function -------------------------------------------------------- */ -//static void DR16_RxCpltCallback(void) { -// osThreadFlagsSet(thread_alert, SIGNAL_DR16_RAW_REDY); -//// detect_hook(DR16_TOE); -//} - -//static bool DR16_DataCorrupted(const DR16_t *dr16) { -// if (dr16 == NULL) return DEVICE_ERR_NULL; - -// if ((dr16->data.ch_r_x < DR16_CH_VALUE_MIN) || -// (dr16->data.ch_r_x > DR16_CH_VALUE_MAX)) -// return true; - -// if ((dr16->data.ch_r_y < DR16_CH_VALUE_MIN) || -// (dr16->data.ch_r_y > DR16_CH_VALUE_MAX)) -// return true; - -// if ((dr16->data.ch_l_x < DR16_CH_VALUE_MIN) || -// (dr16->data.ch_l_x > DR16_CH_VALUE_MAX)) -// return true; - -// if ((dr16->data.ch_l_y < 1000u) || -// (dr16->data.ch_l_y > DR16_CH_VALUE_MAX)) -// return true; - -// if (dr16->data.sw_l == 0) return true; - -// if (dr16->data.sw_r == 0) return true; - -// return false; -//} -///* Exported functions ------------------------------------------------------- */ -//int8_t DR16_Init(DR16_t *dr16) { -// if (dr16 == NULL) return DEVICE_ERR_NULL; -// if ((thread_alert = osThreadGetId()) == NULL) return DEVICE_ERR_NULL; - -// BSP_UART_RegisterCallback(BSP_UART_REMOTE, BSP_UART_IDLE_LINE_CB, -// DR16_RxCpltCallback); -// return DEVICE_OK; -//} - -//int8_t DR16_Restart(void) { -// __HAL_UART_DISABLE(BSP_UART_GetHandle(BSP_UART_REMOTE)); -// __HAL_UART_ENABLE(BSP_UART_GetHandle(BSP_UART_REMOTE)); -// return DEVICE_OK; -//} - -//int8_t DR16_StartDmaRecv(DR16_t *dr16) { -// if (HAL_UARTEx_ReceiveToIdle_DMA(BSP_UART_GetHandle(BSP_UART_REMOTE), -// (uint8_t *)cbuf, -// sizeof(cbuf)) == HAL_OK) -// return DEVICE_OK; -// return DEVICE_ERR; -//} - -//bool DR16_WaitDmaCplt(uint32_t timeout) { -// return (osThreadFlagsWait(SIGNAL_DR16_RAW_REDY, osFlagsWaitAll, timeout) == -// SIGNAL_DR16_RAW_REDY); -//} - -//int8_t DR16_ParseRaw(DR16_t *dr16) -//{ -// if(dr16 ==NULL) return DEVICE_ERR_NULL; -// dr16->data.ch_r_x = (cbuf[0] | (cbuf[1] <<8)); -// dr16->data.ch_r_y = ((cbuf[1] >> 3)| (cbuf[2] << 5)); -// dr16->data.ch_l_x = ((cbuf[2] >>6) | (cbuf[3] << 2) | (cbuf[4] <<10)); -// 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; -// -// return 1; -//} -//int8_t DR16_ParseRC(const DR16_t *dr16, CMD_RC_t *rc) { -// if (dr16 == NULL) return DEVICE_ERR_NULL; -// -// if (DR16_DataCorrupted(dr16)) { -// return DEVICE_ERR; -// } else { -// memset(rc, 0, sizeof(*rc)); -// } - -// float full_range = (float)(DR16_CH_VALUE_MAX - DR16_CH_VALUE_MIN); - -// rc->ch_r_x = 2 * ((float)dr16->data.ch_r_x - DR16_CH_VALUE_MID) / full_range; -// rc->ch_r_y = 2 * ((float)dr16->data.ch_r_y - DR16_CH_VALUE_MID) / full_range; -// rc->ch_l_x = 2 * ((float)dr16->data.ch_l_x - DR16_CH_VALUE_MID) / full_range; -// rc->ch_l_y = 2 * ((float)dr16->data.ch_l_y - DR16_CH_VALUE_MID) / full_range; - -// rc->sw_l = (CMD_SwitchPos_t)dr16->data.sw_l; -// rc->sw_r = (CMD_SwitchPos_t)dr16->data.sw_r; - -// rc->key = dr16->data.key; - -//// rc->ch_res = ((float)dr16->data.res - DR16_CH_VALUE_MID) / full_range; -// return DEVICE_OK; -//} - -//int8_t DR16_HandleOffline(const DR16_t *dr16, CMD_RC_t *rc) { -// if (dr16 == NULL) return DEVICE_ERR_NULL; -// if (rc == NULL) return DEVICE_ERR_NULL; - -// (void)dr16; -// memset(rc, 0, sizeof(*rc)); -// return 0; -//} +/* Includes ----------------------------------------------------------------- */ +#include "dr16.h" +#include +#include "bsp_usart.h" +#include "error_detect.h" +#ifdef dr16_t + +/* Private define ----------------------------------------------------------- */ +#define DR16_CH_VALUE_MIN (364u) +#define DR16_CH_VALUE_MID (1024u) +#define DR16_CH_VALUE_MAX (1684u) + +/* Private macro ------------------------------------------------------------ */ +/* Private typedef ---------------------------------------------------------- */ +/* Private variables -------------------------------------------------------- */ + +static osThreadId_t thread_alert; +uint8_t cbuf[36]; //此处设置为两帧字节的长度 若为一帧会出现乱码的情况 +/* Private function -------------------------------------------------------- */ +static void DR16_RxCpltCallback(void) { + osThreadFlagsSet(thread_alert, SIGNAL_DR16_RAW_REDY); +// detect_hook(DR16_TOE); +} + +static bool DR16_DataCorrupted(const DR16_t *dr16) { + if (dr16 == NULL) return DEVICE_ERR_NULL; + + if ((dr16->data.ch_r_x < DR16_CH_VALUE_MIN) || + (dr16->data.ch_r_x > DR16_CH_VALUE_MAX)) + return true; + + if ((dr16->data.ch_r_y < DR16_CH_VALUE_MIN) || + (dr16->data.ch_r_y > DR16_CH_VALUE_MAX)) + return true; + + if ((dr16->data.ch_l_x < DR16_CH_VALUE_MIN) || + (dr16->data.ch_l_x > DR16_CH_VALUE_MAX)) + return true; + + if ((dr16->data.ch_l_y < 1000u) || + (dr16->data.ch_l_y > DR16_CH_VALUE_MAX)) + return true; + + if (dr16->data.sw_l == 0) return true; + + if (dr16->data.sw_r == 0) return true; + + return false; +} +/* Exported functions ------------------------------------------------------- */ +int8_t DR16_Init(DR16_t *dr16) { + if (dr16 == NULL) return DEVICE_ERR_NULL; + if ((thread_alert = osThreadGetId()) == NULL) return DEVICE_ERR_NULL; + + BSP_UART_RegisterCallback(BSP_UART_REMOTE, BSP_UART_IDLE_LINE_CB, + DR16_RxCpltCallback); + return DEVICE_OK; +} + +int8_t DR16_Restart(void) { + __HAL_UART_DISABLE(BSP_UART_GetHandle(BSP_UART_REMOTE)); + __HAL_UART_ENABLE(BSP_UART_GetHandle(BSP_UART_REMOTE)); + return DEVICE_OK; +} + +int8_t DR16_StartDmaRecv(DR16_t *dr16) { + if (HAL_UARTEx_ReceiveToIdle_DMA(BSP_UART_GetHandle(BSP_UART_REMOTE), + (uint8_t *)cbuf, + sizeof(cbuf)) == HAL_OK) + return DEVICE_OK; + return DEVICE_ERR; +} + +bool DR16_WaitDmaCplt(uint32_t timeout) { + return (osThreadFlagsWait(SIGNAL_DR16_RAW_REDY, osFlagsWaitAll, timeout) == + SIGNAL_DR16_RAW_REDY); +} + +int8_t DR16_ParseRaw(DR16_t *dr16) +{ + if(dr16 ==NULL) return DEVICE_ERR_NULL; + dr16->data.ch_r_x = (cbuf[0] | (cbuf[1] <<8)); + dr16->data.ch_r_y = ((cbuf[1] >> 3)| (cbuf[2] << 5)); + dr16->data.ch_l_x = ((cbuf[2] >>6) | (cbuf[3] << 2) | (cbuf[4] <<10)); + 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; + + return 1; +} + +int8_t DR16_ParseRC(const DR16_t *dr16, CMD_RC_t *rc) { + if (dr16 == NULL) return DEVICE_ERR_NULL; + + if (DR16_DataCorrupted(dr16)) { + return DEVICE_ERR; + } else { + memset(rc, 0, sizeof(*rc)); + } + + float full_range = (float)(DR16_CH_VALUE_MAX - DR16_CH_VALUE_MIN); + + rc->ch_r_x = 2 * ((float)dr16->data.ch_r_x - DR16_CH_VALUE_MID) / full_range; + rc->ch_r_y = 2 * ((float)dr16->data.ch_r_y - DR16_CH_VALUE_MID) / full_range; + rc->ch_l_x = 2 * ((float)dr16->data.ch_l_x - DR16_CH_VALUE_MID) / full_range; + rc->ch_l_y = 2 * ((float)dr16->data.ch_l_y - DR16_CH_VALUE_MID) / full_range; + + rc->sw_l = (CMD_SwitchPos_t)dr16->data.sw_l; + rc->sw_r = (CMD_SwitchPos_t)dr16->data.sw_r; + + rc->key = dr16->data.key; + +// rc->ch_res = ((float)dr16->data.res - DR16_CH_VALUE_MID) / full_range; + return DEVICE_OK; +} + +int8_t DR16_HandleOffline(const DR16_t *dr16, CMD_RC_t *rc) { + if (dr16 == NULL) return DEVICE_ERR_NULL; + if (rc == NULL) return DEVICE_ERR_NULL; + + (void)dr16; + memset(rc, 0, sizeof(*rc)); + return 0; +} +#endif diff --git a/User/device/dr16.h b/User/device/dr16.h index b8cb98d..db37183 100644 --- a/User/device/dr16.h +++ b/User/device/dr16.h @@ -11,6 +11,11 @@ /* Exported constants ------------------------------------------------------- */ /* Exported macro ----------------------------------------------------------- */ /* Exported types ----------------------------------------------------------- */ + +#ifdef dr16_t + + +#define dr16_t typedef __packed struct { uint16_t ch_r_x : 11; @@ -44,3 +49,4 @@ int8_t DR16_HandleOffline(const DR16_t *dr16, CMD_RC_t *rc); #endif +#endif \ No newline at end of file diff --git a/User/device/r12ds.c b/User/device/r12ds.c index adffdba..3bc7b8e 100644 --- a/User/device/r12ds.c +++ b/User/device/r12ds.c @@ -12,6 +12,8 @@ #include #include "cmd.h" #include "user_math.h" + +#ifdef r12ds_t extern UART_HandleTypeDef huart3; extern DMA_HandleTypeDef hdma_usart3_rx; @@ -121,11 +123,6 @@ int8_t R12ds_DMA_Init(uint8_t *rx1_buf, uint8_t *rx2_buf, uint16_t dma_buf_num) return 1; } -//int map(int x, int in_min, int in_max, int out_min, int out_max) //ӳʤگ˽ -//{ -// return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; -//} - int8_t sbus_to_rc(volatile const uint8_t *sbus_buf, CMD_RC_t *rc_ctrl) { @@ -180,5 +177,5 @@ int8_t sbus_to_rc(volatile const uint8_t *sbus_buf, CMD_RC_t *rc_ctrl) return 0; } - +#endif diff --git a/User/device/r12ds.h b/User/device/r12ds.h index a035e4e..389aa59 100644 --- a/User/device/r12ds.h +++ b/User/device/r12ds.h @@ -6,6 +6,9 @@ #include "bsp_usart.h" #include "cmd.h" + +#ifdef r12ds_t + #define RC_FRAME_LENGTH 25u @@ -21,8 +24,8 @@ int8_t sbus_to_rc(volatile const uint8_t *sbus_buf,CMD_RC_t *rc_ctrl); //void R12ds_HandleOffline(void); -// int map_int(int x, int in_min, int in_max, int out_min, int out_max) ; #endif +#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 index 7a4603b..f3b6f7c 100644 --- a/User/task/chassis_task.c +++ b/User/task/chassis_task.c @@ -13,8 +13,6 @@ static CAN_t can; -#define remote_mode dr16 //遥控器选择 - #ifdef DEBUG CAN_Output_t out; @@ -70,9 +68,7 @@ void Task_Chassis(void *argument) 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); diff --git a/User/task/cmd_task.c b/User/task/cmd_task.c index 83bd681..d155116 100644 --- a/User/task/cmd_task.c +++ b/User/task/cmd_task.c @@ -6,7 +6,6 @@ CMD_t cmd; CMD_RC_t rc_ctrl; CMD_NUC_t Nuc; -CMD_ACTION_t cmd_ops_out; #else @@ -52,8 +51,6 @@ void Task_cmd(void *argument){ 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内核 */ /*将需要与其他任务共享的数据放到消息队列里 此处主要分享给底盘 后续会添加和上层机构的通信 */ diff --git a/User/task/dr16_task.c b/User/task/dr16_task.c index c9351a1..6e4e59a 100644 --- a/User/task/dr16_task.c +++ b/User/task/dr16_task.c @@ -1,104 +1,62 @@ -///* -// DR16接收机通信任务(支持DR16和SBUS双协议) -//*/ +/* + DR16接收机通信任务 +*/ -///* Includes ----------------------------------------------------------------- */ -//#include -//#include "dr16.h" -//#include "LD_remote.h" // 新增 SBUS 支持 -//#include "user_task.h" +/* Includes ----------------------------------------------------------------- */ +#include -///* Private typedef ---------------------------------------------------------- */ -///* Private define ----------------------------------------------------------- */ -//#define PROTOCOL_DR16 0 -//#define PROTOCOL_SBUS 1 +#include "dr16.h" +#include "user_task.h" +/* Private typedef ---------------------------------------------------------- */ +/* Private define ----------------------------------------------------------- */ /* Private macro ------------------------------------------------------------ */ -///* Private variables -------------------------------------------------------- */ -//#ifdef DEBUG -//DR16_t dr16; -//CMD_RC_t cmd_rc; -//#else -//static DR16_t dr16; -//static CMD_RC_t cmd_rc; -//#endif +/* Private variables -------------------------------------------------------- */ -//static uint8_t protocol_type = PROTOCOL_DR16; // 当前协议类型 -// uint8_t sbus_rx_buf[36]; // SBUS 数据缓冲区 +#ifdef dr16 -///* Private function --------------------------------------------------------- */ -///** -// * \brief 协议识别函数 -// * -// * \param buf 接收到的数据缓冲区 -// * \return uint8_t 协议类型:PROTOCOL_DR16 或 PROTOCOL_SBUS -// */ -//static uint8_t Detect_Protocol(const uint8_t *buf) { -// if (buf[0] == 0x0F && buf[24] == 0x00) { // SBUS 协议特征 -// return PROTOCOL_SBUS; -// } -// return PROTOCOL_DR16; // 默认 DR16 -//} +#ifdef DEBUG +DR16_t dr16; +CMD_RC_t cmd_rc; +#else +static DR16_t dr16; +static CMD_RC_t cmd_rc; +#endif -///** -// * \brief 统一回调函数 -// */ -//static void UART_RxCpltCallback(void) { -// if (Detect_Protocol(sbus_rx_buf) == PROTOCOL_SBUS) { -// protocol_type = PROTOCOL_SBUS; -// } else { -// protocol_type = PROTOCOL_DR16; -// } -// osThreadFlagsSet(osThreadGetId(), SIGNAL_DR16_RAW_REDY); -//} +#endif -///* Exported functions ------------------------------------------------------- */ +/* Private function --------------------------------------------------------- */ +/* Exported functions ------------------------------------------------------- */ -///** -// * \brief dr16接收机任务(支持DR16和SBUS双协议) -// * -// * \param argument 未使用 -// */ -//void Task_dr16(void *argument) { -// (void)argument; /* 未使用,消除警告 */ +/** + * \brief dr16接收机 + * + * \param argument 未使用 + */ +void Task_dr16(void *argument) { + (void)argument; /* 未使用,消除警告 */ +#ifdef dr16 -// DR16_Init(&dr16); /* 初始化 DR16 */ -// RC_New_Init(); /* 初始化 SBUS */ + DR16_Init(&dr16); /* 初始化dr16 */ -// while (1) { -//#ifdef DEBUG -// /* 调试信息:堆栈水位 */ -// task_runtime.stack_water_mark.dr16 = osThreadGetStackSpace(osThreadGetId()); -//#endif + while (1) { +#ifdef DEBUG + /* */ + task_runtime.stack_water_mark.dr16 = osThreadGetStackSpace(osThreadGetId()); +#endif + /* 开启DMA */ + DR16_StartDmaRecv(&dr16); -// /* 开启 DMA 接收 */ -// if (protocol_type == PROTOCOL_DR16) { -// DR16_StartDmaRecv(&dr16); -// } else { -// HAL_UARTEx_ReceiveToIdle_DMA(&huart3, sbus_rx_buf, sizeof(sbus_rx_buf)); -// } - -// /* 等待 DMA 完成 */ -// if (DR16_WaitDmaCplt(30)) { -// if (protocol_type == PROTOCOL_DR16) { -// /* DR16 数据处理 */ -// DR16_ParseRaw(&dr16); -// DR16_ParseRC(&dr16, &cmd_rc); -// } else { -// /* SBUS 数据处理 */ -// const RC_Ctrl_New_t *sbus_data = RC_New_GetData(); -// cmd_rc.ch_r_x = sbus_data->ch[0] / 1000.0f; // 映射到 [-1, 1] -// cmd_rc.ch_r_y = sbus_data->ch[1] / 1000.0f; -// cmd_rc.ch_l_x = sbus_data->ch[2] / 1000.0f; -// cmd_rc.ch_l_y = sbus_data->ch[3] / 1000.0f; -// } -// } else { -// /* 处理遥控器离线 */ -// DR16_HandleOffline(&dr16, &cmd_rc); -// } - -// /* 发送数据到消息队列 */ -// osMessageQueueReset(task_runtime.msgq.cmd.raw.rc); -// osMessageQueuePut(task_runtime.msgq.cmd.raw.rc, &cmd_rc, 0, 0); -// } -//} \ No newline at end of file + if (DR16_WaitDmaCplt(30)) { + /* 转换 */ + DR16_ParseRaw(&dr16); + DR16_ParseRC(&dr16, &cmd_rc); + } else { + /* 处理遥控器离线 */ + DR16_HandleOffline(&dr16, &cmd_rc); + } + osMessageQueueReset(task_runtime.msgq.cmd.raw.rc); + osMessageQueuePut(task_runtime.msgq.cmd.raw.rc, &cmd_rc, 0, 0); + } +#endif +} diff --git a/User/task/init.c b/User/task/init.c index 0dffbec..c540de2 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 ----------------------------------------------------------- */ @@ -36,8 +35,6 @@ void Task_Init(void *argument) { osThreadNew(Task_AttiEsti, NULL, &attr_atti_esti); task_runtime.thread.chassis = osThreadNew(Task_Chassis, NULL, &attr_chassis); -// task_runtime.thread.dr16 = -// osThreadNew(Task_dr16,NULL,&attr_dr16); task_runtime.thread.r12ds = osThreadNew(Task_r12ds,NULL,&attr_r12ds); @@ -47,13 +44,7 @@ void Task_Init(void *argument) { osThreadNew(Task_cmd,NULL,&attr_cmd); task_runtime.thread.nuc = osThreadNew(Task_nuc,NULL,&attr_nuc); - - task_runtime.thread.navi = - osThreadNew(Task_Navi,NULL,&attr_navi); - task_runtime.thread.action_ops= - osThreadNew(Task_action,NULL,&attr_ops_9pos); - task_runtime.thread.error_detect = osThreadNew(Task_error_detect,NULL,&attr_error_detect); @@ -88,13 +79,6 @@ void Task_Init(void *argument) { osMessageQueueNew(3u, sizeof(CMD_t), NULL); task_runtime.msgq.cmd.raw.nuc = osMessageQueueNew(3u,sizeof(CMD_NUC_t), NULL); - task_runtime.msgq.cmd.raw.Action = - osMessageQueueNew(3u,sizeof(Action_POS_t), NULL); - task_runtime.msgq.cmd.raw.ops_9_out = - osMessageQueueNew(3u,sizeof(CMD_ACTION_t), NULL); - -// task_runtime.mutex.imu_eulr = -// xSemaphoreCreateMutex(); 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/r12ds_task.c b/User/task/r12ds_task.c index d073462..d12f02c 100644 --- a/User/task/r12ds_task.c +++ b/User/task/r12ds_task.c @@ -3,6 +3,9 @@ #include "user_task.h" #include + +#ifdef r12ds_t + #ifdef DEBUG CMD_RC_t cmd_rc; @@ -20,6 +23,8 @@ static CMD_RC_t cmd_rc; CMD_RC_t *R12ds_DataGet(){ return &cmd_rc; } + + //void R12ds_HandleOffline(void) { // CMD_RC_t *rc; // rc = R12ds_DataGet(); @@ -27,10 +32,15 @@ CMD_RC_t *R12ds_DataGet(){ // memset(rc, 0, sizeof(*rc)); // rc->offline = 1;//用作遥控器断电后急停使用 //} + +#endif void Task_r12ds(void *argument) { (void)argument; + +#ifdef r12ds_t + const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_R12DS; R12ds_DMA_Init(sbus_rx_buf[0],sbus_rx_buf[1],50); @@ -61,6 +71,7 @@ void Task_r12ds(void *argument) } +#endif } diff --git a/User/task/user_task.c b/User/task/user_task.c index e2496e4..f6c9ae8 100644 --- a/User/task/user_task.c +++ b/User/task/user_task.c @@ -25,11 +25,6 @@ const osThreadAttr_t attr_atti_esti = { .priority = osPriorityRealtime, .stack_size = 256 * 4, }; -const osThreadAttr_t attr_ops_9pos = { - .name = "action", - .priority = osPriorityRealtime, - .stack_size = 256 *4, -}; const osThreadAttr_t attr_chassis = { .name = "chassis", .priority = osPriorityAboveNormal, @@ -65,14 +60,10 @@ const osThreadAttr_t attr_error_detect = { .stack_size = 128 *4, }; -//const osThreadAttr_t attr_dr16 = { -// .name = "dr16", -// .priority = osPriorityRealtime, -// .stack_size = 128 *4, -//}; - -const osThreadAttr_t attr_navi = { - .name = "navi", +const osThreadAttr_t attr_dr16 = { + .name = "dr16", .priority = osPriorityRealtime, .stack_size = 128 *4, }; + + diff --git a/User/task/user_task.h b/User/task/user_task.h index 4c2c9b7..9317486 100644 --- a/User/task/user_task.h +++ b/User/task/user_task.h @@ -18,17 +18,13 @@ #define TASK_FREQ_CTRL_CMD (500u) #define TASK_FREQ_NUC (500u) #define TASK_FREQ_CAN (1000u) -#define TASK_FREQ_NAVI (500u) #define TASK_FREQ_R12DS (1000u) -#define TASK_FREQ_ACTION (500u) +#define TASK_FREQ_dr16 (1000u) #define TASK_FREQ_ERROR_DTC (3u) #define DEBUG - -#define TASK_INIT_DELAY_ACTION (400u) - #define TASK_INIT_DELAY_NUC (500u) /* Exported defines --------------------------------------------------------- */ @@ -40,17 +36,14 @@ typedef struct { struct { osThreadId_t atti_esti; osThreadId_t chassis; -// osThreadId_t dr16; + osThreadId_t dr16; osThreadId_t r12ds; - - osThreadId_t action_ops; osThreadId_t ai; osThreadId_t can; osThreadId_t cmd; osThreadId_t nuc; - osThreadId_t navi; osThreadId_t error_detect; } thread; @@ -67,8 +60,6 @@ typedef struct { osMessageQueueId_t rc; osMessageQueueId_t nuc; osMessageQueueId_t eulr;/*姿态结算得到的欧拉角*/ - osMessageQueueId_t Action; - osMessageQueueId_t ops_9_out; }raw; @@ -105,13 +96,11 @@ typedef struct { UBaseType_t chassis; UBaseType_t can; UBaseType_t atti_esti; -// UBaseType_t dr16; + UBaseType_t dr16; UBaseType_t r12ds; - UBaseType_t action; UBaseType_t cmd; UBaseType_t nuc; - UBaseType_t navi; UBaseType_t error_detect; } stack_water_mark; /* stack使用 */ @@ -123,8 +112,6 @@ typedef struct { float r12ds; float cmd; float nuc; - float action; - float navi; float error_detect; } freq; /* 任务运行频率 */ @@ -132,12 +119,9 @@ typedef struct { float chassis; float can; float atti_esti; - float ai; float r12ds; float cmd; float nuc; - float navi; - float action; float error_detect; } last_up_time; /* 任务上一次运行的时间 */ #endif @@ -155,8 +139,6 @@ 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; @@ -164,7 +146,6 @@ extern const osThreadAttr_t attr_error_detect; //extern const osThreadAttr_t attr_dr16; extern const osThreadAttr_t attr_r12ds; -extern const osThreadAttr_t attr_navi; /* Exported functions prototypes -------------------------------------------- */ void Task_Init(void *argument); @@ -179,14 +160,10 @@ void Task_cmd(void *argument); void Task_nuc(void *argument); -void Task_action(void *argument); - -void Task_Navi(void *argument); - - void Task_error_detect(void *argument); + void Task_r12ds(void *argument); -//void Task_dr16(void *argument); +void Task_dr16(void *argument); #endif