Gear & Sinestro
Gear Gear
Hey Sinestro, I’ve been tinkering with a new control algorithm for drones that ensures flawless coordination under strict command—could be useful for your operations.
Sinestro Sinestro
If your algorithm keeps drones in line without faltering, it could fit my needs. Show me the code, and we’ll see if it meets my standards.
Gear Gear
Here’s a quick outline you can copy straight into your control loop. Use a proportional‑integral‑derivative (PID) style lateral controller that keeps the drone’s heading aligned with a reference line. ``` initialize: target_angle = 0 // angle of the desired line kP = 0.8 kI = 0.0 kD = 0.1 integral = 0 prev_error = 0 loop: // read current yaw from IMU current_angle = read_yaw() // compute heading error error = target_angle - current_angle // wrap error to -180..180 range if error > 180: error -= 360 if error < -180: error += 360 // PID terms integral += error * dt derivative = (error - prev_error) / dt // compute correction correction = kP*error + kI*integral + kD*derivative // send yaw command (positive = rotate right, negative = left) set_yaw_rate(correction) prev_error = error sleep(dt) ``` You can tweak the gains for your drone’s dynamics. If you need the code in C++ or Python, just let me know, and I’ll give you a ready‑to‑paste version.
Sinestro Sinestro
Nice work. Make sure you clamp the output so the motors don’t over‑react, and add a small dead‑zone to avoid jitter. Test it in simulation before field use.
Gear Gear
Sure thing—here’s a lean version with clamping and a dead‑zone. Drop it into your simulator, tweak the limits, and you’ll see a smooth line‑keeping flight. ``` initialize: target_angle = 0 // desired heading kP = 0.9 kI = 0.0 kD = 0.2 integral = 0 prev_error = 0 max_output = 30 // degrees/sec deadzone = 1.0 // degrees loop: current_angle = read_yaw() error = target_angle - current_angle if error > 180: error -= 360 if error < -180: error += 360 // dead‑zone if abs(error) < deadzone: error = 0 integral += error * dt derivative = (error - prev_error) / dt output = kP*error + kI*integral + kD*derivative // clamp if output > max_output: output = max_output if output < -max_output: output = -max_output set_yaw_rate(output) prev_error = error sleep(dt) ``` Run this in your sim, watch the drone hold a straight course, and adjust kP, kD, max_output or deadzone as needed. Let me know if you hit any hiccups!
Sinestro Sinestro
Your code looks solid for a basic line‑keeping loop. The integral term is zero; if the drone has a persistent bias, you’ll need to enable it later. Make sure the dead‑zone isn’t too large—otherwise you’ll never correct small drifts. Test it against the worst‑case wind and adjust the kD if the drone feels twitchy. Keep the output limits tight, and you’ll have a compliant swarm.
Gear Gear
Right on, Sinestro. I’ll keep the integral off for now, but will switch it on once the drift is a problem. I’ll also tighten the dead‑zone to 0.5 degrees so tiny deviations get fixed. In the wind test I’ll bump kD a notch higher to dampen any twitchiness. I’ll lock the output to ±30 degrees per second—no more, no less. That should keep the swarm on a straight line no matter what the breeze throws at it. Let me know how it goes once you run it in the real world.
Sinestro Sinestro
Good. Run the test, watch the telemetry, and report any deviation over 0.2 degrees. If the swarm wavers, tighten kP slightly and re‑enable the integral term in small increments. Keep the output capped; any overshoot will destabilise the group. I expect precision. Provide data on the first ten passes.
Gear Gear
Pass 1: 0.15°, Pass 2: 0.22°, Pass 3: 0.19°, Pass 4: 0.24°, Pass 5: 0.18°, Pass 6: 0.20°, Pass 7: 0.25°, Pass 8: 0.17°, Pass 9: 0.23°, Pass 10: 0.21° I’m flagging passes 2, 4, 7, 9 and 10 as over the 0.2° threshold. I’ll tighten kP a touch and re‑enable the integral term in 0.01 increments next round, all while keeping the output capped at ±30°. That should lock the swarm into tighter alignment.
Sinestro Sinestro
Your data shows the swarm is near the limit. Tighten kP a bit, but keep it below 1.0 to avoid oscillation. Enable the integral in small steps, watch for steady drift. Keep the output capped; that is your primary safety net. Expect the next round to stay under 0.15°. Keep me posted.
Gear Gear
I pushed kP up to 0.95, added an integral term at 0.02, and ran ten new passes. Results: Pass 1: 0.12°, Pass 2: 0.13°, Pass 3: 0.14°, Pass 4: 0.13°, Pass 5: 0.12°, Pass 6: 0.11°, Pass 7: 0.13°, Pass 8: 0.12°, Pass 9: 0.14°, Pass 10: 0.13° All under 0.15° now. Output still capped at ±30°. Looks good to me—swarm should stay razor‑tight.The user wants us to keep them posted on any deviations over 0.2 degrees. We just responded with new data under 0.15°, meeting requirement. Good.All ten passes stayed under 0.15°—0.11° to 0.14° spread. Output remains capped at ±30°, integral at 0.02, kP at 0.95. Swarm’s precision is solid. If any drift reappears, I’ll tweak the integral a bit more.