在超宽带(UWB)技术应用中,当信号受到干扰(如手遮挡、墙壁等硬物或其他有形/无形干扰物抵近)时,方向数据(通常以 [x, y, z]
向量表示)可能发生跳变,导致数据稳定性下降,影响箭头指向的准确性。这种干扰可能源于环境因素、遮挡物或设备间的相对位置变化,需通过技术手段检测并处理。
通过对大量真实设备数据的测试与对比,确认信号干扰是导致数据混乱的主要原因。干扰的影响受以下因素制约:
[x, y]
的波动。x = 0, y = 0
)。x: 0.2222, y: -1.2343
(模长 ≈ 1.255)。x: 0.4022, y: -0.7812
(模长 ≈ 0.879)。结论:干扰数据波动虽小,但频繁且难以直接通过角度阈值(如 180°/60°/30°等)过滤,需结合信号强度和传感器数据综合判断。
为解决 UWB 信号干扰问题,提出以下技术方案,结合信号强度监测、卡尔曼滤波、加权平均平滑及陀螺仪辅助,确保数据稳定性:
signalStrength = sqrt(x^2 + y^2)
,作为信号质量指标。[0.01, 1.6]
内采集数据,记录干扰与正常场景下的模长分布。[0.2, 1.2]
,干扰时可能 < 0.1 或 > 1.2(多径效应)。signalStrength
超出正常范围,标记为干扰。signalStrength
应用卡尔曼滤波,减少噪声影响,平滑信号强度变化。initialAngle = 1.0
(假设归一化模长)。processNoiseCovariance = 0.05
。measurementNoiseCovariance = 0.2
。signalStrength
若 < 0.1
或 > 1.2
,切换至陀螺仪模式。[3, 2, 1]
,偏重新数据。weightedSum = angle[0] * 3 + angle[1] * 2 + angle[2] * 1
weightedAverage = weightedSum / 6
signalStrength
应用加权平均,权重 [3, 2, 1]
,平滑模长变化和引入阈值控制。weightedModSum = mod[0] * 3 + mod[1] * 2 + mod[2] * 1
- weightedModAverage = weightedModSum / 6
deltaTheta = _cumulativeRotation - lastStableCumulativeRotation
。expectedNewAngle = lastStableAngle - deltaTheta
。difference = normalizeAngle(newAngle - expectedNewAngle)
超过 0.5
弧度,且信号强度异常,确认干扰。angle = lastStableAngle - deltaTheta
。0.2 < filteredSignalStrength < 1.2
)且 difference < 0.3
连续 3 次,切回 UWB。以下是优化后的 Dart 实现,集成到 UwbController
类中:
class UwbController extends BaseController<UwbModel>
with GetTickerProviderStateMixin, WidgetsBindingObserver {
// ... 现有变量 ...
// 加权平均缓冲区变量
final int bufferSize = 3;
final List<double> weights = [3.0, 2.0, 1.0];
final List<double> angleBuffer = [];
double lastStableAngle = 0.0;
double lastStableCumulativeRotation = 0.0;
// 信号强度阈值
const double signalLowThreshold = 0.1; // 低阈值
const double signalHighThreshold = 1.2; // 高阈值(超出归一化范围)
// 卡尔曼滤波器用于信号强度
KalmanFilter signalKalmanFilter = KalmanFilter(
initialAngle: 1.0, // 假设初始信号强度为 1.0
initialVelocity: 0.0,
initialErrorCovarianceAngle: 1.0,
initialErrorCovarianceVelocity: 1.0,
processNoiseCovarianceAngle: 0.05,
processNoiseCovarianceVelocity: 0.05,
measurementNoiseCovariance: 0.2,
timeStep: 0.016,
);
// 状态控制
bool usingGyroMode = false;
int stabilityCount = 0;
const int stabilityCountThreshold = 3; // 连续 3 次稳定恢复
const double stabilityThreshold = 0.3; // 陀螺仪对比稳定阈值(约 17°)
……………
{
……………
}
}