A brief history of a flight controller – From MultiWii to Betaflight and beyond

I will tell you the history of probably the most successful family of Open Source flight controllers: MultiWii that continues its life today as Betaflight, EmuFlight, and INAV. Other families like OpenPilot were not that successful and practically died. On the other hand, the history of ArduPilot is not that interesting and we can leave it for the other time.

Wii and Arduino make MultiWii

Believe it or not, but it all began with a Nintendo Wii controller: Nunchuck. Why? It was the most obvious source of gyros in the early days. You pry open one Nintendo Nunchuck, get gyro out, connect it to Arduino, flash it with MultiWii and you have made you your very own DIY flight controller. Yeap, the “Wii” in MultiWii was taken from the Nintendo Wii itself. If DIY was not your thing, you always had the option of buying ready boards like KK for example. Read More

RaceFlight One source code has been published and what does that mean

In the beginning of time, there was MultiWii and it was good. But then times moved on and 8bit ATmegas were end-of-line for flight control. So, Baseflight was created. In the beginning, it was supposed to be only a MultiWii port to support STM32f1 flight controllers in a for of Afroflight Naze. And it was good for a while. But the guy that was running this show turned out to be a prick and one of Baseflight developers forked everything and called it Cleanflight. One might want to say "Hail Hydra" but let's try to be serious here.

Anyhow, everything was great again. No pricks anywhere and Cleanflight was growing. People started to fork Cleanflight. Betaflight, INAV and Raceflight were created. No problems anywhere, one big happy family.

It did not take long for things to change. Someone decided that he can make money by making code closed-source and run only selected, sold by them hardware. It was RaceFlight by the way and this is a reason I'm not writing much about them. There real problem is that you just can not make an Open Source code under GPL license Closed Source just like that. It is virtually impossible since all commiters would have to agree to that. All of a few hundred. Good luck with that. INAV tried to change license once (and still be Open Source) and it failed. Few devs just said no. End of story.

Back to Raceflight. When in late 2016/early 2017 Raceflight went Closed Source. Some devs decided to check this and that, decompiled RF firmware and compared that with CF/BF. Surprise, surprise, decompiled code for gyro initialization looked exactly like in CF/BF. Raceflight was violating GPL license! They had no rights to close the code of Raceflight. Period. RF team defended themselves as they could but IIRC finally published source code for Raceflight (not RF One) like GPL required. Joshua Bardwell did a video on that topic you might want to watch BTW.

You might think this is the end of a story, but not. Raceflight announced RaceFlight One and claimed that RaceFlight One is 100% their doing, rewritten and does not contain absolutely no code from Baseflight/Cleanflight/Betaflight. So it does not fall into GPL at all. They were more less believed and most of pilots forgot about the whole thing.

Until yesterday. Because yesterday, Kalyn Doerr aka rs2k (one of creators on RF) published the full source code of Raceflight One on GitHub and posted something interesting on Facebook too:

(…) I don't want to say much publicly right now. I have kept quiet as I have been in fear for my safety for some time now. Over the last several months I have documented Preston Garrison's business dealings as he has tried to keep me away from the business. I have had no success in reasoning with him. I created it originally to share with the community and I have poured my lifeblood into it. It will not die here. I am RaceFlight.

Pretty scary, isn't it? Drama and stuff. But what happened is that RF One source code is on GitHub. Take it while it's fresh since it might be removed due to DMCA soon.

Let's leave the drama and see what mentioned Prestion aka proggod posted:

Well apparently Kalyn decided to release our code to the public without consent from me. I have no idea what his intentions are, or why he would decided to do this, last time I communicated him he was working on his home life. I can say he doesn't own the code, and it certainly can't be licensed as GPL, especially since he was not the only contributor to the code base. (…)

In other worlds "_I have no idea what happened but this code is private and GPL does not apply". Well… Betaflight community decided to check again an they found out something very interesting:

//TODO REwrite this better
char *ftoa(float x, char *floatString)
{
    int32_t value;
    char intString1[12];
    char intString2[12] = { 0, };
    char *decimalPoint = ".";
    uint8_t dpLocation;

//TODO REwrite this better is nothing strange. But, exactly the same ftoa implementation can be found in Cleanflight, Betaflight and INAV source code. And by exact, I mean exact. not similar. Exactly the same. It was committed by hydra in April 2014 under GPL license. And that means one thing: whole RaceFlight One is GPL. This is how GPL works. They did not rewrite it from the scratch, they took some elements of GPL code and continued from there. GPL is very intrusive license: if you use anything licensed under GPL, your whole project is automatically GPL too. Period.

I have no idea who is lying. But someone on the RaceFlight side is lying. Why? If you do not know why it's because of money. An old universal truth. And I suspect this whole thing might have legal repercussions and someone will meet someone in a court. Is that good? No idea. Bottom line is: RaceFlight One is violating GPL license of a code it was based on.

Ah, there is one more small thing. According to some RF/BF devs and users, Preston Garrison always stated that RF One is not using Kalman filtering. More, users were apparently banned from Slack for suggesting RF One was using Kalman filtering. Guess what… The published code suggests RaceFlight One is using Kalman filtering… Funny….

I will try to keep my eye on it and if I will keep you posted in case of any major developments (if any)…

Update #1

No, there is no Kalman filtering in RaceFlight One after all. All occurrences of Kalman filtering are commented out

Update #2

After all, there is a Kalman filter in RaceFlight One. The commented out code refers to multi-state Kalman filter. Method PafUpdate that is used for gyro filtering is 1-state Kalman filter. Thanks DigitalEntity for discovery

Follow up for 2017.12.07

And the most popular flight controller for INAV is…

Did you ever wondered what is the most popular flight controller? Hardware I mean. I can tell you 🙂 OK, maybe it will not be a full truth, since I have data only from INAV, but assuming that distribution for Betaflight and Cleanflight is similar, we might know what is happening…

Important, this is not the number of boards flashed with INAV, but rather number of times a board was connected to Configurator!

This counts TARGET software name, not retail name. For example, all clones of Naze32 will be counted as Naze32

Data was taken in June 2017, multiple connections during single user session are stored as single entry. Read More

Cleanflight is still dead…

When week ago Dominic Clifton replaced all Cleanflight source code with Betaflight, I’ve written than Cleanflight is dead. Few people agreed, few (including Dominic himself) stated that it was a good idea. Main argument was that Cleanflight needed F4/F7, Dshot, CMS support and so on. Yes, CF needed that. This is true. In theory, with that one move Cleanflight got everything what it need. But also lost all it’s uniqueness. Further narration wast that all those things that only CF had will be readded on top of Betaflight code.

One week later I repeat: that was a bad move and here are my arguments:

  • All Open Source projects exists only thanks to The Community. The bigger the community, the better. I did not participated in Cleanflight development much. Only few really minor pull request. I joined the hobby too late. Many developers worked on CF code for months, maybe even years. Not only Dominic. If someones arbitrary decission would just “erase” my contribution (in both code and know-how) I would be pretty pissed off. Really, there was a reason all those people participated in CF. Now, all their work that was not present in Betaflight, is gone. That is not encouraging.
  • The same goes for 3rd party apps like EZ-GUI. All of them lost CF compatibility over the night. Will they be willing to adopt to the changes?
  • I’m really not sure is reimplementation of Cleanflight specific features on top new code will be simple enough to be done in reasonable period of time
  • The biggest programming problem I see are resources. Betaflight is in very comfortable situation: it, more less, can ignore the fact that servo and motor outputs can not share the same timers. After all, who uses servos on mini quads? And CF is (was) not only about mini quads. What about airplanes? Are resources ready to handle servos and motors at the same time and prevent all potential clashes? I doubt it
  • Changing codebase maybe looked like a best solution to get F4, Dshot and so on. But was not the only way. Somehow INAV got it after all. And Betaflight got it. How? Thanks to The Community

Cleanflight is dead…

Only 5 weeks ago I’ve written that Cleanflight has a problem. Looks like, the problem was much bigger than I expected. Today in the morning, Dominic Clifton aka. Hydra essentially killed the project by resetting GitHub repository to Betaflight 3.1.

It was announced on Facebook:

Cleanflight v2.0.0-RC1 is out now, with all the new features from Betaflight v3.1 – please share this post!

Thanks to the hard-working betaflight developers especially Boris B, Jason Blackman and Martin Budden who have been doing fantastic work for us all!

Also, all GitHub Issues and Pull Requests were deleted.

What does that means? More less the following:

  1. Cleanflight lost all it’s uniqueness and is Betaflight under different name
  2. Pilots that were using Cleanflight on airplanes or big multirotors are left alone. Betaflight aims on mini-quads, not airplanes!
  3. Why anyone would want to use CF when BF is there and this moment it offers better community support?

The way I see it, it was a nice ride, but now it is over and Cleanflight is dead. Too bad, since it had a huge impact on multirotor community over last few year…

Cleanflight, what is up with you?

Those are my personal thought on the topic. If you do not aggree, it is fine, I will not argue or discuss. You have a right you your oppinion, I have a right to mine…

When I entered multirotor hobby about 2 years ago, Cleanflight was The Flight Controller software to get. OpenPilot was about to die, just like BaseFlight. Or maybe even BaseFlight was already dead… never mind.

Bottom line was that Cleanflight was it: fast realease cycle, great support, great community. Everything was just better there.

Then, somewhere in second half of 2015 it started to change. You do not remember what happened in the second part of 2015? It is more less the time when both Betaflight and INAV (both are forks of Cleanflight just like Cleanflight was the fork of BaseFlight) started to appear. I remember narration behind both of those projects: we will rewrite some code, make it fly better with racers (Betaflight) and handle GPS better (INAV) and when this is done, it will be merged back to Cleanflight. Read More

PID looptime: why it is not only about frequency

Last 18 months was an extremely good period of time for all mini-quad enthusiasts. Progress, hardware and software both, was just incredible. Who could have guessed that in less than 2 years mini-quads will evolve into main group of drones with such excellent flight characteristics. Just take a look at looptime. When I entered the hobby, standard looptime was 3500us (285Hz). Then, someone noticed that mini-quads fly much better when looptime is lowered and it started. Right now, standard looptime is 2000us (500Hz), while Betaflight starts with 1000us (1kHz) or even 500us (2kHz) in case of faster flight controllers.

Just by looking at numbers one might come to a conclusion, that looptime should be kept as low as possible and higher control loop frequency is better. Hey, 2kHz should be twice as good as 1kHz, right? One might even thing that it’s really about frequency. Well, this is both false and true: sometimes it is not about frequency, sometimes it is about frequency after all.

Read More

Cleanflight low pass filters part 2

Quite a lot things changed in the world of low pass filtering since my previous port on this topic was published. So, here is the updated guide to Cleanflight LPF filters:

gyro_lpf

gyro_lpf is the most important low pass filter for gyroscope readouts. First of all, it is not part of Cleanflight, but is done by gyroscope itself. Cleanflight only initializes gyro with desired cutoff frequency. Allowed values are:

  • OFF
  • 188HZ
  • 98HZ
  • 42HZ
  • 20HZ
  • 10HZ

When OFF is selected, gyro offers fastest possible sampling rate (8kHz, new data every 125us) and smaller possible delay. But, it is extremely prone to any vibrations. Any noise from motor or propeller will be visible in gyro output. All other values of this filter allows gyro to provide new data every 1000us (1kHz).

42Hz is lowest 'flyable' cutoff frequency. It does not makes sense to go lower, since signal delay will be too big and filter will attenuate frequencies that are important from 'flight' point of view. So, 188Hz, 98Hz and 42Hz are the ones that are interesting for us. Exact value depends on propellers, motors, balancing, bearings state, frame rigidness and few other aspects. Let's say, that 250mm or smaller frames can use 188Hz, 450mm and bigger frames should use 98Hz or 42Hz.

gyro_soft_lpf

gyro_soft_lpf is a second state of gyro readout filtering before they are introduced to PID controller. One might ask: why two filters? After all, gyro_lpf does the same thing. Yes, it does the same thing. But using 2 LPFs in this case has some advantages. gyro_lpf can not be tuned. It's either: off, 188Hz, 98Hz, 42Hz. But what if, for example, main source of gyro noise is at about 90Hz? Cutoff at 98Hz would be pretty useless. One would have to use 42Hz, loosing a lot of usable frequencies and having to suffer from noticeable (from PID controller point of view) delay. This is why fully configurable second stage of LPF was added.

gyro_soft_lpf should be kept below gyro_lpf, and below frequency of main noise source. Usually between 50 and 100Hz. Frequencies below 50Hz are too important for stable flight to attenuate them. On the other hand, everything above 100Hz is useless and can be cut off.

pterm_cut_hz

This software LPF filter was removed and is no longer available.

dterm_cut_hz

Here, let me just quote my previous post:

(..) D term of PID controller, since it is trying to look into a future, can be a source of huge noise and vibrations. After all, looking into a future is always a tricky business. This is why D term can change with totally different frequency than gyro input and there is a very good reason to limit D term change. Too see how excess D noise can affect gyro traces take a look at my Blackbox tutorial.
(…) Rule of thumb is: smaller and more rigid frames allows for higher D term cutoff frequency and 42Hz is a good place to start. Bigger frames might require lower cutoff frequency and 10Hz is lower boundary.

If only frame and noise level allows, D term cutoff frequency should be kept as high as possible. This allows D term to reacts faster to changing flight conditions and can greatly improve UAV behavior in prop wash and rapid maneuvers.

DIY wireless telemetry link for UAV

Telemetry link between UAV (drone, airplane, boat) and laptop/mobile/ground station device can be very useful. Not only to get current drone position, altitude or battery level, but also, when wireless link provides such a possibility, to update drone parameters in-flight. Some radio links, like OpenLRS provides such a possibility out of the box. They include transparent serial bridge and almost any kind of device can use it to communicate with flight controller. Unfortunately, most RC radio systems lacks this functionality and additional telemetry links have to be used. Like 3DR 433Mhz radio link.

One can buy or one can build something by his own. Some time ago I've chosen the second way and decided to build my own wireless serial link to archive 2 way communication between drone and ground station software. My objectives were:

  • 433MHz since it is legal in my country
  • has to allow to use my phone with EZ-GUI, since I do not like to carry my notebook to an airfield
  • as cheap as possible
    To satisfy those objectives I've decided as follows:

Read More

Connecting ultrasonic rangefinder (Sonar) to Cleanflight and INAV

Keeping constant altitude with a drone is not a trivial task. Specially, if drone is supposed to keep give altitude very precisely few meters above the ground. One of the reasons for it is difficulty of reading precise altitude. Barometer can drift when atmospheric pressure changes and can produce a lot of noise. GPS is very inaccurate when dealing with altitude. One of the options is to use some kind of rangefinder. Ultrasonic for example. Cleanflight and its derivatives supports exactly one kind of those: cheap HC-SR04 sonar. There are plans to integrate different sonars, but none of official builds supports it yet.

dav

Read More