跳转至

模拟器目标机型到自组机反向标定

本篇提供一条可执行的反向标定流程:选择Uncrashed、Liftoff或TRYP FPV中的一台固定内置机型,把它的操纵响应定义为目标,再让一架使用Betaflight的自组多旋翼在安全包线内逐层逼近。

模拟器目标机型反向标定工作流

本方法不承诺把不同物理模型变成完全相同的飞行器。它要回答三个更具体的问题:

  1. 哪些手感可以直接换算成Betaflight参数;
  2. 哪些参数可以由称重和动力台架生成候选值;
  3. 哪些控制参数必须通过Blackbox和短测迭代,不能由重量或电机Kv直接计算。

本文固定Betaflight 2026.6.2。公式来自该标签源码;其他版本必须重新核对Rates、油门曲线、简化调参和日志字段。

先给出结论

项目 能否直接计算 正确方法
Actual Rates曲线 可以 由Center Sensitivity、Max Rate和Expo精确计算
重量、悬停单电机推力 可以 由整机质量和重力计算
静态推重比 可以 由动力台架最大推力和整机质量计算
候选悬停电机命令 可以近似 对动力台架推力曲线插值或拟合
滚转、俯仰、偏航惯量 可以粗略估算 按部件质量和相对重心位置计算
PID、滤波和前馈最终值 不能仅凭规格计算 从合格基线开始,用Blackbox闭环响应逐项迭代
桨洗、阻力、延迟和能量保持 只能测量后逼近 标准动作、同步录像、日志和环境控制

重量是必要输入,但不是完整模型。250 g只能说明重力约为2.45 N;它不能说明电机多快建立推力、机体多难停止旋转、图传延迟多少或机架在哪个频率共振。

进入本篇的门禁

真实机必须已经完成:

如果真实机还没有稳定基线,本篇只能用于整理目标、计算Rates和建立记录表,不能直接生成可试飞PID。

第1步:冻结唯一目标

一轮标定只选择一台目标机型。填写:

模拟器:
游戏版本或构建号:
物理版本:
内置机型完整名称:
机型是否被修改:
控制器:
控制器校准日期:
Rates模型与三轴参数:
相机角度:
水平/垂直FOV:
宽高比与分辨率:
帧率与垂直同步:
风、重力和环境设置:
目标模式:
记录日期:

游戏更新、物理版本变化、机型修改或控制器重新校准后,旧目标不再视为同一基线。

为什么只能先选一款游戏

三款模拟器的电机、螺旋桨、阻力、桨洗、碰撞和控制器实现不同。即使它们都有同名“三寸自由式”机型,也不表示:

  • 相同重量产生相同惯量;
  • 相同PID数值具有相同控制效果;
  • 相同油门杆位产生相同推力;
  • 相同相机角度产生相同速度感。

先把一个目标闭环,再为其他游戏分别建立Profile和记录,不求一个真实机参数同时匹配所有游戏。

第2步:从模拟器提取目标响应

优先读取游戏直接显示的Rates、重量、动力和相机参数。游戏没有导出遥测时,用固定帧率录像和相同遥控器输入测量外部行为。

目标测试条件

  • 使用计划控制真实机的同一遥控器;
  • 遥控器端不增加Expo或混控;
  • 游戏内重新校准中位和端点;
  • 关闭风或固定同一风场;
  • 固定相机角度、FOV、分辨率和帧率;
  • 使用同一内置机型和电池状态;
  • 显示杆位叠加或同步录制遥控器动作;
  • 每个动作至少重复三次。

目标动作卡

动作 输入 提取量
中心小幅滚转 10%稳定杆量 中心灵敏度近似值
半杆滚转 50%稳定杆量 中段角速度
满杆滚转 100%稳定杆量 最大滚转角速度
半杆俯仰 50%稳定杆量 俯仰中段角速度
满杆偏航 100%稳定杆量 最大偏航角速度
快速半杆阶跃 中位快速到50%并保持 上升时间、延迟和过冲
快速回中 50%快速回中 停止时间和回弹
定高悬停 调整到稳定高度 目标悬停杆位
悬停后短时加油 固定增量、固定持续时间 爬升趋势和油门响应
松油门滑行/转弯 固定初速和动作 阻力、惯量和能量保持

游戏不显示角速度时

使用清晰可辨的完整翻滚或偏航:

平均角速度 ω ≈ 360° × 完整旋转圈数 N ÷ 持续时间 Δt

例如,录像中两圈完整滚转用时0.90 s:

ω ≈ 360 × 2 ÷ 0.90 = 800 °/s

使用达到稳定转速后的中间完整圈,不把起始加速和末尾停止混入稳定角速度。帧率为120 fps时,持续时间可以由帧数计算:

Δt = 经过帧数 ÷ 120

该方法适合估计稳定角速度,不适合精确计算最初几十毫秒的响应。上升时间和输入延迟优先使用游戏遥测;没有遥测时只能作为分级比较。

第3步:采集真实三寸机身份

最小数据集

带电池起飞重量:
轴距:
机架布局:True-X / Deadcat / Squashed-X / 其他
重心相对几何中心的位置:
电机完整型号、定子尺寸和Kv:
螺旋桨厂商、型号、直径、螺距和叶数:
电池串数、容量、重量和实测内阻:
电子调速器型号、固件和PWM频率:
飞控型号、陀螺仪和安装方式:
接收机协议和数据包速率:
图传、眼镜/屏幕和刷新率:
相机角度:
Betaflight version:
Betaflight status:
Betaflight diff all:
无风悬停油门:
动力台架推力/电流/RPM/电压曲线:
基线Blackbox:

质量分布表

只记录总重量无法估计转动惯量。至少记录主要部件:

部件 质量 相对重心前后x 左右y 上下z
电池 项目测量 项目测量 项目测量 项目测量
四个电机 分别测量 项目测量 项目测量 项目测量
相机/图传 项目测量 项目测量 项目测量 项目测量
飞控/电调 项目测量 项目测量 项目测量 项目测量
机架与线束 项目测量 估算分布 估算分布 估算分布

质量使用千克,位置使用米。坐标原点取整机重心。

第4步:计算重量、悬停推力和推重比

重力

W = m × g
  • W:重力,单位牛顿;
  • m:带电池整机质量,单位千克;
  • g:标准重力加速度,取9.80665 m/s²。

250 g三寸机:

m = 0.250 kg
W = 0.250 × 9.80665 ≈ 2.452 N

悬停单电机推力

水平悬停、四电机近似均匀承担载荷时:

T_hover_motor = W ÷ 4

示例:

T_hover_motor = 2.452 ÷ 4 ≈ 0.613 N

若动力台架使用克力(gf),四轴机可直接用:

单电机悬停推力 ≈ 整机质量克数 ÷ 4
250 g ÷ 4 = 62.5 gf

真实机存在重心偏移、机架气动干扰和电机差异,Blackbox中的四电机命令不一定完全相等。

最大静态推重比

R_TW = 四电机最大静态总推力 ÷ 整机重力

使用克力和克时:

R_TW = 4 × 单电机最大推力(gf) ÷ 整机质量(g)

若单电机最大静态推力为350 gf:

R_TW = 4 × 350 ÷ 250 = 5.6

该值只表示当前电池电压和台架条件下的静态余量,不等于飞行中的动态推力,也不能直接给出PID。

第5步:由推力曲线估算悬停电机命令

电机Kv只能粗略给出空载转速:

空载转速 n_0 ≈ Kv × 电压

带桨转速、推力和电流不能仅由Kv计算。必须使用同一电机、桨、电池电压和电子调速器设置的动力台架曲线。

表中的归一化命令u必须与Betaflight实际有效电机命令建立对应。普通电调测试器的“20%”可能使用不同端点、协议或输出映射,不能未经校准直接当作u=0.20。

线性插值

假设台架得到:

归一化电机命令u 单电机推力
0.20 25 gf
0.40 80 gf
0.60 160 gf
0.80 250 gf
1.00 350 gf

目标悬停推力62.5 gf位于25和80 gf之间:

u_hover ≈ u_1 + (T_hover - T_1) ÷ (T_2 - T_1) × (u_2 - u_1)

代入:

u_hover ≈ 0.20 + (62.5 - 25) ÷ (80 - 25) × (0.40 - 0.20)
        ≈ 0.336

候选悬停电机命令约为34%。这只是静态候选,最终使用实机悬停Blackbox复核。

幂函数拟合

有五个以上有效测试点时,可拟合:

T(u) = a × u^b
ln(T) = ln(a) + b × ln(u)

用最小二乘求出a和b后:

u_hover = (T_hover_motor ÷ a)^(1 ÷ b)

不得把不同电池电压、不同桨或不同PWM频率的数据混在同一次拟合中。拟合残差大、存在失步或高命令区明显饱和时,停止使用该模型。

第6步:估算质量分布与转动惯量

把主要部件近似为点质量:

I_roll  ≈ Σ m_i × (y_i² + z_i²)
I_pitch ≈ Σ m_i × (x_i² + z_i²)
I_yaw   ≈ Σ m_i × (x_i² + y_i²)
  • m_i:第i个部件质量,单位千克;
  • x_i、y_i、z_i:相对整机重心的位置,单位米;
  • 结果单位为kg·m²。

该估算适合:

  • 判断俯仰惯量是否明显大于滚转惯量;
  • 比较两种电池安装位置;
  • 解释为什么同重量机体停止响应不同;
  • 为Pitch Tracking和Pitch Damping的后续日志判断提供背景。

它不适合直接计算Betaflight P、I、D。机架板、线束和外壳是连续分布质量,电机推力建立还包含电子调速器、电机、螺旋桨和电池动态。

第7步:计算并对齐Actual Rates

若目标内置机型显示Actual Rates,直接复制同一模型和三轴参数。Betaflight 2026.6.2对单轴的固定源码公式可写为:

Betaflight Actual Rates和油门曲线实际入口

App操作入口为“PID调参”→“Rate配置文件设置”:

  1. 确认当前Rate Profile;
  2. 把Rate类型切换为Actual;
  3. 分轴填写中央灵敏度、最大角速率和Expo;
  4. 在Rates预览中核对中心、半杆和满杆曲线;
  5. 保存并重启,再确认Profile与数值没有改变。

截图来自App 2026.6.2虚拟模式,页面中的70/670/0.00只展示字段位置。

ω(x) = C × x + (M - C) × |x| × [E × x^5 + (1 - E) × x]
  • x:归一化摇杆位置,范围-1至1;
  • C:Center Sensitivity,单位°/s;
  • M:Max Rate,单位°/s;
  • E:Expo,范围0至1;
  • ω:目标角速度,单位°/s。

该写法适用于常规的M ≥ C配置;固定源码在M < C时会把M - C对应的增量钳制为零,不允许按负增量外推。

该公式满足:

ω(1) = M
中心附近曲线斜率 = C

示例:

C = 100 °/s
M = 800 °/s
E = 0.40
x = 0.50

ω(0.5)
= 100 × 0.5 + 700 × 0.5 × [0.4 × 0.5^5 + 0.6 × 0.5]
≈ 159.4 °/s

目标不显示参数时反求候选

先测:

  • 满杆角速度得到M ≈ ω(1);
  • 小杆量角速度估算中心斜率C;
  • 再用一个中间杆位反求Expo。

对正杆位0 < x < 1:

A = [ω(x) - C × x] ÷ [(M - C) × x]
E = (A - x) ÷ (x^5 - x)

视频测量误差可能使E超出0至1。此时不强行截断,应增加重复次数或改用Rates转换器拟合多个点。

目标使用Betaflight Rates、Quick Rates或其他模型时,不把三个字段按名称直接填入Actual Rates。优先在目标游戏和Betaflight使用同一种模型;否则按10%/50%/100%三个以上杆位拟合曲线。

第8步:建立候选油门曲线

Betaflight 2026.6.2使用:

  • thr_mid:希望悬停出现的摇杆位置;
  • thr_hover:该摇杆位置映射到的飞控油门输出;
  • thr_expo:悬停点两侧曲率。

如果目标模拟器机型在45%油门杆位悬停,而真实机台架和Blackbox显示约34%输出可以悬停,第一版候选为:

thr_mid   = 45
thr_hover = 34
thr_expo  = 0

固定版本源码使用两段二次Bezier曲线,通过(0,0)、(thr_mid,thr_hover)和(1,1),因此悬停点可以同时指定输入坐标和输出坐标。thr_expo只在完成悬停点验证后逐步调整。

最大动力过强

如果目标机型的满油门响应明显弱于真实机:

  1. 先取得目标机型公开的推力/推重比,或者在具有已知距离和时间基准的模拟场景中标定爬升响应;
  2. 从真实机动力台架曲线确定目标最大推力对应的电机命令u_limit;
  3. 先使用Rate Profile中的SCALE型throttle_limit生成候选;
  4. 重新测量悬停点、输出余量、温度和控制权;
  5. 不把motor_output_limit当作普通手感旋钮。

SCALE保留完整摇杆行程并缩放驾驶员油门命令;CLIP保留低段映射但截断高段。两者都不能保证推力按同一百分比变化,因为真实推力曲线非线性。

目标没有可追溯动力数据、已知尺度或可重复爬升基准时,不计算throttle_limit_percent,只记录“目标满油门较弱”的主观差异。

第9步:PID和前馈为什么没有直接公式

角速度环面对的是完整被控对象:

飞控计算延迟
→ 电子调速器与电机响应
→ 螺旋桨推力建立
→ 机体转动惯量和阻力
→ 陀螺仪测量与滤波延迟

即使已知质量、惯量和静态推力,也仍缺少电机时间常数、动态推力、结构模态、滤波相位和执行器饱和。模拟器内部控制器也不一定等同于Betaflight 2026.6.2。

因此:

  • 公式用于建立Rates、油门和物理能力候选;
  • PID从当前构型的已验证默认值或适用预设开始;
  • 最终值由真实机Blackbox闭环响应决定;
  • 游戏PID数值不直接写入真实飞控。

第10步:用Blackbox计算响应差异

对同一轴、同一杆位和同一动作,记录:

  • setpoint:目标角速度;
  • gyro:实际角速度;
  • P、I、D和前馈输出;
  • 四电机命令;
  • 油门、电压和RPM;
  • 时间戳和dropout。

上升时间

t_r = t_90 - t_10
  • t_10:gyro首次达到目标幅值10%的时间;
  • t_90:gyro首次达到目标幅值90%的时间。

过冲

OS% = (ω_peak - ω_target) ÷ |ω_target| × 100%

稳态误差

在目标保持稳定的选定时间窗:

e_ss = mean(setpoint - gyro)

归一化均方根跟踪误差

NRMSE = sqrt[Σ(setpoint_i - gyro_i)² ÷ N] ÷ max(|setpoint|)

比较前后必须使用同一轴、杆位、动作持续时间、电池条件和日志采样条件。目标模拟器只有视频而没有遥测时,不把视频估计和Blackbox精度写成同等级证据。

第11步:把差异映射到参数

先固定Rates和油门候选,再判断控制器。每轮只改一个维度。

Betaflight PID简化滑块和具体轴值入口

在App中先选定PID Profile,再使用Damping、Tracking和Stick Response等简化滑块形成单变量候选。截图中的1.00及P/I/D/F值为虚拟示例,不复制到实体机。

观察到的差异 优先参数 修改方向 必须先排除
中心附近比目标敏感 Center Sensitivity 降低 中位抖动、双重Expo
中心附近比目标迟钝 Center Sensitivity 提高 死区过大、输入滤波异常
满杆角速度不同 Max Rate 直接对齐目标 电机饱和、Rate Limit
中心和满杆一致,半杆不同 Expo 调整中段曲率 Rates模型不同
悬停杆位低于目标 thr_mid/thr_hover 把目标杆位映射到实机悬停输出 电压和载荷不一致
满油门明显强于目标 throttle_limit=SCALE候选 按推力曲线降低 动力台架数据缺失
动作初段落后,稳定段能跟上 Stick Response/前馈 小幅提高 RC平滑、链路速率、Rates变化
动作初段抢先或过冲 Stick Response/前馈 降低或增加适当平滑 停止段D不足
整个动作持续落后且有输出余量 Tracking/P与I 小幅提高 电机饱和、过度滤波
快速回中后回弹 Damping、I-term Relax和前馈 先查饱和与前馈,再评估Damping 坏桨、噪声、失步
持续风或重心偏移下保持差 Drift-Wobble/I 小幅提高 机械重心和电机差异
高频振荡或电机温升异常 Tracking/Damping/滤波 回滚并处理噪声 不得继续追目标手感
俯仰明显比滚转难停止 Pitch Damping 日志确认后小幅提高 俯仰惯量、饱和和相机干扰

使用简化调参滑块时,第一轮单项候选变化不超过当前值的5%,只是保守测试增量,不是通用最终值。每次落地后复核日志、温度、振动和输出余量;没有改善就回滚,不连续叠加多个“也许有效”的改动。

第12步:完整三寸机算例

目标

模拟器:示例
目标内置机型:固定三寸机型
Rates:Actual
Roll Center Sensitivity:100 °/s
Roll Max Rate:800 °/s
Roll Expo:0.40
目标悬停杆位:45%
目标半杆滚转:约159 °/s
目标滚转上升时间:0.13 s
目标停止过冲:5%

真实机

带电池重量:250 g
单电机最大台架推力:350 gf
悬停所需单电机推力:62.5 gf
推重比:5.6
插值得到候选悬停输出:33.6%

第一版候选

  1. Betaflight选择Actual Rates;
  2. Roll输入100/800/0.40;
  3. 设置thr_mid=45、thr_hover=34、thr_expo=0;
  4. PID、滤波和前馈保持已验证基线;
  5. 不立即限制最大油门,因为目标最大推力尚未形成可信测量;
  6. 执行半杆滚转阶跃并保存Blackbox。

第一轮结果

假设实机:

半杆稳定角速度:158 °/s
上升时间:0.18 s
过冲:3%
电机输出有余量
无高频振荡
温度通过

判断:

  • Rates已经匹配,不再修改Center Sensitivity、Max Rate或Expo;
  • 稳定角速度正确但动作初段较慢;
  • 过冲低且输出有余量;
  • 第一候选优先小幅提高Stick Response/前馈,而不是提高Max Rate。

若修改后上升时间变为0.15 s、过冲变为5%且温度与噪声仍通过,可保留为下一轮候选。若过冲升至12%或出现电机尖锐活动,则立即回滚。

此算例演示的是判断顺序,不是向所有三寸机推荐100/800/0.40、thr_hover=34或任何前馈数值。

收敛标准

项目可以把以下值作为初始“手感比较目标”,不能替代安全放行:

指标 初始比较目标
直接输入的Rates字段 与目标完全一致
实测10%/50%/100%角速度 与目标差异不超过±5%
上升时间和停止时间 与目标差异不超过±15%
过冲 与目标差异不超过5个百分点
悬停杆位 与目标差异不超过3个百分点
主观重复评分 同一操作者、盲化顺序、至少三轮结果一致

出现以下任一情况,即使手感更接近也判为不通过:

  • 高频或低频持续振荡;
  • 电机、电子调速器或电池温度超过批准限值;
  • DShot错误、失步、削波或Blackbox dropout;
  • 代表性动作中电机长期饱和;
  • 需要关闭安全检查或减弱Failsafe;
  • 机械、滤波或日志身份发生未记录变化。

交付记录

目标模拟器与固定版本:
目标内置机型:
目标Rates与视觉设置:
目标动作视频和测量表:
真实机身份与带电池重量:
质量分布与惯量估算:
动力台架曲线与拟合方法:
悬停推力和推重比计算:
候选Rates:
候选油门曲线:
基线PID/滤波/前馈:
每轮唯一修改:
Blackbox文件:
上升时间、过冲、停止时间和NRMSE:
温度、振动和输出余量:
不可消除差异:
最终Profile与恢复文件:
结论:未测试 / 阻断 / 通过 / 不通过 / 无效 / 不适用

检查理解

  1. 为什么带电池重量不能直接计算PID?
  2. 为什么电机Kv不能代替动力台架推力曲线?
  3. Actual Rates的哪些参数分别决定中心斜率、满杆角速度和中段曲率?
  4. 为什么稳定角速度正确但动作初段落后时,不应继续提高Max Rate?
  5. 为什么目标手感达到后,真实机安全证据仍可以否决该参数?

主要参考