Betaflight控制逻辑
为什么 Betaflight 不用双环?
用不了。穿越机抖动噪声太大,外环积分误差会很大。
Betaflight的Dynamic Notch 在做什么?
实时测 RPM ,根据转速计算电机噪声频率。然后把 notch 滤波器中心频率移动到当前噪声上。
加载过慢请开启缓存 浏览器默认开启
为什么 Betaflight 不用双环?
用不了。穿越机抖动噪声太大,外环积分误差会很大。
Betaflight的Dynamic Notch 在做什么?
实时测 RPM ,根据转速计算电机噪声频率。然后把 notch 滤波器中心频率移动到当前噪声上。
首先规定,飞控就是四旋翼的飞行控制器。
遥控就是遥控器。发射命令给四旋翼,来决定飞机上升速度,前进速度等。
四旋翼最关键也最容易的就这俩。别的没了。
你问我这样飞机就能飞了吗?差了电调和电机电池啥的,但是那些基本都是飞控和遥控器配置完之后才考虑的事情了。
macOS开发,下载cubeMX和cubeIDE。
然后想清楚最核心的逻辑,我希望四旋翼可以听我的指令,首先可以起飞,然后前进后退,那么遥控器的左边的摇杆和右边的摇杆要控制什么呢?我之前想了很久,后来我的答案是分情况。
不同四旋翼开源项目的飞行器控制逻辑都有区别,比如最简单的,你可以希望右边摇杆左右滑动控制飞行器左飞行和右飞行但是恒速度,也可以规定,摇杆幅度越大侧倾越大,从而速度越大。所以看你。
对于我和这个项目来说,我希望右摇杆左右拖动决定的是飞行器相对于稳定状态下的侧倾角度变化。这句话不完善,稍后我来清晰表达。
代码怎么实现呢?当你推动右摇杆时,我实际上是在请求一个特定的角度,飞控的 PID 控制器会计算所需的电机输出,以使飞行器达到并保持那个角度。当摇杆回中时,期望角度为 0,飞控会将飞行器拉回水平状态。
再明确一下,我是请求侧倾的角度变化还是角速度变化?
如果我请求角速度变化,那我摇杆一直往右打,飞机倾转60度之后不就坠机了?
所以我请求角度。
那么飞控的PID最好帮我控制角度。
同时,右摇杆我想到了一定要自动回中的,还得带点死区。这个好理解吧。
具体到代码。遥控器输入决定期望角度,然后飞控通过 PID_ANGLE_GAIN 转换为期望角速度。为什么要转成期望角速度?
因为飞控内部通常需要分两层控制。角度 loop(外环)加上 角速度 loop(内环)。
先解释为什么不只用一个角度环。
风吹一下,角度 PID 无法快速抵消,只能等角度偏差出现再纠正,会来不及自稳。
具体验证需要通过实践,后面我会实际验证给读者看。
多提一嘴,为什么DJI的四旋翼这么稳?我估计DJI的角速度 PID loop 肯定很高。
思维扩散。思考一个问题,四旋翼的电机,电机的工作,到底会改变四旋翼的什么?
一是飞机的三维“角速度”(旋转速度)。二是“角度”,但是角度是经过时间积分产生的。θ(t)=∫ω(t)dt。
再补充一下,就刚才的右摇杆左右拖动决定的是飞行器相对于稳定状态下的侧倾角度变化,这个不绝对!
Betaflight用的就不是这个逻辑!
穿越机 FPV 的标准模式:摇杆控制的是 期望角速度(Desired Angular Velocity)。
算了都讲到这里了,直接补充Betaflight的Rate PID 控制器逻辑吧。
P_output = P_gain * error,I_term += I_gain * error * dt
,D_output = D_gain * (error - previous_error) / dt。
P决定打杆时的跟随感。
I作用是抵消风。
D是为了抑制 overshoot。
同时PID加在一起的PID_output是有限制幅度的,数值太大,电机受不了/电调受不了/电池受不了,四旋翼肯定就不稳定出事故了。
这里提几个难点吧。Betaflight 对 D 项做了 动态低通滤波,减少噪声导致的振荡。这个大后期再讲解。Betaflight 里面的 I 项还有 anti-windup 和 I-term relax(松杆时不积累)。
扯到Betaflight就太多太多可以说的了。
换到另外一个贴文里面讲解。文件命名是Betaflight控制逻辑.md。
问题1: 用Cloudflare管理域名的时候,会发现有个橙色的选项,它打开不打开的区别?
这个橙色选项就Cloudflare 的“代理”功能”(橙色云 vs 灰色云)。
灰色云:仅 DNS,也就是仅解析域名,不走 Cloudflare 的网络。用户访问你的域名时,会直接访问你原本的服务器 IP。Cloudflare 不会提供缓存、加速、DDoS 防护等服务。适用场景就是,你希望纯粹用 Cloudflare 做 DNS 管理,但不希望流量经过它。
橙色云:代理,也就是访问请求先经过 Cloudflare 的网络。用户看不到你服务器真实 IP。优势就是开启了CDN加速,还可以缓存静态资源。
入门的第一个实验:测量直流电3.3V,并分析示波器的数据。
这个实验很简单,因为默认我们都有一块ESP32或者STM32的开发板。给示波器插上通道A的探测头,一端接GND引脚,一端接3.3V引脚,示波器调节模式为AUTO档位,耦合方式选择DC,开始观察波形。
调节垂直档位,再次观察波形。
观察示波器的Vp-p数值,一般会有十几mv或者几十mv,解释:示波器上看到的 “Vp-p” 是 “Peak-to-Peak Voltage” 的缩写,也就是 峰峰值电压。它表示一个波形从 最低点(谷)到最高点(峰)的电压差。Vp−p=Vmax−Vmin。所以测出来很小的波动是正常的。
入门第二个实验:测量MCU发出的PWM波。
最经典问题:套免费二级域名的时候,显示有人已经用了怎么办?
没办法,我当时的免费二级域名是ludwekin.dpdns.com,遇到这个问题后,vercel页面提示我验证一下是我的域名就行,然后我也验证了,但是后面vercel提示请从组织申请,大概意思就是无法套上二级域名。
最经典问题2: 我已经用vercel托管了我的Github Pages了,为什么国内网络还是无法访问xxxx-github-io.vercel.app?
原因是vercel默认提供的域名 *.vercel.app 由于滥用已被大陆屏蔽(DNS污染),如果需要在国内能访问到您的站点,绑定一个新的域名即可。
问题3: 7771212.xyz 指向 76.76.21.21,这句话什么意思?
这意味着你的域名 7771212.xyz 的 A 记录 被设置成了 IP 地址 76.76.21.21。
当用户访问 7771212.xyz 时,DNS 系统会告诉他们“去这个 IP 找网站”,也就是你的服务器或托管服务所在的地址。
在我的例子里,这个 IP 正是 Vercel 提供的静态/前端托管服务的服务器 IP。
简单来说,怎么做?
在VS CODE里面下载ESP IDF插件跟着指示一步步来就行。
第一次配好环境写代码会有个坑:
写代码的时候,VSCode 的 includePath 没有加载 ESP-IDF 的头文件路径,所以写的比如,#include “driver/rmt_tx.h”、#include “driver/gpio.h”、#include “esp_log.h”等等代码会显示报错。
解决办法:
在 VSCode 里执行 ESP-IDF: Add vscode configuration folder,输入ESP-IDF: Add vscode configuration folder 即可。
OK,我们继续,下面分享一些开发经验。
Espressif IoT Development Framework Configuration,这个是我们下ESP IDF的时候它自带的,一般看到这个界面,就是 ESP32 项目配置的交互式菜单。它是基于ncurses的图形化终端菜单,不是 GUI 窗口,但用键盘可以操作。简而言之,这是我们在配置 ESP32 项目编译和烧录参数的地方,操作后会生成 sdkconfig 文件,控制项目的各种行为。
看不懂不要紧,等实际上手遇到这个界面你就知道我说的是什么意思了。
在公司开发照明无人机的时候,我同步开始研究LED的电路。
调研发现,市面上的稍大功率的LED照明方案都是采用的铝基板PCB,而不是普通的FR4电路板。
优点就是散热更好。缺点?缺点就是双面铝基板价格很高,所以一般业界都是画单面PCB。
单面PCB的布线要求其实蛮高的,也比较特别。
我想到了0欧姆电阻跨接大法,真的好用,但是注意功率限制,1206封装的0欧姆电阻功率一般不超过3W,所以要注意不要给主电流回路用上跨接。

兜兜转转,之前只知道有个Github Pages,知道它很好用,就是不能被国内直连。
现在又知道了一个Cloudflare Pages,据说,据说国内访问速度还行,反正比访问Github Pages要稳定。
原理也很简单,就是可以上传静态页面让Cloudflare帮你渲染。特别的是,Cloudflare Pages支持导入Github Pages仓库!也就是说你在GitHub Pages正常写你的博客,然后Cloudflare Pages也会同步帮你搭建。这个玩法就很多了。
开始配置我的hexo博客到Cloudflare。对于hexo博客,需要确保设置以下内容,Build command填npm install && npx hexo generate。Output directory填public。然后有个变量声明,对于我的hexo博客需要指定Required Node.js version为20.19.0版本。
然后网站就可以通过它生成的域名访问了。这里主播一直出错,原因是Output directory没填public而是留空了。
网站成功上线。但是问题接踵而至。国内对Cloudflare Pages有点墙,至少限速了。不开代理访问网站速度堪忧,大概需要5s才能打开。
这时候有些博主提出了一个办法,就是给Cloudflare Pages生成的访问链接比如https://ludwekin.pages.dev/ ,再套一个CNAME,也就是域名。
最保险的还是买阿里云的域名。这里我尝试使用一个免费的digitalplat二级域名。
好的,那现在我问个问题,现在国内网络,访问ludwekin.pages.dev会发生什么?
主播之前用的也是Github Pages的方案写的博客,但当时用的模板是Jekyll下面的MMistakes。2025年12月4日,主播突然发现,自己的博客页面实在不好看,当时很想换成流行的二次元风格。。。然后当即就开始重新折腾了,也就是形成了现在这个博客的风格。
第一种方法,最简单而且稳定,就是借助于博客园,掘金,CSDN等等网站。这个方式适合于技术文章的发表,不太适合生活记载。
我自己试过用博客园发博客,还挺方便的。
第二种,云服务器。这个最适合技术提升,因为需要掌握很多领域的知识。比如云服务和网页技术。我试过,之前有一个免费的EC2服务器,搭建了自己的WordPress博客,还挺有意思是的。缺点就是一般云服务器价格高,而且需要和域名,备案一起才能组成一个可访问的国内网站。
第三种,GitHub Pages方案。这个很有意思,主播最喜欢,而且免费。缺点是Github Pages在国内无法直连,也就是说没有代理的人是无法访问你的博客的。解决方法也有,那就是为网站配置一个国内CDN。我这个博客是采用的ClouDNS加Cloudfare的组合方案。理论上可以让这个博客可以国内直连。因为Cloudflare有国内的CDN。