发 帖  
原厂入驻New
发烧友10周年庆典,全网超值优惠来袭!千元现金券,下单抽奖赶紧参与》》

[经验] 【案例分析】基于超声波的四轴定高控制简析

2019-7-11 06:30:00  523 超声波 四轴飞行器
分享
1
大家讲一下基于超声波的定高问题,鉴于笔者能力有限,所以如有错误请多指教,且很多仅仅是工程上的近似化应用,没有做过仿真模拟。
我讲的东西更加偏重于实践,可以帮助你切实的实现这个应用!
基于超声波的定高主要有如下几个问题:
(有需要自主DLY资料和控制板或者四轴的加QQ939062236)
硬件和安装技巧?
超声波测距的算法(如何编程,如何处理结果)?
是用什么样子的PID算法?
如何调试更加快捷?
实际开发将会遇到哪些棘手问题?
定高控制如何实现较为稳定为起降?
笔者做定高用了一个星期,而且参考了别的算法,实现比较简单,但是真正达到一个很好的效果,却经历了很多挫折。
那么我将展开讨论了:
如图1是我搭建的四轴平台,花了2000左右,PCB是自己做的,模块是自己的配的,调试地面站是匿名地面站,通过蓝牙通信;当然这不是今天的主题,笔者假设你已经得到了很好地姿态控制。
7.png


一.硬件和安装技巧:
1.超声波的特性是这样的,当模块被东西突然遮住的时候(1cm之内或者更小),那么测量值就会发生突变,非常之大,那么这对控制来说是毁灭性的。所以你的超声波要安装到飞行器的正下方,而且要避免跟电池放在一起。容易干扰。此外,需要做阈值处理,如果测量值突变,则舍弃测量结果。
理论上讲超声波放在飞行器的正下面的中心是最好的,这样测出来的距离更加精确。如图2。如果飞行器俯仰角不为0,从数学上讲要进行补偿,但是实际上你们可以算一下角度变化10以内的时候对这个距离造成的距离影响很小。所以并不需要PPT里面所讲的这种几何补偿,而且在STM32中三角函数的计算量非常大,就算是换成快速三角函数,造成的计算误差,远远大于实际测量误差,补偿反而得不偿失。而且超声波也没有明显的偏移。PPT的作者可能并没有实际实现过。超声波也不需要装在正下方,装在支架的两边可以。因为正下方可是要放摄像头的。
如果在程序上不精密设计,不合理的线程设计,不合理的计算设计,都会导致程序失控。
8.png


2.如何测量和处理数据:
超声波有的采用串口协议,我个人觉得串口协议的蛮好用,下面是程序截图,语句1意思是测出的数据是两个字节得到的,第一个字节左移八位,加上第二个字节。两者距离,单位是mm,笔者实测,超声波模块的精度很高。
测量得到原始的ultra_distance,需要处理,不然得到的数据是上下抖动的。
9.png


笔者没有保存图,所以下面这个不是很明显,还是可以看出跳动。通常有3种滤波算法:
1.均值滤波
2.低通滤波
3.kalman滤波
10.png


笔者实测,第二三中效果差不多,且低通滤波更加易于实现,第一种的效果很差,那么我们来看一下低通滤波。


11.png
这里针对不同的高度做了不同频率的低通滤波,这个形式是基于滤波频率的,比较难懂,大家可以看下下面这种:
Yn=a* Xn+(1-a)*Yn-1
Yn-1是上次测量值,Yn是这次测量值,得到输出,截止频率是
F = a /(2*3.14*T)
T为采样周期;
12.png


如上就是代码实现,其中通过右移8位的方式实现除法,速度更快。计算可得截止频率是50HZ
二、用了什么样子的PID?
当然是串级PID了。
13.png


一阶PID也是可以实现的。但是明显不稳定,而且控制复杂。需要在不同的高度调节不同的参数。串级PID则比较稳定,问题较少。上图是PixHawk的PID算法。实际上我用的内环是速度pID,即飞行器上升下降的速度,外环当然是高度PID了。
整体实现不讲了,就是PID算法,说一下细节。比如说,如何得到速度,这里需要用到融合滤波算法:
    y = (a)*(y) + (1-a)*(x);
这个是不同于低通滤波是一种一阶融合滤波,将两种测量结果,融合在一起,兼顾两种测量好的效果,抵消掉不利的效果。
14.png


wz-speed是通过重力加速度积分测得的速度,h_speed是超声波差分得到的。代码的一个句就是对加速度进行积分,第二句是死区控制,有点麻烦,这里不提。
三四句对加速度测量做了低通滤波,第五句,通过融合两种速度,得到更加稳定的结果。你可以在地面站上去看这个曲线,非常漂亮,只是速度回复稍微有点慢。
外环就是对高度进行控制,这里需要注意几点:
1.高度要做限制,不能过高;
2.无人机启动从地面起飞的时候,要设定一个固定的较大的高度值,提供一个稳定的PID控制,超过了一定的高度再更改目标高度,比如说无人机静止时候测量得到20CM,那么打开油门后设定目标高度为40,飞机上升到40,在继续加高度。因为无人机有地面效应,在地面的时候有更大的推力。
这里是工程实践得到的经验。
三、如何调试更加快捷?
实际开发将会遇到哪些棘手问题?
如何调试定高,真的挺费劲的。需要反复更改PID。
而且还有很多棘手问题,我当时调试,就是因为回来一个头,结果没看住无人机飞到天下,把天花板撞烂了。四轴的底层很难调,经常出问题。出一个问题弄不好就是毁灭性的。
我是在四轴的两个方向上加了两个支柱,这样飞起来的时候,不好的话,可以抓住它。还有第二个好处,就是定高的时候悬停是没有的,所以飞机四处飘,很难调定高,你可以是不是的戳一下杆子,让他保持在一个范围内。还有一个好处测量你姿态的稳定度。好的稳定度,你去剧烈摇摆杆子,姿态可以很快地恢复。不会崩溃。但是千万不要用杆子去旋转四轴,那样基本就雪崩。
首先先调内环。外环不管。把油门加到可以让无人机起飞。接下里,调P,将P调到一个合适的位置,你剧烈的上下晃动四轴,无人机会出下一个很大的阻尼,阻尼越平滑,反应越快越好,你将四轴向上推,四轴转速降低,向下推转速开始对看你的推力。调的较好以后就徒手悬空放开四轴,会发现四轴慢慢的飘落,如果速度保持为0的性能越好,则P越好。然后调D,D差不多就行了。关键是I ,这个需要长时间调试去感受了。没有I的话,效果很差。
然后就是调高度环,先调50cm定高,再调100cm定高,再是30cm,越低越难调。四轴能够稳定的到达目的地那是最好的、
这里有一个技巧:
15.png


exp_height是定高控制值。height_value是真实的目标值,不能一蹴而就,所以期待的定高,要慢慢去逼近他。不然一次给一个很大的值,很容易过冲,一点点的逼近目标,会比较稳定。这时候只需要慢慢调节逼近速度即可。
四,如何实现稳定的起降?
这个是最具工程性的,而且编程难度实际上很大。
降落来讲,首先低于一个阈值就必须关闭电机,不然四周会在地面跳跃,不稳定;
再就是从高处下落,更好地办法是开环的,慢慢的较低油门,就可以慢慢掉下来。比控制高度的方法效果更高;

起飞也是非常难得。

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发经验
课程
    关闭

    站长推荐 上一条 /10 下一条

    快速回复 返回顶部 返回列表