无人机之姿态控制篇

姿态控制篇

拿四旋翼无人机为例,四个桨叶旋转是的无人机产生了升力,但是这个升力要怎么匹配才能使得无人机能够平稳的飞行呢,这个就是无人机姿态控制的关键。
在这里插入图片描述
如图四个电机1、2、3、4,水平位置X,Y。要想使无人机平稳的飞行则水平位置XY的升力必须达到平衡。这是姿态控制就要发挥它的作用了。
本次我使用的姿态控制算法也是传统的串级PID,首先我们需要先了解一下姿态控制需要用到哪些数据:
1、输入型数据:欧拉角(水平位置的反馈信息)、陀螺仪数据(可以理解为欧拉角的微分,这个数据可以实时检测到飞机的XY方向的角速度)
2、输出型数据:输出有三个轴的信息需要输出,X轴、Y轴、Z轴。X轴控制左右方向,比如检测到飞机往右边倾斜了X轴数据的数据会加大34电机的PWM,从而是的飞机恢复水平,反之检测到飞机往左边倾斜则X轴数据会加大12电机的PWM是的飞机恢复平衡。Y轴同理X轴。剩下就是Z轴也称Yaw轴,无人机桨叶在旋转的时候同时会带动飞机往反方向旋转,所以Yaw控制13电机24电机的平衡。
原理写完了直接上代码:

void Extern_pid(_PID_extern* par,float tar,float cur,float ratio_p,float ratio_i,float ratio_d)
{
float err = 0, i_err= 0, d_err = 0, results = 0;
 err = tar-cur;
 i_err = par->i_err+ratio_i*err;
 d_err = err-par->pre_err;
 par->pre_err = err;
 par->i_err = i_err;
 d_err = d_err*ratio_d;
 par->d_err = d_err;
 err = err*ratio_p;
 results = err+par->i_err+d_err;
 par->results = results;
}//先上一个PID的框架,后面就直接调用这个PID函数了
//各个参数的意义熟悉PID的同学应该很快就能看出来,下面就是串级PID的精髓了:
//position control
  Extern_pid((_PID_extern*)&pitch_angle,eulerPitchDesired,eulerPitchActual,
    ANGLE_PitchRoll_KP,ANGLE_PitchRoll_KI,ANGLE_PitchRoll_KD);
  Extern_pid((_PID_extern*)&roll_angle,eulerRollDesired,eulerRollActual,
    ANGLE_PitchRoll_KP,ANGLE_PitchRoll_KI,ANGLE_PitchRoll_KD);
Extern_pid((_PID_extern*)&yaw_angle,eulerYawDesired,flight_yaw(eulerYawActual,eulerYawDesired),
    ANGLE_Yaw_KP,ANGLE_Yaw_KI,ANGLE_Yaw_KD);
 //eulerPitchActual,eulerRollActual,flight_yaw(eulerYawActual,eulerYawDesired)这三个参数就是姿态解算出来的欧拉角,欧拉角作为串级PID的外环。
 //angular velocity control
  Extern_pid((_PID_extern*)&pitch_gyro,pitch_angle.results,gyro_x,
    VEL_PitchRoll_KP,VEL_PitchRoll_KI,VEL_PitchRoll_KD);
  Extern_pid((_PID_extern*)&roll_gyro,roll_angle.results,gyro_y,
    VEL_PitchRoll_KP,VEL_PitchRoll_KI,VEL_PitchRoll_KD);
  Extern_pid((_PID_extern*)&yaw_gyro,yaw_angle.results,gyro_z,
    VEL_Yaw_KP,VEL_Yaw_KI,VEL_Yaw_KD);
    //这个内环也解释一下,用外环PID的运算值加入到内环PID的期望值,这个思想等同于模糊PID即外环误差越大内环误差成倍数增大,类似于内环动态的KP,KI,KD值。内环主要是角速度环,在整个串级PID来说内环相当于单极PID的D值,只是这个D值反应很迅速,所以这个算法在无人机姿态控制效果很好。
    MotorValue[0]=(int16)(LIMIT(thr_out+pitch_filter_control+roll_filter_control+yaw_filter_control,0,960));
 MotorValue[1]=(int16)(LIMIT(thr_out-pitch_filter_control+roll_filter_control-yaw_filter_control,0,960));
 MotorValue[2]=(int16)(LIMIT(thr_out-pitch_filter_control-roll_filter_control+yaw_filter_control,0,960));
 MotorValue[3]=(int16)(LIMIT(thr_out+pitch_filter_control-roll_filter_control-yaw_filter_control,0,960));
 //然后就是把XYZ三轴经过PID运算的数据传到各个对应的电机

到此,姿态平稳控制完成,希望对你有用,有关无人机各个模块讲解持续更新中…

  • 7
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值