NOVAerial Robotics AC3.4-Heli Review and Issues List

I wanted to open a new topic to announce that I am beginning to work with AC3.4 for TradHeli finally. I am reviewing the code, and will be posting my findings and updates here. As you may or may not be aware, I had to stop doing development work on the software last spring as I was mainly busy developing a new commercial UAV helicopter which is using Ardupilot, the Procyon 800E.

This is mostly done now and going into limited volume production. This system is still using AC3.3, but the time has come to start preparing to move to AC3.4, and with that, I’m conducting a fairly thorough review of the helicopter code. In this thread, I will bring up any important findings. And we can talk about fixes, I’ll give links to my patches, etc.

Also connected with this, I’m announcing that I am installing a PixRacer onto a Blade 250CFX RTF helicopter. This will be my main “hacking” machine, and I will also offer it for sale to Procyon customers as a “trainer”. I will also be open sourcing the system so that anybody who wants an RTF system to play with Ardupilot for Heli can build their own. I will open a new thread just for this shortly, so please don’t post questions about it here.

So far, due to this work, I want to state that I have found a bug in the Direct-Drive Fixed Pitch tail control code. Basically, you can’t assign it to an output on the Pixracer, and also the math for the control output is completely wrong. I don’t advise using this right now. I’m working on a patch for it now. I’ve also added a new feature for trailing edge pitch control required for the 250CFX or any heli that has trailing edge pitch links.


Hi Rob

The good news, strong attention, look forward to Rob’s new discovery


Hi Rob,

every FBL-unit I use returns the swash plate in about 4-5 seconds after a full stick input back to neutral (something like 1/2 value after every second), the current code needs about 5 times longer. Could you please implement this faster leaking or can we have a parameter to set it ourselves.

Interesting. We already do leak the I-term quite quickly. Should be about 4-5 seconds. I think what might be causing what you see, is that when you push the stick, the target attitude moves up to 10 degrees, and holds indefinitely. So that will permanently offset the swash a bit.

Now, besides “because the others are doing it” is there a functional reason to make a change like this? I don’t have any issue with our current system due to this.

So, another issue that has just cropped up. There’s an issue with PosHold, where if you take off in Stabilize or Acro before the Motor Runup is Complete, then switch to PosHold, it will jump to full down collective. Basically, because it won’t try to fly until Runup is complete in any auto-throttle modes.

Alt_Hold and Loiter will actually fail the mode change if you try this. But the check was missed in PosHold. I don’t use PosHold, haven’t tested it, and don’t plan to. I had wanted to simply completely disable these modes for TradHeli. Same goes for Flip, Drift, and maybe a few others.

Oh, another issue, and this is actually a pretty big one:

If your LAND_COL_MIN is set too high, such that the helicopter has trouble descending for a landing, then during an RTL or Land Mode, it can think that it has landed, and disarm in the air. I had a bad crash because of this. This also affects large efficient multirotors.

For helicopters, making sure you have sufficient negative pitch to descend will avoid the problem. In my case, I had set LAND_COL_MIN to give nearly zero pitch because I had a ground resonance problem. I fixed that with stiffer landing gear, but forgot to change this to a more reasonable negative pitch value (-3 or -4 degrees should be enough). During an RTL on a windy day, it disarmed and fell from 30 feet.

However, I’m working on a patch that will add a check for the Motor Interlock to be False before accepting a Land Complete. This is a double edged sword. It prevents any chance of a mid-air disarm because of a false-positive Land Complete. But it also means that after an RTL, etc. the copter will not disarm until the pilot drops the Motor Interlock. This will be an optional feature.

Hi Rob,

We actually depend on PosHold mode, so I’d prefer it to remain in the code. I’d be happy to help with testing and make any changes necessary to keep that file up to date with other modes for the heli. I was planing on using/modifying Drift mode for TradHeli also, so maybe I can test and update that file too.

Thanks for your amazing work!

This sound like a great idea as we had a problem with this too.

However, I’m working on a patch that will add a check for the Motor Interlock to be False before accepting a Land Complete. This is a double edged sword. It prevents any chance of a mid-air disarm because of a false-positive Land Complete. But it also means that after an RTL, etc. the copter will not disarm until the pilot drops the Motor Interlock. This will be an optional feature.

I’ve been flying various versions of 3.4 for sometime now and I have a few potential issues to add to the list. I’ll summarize them in another post later.

Goro, great, I would appreciate your issues list.

I will then leave PosHold in if you are using it and are sure it’s not going to crash the helicopter. I will add the check required so that it will fail the mode change if the rotor isn’t up to speed, same as AltHold and Loiter do currently. It can sometimes be an annoyance, but at least it’s safe.

Hello, I also have this problem. Firmware AC 3.3.3 in the RTL mode, fell from a height of 25 meters. So it was 3 times the RTL mode. This is a problem, it would be good to solve it.

Yes, it’s not a 3.4-only problem. It can happen in 3.3 as well. The root cause is having LAND_COL set too high, but it should not happen in any case.

Firmware is called AC3.3 H_COL_MIN?


Though H_COL_MIN would play a role as well. The two combine to give you the minimum collective while trying to land. If it doesn’t descend while on H_LAND_COL_MIN, then it assumes it is on the ground and disarms.

Basically, if you are in Loiter mode while disarmed, you should have at least -3 deg pitch on the blades.

I found H_LAND_COL_MIN = 550 it is not enough?

I changed all my helis to Pixhawk + FBL-unit because of this. If I try to launch a Pixhawk only setup on rough terrain I get in trouble, while any standard FBL-unit doesn’t present the slightest problem in the same situation, because the swash is neutral.

Probably needs to be much lower. What matters is the actual blade pitch as I specified in the test above.

What sort of terrain are you launching from? I’ve never had an issue. Are you launching from Stabilize or Acro? Stabilize will always push the swashplate over, I can’t stop that while still having it stabilize. Have you ever tried to take off on rough terrain with an FBL in self-level mode, and how does it behave? If you are taking off from rough terrain in Acro mode, when you arm it, it should accept ‘whatever angle it’s currently at’ as the neutral point and won’t try to pull it level.

Most of my helis are tail-draggers, and I’ve not had an issue. So just trying to get a full understanding here.

Hi Rob,

I am flying in the mountains after hiking up above the treeline to get to the area of interest. The launch and landing ‘area’ is usually a very small spot with lots of gradient and there is no hard and even space for the skids. This means the heli will rock no matter how smooth the rpm goes up. Because of the swash inclination I am forced to do a little bit of countersteering with the sticks and the whole launch process is getting ‘very interesting’. ‘Ofcourse’ I can launch and land only in Acro mode, using ACRO_TRAINER = 0 in this terrain. Launching / landing at the local club I have no problem to use the higher modes, but on the slopes Acro is king (PosHold, RTL and Auto for flying missions).
Using a VBar or whatever else in the same situation I do the stick movement test, check the reaction of the FBL, walk back, start the motor, look more or less relaxed how strong the heli rocks and lift off. For the same reason I am on ACRO_TRAINER = 0 I do not use any self leveling mode with VBar for launch and landing. Any kind of self-level mode would yield to another one bites the dust (actually rocks) as the blades would strike on the hill side.
The heli code is way more sensitive on the PID settings than any FBL-unit I have and - sorry to say - it doesn’t feel as good for me and some others.
I am willing to help as much as I can (but my spare time is limited).

I don’t know what the situation is for ultrafuge, but we also use FBL in conjunction with Pixhawk, mostly because our heli pilots are used to FBL (I personally like helis with good old stabilizers, but that’s another topic) and it’s much easier and quicker to set up and get it in the air. FBL also seem to be able to handle harsh vibrations without much care given to isolation/dampening or tuning. Another reason is that we have a switching system as a failsafe so we can bypass the FC completely if anything goes horribly wrong and still be able to fly the heli manually using FBL.

Anyways, in our setup, we needed to reset the FBL’s swash control everytime before taking off so that the swash returns to neutral, especially when the surface is neither perfectly level nor smooth, which we expect most of our use case to be.

We are using Futaba CGY750, and when we initially tried to use Futaba’s AVCS mode which has almost no I-term leakage, the heli would tilt and drag it’s feet and tips over or fly off in random direction when taking off. The situation is worse for experienced pilots as they unconsciously react and move the stick around and tilt the swash even more. The way to reset the swash (and rudder gyro) on CGY750 with AVCS mode engaged is to give full right and full left repeatedly within one second so that’s what we did right before taking off.

Now we only use “Normal” gyro mode on CGY750 and it seems to be working fine.

Just my 2 cents.

Nice to see your return here Rob.
Just checked my H_LAND_COL_MIN and it is zero, seems that was the default when upping to 3.3.3
With that I have about -7°
But I don’t understand the point of adjusting (upwards in my case) this if I set LAND_SPEED appropriately?