Dual-motor tailsitters

An other video of Q_acro with airspeed enable


Since the last flight I have reduced Q_a_rat yaw and Q_a_rat_rll D an P gains but there are still large oscillations.
This is also the first loop with Q_acro and Inverted flight from 2’55’’.
Thanks again to you and @iampete, that’s a lot of fun. I hope you will try this mode soon.
2 Likes

That does look like fun; did you have any problems at all with stability in high alpha or slow flight? It looked like roll authority was pretty good at low airspeeds. Are you able to hover in QACRO, or did you switch to QHOVER at the end?
Also, have you tried QACRO and or QSTABILIZE with ARSPD_USE=0? I can’t remember…

I’ll soon post binaries with iampete’s gain interpolation method. It should work very well with good airspeed measurements.

Q_acro is very very stable at high alpha, this is where it is more stable than FBWA. This stability is also probably due to the quad configuration because the frame and the CG position is not critical. This is at least my conclusion when I compare to the batwing. Maybe the most critical design point with the quad configuration is the respective thrust of wing and vertical motors plus the distance between motors.
The whole video is q_acro except 5s at takeoff and 5 seconds at landing. It is better for safety reason because I am close to the propellers. Since I have loaded pr_add_qacro I have enabled airspeed so I also flied q_hover (plus loiter and fbwa for calibration) with airspeed enable but no more.
About acro flight, my epp wing is the worst flyer, I think a good frame dedicated to acro would give a much better result. Maybe something like a 3D plane with a large fuselage but without horizontal stabilizer and at least one motor on each wing…

Some thoughts about high alpha stability:
Why the quad configuration does not require a specific frame or vectored thrust and a precise CG to get a stable hover ? because of the differential thrust.
Why Q_acro is more stable than Fbwa at high alpha ? Probably because differential thrust is enable
Why my Epp hacker wing does not fly inverted in manual or Fbwa mode (it looses altitude whatever the throttle and elevator stick position) and fly perfect with Q_acro ? Again thanks to differential thrust.
Some of above observations are linked to the discussion we had about flap deflection as the differential thrust is an added component to the flap deflexion and Cm airfoil.

It would be interesting to look at plots of AETR and PIQR/P/Y vs attitude to see how hard the controller is working, and whether trim and CG adjustments would help.

@losawing have you tried QHOVER with bodyframe roll (Q_TAILSIT_INPUT=2) using the binary for test-copterTS-bodyframe?
This makes the controls work like QACRO with the nose pitched down, but you lose the ability to yaw in body frame when the nose is vertical. It would be a kind of safe mode for high alpha flight, since roll and pitch are angle limited.

Not yet, this is the next task on my list. Maybe on Friday evening we should have a calm weather.

That’s great, I’m hoping that feature will be useful too.
Here are the binaries with Iampete’s gain interpolation method: https://drive.google.com/open?id=13LLj7IDUtUfNZQ4Bt-iWARiIgpdLTVBs
The parameters Q_TAILSIT_SPDMIN and Q_TAILSIT_SPDMAX set the speed range over which gains are interpolated between Q and FW gains.
If you make those two params equal, and set Q_TAILSIT_THSCMX < 1, it will use the titl/throttle based method and the max attenuation will be Q_TAILSIT_THSCMX
I found that 0.2 was good in my SITL test; you might try 0.1 for the EPP wing, since you saw oscillations in your last test.

1 Like

and if you set Q_ASSIST_SPEED to something other than zero you will get quad motor assistance in forward flight, you should be able to do high alpha flying in FBWA if your pitch max angle is large enough. As a rule of thumb Q_ASSIST_SPEED = Q_TAILSIT_SPDMAX = ARSPD_FBW_MIN is a good place to start and Q_TAILSIT_SPDMIN = 0. To start to be quite cautious, the gain scaling is done on airspeed so build up the airspeed slowly. You should find this also allows you to significantly increase your hover gains, I have had good success using the gains straight out of Qautotune although you might have to turn down the aggressiveness abit.

1 Like

So, If I am right, this is two gain attenuation method plus two possible utilization depending on the preferred mode. I am going to ask my boss an other week off :wink: But you are right, the assist speed feature on a quad wing would give the safest airplane ever if it works properly. I am very curious to test it.
I never tested q_autotune on the quad configuration. Do you mean it will work. Also for the pitch axis ?

Yeah, based on Q_TAILSIT_THSCMX it its >= 1 and Q_TAILSIT_SPDMAX ~= Q_TAILSIT_SPDMIN you get my new method. Q_TAILSIT_THSCMX >= 1 and Q_TAILSIT_SPDMAX == Q_TAILSIT_SPDMIN you will get the old stuff. With Q_TAILSIT_THSCMX < 1 you get Marks stuff, I think

It works in fine in the simulator yeah, i think for a copter tailsitter it will be fine, maybe it will struggle with a old flaps only tailsitter.

There are 2 new gain attenuation methods in this branch, and the parameter descriptions above look correct to me.
To summarize:

if (Q_TAILSIT_SPDMIN == Q_TAILSIT_SPDMAX) {
  if (Q_TAILSIT_THSCMX >= 1) {
    1) original method (gain boost at low throttle)
  } else {
    2) attitude/throttle method (gain attenuation based on attitude and throttle)
  }
} else {
  3) gain interpolation based on airspeed (needs airspeed sensor)
}

@iampete The flight-test-gain-interp binaries are built from this branch: https://github.com/kd0aij/ardupilot/commits/flight-test-gain-interp
which has 4 commits on top of your PR branch, one of which logs the scale factor from method 2 along with high-passed gyro rates for oscillation detection. We should probably also add logging of the scaler from method 3.

Just to save some time, is this binaries include also all features listed in posts 1630 and 1631 ?

I’m not sure 1630 is the right post number, but the flight-test-gain-interp branch includes all of the gain scaling methods for Qmodes plus the bodyframe roll input mode for QHOVER/QSTABILIZE.

thanks this is what I wanted to know.

I tried it this evening using the binaries of post 1648. To lose the ability to yaw (body frame) when nose is vertical makes the control very hard, like loosing ailerons on a plane or roll with a copter when hovering.
I was a little stressed because they were about 15 km/h of wind and I was focusing to avoid the wing to drift but it seems to me I had also a strange interaction between pitch and yaw. To be confirmed or not.
About q_yaw_rate_max, it seems to be related to roll rate in qacro mode and yaw rate in qhover mode. This is not easy to figure.

I’ll experiment in SITL with modifying the bodyframe roll option to affect yaw when the nose is vertical. Maybe there is a way to make it “feel” right at all pitch angles.
I just rebuilt those binaries because I found a missing commit that was included in the older binaries. This change does not affect QACRO mode, but is relevant to the other Q modes. Also, it is probably only relevant to non-vectored dual-motor tailsitters where yaw and pitch authority are limited.

maybe we could phase from body frame to earth frame based on pitch angle. earth frame * cos(pitch) + body frame * sin(pitch) or something.

@losawing These binaries: (flight-test-hybrid) https://drive.google.com/open?id=1CQKoz881nR40AdeWZN4m9KNCJi3NNGXS
have some changes to the bodyframe roll mode to make it easier to use when hovering. They should be otherwise identical to the flight-test-gain-interp binaries.

There are now 2 bodyframe roll options, as described in PR: https://github.com/ArduPilot/ardupilot/pull/10828

The idea, as suggested by @iampete above is to split the roll and yaw command inputs into bodyframe roll and yaw depending on Euler pitch.

I also split tailsitter input_type: BF_ROLL into 2 different types:
TAILSITTER_INPUT_BF_ROLL_M=2 and TAILSITTER_INPUT_BF_ROLL_P=3
The M version is bodyframe roll with the roll stick controlling bodyframe yaw in hover (like TAILSITTER_INPUT_MULTICOPTER) and the P version has the yaw stick controlling bodyframe yaw in hover (like TAILSITTER_INPUT_PLANE, and the same as QACRO).

1 Like

This is the test of the binaries from post 1648.
First log is a test of gain attenuation @iampete method


airspeed enabled, q_angle_max=8000 which is the highest value I have ever tested, Q_tailsit_thscmx=1.1, Q_tailsit_spdmin=2, q_tailsit_spdmax=12 up to 370s and then changed to 20.
The gain attenuation is effective but there are still oscillations from time to time, oscillations are stronger when spdmax=20. I think I have to improve airspeed measurements because I can see on the log that airspeed is unstable. Something weird, when flying qacro at high speed the wing responds very slowly to my input

Second log is a test of gain attenuation @kd0aij method


airspeed disabled + protection on the tube, q_angle_max=8000, q_tailsit_angle=30, Q_tailsit_spdmin=q_tailsit_spdmax=10, Q_tailsit_thscmx=1.1 up to 130s, then changed to 0.4 up to 220s then changed to 0.2.
The gain attenuation is very effective, there is no more oscillation when thscmx=0.2 even at high speed in qacro mode. The wing responds normally to input at high speed.
At the end of the flight after 330s I provoked a large pitch error with elevator stick pumping to see if the wing was able to recover. This test ended in a small crash but this is not clear for me if the gain attenuation was too strong.

1 Like