电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
【Crazyflie 2.1开源无人机试用连载】飞行控制
分 享
扫描二维码分享
【Crazyflie 2.1开源无人机试用连载】飞行控制
开源无人机
飞控
瑟寒凌风
关注
发布时间: 2021-07-14
丨
阅读: 717
四轴飞行器是根据空气动力学的原理设计的飞行器,它的螺旋桨与空气发生相对运动,产生了向上的升力,只有当当升力大于四轴的重力时四轴就可以起飞了。从而我们就知道在选择电机的时候,需要选择大扭力,高转速,质量轻的电机。四轴飞行器的四个螺旋桨都是电机直连的简单机构,十字形的布局允许飞行器通过改变电机转速获得旋转机身的力,从而调整自身姿态。 四轴飞行器的水平保持: 假如四个电机的转速是完全相同,会是一个什么情况呢? 当四个螺旋桨的转速相同,并且方向一致的时候,并非在升力大于重力就能够飞起来,因为四轴会发生旋转。我们在控制四轴的时候,一定要对角的电机通同向,相邻电机反向,这样就正好抵消因为电机转动带来的整个飞行器转动。 控制四轴电机1和电机3同向,电机2电机4反向,刚好抵消反扭矩,巧妙的实现了平衡: ![](https://cf05.ickimg.com/bbsimages/202107/e91344ecc6f3d93ad56cb09408e230b8.png) 由于电机和螺旋桨本身制造的差异我们无法做到四个电机转速完全相同,如果我们控制同样的转速很有可能飞行器起飞之后就侧翻了。 为了能够让四轴飞行器保持飞行,需要加上计算机的帮助。简单来说,需要在四轴飞行器上装一台计算机,这台计算机能够“感觉”到飞行器目前的姿态。 而我们的这台开源四轴飞行器中使用的STM32芯片,可以通过控制算法实现无人机的姿态控制。 比如说,飞行器现在往左发生了倾斜,计算机“感受”到之后,立即向四个螺旋桨发出控制信号,使左侧的螺旋桨加大转速,右侧的螺旋桨减少转速,重新使飞行器回到平衡的姿态。这个过程必须非常快,通常在几十毫秒内完成。因为一旦飞行器发生了倾斜,螺旋桨向下的推力变为侧下方的推力,就像把一个球放到斜坡上,便会离开自己的位置。 为了不使人感觉到四轴飞行器的移动,需要尽可能快地把所有姿态纠正的动作完成,这时飞行器就会不停地抖动。 在实际应用中需要一个自动反馈系统替代人操作来完成飞机的自稳定,我们人只需要控制飞机的方向和高度就可以了。这个系统中反馈由姿态传感器替代眼睛,而大脑则由单片机来替代。 # 控制算法 PID是偏差的比例、积分和微分来对被控对象进行控制。 P: (比例)就是输入偏差乘以一个常数 I : (积分)就是对输入偏差进行积分运算 D: (微分)对输入偏差进行微分运算 • 比例(P)控制 比例控制是一种最简单的控制方式。比例环节的作用是对偏差瞬间作出反应。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差。打个比方,如果现在的输出是1,目标输出是100,那么P的作用是以最快的速度达到100,把P理解为一个系数即可。 • 积分(I)控制 在积分控制中,控制器的输出与输入误差信号的积分成正比关系。从积分的数学表达式可知:只要存在偏差,则它的控制作用就不断增加。只有在偏差值为零时,它的积分才是一个常数。控制作用才是一个不会增加的常数。可见,积分部分可以消除系统的偏差。 对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的 或简称有差系统。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积 分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。积分环节虽然会消除静态误差,但是也会降低系统的响应速度,增加系统的超调量。积分时间常数越大,积分的积累越弱。 • 微分(D)控制 控制系统除了期望消除静态误差外,还要求加快调节过程。微分调节就是偏差值的变化率。使用微分环节能够实现系统的超前控制。在偏差出现的瞬间,或在偏差变化的瞬间,不但要对偏差量做出立即响应(比例环节的作用),而且要根据偏差的变化趋势预先给出适当的纠正。大部分控制系统不需要调节微分时间。因为只有时间滞后的系统才需要附加这个参数。如果画蛇添足加上这个参数反而会使系统的控制受到影响。 模拟PID公式如下: ![](https://cf05.ickimg.com/bbsimages/202107/e4a20f4861da6237039ca5ce1bc6c064.png) # 代码 ```c #ifndef _pid_ #define _pid_ #include "stm32f10x_conf.h" #define __P 1 #define __PI 2 #define __PID 3 typedef struct { u8 CHO; float now; float set; float Time; float Time_1; float Time_2; float Kp; float T; u16 Tdata; float Ti; float Td; float Dt; float DT0; short pwm_now; u16 pwm_period; }PID; extern u8 STATUS; extern PID pid; void Init_PID(void); void calc_PID(void); #Timedif #include "pid.h" #include "PWM_Config.h" #include "USART_Config.h" PID pid; void Init_PID() { pid.CHO = __PID; pid.T=460; pid.set =280; pid.Kp=0.325; pid.Ti=69; pid.Td=21; pid.DT0=0; pid.pwm_period = 460; } void calc_PID() { float dk1;float dk2; float t1,t2,t3; if(pid.Tdata < (pid.T)) { return ; } pid.Tdata = 0; pid.Time=pid.set-pid.now; dk1=pid.Time-pid.Time_1; dk2=pid.Time-2*pid.Time_1+pid.Time_2; t1=pid.Kp*dk1; t2=(pid.Kp*pid.T)/pid.Ti; t2=t2*pid.Time; t3=(pid.Kp*pid.Td)/pid.T; t3=t3*dk2; switch(pid.CHO) { case __P: pid.Dt= t1; printf("使用P运算\r\n") ; break; case __PI: pid.Dt= t1+t2; printf("使用PI运算\r\n") ; break; case __PID: pid.Dt= t1+t2+t3; printf("使用PID运算\r\n") ; break; } pid.pwm_now+=pid.Dt; printf("PID算得的OUT:\t%d\r\n",(int)pid.pwm_now) ; if(pid.pwm_now>pid.pwm_period) { pid.pwm_now=pid.pwm_period; } if(pid.pwm_now<0) { pid.pwm_now=0; } printf("实际输出使用的OUT:\t%d\r\n",(int)pid.pwm_now) ; pid.Time_2=pid.Time_1; pid.Time_1=pid.Time; Turn_Angle(pid.pwm_now); } ```
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
瑟寒凌风
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交