无人机项目跟踪记录四十九----角速度环的pid控制详解

角速度环的pid控制的函数是void CtrlAttiRate(void),具体解释如下:

首先初始化变量,获取陀螺仪读取的角速度。

    float yawRateTarget=0;                                   //期望的偏航角速度
	
    static uint32_t tPrev=0;
	  float gryoPitch = imu.gyro[PITCH]-imu.gyroOffset[PITCH];   //当前俯仰值
	  float gryoRoll = imu.gyro[ROLL]-imu.gyroOffset[ROLL];      //当前横滚值
	  float gryoYaw = imu.gyro[YAW]-imu.gyroOffset[YAW];         //当前航向值(也既是航向值)

计算两次调用的间隔时间:

    float dt=0,t=0;                    //两次调用间隔时间
    t=micros();
    dt=(tPrev>0)?(t-tPrev):0;
    tPrev=t;

获取希望的偏航角:为何取负值没有搞清楚,估计与机体系和地理系变换有关系。如果陀螺仪读取的角度小于某个阈值就置为零。


    yawRateTarget=-(float)RC_DATA.YAW;  //希望的偏航角
    //注意,原来的pid参数,对应的是 ad值,故转之
#ifdef IMU_SW
	if(fabs(gryoPitch) < 0.001)
	{
		gryoPitch = 0;
	}
	if(fabs(gryoRoll) < 0.001)
	{
		gryoRoll = 0;
	}
	if(fabs(gryoYaw) < 0.001)
	{
		gryoYaw = 0;
	}

做角速度环的PID自整定,与角度环相似。注意一点就是,角度环是大调整,角速度环是内环细调,所以角度环条用的间隔时间长,角速度环的间隔时间短。

    PID_Postion_Cal(&pitch_rate_PID,pitch_angle_PID.Output,gryoPitch*180.0f/M_PI_F,dt);   //做角速度环的PID自整定,俯仰角的自整定
    PID_Postion_Cal(&roll_rate_PID,roll_angle_PID.Output,gryoRoll*180.0f/M_PI_F,dt);//gyroxGloble    //做角速度环的PID自整定,横滚角的自整定
    PID_Postion_Cal(&yaw_rate_PID,yawRateTarget,gryoYaw*180.0f/M_PI_F,dt);//DMP_DATA.GYROz   //做角速度环的PID自整定,航向角的自整定
#else

    //原参数对应于 DMP的直接输出gyro , 是deg.  且原DMP之后的处理运算是错误的
    PID_Postion_Cal(&pitch_rate_PID,pitch_angle_PID.Output,imu.gyro[PITCH]*DMP_GYRO_SCALE,0);
    PID_Postion_Cal(&roll_rate_PID,roll_angle_PID.Output,imu.gyro[ROLL]*DMP_GYRO_SCALE,0);//gyroxGloble
    PID_Postion_Cal(&yaw_rate_PID,yawRateTarget,imu.gyro[YAW]*DMP_GYRO_SCALE,0);          //DMP_DATA.GYROz
#endif

    Pitch = pitch_rate_PID.Output;
    Roll  = roll_rate_PID.Output;
    Yaw   = yaw_rate_PID.Output;
	

 

#include <Wire.h> #include <MPU6050.h> MPU6050 mpu; // PID参数 float Kp_angle = 1.0; float Ki_angle = 0.0; float Kd_angle = 0.0; float Kp_rate = 1.0; float Ki_rate = 0.0; float Kd_rate = 0.0; // 目标度和速度 float target_angle = 0.0; float target_rate = 0.0; // PID变量 float angle_error = 0.0; float angle_integral = 0.0; float angle_derivative = 0.0; float rate_error = 0.0; float rate_integral = 0.0; float rate_derivative = 0.0; // 输出控制量 float control_signal = 0.0; // 初始化函数 void setup() { Wire.begin(); mpu.initialize(); // 设置PID参数和目标值 // ... // 设置舵机引脚和舵机库 // ... } // 主循环 void loop() { // 读取MPU6050数据 int16_t ax, ay, az, gx, gy, gz; mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // 计算度和速度 float angle = atan2(ay, az) * 180.0 / PI; float rate = gx / 131.0; // 计算度误差和积分项 angle_error = target_angle - angle; angle_integral += angle_error; // 计算速度误差和积分项 rate_error = target_rate - rate; rate_integral += rate_error; // 计算度和速度的微分项 angle_derivative = angle - previous_angle; rate_derivative = rate - previous_rate; // 计算PID控制量 control_signal = Kp_angle * angle_error + Ki_angle * angle_integral + Kd_angle * angle_derivative + Kp_rate * rate_error + Ki_rate * rate_integral + Kd_rate * rate_derivative; // 输出控制量到舵机或双螺旋桨转速差控制 // ... // 更新上一次的度和速度 previous_angle = angle; previous_rate = rate; // 延时 delay(20); } #### 引用[.reference_title] - *1* *3* [ESP32使用Arduino驱动180 360度舵机](https://blog.csdn.net/weixin_42854045/article/details/127603120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ESP32上手笔记 | 02 - ESP32-Arduino开发环境搭建](https://blog.csdn.net/Mculover666/article/details/123486323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wyssailing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值