IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 四轴飞行器偏航角不同飞控的C语言实现方法 -> 正文阅读

[C++知识库]四轴飞行器偏航角不同飞控的C语言实现方法

????????偏航角的控制与俯仰角以及翻滚角不同。俯仰角以及翻滚角都是要随着遥控器改变,特别是遥控器归中的时候,就俯仰角以及翻滚角也要归0。但是偏航角最大的区别就是遥控器归中后不需要恢复。

蓝鸟飞行器:

对于Z轴偏航角的控制:

是对接受来的遥控器数据进行分段处理,当大于某一值的时候,对期望的偏航角度值进行累加。由于是分段控制,所以遥控器摇杆归位以后,期望的偏航角度值并不归0。所以不会出现摇杆归位后,飞机又转回去的现象。

特点:

偏航角数据分段处理不同担心在打油门的时候误触偏航角

Z轴有角度环--角速度环PID控制,所以在未起飞的时候对飞机的偏航角进行改变后,飞机会将认为偏航角的改变是外界的误差干扰,起飞时,为了消除误差会回到初始化时(一般是开机时)的偏航角。

同样的,在飞行的时候,如果强行改变飞行器的偏航角,由于Z轴有角度环PID控制,飞机也会很快的调整到原来的偏航角

简要代码节选:

//遥控器
const float roll_pitch_ratio = 0.04f;//将控制量限制在-20~20之间
?
pidPitch.desired    = -(Remote.pitch-1500)*roll_pitch_ratio 
pidRoll.desired     = -(Remote.roll-1500)*roll_pitch_ratio; 
?
if(Remote.yaw>1820)//当且仅当舵量里中心值(1500)偏移较多时,才对偏航角进行加和 ? 
    {
        pidYaw.desired += 0.75f;    
    }
        else if(Remote.yaw <1180)
    {
        pidYaw.desired -= 0.75f;    
    }
?
?
//PID控制
pidRateX.measured = MPU6050.gyroX * Gyro_G; //陀螺仪测量的角速度
pidRateY.measured = MPU6050.gyroY * Gyro_G;
pidRateZ.measured = MPU6050.gyroZ * Gyro_G;         
?
pidPitch.measured = Angle.pitch; //姿态结算的实际姿态角
pidRoll.measured ?= Angle.roll;
pidYaw.measured ? = Angle.yaw;
?
pidUpdate(&pidRoll,dt); ? ? 
pidRateX.desired = pidRoll.out; //将角度环的输出值作为角速度环的输入值
pidUpdate(&pidRateX,dt); ?
?
pidUpdate(&pidPitch,dt); ? ?
pidRateY.desired = pidPitch.out; ?
pidUpdate(&pidRateY,dt); ? 
?
CascadePID(&pidRateZ,&pidYaw,dt);   
?

//PID算法
void pidUpdate(PidObject* pid,const float dt)
{
    float error;
    float deriv;
?
    error = pid->desired - pid->measured; //比例
    pid->integ += error * dt; //积分 
    deriv = (error - pid->prevError)/dt; //微分 
    pid->out = pid->kp * error + pid->ki * pid->integ + pid->kd * deriv;
    pid->prevError = error; ?//更新误差(用于微分计算)
}
 

小马哥飞行器:

对于Z轴偏航角的控制:

没有对接受来的遥控器数据进行分段处理,和翻滚角以及俯仰角的处理方法相同。但是对偏航角只进行单级的角速度PID控制,而没有角度PID控制。将期望的偏航角度值,直接输入。这样一来也可以实现偏航角不随遥控器摇杆归中的效果。

特点:

没有了偏航角-角度环的控制,对偏航角PID控制仅使用角速度环,在未起飞的时候对飞机的偏航角进行改变后,起飞时飞机会按照已经改变的方向起飞;

飞机在空中飞行的时候,偏航角不像俯仰角与翻滚角,收到外界的干扰相对而言还是少一些的,所以去掉偏航角的角度环问题不大

简要代码节选:

//遥控器
Target_Angle.rol = (float)((rc_in->ROLL-1500)/12.0f);
Target_Angle.pit = (float)((rc_in->PITCH-1500)/12.0f);
Target_Angle.yaw = (float)((1500-rc_in->YAW)/12.0f); 
?
//角度环
    PID_Postion_Cal(&PID_ROL_Angle,Target_Angle.rol,Measure_Angle.rol);//ROLL角度环PID (输入角度 输出角速度)
    PID_Postion_Cal(&PID_PIT_Angle,Target_Angle.pit,Measure_Angle.pit);//PITH角度环PID (输入角度 输出角速度)
//  PID_Postion_Cal(&PID_YAW_Angle,Target_Angle.yaw,Measure_Angle.yaw);//YAW角度环PID  (输入角度 输出角速度)
    
//角速度环
PID_Postion_Cal(&PID_ROL_Rate,PID_ROL_Angle.OutPut,(gyr_in->Y*RadtoDeg)); //ROLL角速度环PID (输入角度环的输出,输出电机控制量)
PID_Postion_Cal(&PID_PIT_Rate,PID_PIT_Angle.OutPut,-(gyr_in->X*RadtoDeg)); //PITH角速度环PID (输入角度环的输出,输出电机控制量)
PID_Postion_Cal(&PID_YAW_Rate,Target_Angle.yaw*PID_YAW_Angle.P,gyr_in->Z*RadtoDeg); //YAW角速度环PID (输入角度,输出电机控制量)`
?
//PID算法
void PID_Postion_Cal(PID_TYPE*PID,float target,float measure)
{
PID->Error ?= target - measure; ? ? ? ? ? ? ?//误差
PID->Differ = PID->Error - PID->PreError; ? ?//微分量
?
PID->Pout = PID->P * PID->Error; ? ? ? ? ? ? ? ? ? ? ? ?//比例控制
PID->Iout = PID->Ilimit_flag * PID->I * PID->Integral; ?//积分控制(Ilimit_flag可以为1或者0)
PID->Dout = PID->D * PID->Differ; ? ? ? ? ? ? ? ? ? ? ? //微分控制
?
PID->OutPut = ?PID->Pout + PID->Iout + PID->Dout; ? ? ? //比例 + 积分 + 微分总控制
?
if(Airplane_Enable == 1&&RC_Control.THROTTLE >= 180) ? ?//飞机解锁之后再加入积分,防止积分过调
{
    if(measure > (PID->Ilimit)||measure < -PID->Ilimit) ? //积分分离
    {PID->Ilimit_flag = 0;}
    else
    {
        PID->Ilimit_flag = 1; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //加入积分(只有测量值在-PID->Ilimit~PID->Ilimit 范围内时才加入积分)
        PID->Integral += PID->Error; ? ? ? ? ? ? ? ? ? ? ? ?//对误差进行积分
        if(PID->Integral > PID->Irang) ? ? ? ? ? ? ? ? ? ? ?//积分限幅
            PID->Integral = PID->Irang;
        if(PID->Integral < -PID->Irang) ? ? ? ? ? ? ? ? ? ? //积分限幅
         ? ?PID->Integral = -PID->Irang; ? ? ? ? ? ? ? ? ? ?
    }
}else
{PID->Integral = 0;}
PID->PreError = PID->Error ; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//前一个误差值
 ?  }

                
        
        
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:20:07  更:2022-03-22 20:20:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:26:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码