IMU Accelerometer + Gyroscope Complementary Filter Calculator
ANA›Life Services Authority›National Calculator Authority›IMU Accelerometer + Gyroscope Complementary Filter Calculator
.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }
IMU Accelerometer + Gyroscope Complementary Filter Calculator
Calculates the fused angle estimate using a complementary filter that combines high-frequency gyroscope integration with low-frequency accelerometer angle measurement. The filter balances gyroscope drift correction against accelerometer noise.
### Accelerometer Inputs
Accelerometer X (m/s²)
Accelerometer Y (m/s²)
Accelerometer Z (m/s²)
### Gyroscope Inputs
Gyroscope Rate (°/s)
Time Step Δt (s)
Previous Angle θ_prev (°)
### Filter Parameter
Filter Coefficient α (0–1)
α close to 1 → trust gyroscope more; α close to 0 → trust accelerometer more
Axis for Accelerometer Angle
Roll (X-axis, using Y and Z) Pitch (Y-axis, using X and Z)
Calculate
Results will appear here.
function imuCalc() { const ax = parseFloat(document.getElementById('imu-accel-x').value); const ay = parseFloat(document.getElementById('imu-accel-y').value); const az = parseFloat(document.getElementById('imu-accel-z').value); const gyroRate = parseFloat(document.getElementById('imu-gyro-rate').value); const dt = parseFloat(document.getElementById('imu-dt').value); const prevAngle = parseFloat(document.getElementById('imu-prev-angle').value); const alpha = parseFloat(document.getElementById('imu-alpha').value); const axis = document.getElementById('imu-axis').value;
const resultDiv = document.getElementById('imu-result');
// --- Validation --- if (isNaN(ax) || isNaN(ay) || isNaN(az)) { resultDiv.innerHTML = '⚠ Please enter valid accelerometer X, Y, Z values.'; return; } if (isNaN(gyroRate)) { resultDiv.innerHTML = '⚠ Please enter a valid gyroscope rate.'; return; } if (isNaN(dt) || dt ⚠ Time step Δt must be a positive number.'; return; } if (isNaN(prevAngle)) { resultDiv.innerHTML = '⚠ Please enter a valid previous angle.'; return; } if (isNaN(alpha) || alpha 1) { resultDiv.innerHTML = '⚠ Filter coefficient α must be between 0 and 1.'; return; }
const accelMag = Math.sqrt(axax + ayay + az*az); if (accelMag ⚠ Accelerometer magnitude is near zero — check your inputs.'; return; }
// --- Accelerometer angle (degrees) --- // Roll: atan2(ay, az) // Pitch: atan2(-ax, sqrt(ay² + az²)) let accelAngleDeg; let accelAngleFormula; if (axis === 'roll') { accelAngleDeg = Math.atan2(ay, az) * (180 / Math.PI); accelAngleFormula = 'θ_accel = atan2(ay, az)'; } else { accelAngleDeg = Math.atan2(-ax, Math.sqrt(ayay + azaz)) * (180 / Math.PI); accelAngleFormula = 'θ_accel = atan2(−ax, √(ay² + az²))'; }
// --- Gyroscope integrated angle --- const gyroAngleDeg = prevAngle + gyroRate * dt;
// --- Complementary filter --- // θ_fused = α × (θ_prev + ω × Δt) + (1 − α) × θ_accel const fusedAngle = alpha * gyroAngleDeg + (1 - alpha) * accelAngleDeg;
// --- Time constant equivalent --- // τ = α × Δt / (1 − α) const tau = (alpha * dt) / (1 - alpha + 1e-15);
// --- Cutoff frequency --- // f_c = 1 / (2π × τ) const fc = 1 / (2 * Math.PI * tau);
resultDiv.innerHTML = '### Results ' + '' + 'ParameterValue' + 'Accelerometer Angle (θ_accel)' + accelAngleDeg.toFixed(4) + ' °' + 'Gyroscope Integrated Angle (θ_gyro)' + gyroAngleDeg.toFixed(4) + ' °' + 'Complementary Filter Output (θ_fused)' + fusedAngle.toFixed(4) + ' °' + 'Accelerometer Magnitude |a|' + accelMag.toFixed(4) + ' m/s²' + 'Filter Time Constant (τ)' + tau.toFixed(4) + ' s' + 'Equivalent Cutoff Frequency (f_c)' + fc.toFixed(4) + ' Hz' + 'Gyroscope Weight (α)' + (alpha * 100).toFixed(1) + ' %' + 'Accelerometer Weight (1−α)' + ((1 - alpha) * 100).toFixed(1) + ' %' + '' + 'Axis: ' + (axis === 'roll' ? 'Roll' : 'Pitch') + ' | ' + 'Accel angle formula: ' + accelAngleFormula + '
'; }
#### Formulas Used
1. Accelerometer Angle
Roll: θ_accel = atan2(ay, az) Pitch: θ_accel = atan2(−ax, √(ay² + az²))
2. Gyroscope Integration
θ_gyro = θ_prev + ω · Δt
where ω is the gyroscope angular rate (°/s) and Δt is the time step (s).
3. Complementary Filter
θ_fused = α · θ_gyro + (1 − α) · θ_accel
α = filter coefficient (0 ≤ α ≤ 1) High α → trusts gyroscope (good for fast dynamics, prone to drift) Low α → trusts accelerometer (good for slow dynamics, noisy for vibration)
4. Equivalent Time Constant & Cutoff Frequency
τ = α · Δt / (1 − α) fc = 1 / (2π · τ)
The filter acts as a high-pass filter on the gyroscope and a low-pass filter on the accelerometer, with crossover at fc.
#### Assumptions & References
More Calculators
- FMLA Leave Eligibility Calculator
- Well Pump Horsepower Calculator
- Tank vs. Tankless Cost Comparison Calculator
- Workplace Safety Compliance Score Calculator
- Well Pump Pressure Tank Size Calculator
- Well Water Flow Rate & Yield Calculator
- Whistleblower Award Estimator
- Macronutrient Balance Calculator
- Stress & Cortisol Load Estimator
- Intermittent Fasting Window Calculator
- Body Toxin Load & Detox Timeline Estimator
- Target Heart Rate Zone Calculator
Read Next
Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...