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

2023-05-16

 

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

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

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

(有需要自主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是真实的目标值,不能一蹴而就,所以期待的定高,要慢慢去逼近他。不然一次给一个很大的值,很容易过冲,一点点的逼近目标,会比较稳定。这时候只需要慢慢调节逼近速度即可。

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

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

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

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

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

转载于:https://www.cnblogs.com/ypwen/p/5862783.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于超声波的四轴定高控制简析 的相关文章

  • linux下 /usr/bin/ld: 找不到 -ldhnetsdk的解决方法

    linux下使用Qt编译程序的时候 xff0c 安装了程序自带的链接库之后 xff0c 仍然上报这个错误 xff0c 发现系统上报这个错误 xff1a usr bin ld 找不到 ldhnetsdk 经过仔细的定位 xff0c 终于解决了
  • 无人机--飞控科普

    无人机是无人驾驶飞机的简称 xff08 Unmanned Aerial Vehicle xff0c UAV xff09 xff0c 是利用无线电遥控设备和自备的程序控制装置的不载人飞机 xff0c 包括无人直升机 固定翼机 多旋翼飞行器 无
  • 远程桌面使用双屏或多屏

    选项 显示 将所有监视器用于显示 查了半天居然没有靠谱答案 xff0c 自己动手发现 转载于 https www cnblogs com phoenix p 4294103 html
  • 问题记录:未设置为接受端口“文件和打印机共享(SMB)”上的连接

    解决办法 xff1a 网络 xff08 右击 xff09 属性 本地连接 xff08 右击 xff09 属性 此连接使用下列选项 Microsoft网络的文和打印共享 xff08 打上勾 xff09 转载于 https www cnblog
  • arduino 语音音箱 :语音控制、MP3播放、报时、回复温湿度情况

    arduino 语音音箱 xff1a 语音控制 MP3播放 报时 回复温湿度情况 效果图 线路图 包装后的效果 功能 需要材料 arduino板MP3播放模块及喇叭时钟模块温湿度模块语音识别模块面包板及其他线材 电阻TF卡 xff08 用于
  • 通过多张网卡发送UDP多播(组播)数据

    在具有多个网卡的机器上 xff0c 如果想要从每个网卡发送UDP数据 xff0c 一般的做法是 xff1a 针对每张网卡的每个IP都绑定一个SOCKET xff0c 然后发送的时候针对每个SOCKET都发送一次 但是如果你要发送多播数据 x
  • 常见的HTTP状态码

    本内容摘抄自RESTful WebServices 中文译本附录B 39 42种常见的HTTP响应代码 39 原文作者 xff1a Leonard Ricbardson amp Sam Ruby 翻译 xff1a 徐涵 李红军 胡伟 1 三
  • ps快速切图

    妈呀 xff0c 不得不感慨一下 xff0c 切了这么久的图 xff0c 竟然不知道有个切图工具这么好用 以前我的切图流程 xff1a 拿到ui设计好的psd文件 61 61 gt 拉基准线 61 61 gt 切片工具切图 61 61 gt
  • MongoDB v4.0 命令

    MongoDB v4 0 命令 官方文档 gt 点这里 lt 操作系统库 操作管理员库 use admin 鉴权 db auth 34 root 34 34 admin 34 用户查看 格式美化 db system users find p
  • 查看端口是否可访问(防火墙拦截处理)

    telnet ip 端口 例如 xff1a telnet 10 20 113 15 8080 出现 Escape character is 表示连接 xff0c 没有被防火墙拦截 转载于 https www cnblogs com kdx
  • ESP32-CAM上手

    硬件 ESP32 CAM摄像头开发板 安信可科技 ESP32 CAM摄像头开发板 https item taobao com item htm spm 61 a1z09 2 0 0 67002e8dvbTVMF amp id 61 6159
  • 面试时如何做好5分钟自我介绍?

    有简历 xff0c 为何还要自我介绍 xff1f 一个常规的面试 xff0c 寒暄之后面试官提出的第一个问题几乎千篇一律 xff1a 请您简单地做一下自我介绍 有些被面试者都会问 xff1a 简历中情况已经写得很清楚了 xff0c 这是否多
  • windows查看当前python的版本

    1 Ctrl 43 R打开控制台 输入python之后回车 转载于 https www cnblogs com CK85 p 10243904 html
  • 利用MATLAB绘制置信区域

    lt MATLAB小技巧之二十四 xff1a 利用MATLAB绘制置信区域 gt 统计中经常会遇到求置信区间 置信区域 xff08 如置信椭圆 置信椭球 xff09 等 xff0c 有时候需要把置信区域画出来 xff0c 这样看起看更为直观
  • 关于latex编译中文不显示问题的解决方法。

    我的编译环境是texlive2018 43 texstudio 配置如图 默认编码格式为utf8 直接上代码 documentclass article usepackage xeCJK documentclass UTF8 ctexart
  • 最新百度 阿里 华为 腾讯 谷歌面试笔试题及解析 (转)

    原文地址 xff1a http m blog csdn net blog panfengyun12345 12618453 8月15日 xff0c 百度2道面试题 xff1a 1 来自 编程之美 的概率题 xff1a 一个桶里面有白球 黑球
  • 归并排序——C语言

    归并排序 归并排序 xff08 MERGE SORT xff09 是建立在归并操作上的一种有效的排序算法 该算法采用经典的分治 xff08 divide and conquer xff09 策略 xff08 分治法将问题分 divide 成
  • Linux设备驱动程序学习(19)-USB 驱动程序(四)

    编写 USB 驱动程序 xff08 本部分的一些示例源码来自drivers usb usb skeleton c xff0c 它是Linux内核为我们提供的最基础的USB驱动程序 xff0c USB骨架程序 xff09 驱动程序把驱动对象注
  • Linux----面试

    1 tcp和udp的区别 TCP xff1a 是面向连接的流传输控制协议 xff0c 具有高可靠性 xff0c 确保传输数据的正确性 xff0c 有验证重发机制 xff0c 因此不会出现丢失或乱序 UDP xff1a 是无连接的数据报服务
  • ssh免密码登陆失败的原因

    今天因为需要在两台服务器上进行ssh免登陆 xff0c 所以安装网上的教程 xff0c ssh keygen t rsa xff0c 然后把相互的密钥加入到对方的authorized keys 问题是我们虽然这样做了 xff0c 却一直要密

随机推荐

  • ESP32-s2芯片esp32-s2-saola-1开发板 micropython的repl连接

    本文只是解决通过esp32 s2 saola 1开发板 自带microUSB 作为repl与micro python通信的问题 如果你对esp32 xff0c micropython不熟 xff0c 本文不适合你 如果你用的不是esp32
  • 机械臂模拟2.0

    机械臂模拟 void MobileCrane updateHopeLength int center x int center y int center z int armNodeNum int ropePitchNum int baseN
  • Qt获取时间戳作为图片名

    Qt获取时间戳作为图片名 保存图片 void SaveRealsenseImg QString picIndexName 61 dataSavePath picIndexName append 34 34 获取当前时间 QDateTime
  • [转&精]IO_STACK_LOCATION与IRP的一点笔记

    IO STACK LOCATION和IRP算是驱动中两个很基础的东西 xff0c 为了理解这两个东西 xff0c 找了一点资料 1 IRP可以看成是Win32窗口程序中的消息 xff08 Message xff09 xff0c DEVICE
  • wireshark抓包结果很多[TCP Retransmission]怎么办?

    有一同事问用wireshark抓包时发现很多 TCP Retransmission xff0c 这些包极大影响了自己真正想看的http数据包 xff0c 如下图 我拿到pcapng后首先看到这些包的来源ip都是固定的两个 xff0c 所以首
  • MATLAB神经网络训练结果各参数解释

    最上面的图形显示的是神经网络的结构图 xff0c 可知有一个隐层一个输出层 第二部分显示的是训练算法 xff0c 这里为学习率自适应的梯度下降BP算法 xff1b 误差指标为MSE 第三部分显示训练进度 xff1a Epoch xff1a
  • SQL语句统计个数大于一的记录

    1 主要是利用Having语句进行 xff0c 由于where不能与聚合函数一起使用 xff0c 所以用having SELECT MC COUNT MC AS SL FROM JSB GROUP BY MC HAVING COUNT MC
  • You must give at least one requirement to install (see "pip help install")

    语言 python why install 后面没有参数 xff0c 也就是说没有给想要安装的包 way pip install 后面要跟想要安装的包名 转载于 https www cnblogs com 2bjiujiu p 902966
  • VHDL乘除法及转换

    首先鄙视一下这个不智能的语言 1 要进行乘法与除法 xff0c 数据类型必须是signed 2 两个16位的数相乘 xff0c 结果必须是32位的 3 乘以2的n次幂的数可以直接乘 xff0c 之后截位也比较方便 xff0c xff08 其
  • C语言真正的编译过程

    说实话 xff0c 很多人做了很久的C C 43 43 也用了很多IDE xff0c 但是对于可执行程序的底层生成一片茫然 xff0c 这无疑是一种悲哀 xff0c 可以想象到大公司面试正好被问到这样的问题 xff0c 有多悲催不言而喻 x
  • Docker 删除&清理镜像

    文章首发自个人网站 xff1a https www exception site docker docker delete image 本文中 xff0c 您将学习 Docker 如何删除及清理镜像 xff1f 一 通过标签删除镜像 通过如
  • 解决:invalid application of `sizeof' to incomplete type `({anonymous})'错误

    这个错误的原因 xff1a sizeof不能用在extern变量 xff0c sizeof 的计算发生在代码编译 的时刻 extern 标注的符号 在链接的时刻解析 所以 sizeof 不知道 这个符号到底占用了多少空间 发生错误的程序是这
  • 自制吸锡带

    焊接qfp封装芯片的时候 xff0c 由于两个引脚间距过小 xff0c 常常会在引脚上留有焊锡 xff0c 这个时候就需要吸锡带 xff0c 但是一般情况下我们手边的设备并不齐全 xff0c 所以我们可以利用手边的工具自制 工具 xff1a
  • 实验六

    芯片派生 include lt iostream gt using namespace std class Base public void add int x int y cout lt lt x lt lt 34 43 34 lt lt
  • geometry_msgs.msg.PoseStamped 代码示例

    https programtalk com python examples geometry msgs msg PoseStamped 转载于 https www cnblogs com sea stream p 11129929 html
  • ubuntu 执行apt-get update报错Failed to fetch

    在ubuntu下执行sudo apt get update时 xff0c 经常会遇到报错 xff1a Err http security ubuntu com precise security InReleaseErr http secur
  • github中的wiki是干嘛的_在 Hyperf 框架中,如何定制 gen:model 命令

    Hyperf v2 0 版本中 xff0c 会将 decimal 转化为 float xff0c 从而存在精度丢失的风险 如果直接修改这个问题 xff0c 可能会导致 v2 0 出现 BC xff0c 所以我们在 v2 1 中得到了处理 x
  • APM飞控修改数传模块方法

    APM飞控修改数传模块方法 硬件 ARDUCOPTER第二代数传模块 USB接口 数传模块 telem接口 usb ttl模块 修改方法 注意 xff1a APM固件版本和数传模块估计版本是分开的 xff0c 但有一定的对应关系 xff0c
  • HTTP AUTH 那些事

    谨以此文献给那些需要实现HTTP AUTH的 程序猿 们 关于HTTP AUTH的文档不多 RFC在 http www ietf org rfc rfc2617 txt wiki在 http en wikipedia org wiki Ba
  • 基于超声波的四轴定高控制简析

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