• 基于超声波的四轴定高控制简析


     

    笔者是来自武汉理工的小青同学,接下来为大家讲一下基于超声波的定高问题,鉴于笔者能力有限,所以如有错误请多指教,且很多仅仅是工程上的近似化应用,没有做过仿真模拟。

    我讲的东西更加偏重于实践,可以帮助你切实的实现这个应用!

    基于超声波的定高主要有如下几个问题:

    (有需要自主DLY资料和控制板或者四轴的加QQ939062236)

    硬件和安装技巧?

    超声波测距的算法(如何编程,如何处理结果)?

    是用什么样子的PID算法?

    如何调试更加快捷?

    实际开发将会遇到哪些棘手问题?

    定高控制如何实现较为稳定为起降?

    笔者做定高用了一个星期,而且参考了别的算法,实现比较简单,但是真正达到一个很好的效果,却经历了很多挫折。

    那么我将展开讨论了:

    如图1是我搭建的四轴平台,花了2000左右,PCB是自己做的,模块是自己的配的,调试地面站是匿名地面站,通过蓝牙通信;当然这不是今天的主题,笔者假设你已经得到了很好地姿态控制。


    .硬件和安装技巧:

    1.超声波的特性是这样的,当模块被东西突然遮住的时候(1cm之内或者更小),那么测量值就会发生突变,非常之大,那么这对控制来说是毁灭性的。所以你的超声波要安装到飞行器的正下方,而且要避免跟电池放在一起。容易干扰。此外,需要做阈值处理,如果测量值突变,则舍弃测量结果。

    理论上讲超声波放在飞行器的正下面的中心是最好的,这样测出来的距离更加精确。如图2。如果飞行器俯仰角不为0,从数学上讲要进行补偿,但是实际上你们可以算一下角度变化10以内的时候对这个距离造成的距离影响很小。所以并不需要PPT里面所讲的这种几何补偿,而且在STM32中三角函数的计算量非常大,就算是换成快速三角函数,造成的计算误差,远远大于实际测量误差,补偿反而得不偿失。而且超声波也没有明显的偏移。PPT的作者可能并没有实际实现过。超声波也不需要装在正下方,装在支架的两边可以。因为正下方可是要放摄像头的。

    如果在程序上不精密设计,不合理的线程设计,不合理的计算设计,都会导致程序失控。

     


    2.如何测量和处理数据:

    超声波有的采用串口协议,我个人觉得串口协议的蛮好用,下面是程序截图,语句1意思是测出的数据是两个字节得到的,第一个字节左移八位,加上第二个字节。两者距离,单位是mm,笔者实测,超声波模块的精度很高。

    测量得到原始的ultra_distance,需要处理,不然得到的数据是上下抖动的。

     


    笔者没有保存图,所以下面这个不是很明显,还是可以看出跳动。通常有3种滤波算法:

    1.均值滤波

    2.低通滤波

    3.kalman滤波


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


     

    这里针对不同的高度做了不同频率的低通滤波,这个形式是基于滤波频率的,比较难懂,大家可以看下下面这种:

    Yn=a* Xn+(1-a)*Yn-1 

    Yn-1是上次测量值,Yn是这次测量值,得到输出,截止频率是

    F = a /(2*3.14*T)

    T为采样周期;


    如上就是代码实现,其中通过右移8位的方式实现除法,速度更快。计算可得截止频率是50HZ

    二、用了什么样子的PID?

    当然是串级PID了。


    一阶PID也是可以实现的。但是明显不稳定,而且控制复杂。需要在不同的高度调节不同的参数。串级PID则比较稳定,问题较少。上图是PixHawk的PID算法。实际上我用的内环是速度pID,即飞行器上升下降的速度,外环当然是高度PID了。

    整体实现不讲了,就是PID算法,说一下细节。比如说,如何得到速度,这里需要用到融合滤波算法:

        y = (a)*(y) + (1-a)*(x);

    这个是不同于低通滤波是一种一阶融合滤波,将两种测量结果,融合在一起,兼顾两种测量好的效果,抵消掉不利的效果。


    wz-speed是通过重力加速度积分测得的速度,h_speed是超声波差分得到的。代码的一个句就是对加速度进行积分,第二句是死区控制,有点麻烦,这里不提。

    三四句对加速度测量做了低通滤波,第五句,通过融合两种速度,得到更加稳定的结果。你可以在地面站上去看这个曲线,非常漂亮,只是速度回复稍微有点慢。

    外环就是对高度进行控制,这里需要注意几点:

    1.高度要做限制,不能过高;

    2.无人机启动从地面起飞的时候,要设定一个固定的较大的高度值,提供一个稳定的PID控制,超过了一定的高度再更改目标高度,比如说无人机静止时候测量得到20CM,那么打开油门后设定目标高度为40,飞机上升到40,在继续加高度。因为无人机有地面效应,在地面的时候有更大的推力。

    这里是工程实践得到的经验。

    三、如何调试更加快捷?

    实际开发将会遇到哪些棘手问题?

    如何调试定高,真的挺费劲的。需要反复更改PID。

    而且还有很多棘手问题,我当时调试,就是因为回来一个头,结果没看住无人机飞到天下,把天花板撞烂了。四轴的底层很难调,经常出问题。出一个问题弄不好就是毁灭性的。

    我是在四轴的两个方向上加了两个支柱,这样飞起来的时候,不好的话,可以抓住它。还有第二个好处,就是定高的时候悬停是没有的,所以飞机四处飘,很难调定高,你可以是不是的戳一下杆子,让他保持在一个范围内。还有一个好处测量你姿态的稳定度。好的稳定度,你去剧烈摇摆杆子,姿态可以很快地恢复。不会崩溃。但是千万不要用杆子去旋转四轴,那样基本就雪崩。

    首先先调内环。外环不管。把油门加到可以让无人机起飞。接下里,调P,将P调到一个合适的位置,你剧烈的上下晃动四轴,无人机会出下一个很大的阻尼,阻尼越平滑,反应越快越好,你将四轴向上推,四轴转速降低,向下推转速开始对看你的推力。调的较好以后就徒手悬空放开四轴,会发现四轴慢慢的飘落,如果速度保持为0的性能越好,则P越好。然后调D,D差不多就行了。关键是I ,这个需要长时间调试去感受了。没有I的话,效果很差。

    然后就是调高度环,先调50cm定高,再调100cm定高,再是30cm,越低越难调。四轴能够稳定的到达目的地那是最好的、

    这里有一个技巧:


    exp_height是定高控制值。height_value是真实的目标值,不能一蹴而就,所以期待的定高,要慢慢去逼近他。不然一次给一个很大的值,很容易过冲,一点点的逼近目标,会比较稳定。这时候只需要慢慢调节逼近速度即可。

    四,如何实现稳定的起降?

    这个是最具工程性的,而且编程难度实际上很大。

    降落来讲,首先低于一个阈值就必须关闭电机,不然四周会在地面跳跃,不稳定;

    再就是从高处下落,更好地办法是开环的,慢慢的较低油门,就可以慢慢掉下来。比控制高度的方法效果更高;

    起飞也是非常难得。今天先将到这里,下次好好讲一下,稳定起降。

  • 相关阅读:
    GridView实用示例源码附加导出Excel功能
    在做web项目时经常遇到新闻要上一篇,下一篇
    wpf是什么
    今天发的一些文章是早以前遇到一些小问题,园友别炮轰我哦
    Excel表中的数据导入到数据库中
    WPF指南之XAML概述
    sql 替换字段内的内容及出现的问题
    const 和readonly
    SQL2008报Script failed for Server 'xxxxxx.database.windows.net' (Microsoft.SqlServer.Smo)这样的错误
    新年新气象
  • 原文地址:https://www.cnblogs.com/ypwen/p/5862783.html
Copyright © 2020-2023  润新知