Custom heli (3m rotor, 25kg empty) — cornering limited to ~3m/s, plus RAT/POS tuning questions at higher payload

Hi everyone,

It’s been a while since I last needed community help, so first a quick project overview: I’m working on this for a company and unfortunately can’t share photos/videos, but logs and parameter files are fine to share and should hopefully be enough for analysis.

Aircraft: Fully custom-built helicopter, turbine powered, 3-blade main rotor (3m diameter), 2-blade tail rotor (0.7m diameter), empty weight (no payload) 25kg, CCW main rotor (left-hand rotation). Designed to fly empty, with 40kg payload, and with 60kg payload.

Structural note: The airframe is built light rather than ultra-stiff. The chassis has a bit of flex in roll, and the tail boom isn’t fully rigidly supported (it can give slightly). The payload itself is mounted rigidly to the landing gear (and that will stay that way), and the landing gear itself is very rigidly attached to the chassis — the flex we have is only in the chassis structure itself, nowhere else. Worth mentioning since it may be relevant to tuning behavior/vibration characteristics.

This airframe has flown successfully on other projects before (with different electronics), so we’re fairly confident mechanical issues can be ruled out.

Current setup: Pixhawk Cube Orange with Here GPS 4, recently installed. I’ve done several test flights since installation in ACRO, LOITER, and AUTO modes. The AUTO mission is always a 200m x 18m rectangle flown at 20-40m altitude, cruise speed typically 12-18 m/s.

I currently have two separate problem areas I’m stuck on:


Problem 1: Cornering in AUTO — stuck at ~3 m/s regardless of parameters tested

The helicopter always brakes very hard in the corners, down to 2.5-3.5 m/s, and flies the corners quite “boxy”/sharp-cornered rather than smooth. Ideally we’d like either a smooth 180° turn, or two 90° turns with a large enough radius that they effectively merge into one continuous arc. No matter what I change, the outcome stays essentially identical — sharp, slow, “hover-like” corners.

Important constraint: The 18m spacing between the corner waypoints is fixed by the mission requirements this aircraft is being built for — we cannot simply widen that leg to get a gentler geometric turn. Any solution needs to work within that fixed 18m spacing.

Parameters tested so far (individually and in combination):

  • WPNAV_ACCEL: 100–350 cm/s²

  • WPNAV_JERK: 1–5 m/s³

  • WPNAV_ACCEL_C: 200–600 cm/s²

  • WPNAV_RADIUS: 1000–3000 cm

  • WPNAV_SPEED: 7.5–18 m/s

None of these combinations changed the outcome in any noticeable way.

Lean angle: ANGLE_MAX is set to 30°, but the aircraft never comes close to using it — peak lean in corners is around 10°, at most.

I also tried SPLINE waypoints in Mission Planner, but the closer together the waypoints are, the slower it seems to loiter/crawl through them, not faster.

The flight logs I’ll attach are the fastest/smoothest corners I’ve managed to get so far — I genuinely don’t know what is actually limiting the corner speed at this point. Logically I would have expected WPNAV_RADIUS and WPNAV_ACCEL_C to be the relevant levers, but since WPNAV_ACCEL_C produced zero visible change, I started wondering whether that parameter has effectively become non-functional (the Mission Planner description field for it also appears to be missing/blank), which is why I then tested with WPNAV_ACCEL instead (always raising jerk proportionally so the accel ramp works out to about 1 second).

Question: Given the fixed 18m waypoint spacing, what is actually the binding constraint here? Is there some other parameter or interaction I’m missing?


Problem 2: General attitude tuning status, and how payload weight affects it

Baseline: 40kg payload — looks/flies good, but feedback welcome

I’d really appreciate expert input on the tuning here. The 40kg-payload flight (log attached) looks visually very good — flies stable and does what it’s commanded to do. The AUTO mission also looks good; the tail maybe overshoots slightly at the corners, but nothing dramatic. In LOITER it tracks the stick well, same in ACRO.

Tuning approach used so far (per the ArduPilot Heli tuning docs):

  • Rate (RAT) PIDs: D increased until shake onset, then set to 50% of that value. P increased until shake onset, then set to 50%. FF raised significantly to get the aircraft to track the stick tightly — with too-low FF we saw toilet-bowling in LOITER, which went away once FF was raised.

  • I gains have not been re-raised yet — early on the swashplate oscillated strongly, so all PIDs were cut back significantly, and I haven’t revisited/increased I since. Planning to do this in upcoming test flights.

  • Tail (yaw): same approach — P raised to shake onset then backed off, D likewise. Not sure how to approach I here. FF isn’t really needed for yaw per the docs, as I understand it.

All of the above was tuned at 40kg payload and then test-flown as shown in the attached log.

60kg payload — noticeably worse, especially the tail

After increasing payload to 60kg (same gains, not re-tuned): the aircraft still flies, but the tail in particular behaves somewhat erratically — even though we’re not yet at a power/performance limit. It doesn’t track the stick well; subjectively, for the same stick input it seems to yaw sometimes faster, sometimes slower, inconsistently. In the AUTO mission, the tail overshoots badly at the corners — I’d estimate 30-40°, before steering back.

That said, it does still fly the AUTO mission overall.

In LOITER, larger/faster stick inputs cause it to start oscillating — and looking at the log, the acceleration values in the position controller clearly don’t track well together and start oscillating too. I tested both higher and lower PSC_POSXY_P — both were worse. Also higher/lower PSC_VELXY_P, _I, and _D, though I had to stop that testing early due to time constraints. PSC_VELXY_D = 0.2 caused strong, fast shaking; PSC_VELXY_P ±20% changed things somewhat, but it never became properly stable either way. I suspect I might be looking in the wrong place here.

Question: It’s possible/likely that separate RAT and POS controller gain sets are needed for empty / 40kg / 60kg configurations, switched depending on payload — is that the right conclusion, or is there something more fundamental I should be addressing first?

Ideally, a single gain set that covers all three weight configurations reasonably well would obviously be preferable to us — simpler operationally, one less thing to get wrong before a flight. If that’s genuinely not realistic given the weight range involved, then swapping parameter sets between payload changes is something we can live with — but if there’s a way to avoid that, we’d much rather go that route. Otherwise, of course, we’ll need to tune separate parameter sets for each configuration — worth mentioning that we’re working under fairly tight time constraints to get this project flight-ready, so any pointers that help us avoid unnecessary extra tuning rounds are very much appreciated.


Very much looking forward to your thoughts — any feedback or pointers to improve the flight behavior are welcome, on either problem.

Logs + Parameter File:

Tuning for variable payload mass is described on the copter wiki.

Thank you for the pointer — I searched right after reading your reply, is this what you meant?

https://ardupilot.org/copter/docs/input-shaping.html

Aside from the whole slung-payload discussion (which is covered in a lot of detail), this is the only thing I could find that seems to speak directly to weight-dependent tuning — specifically the note about scaling ATC_ACC_P_MAX, ATC_ACC_R_MAX, and ATC_ACC_Y_MAX by min_TOW / max_TOW for aircraft carrying large directly-mounted payloads.

If that’s the page you meant — I can obviously go ahead and test lower acceleration values for the heavier configuration, but our current values are already set quite conservatively (specifically to reduce forces on the airframe and make sure the aircraft never makes abrupt movements). Does it still make sense to scale them down further by the min/max TOW ratio in that case?

Also, when I look through our logs, I don’t actually see these acceleration values acting as a limiting factor anywhere (achieved rates/lean angles stay well below what’s currently configured) — but maybe I’m misreading something there, happy to be corrected if so.

Or do you mean a different site in the wiki? If so i would be very thankful if you could provide a link.

Hi @PatrickS ,

I suggest the following:

Set H_OPTIONS to 0, the heli is htting I-term limits when transitioning from forward flight to hover or near hover condition, see following (I-term gets clamped to ILMI):

H_OPTIONS = 1 was the old way of handling I-term (aka “leaky I”), basically relying on ground speed to release full integrative. So, strongly suggested H_OPTIONS = 0.

Then I suggest to lower LOITER_ACC_MAX and WPNAV_ACC for a machine that size, It will improve the handling especially at MTOW configuration.

Lower ATC_SLEW_YAW, perhaps aorund 3500-4000.

Not much you can achieve with only 18m spacing with those corner waypoints.

I think you are hitting structural non linear response of the airframe (since you mentioned tail boom has some slack/flexibility). Increased mass moment of inertia and flexibility can contribute to the behavior you are seeing. Try increasing PILOT_Y_RATE_TC, but stiffening the tail assembly should be evaluated (if possible).

Thank you very much for the detailed reply — really appreciate it!

I’ll switch H_OPTIONS to 0 as suggested, thanks for spotting that in the log.

Regarding lowering LOIT_ACC_MAX and WPNAV_ACCEL — do you have a ballpark recommendation for a machine this size? Something like 75 cm/s²? 50 cm/s²? And should I keep adjusting WPNAV_JERK proportionally so the accel ramp stays at roughly 1 second, as I’ve been doing so far?

I’ll test lowering ATC_SLEW_YAW to the 3500-4000 range — one concern though: couldn’t that end up limiting my corner speed further? At e.g. 40°/s I’d need ~4.5-5 seconds for a 180° heading change, and since the nose is supposed to track the next waypoint through the turn, wouldn’t the slew limit then become the pacing item for the whole corner?

Thanks also for the honest feedback on the corner speed with the fixed 18m spacing. I’d genuinely love to understand why this is the case though — none of the limiting parameters are anywhere near their maximum in the logs (lean angle peaks around 10-12° with 30° allowed, rates similarly far below their limits). And when I fly the same geometry manually in ACRO, I can fly a nice smooth 180° turn within those dimensions carrying significantly more speed through the corner — which actually keeps overall loads lower than the current brake-hover-accelerate cycle, since the heli is also considerably more efficient with forward airspeed than in near-hover. So the airframe can clearly do it; it’s the trajectory planner that won’t ask for it. Is this a fundamental S-curve planner limitation with tight waypoint spacing, or is there some interaction I could still exploit?

On PILOT_Y_RATE_TC — as I understand it, that only shapes manual stick inputs, correct? I’ll try it for the manual flying, but honestly manual flight is acceptable as-is; the AUTO mission behavior is what matters most for this project. Is there an equivalent parameter that would achieve the same smoothing effect for yaw commands in AUTO?

One more question if I may: do you have any input on the Loiter/position controller side at higher takeoff weights? My current thinking is that the PSC_VELXY_* gains probably need to go lower for the heavier configuration (outer loop needs to respect the slower inner loop response with the higher inertia), while the rate PIDs could potentially go higher than the light-weight tune allows, precisely because of the increased mass moment of inertia. Does that match your experience, or am I thinking about this the wrong way?

Our path planner is limited to looking 2 waypoints ahead (1 corner), it assumes it has to stop by the second waypoint.