打印
[Beagle Bone]

【Beagle Bone开源设计】四轴飞行器(8)-网络通信及PID调节

[复制链接]
2230|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
friendyh|  楼主 | 2015-2-26 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 friendyh 于 2015-6-7 22:13 编辑

1.     网络通信
四轴飞行器的BBB开发板和电脑在同一个无线路由器上面连接,BBB开发板的IP固定为192.168.1.150.两者之间采用流式SOCKET通信,由电脑向BBB发出控制信号,之后BBB根据接受的信号来执行相应的动作,这个相对简单。

2.    PID简介
当今的闭环自动控制技术都是基于反馈的概念以减少不确定性。反馈理论的要素包括三个部分:测量、比较和执行。测量关心的是被控变量的实际值,与期望值相比较,用这个偏差来纠正系统的响应,执行调节控制。在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器(比例-积分-微分控制器)是一个在工业控制应用中常见的反馈回路部件,由比例单元P、积分单元I和微分单元D组成。(百度)
四轴飞行器使用PID算法的目的是其能根据传感器的数据进行自动调节来维持平衡,即便有风过来把飞行器刮歪了,飞行器也可以自动调节到平衡状态。PID算法是四轴飞行器程序的核心。
3.      四轴飞行器PID
PID本身的算法相对简单,算法的输出就是计算出飞行器传感器现在的值和要达到的稳定状态传感器的值的差值。代码如下:
double xpidupdate(double ox, double mx,struct pid*pidx)
{
pidx->error=ox-mx;
if(pidx->error>=-1.5&&pidx->error<=1.5)
{   return 0;
}
pidx->pterm=pidx->error*pidx->pgain;
pidx->dterm=(pidx->error-pidx->lasterror)*pidx->dgain;
pidx->lasterror=pidx->error;
return ((double)pidx->pterm+pidx->dterm);
}
其中ox是传感器现在的值,mx是稳定状态时候传感器的值。目前我这个算法里面只使用了P和D,没有加入I,后期会把I加进去。MPU6050传感器的输出值为三个角度,也就是飞行器和当前水平面的X,Y夹角,以及飞行器相对初始状态的一个偏航角。三个角度在刚开始都接近0度,在飞行的过程中如果不平稳,三个角度就不会是0度,PID算法就是根据角度值使得四轴飞行器自动改变姿态,当把三个角度调成到接近0度是,就是平稳状态。
这个自动调节原理很简单,可是实现起来比较复杂。这中间不光要涉及到编程,还有物理学的知识,在得到差值之后,根据差值来控制四个螺旋桨的转速,这个差值到四个螺旋桨的映射是四轴飞行器的核心。
刚开始,我想的是当飞行器不平衡时候,让低的一边螺旋桨加速,高的一边螺旋桨减速,加速和减速的值相同,这个算法写完之后,我想到了四轴飞行器不是质量均匀分布的整体,在平稳状态是四个螺旋桨的转速不一定相同,因此这样的算法不正确。之后我改成按照比例调节,比如一边增加10%的转速,另外一边减小10%的转速,可是这样如果调节不精确,还会导致四轴飞行器自旋。最后我又查看了四轴飞行器的物理知识,当飞行器在水平位置时候,每个螺旋桨的升力是和转速的平方成近似正比关系,因此调节的时候要按照转速的平方进行调节,而不是转速,因此我又修改算法。四个旋翼的输出的PWM值是以纳秒为单位,如果这样计算,再加上平方,数值会很大,会越界,因此计算前先将纳秒转化成微秒,减少计算量,等待计算完成后再将微秒转化成纳秒输出给四个螺旋桨的PWM。至此四轴飞行器的主要功能代码编写完毕。完整的程序上传到附件,包括BBB服务器端代码和PC的控制端代码。

源代码.zip

547.89 KB, 阅读权限: 200

相关帖子

沙发
WoodBridge| | 2016-6-7 10:18 | 只看该作者
支持上传,这个算是比较有用的东西了!

使用特权

评论回复
板凳
傲视苍穹的鹰| | 2016-8-18 19:36 | 只看该作者
看看你的源码,貌似下载不了啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

70

帖子

6

粉丝