新增通用定义头文件,主要内容是角度转换.统一控制的输入,为后续model-based控制做准备

This commit is contained in:
NeoZng
2022-12-04 23:15:18 +08:00
parent e94bb504b8
commit 8e7935876e
14 changed files with 126 additions and 80 deletions

View File

@@ -17,6 +17,7 @@
#include "super_cap.h"
#include "message_center.h"
#include "referee.h"
#include "general_def.h"
#include "arm_math.h"

View File

@@ -4,6 +4,7 @@
#include "ins_task.h"
#include "master_process.h"
#include "message_center.h"
#include "general_def.h"
/* gimbal_cmd应用包含的模块实例指针和交互信息存储*/
#ifndef ONE_BOARD

View File

@@ -3,10 +3,15 @@
#include "dji_motor.h"
#include "ins_task.h"
#include "message_center.h"
#include "general_def.h"
// 需要将控制值统一修改为角度制而不是编码器ECD值
#define YAW_ALIGN_ECD 0 // 云台和底盘对齐指向相同方向时的电机编码器值
#define PITCH_HORIZON_ECD 0 // 云台处于水平位置时编码器值
/* 根据每个机器人进行设定,若对云台有改动需要修改 */
#define YAW_CHASSIS_ALIGN_ECD 0 // 云台和底盘对齐指向相同方向时的电机编码器值
#define PITCH_HORIZON_ECD 0 // 云台处于水平位置时编码器值
// 自动将编码器转换成角度值
#define YAW_CHASSIS_ALIGN_ANGLE
#define PTICH_HORIZON_ALIGN_ANGLE
static attitude_t *Gimbal_IMU_data; // 云台IMU数据
static dji_motor_instance *yaw_motor; // yaw电机
@@ -43,7 +48,7 @@ void GimbalInit()
.controller_setting_init_config = {
.angle_feedback_source = MOTOR_FEED,
.speed_feedback_source = MOTOR_FEED,
.outer_loop_type=ANGLE_LOOP,
.outer_loop_type = ANGLE_LOOP,
.close_loop_type = ANGLE_LOOP | SPEED_LOOP,
.reverse_flag = MOTOR_DIRECTION_REVERSE,
},
@@ -70,7 +75,7 @@ void GimbalInit()
.controller_setting_init_config = {
.angle_feedback_source = MOTOR_FEED,
.speed_feedback_source = MOTOR_FEED,
.outer_loop_type=ANGLE_LOOP,
.outer_loop_type = ANGLE_LOOP,
.close_loop_type = ANGLE_LOOP | SPEED_LOOP,
.reverse_flag = MOTOR_DIRECTION_REVERSE,
},
@@ -84,8 +89,8 @@ void GimbalInit()
}
// /**
// * @brief
// *
// * @brief
// *
// */
// static void TransitionMode()
// {
@@ -111,17 +116,17 @@ void GimbalTask()
DJIMotorChangeFeed(yaw_motor, SPEED_LOOP, OTHER_FEED);
DJIMotorChangeFeed(pitch_motor, ANGLE_LOOP, OTHER_FEED);
DJIMotorChangeFeed(pitch_motor, SPEED_LOOP, OTHER_FEED);
DJIMotorSetRef(yaw_motor,gimbal_cmd_recv.yaw);
DJIMotorSetRef(pitch_motor,gimbal_cmd_recv.pitch);
DJIMotorSetRef(yaw_motor, gimbal_cmd_recv.yaw);
DJIMotorSetRef(pitch_motor, gimbal_cmd_recv.pitch);
break;
//是否考虑直接让云台和底盘重合,其他模式都使用陀螺仪反馈?
// 是否考虑直接让云台和底盘重合,其他模式都使用陀螺仪反馈?
case GIMBAL_FREE_MODE:
DJIMotorChangeFeed(yaw_motor, ANGLE_LOOP, MOTOR_FEED);
DJIMotorChangeFeed(yaw_motor, SPEED_LOOP, MOTOR_FEED);
DJIMotorChangeFeed(pitch_motor, ANGLE_LOOP, MOTOR_FEED);
DJIMotorChangeFeed(pitch_motor, SPEED_LOOP, MOTOR_FEED);
DJIMotorSetRef(yaw_motor,YAW_ALIGN_ECD);
DJIMotorSetRef(pitch_motor,PITCH_HORIZON_ECD);
DJIMotorSetRef(yaw_motor, YAW_ALIGN_ECD);
DJIMotorSetRef(pitch_motor, PITCH_HORIZON_ECD);
break;
default:
break;
@@ -142,9 +147,9 @@ void GimbalTask()
*/
// 获取反馈数据
gimbal_feedback_data.gimbal_imu_data=*Gimbal_IMU_data;
gimbal_feedback_data.yaw_motor_ecd=pitch_motor->motor_measure.ecd;
gimbal_feedback_data.gimbal_imu_data = *Gimbal_IMU_data;
gimbal_feedback_data.yaw_motor_ecd = pitch_motor->motor_measure.ecd;
// 推送消息
PubPushMessage(gimbal_pub,&gimbal_feedback_data);
PubPushMessage(gimbal_pub, &gimbal_feedback_data);
}

View File

@@ -12,10 +12,6 @@
#ifndef ROBOT_DEF_H
#define ROBOT_DEF_H
#define PI 3.14159f
#define RAD_2_ANGLE (180.0f / PI)
#define ANGLE_2_RAD (PI / 180.0f)
#include "ins_task.h"
#include "master_process.h"
#include "stdint-gcc.h"

View File

@@ -3,6 +3,7 @@
#include "dji_motor.h"
#include "message_center.h"
#include "bsp_dwt.h"
#include "general_def.h"
#define ONE_BULLET_DELTA_ANGLE 0 // 发射一发弹丸拨盘转动的距离,由机械设计图纸给出
#define REDUCTION_RATIO 49.0f // 拨盘电机的减速比,英雄需要修改为3508的19.0f
@@ -19,9 +20,8 @@ static Shoot_Ctrl_Cmd_s shoot_cmd_recv; // 来自gimbal_cmd的发射控制信息
static Subscriber_t *shoot_sub;
static Shoot_Upload_Data_s shoot_feedback_data; // 来自gimbal_cmd的发射控制信息
// 定时,计算冷却用
static uint32_t INS_DWT_Count = 0;
static float dt = 0, t = 0;
// dwt定时,计算冷却用
static float hibernate_time = 0, dead_time = 0;
void ShootInit()
{
@@ -125,30 +125,39 @@ void ShootTask()
// 从cmd获取控制数据
SubGetMessage(shoot_sub, &shoot_cmd_recv);
// 根据控制模式进行电机参考值设定和模式切换
switch (shoot_cmd_recv.load_mode)
// 对shoot mode等于SHOOT_STOP的情况特殊处理,直接停止所有电机
if (shoot_cmd_recv.load_mode == SHOOT_STOP)
{
// 停止三个电机
case SHOOT_STOP:
DJIMotorStop(friction_l);
DJIMotorStop(friction_r);
DJIMotorStop(loader);
break;
}
// 如果上一次触发单发或3发指令的时间加上不应期仍然大于当前时间(尚未休眠完毕),直接返回即可
if (hibernate_time + dead_time > DWT_GetTimeline_ms())
return;
// 若不在休眠状态,根据控制模式进行电机参考值设定和模式切换
switch (shoot_cmd_recv.load_mode)
{
// 停止拨盘
case LOAD_STOP:
DJIMotorOuterLoop(loader, SPEED_LOOP);
DJIMotorSetRef(loader, 0);
break;
// 单发模式,根据鼠标按下的时间,触发一次之后需要进入不响应输入的状态(否则按下的时间内可能多次进入)
// 激活能量机关/干扰对方用,英雄用.
case LOAD_1_BULLET:
// 单发模式,根据鼠标按下的时间,触发一次之后需要进入不响应输入的状态(否则按下的时间内可能多次进入)F
case LOAD_1_BULLET: // 激活能量机关/干扰对方用,英雄用.
DJIMotorOuterLoop(loader, ANGLE_LOOP);
DJIMotorSetRef(loader, loader->motor_measure.total_angle + ONE_BULLET_DELTA_ANGLE); // 增加一发弹丸
DJIMotorSetRef(loader, loader->motor_measure.total_angle + ONE_BULLET_DELTA_ANGLE); // 增加一发弹丸的角度
hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间
dead_time = 150; // 完成1发弹丸发射的时间
break;
// 三连发,如果不需要后续可能删除
case LOAD_3_BULLET:
DJIMotorOuterLoop(loader, ANGLE_LOOP);
DJIMotorSetRef(loader, loader->motor_measure.total_angle + 3 * ONE_BULLET_DELTA_ANGLE); // 增加3发
hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间
dead_time = 300; // 完成3发弹丸发射的时间
break;
// 连发模式,对速度闭环,射频后续修改为可变
case LOAD_BURSTFIRE:

View File

@@ -5,4 +5,4 @@ void ShootInit();
void ShootTask();
#endif //SHOOT_H
#endif // SHOOT_H