Dual-motor tailsitters

This is a place to discuss support for dual-motor tailsitters with ArduPilot. This is for any fixed-wing airframe which sits on its tail to startup, and has two forward motors for thrust. The motors use differential thrust for roll when hovering, and elevons for pitch and yaw.
Support for this type of airframe is in master now, but has only been tested in a simulator. We’re now waiting on the first real aircraft flight tests. Mark Whitehorn may well get there first, as he already has one flying with PX4 and has indicated he is interested in trying it with ArduPilot.
The only real-world tailsitter testing with ArduPilot so far has been with a 3D AddictionX (see ArduPilot flying 3D aircraft, including hovering for details and flight videos). That went very well, but didn’t test dual-motor support.
One possible issue is yaw torque caused by differential thrust. I think the addition of a feed-forward parameter between differential thrust and body roll would reduce that to a manageable level.
Please share your designs for dual-motor tailsitters here, and any flight videos (successful or not!)


Here is some information on dual-motor tailsitter setup for those who want to try it.
You will need to set:


For initial testing I’d also recommend setting:

Currently when you calibrate the accelerometers you will need to have the plane level in fixed-wing flight (ie. nose forward). Later we will need to add support for calibrating with the nose up, which would be more natural.

For servo setup, follow the fixed wing setup documentation for an elevon plane. You will also need to setup separate throttle outputs for left and right throttle. If you have left throttle on channel 3 and right throttle on channel 4 then you would use:


One critical setting is KFF_RDDRMIX, which controls the amount of differential thrust to use to give body frame yaw (roll when hovering). I’d recommend starting with a value of around 0.1 and seeing how well it controls roll in hover.

I’d recommend initial flights in QSTABILIZE and QHOVER mode to test it hovers OK.


I should also mention that you will need to choose the stick input style for your tailsitter in hover. The default is multicopter style, so roll stick will roll from the persepective of hovering. If you prefer to have body-frame controls (like when hovering a plane manually) then set Q_TAILSIT_INPUT=1.

Thanks for starting this thread! I’m going to try to to build up a dual-motor tailsitter using an Skywalker X5, and a Pixracer as a flight controller. My goal is to test the wind limits in hover mode, to see if it’s a viable launch and recovery method for a commercial UAS, and also to see what sort of impact adding the extra motor, prop, and ESC has on flight endurance. It seems like a dual-motor tailsitter would be pushing the upper limits of flight efficiency for a VTOL platform, since it doesn’t have the extra weight of a power system that isn’t used in forward flight, motor tilt mechanisms, ect.

One more quick question: are you using an airspeed sensor? I know Roman Bapst’s PX4 tailsitter code was really dependent on an airspeed input to scale the control surface deflections between hover mode and forward flight.

The original ArduPilot quadplane code required an airspeed sensor, but I removed that requirement a few months ago. I now commonly fly quadplanes without an airspeed sensor, and I don’t have one on the 3D plane that I did a video of recently (which is flying as a tailsitter). It flies fine in quite high wind.

Hi Tridge,
Verry interresting news.
I’m waiting since one year for this feature with ArduPilot.
This gives my motivation a strong push and is something new in the scene.
It exists with PX4 Stack but after all posts no to recommend.
Thank you
Otto from Switzerland

Hi Tridge,

In the Pixhawk Wiki (Copter) is described to set the Parameter MOT_PWM_TYPE to 2 for a OneShot125 ESC.

Is this the Parameter Q_M_PWM_TYPE for the 2 Mot Tailsitter now?
In the Full parameter list is no comment at this line.
Or are OneShot not supported?

it is, but it isn’t active for tailsitters. It is active for the VTOL motors on other quadplane types.

oh? Seems to be here:

it isn’t supported on tailsitters yet as the tailsitters AP_Motors backend uses the fixed wing control channels. It could be activated for the throttle if needed.

I’m sorry, I didn’t understand the sentence: Could be activated if needed.
I bought already the ESC’s. So do I have to order standad ESC’s?

most ESCs that do oneshot also understand normal PWM, so I expect it will work. If not then I could give you a test firmware with it enabled.
Can you try the latest master builds and let me know if it works for you?

I’m still waiting for new ESC’s with PWM.
Of course I’will give you feedbacks as soon as I can.

Which outputs (servo_Function) are for left, right motor and left, right elevon?
Below my first Project with Tailsitter.

1 Like

You can have the outputs in any order you like. The key is to set the SERVOn_FUNCTION values correctly. You need to set the left motor output to 73 and right motor output to 74.


Sorry, din’t read correct your first post.

System running on the desk, various strange effects.
Signal check in MP/Tuning/Ch1Out to Ch4Out.
Servos Ch1,2 reacts according to stick input and moving the FC roll/pitch
Mots Ch3,4 are on 1100. With stick Yaw one or other are moving to 1500 with FMode FBWA but not in QSTABILIZE/QHOVER. No reaction on Throttel stick.
Arming not possible even Safty switch on and QSTABILIZ, STABILIZE

Trouble found: Locked due to arming check, no GPS.
What is the difference QSTABILIZE versus QStabilize, QHOVER versus QHover in Mode Calibraton with MP?

Summary of Params
SERVO1_FUNCTION=4 Output 1 Pixracer
SERVO2_FUNCTION=19 Output 2 Pix
SERVO3_FUNCTION=73 Output 3 Pix
SERVO4_FUNCTION=74 Output 4 Pix
MIXING_OFFSET =0 (-1000, 0 , +1000 %)

only difference is capitalisation :slight_smile: [quote=“lorbass, post:13, topic:15302”]
Trouble found: Locked due to arming check, no GPS.
ok, have you made any more progress? Do you want me to examine your parameters? (if so, posting a log is best)

@tridge The motor/servo config I’m using for the Stryker tailsitter is this one: https://github.com/PX4/Firmware/blob/master/ROMFS/px4fmu_common/mixers/caipirinha_vtol.main.mix

motors are on main PWM out 1,2 and servos are on 5,6

The Stryker tailsitter looks like this: https://goo.gl/photos/227HffnkZFAMQgD56


What you will need is the following on top of the default plane parameters with master:


SERVO1_FUNCTION=74 # right motor

SERVO2_FUNCTION=73 # left motor



obviously you should adjust trims as per usual. Note that the elevon trims are pre-mixer, so SERVO5_TRIM is your roll trim, not your left elevon trim (yes, I know this is weird …)

then you will need ELEVON_OUTPUT set to the right value. Start with ELEVON_OUTPUT=1 and try all 8 possible values (1 to 8) until you get the right pitch/roll controls in manual mode.

Then set Q_TAILSIT_INPUT to what control system you expect to use. I think PX4 does body-frame controls? So aileron stick when hovering does earth-frame yaw (I haven’t flown PX4 tailsitter, but I have heard this is what they do). If you like that scheme then set Q_TAILSIT_INPUT=1. If instead you prefer it to be like a multicopter, where aileron stick does earth-frame roll then set Q_TAILSIT_INPUT=0

Good luck!

PS: corrected for elevons being on 5/6, I misread it as 3/4 at first

also note that you need to do accel cal with the aircraft in fixed wing flight attitude, and set AHRS_ORIENTATION appropriately for fixed wing flight.

a few more notes as I know you haven’t flown ArduPilot fixed wing much.
Do your initial RC and servo direction setup in MANUAL mode. Get the RC1_REVERSED, RC2_REVERSED right, then get ELEVON_OUTPUT right for the elevon reversals.
Then switch to FBWA mode and check stabilisation direction is correct, do accel cal and mag cal. Make sure you do ESC cal too (unless you already know the range, in which case just set SERVO1_MIN/MAX and SERVO2_MIN/MAX). Also set SERVO1_TRIM and SERVO2_TRIM to the min throttle PWM.
First the first flight, use QSTABILIZE mode. Then switch to QHOVER for most testing and tuning. Once that works well try QLOITER. You may find you need to lower the XY velocity and position gains.
I don’t see a GPS in your photo? You will need one for the plane code.
Only once QLOITER is working well should you try a transition to FBWA mode.

I finally started the airframe build for my test aircraft, using a Skywalker X-5. Any chance someone can send me a build of APMPlane that includes the tailsitter code, for a PixRacer?