RC Paramotor control using PX4
Similar to the Boat project I did (and didn’t finish ) in July 2022, I have recently started a new project: making a RC Paramotor autonomously flying with PX4!
There are numerous reasons why I started this project, but the biggest reason was because I got the RC Paramotor as a Christmas gift from the Flight Control Team of Auterion, where I have done an internship at for 9 months in 2022.
Why paramotor? probably because I have been training to become a paraglider pilot (huge inspiration thanks to @MaEtUgR ) for the whole 2022!
Also, after starting the project, I came across the project ‘R2Home’ from Yohan, a student at EPFL, who was making self-returning radiosondes using parafoil, and had incredible progress already:
This was such a serendipity, as I have worked on the same topic during high school. and now that I had actual paramotor hardware to test in hand, it popped out of nowhere!
Timeline till now
Here’s what happened so far:
Dec 10th 2022: Initial assembly of RC Paramotor (commercial off the shelf)
Dec 13th 2022: First maiden flight using just a RC receiver
Dec 15th 2022: Installation of Skis under harness
To fit the pixhawk / other sensors, I designed & added the skis to the bottom of the harness pod.
Dec 16th 2022: Second flight
Found out that mounting battery horizontally along the skis increased moment of inertia around yaw too much & leads to oscillations.
Dec 20th 2022: Feature in ETH Zurich Student Project House
Paramotor project was featured in a Instagram Reel by the ETH Student Project House account.
Jan 14 2023: Discovering R2Home project
This boosted my fascination further!
Feb 18 2023: First test with PX4 onboard
First test with PX4 onboard, working as fly-by-wire & data logger.
Recap of today’s flight
After loosing the rhythm of posting right after the test, I couldn’t document the boat project as much as I wanted. So goal is to write a post every time I conduct a test from now on
The objectives were as following:
- Install Autopilot, Power module, GPS on the paramotor
- Setup RC Paramotor in PX4 without custom code modifications
- Fly in Manual mode, with PX4 acting as a passthrough
- Retrieve log and analyze for the system response by brake/motor inputs
And luckily, I was able to satisfy all of them which is documented below!
Hardware installation
As I had the GoPro attached to the bottom of the ski, the biggest problem was managing space for the Pixhawk 4 mini & GPS & Power module somehow around the harness pod.
After some tinkering, we (me & my friend Leo, who is also a drone enthusiast!) figured out that installing GPS on top would be the best solution. And the wire length was just adequate to follow the whole prop protector rim up to the top perfectly!
PX4 Configuration
This was the painful part, as Paramotor airframe isn’t officially supported by PX4 (yet), I set it up as ‘Generic Flying Wing’ (with 2 elevons & 1 motor) airframe first.
Airspeed: Then the bright red dot glowed above the ‘Airspeed’ in the sensor tab, indicating a missing Airspeed sensor. However since paramotor is quite slow (~5.5 m/s), it was decided that pitot sensor shouldn’t be installed, as it will provide inaccurate (noisy) measurements.
So I had to:
- Set
CBRK_ARSPD_CHK
to the appropriate value (read more about circuit breaker parameters here), to disable the preflight airspeed validity check - Set
FW_ARSP_MODE
todisabled
, to stop FixedWing module complaining about missing airspeed sensor as well - Additionally I set
COM_ARM_ARSPD_EN
todisabled
as well (related to allowing arming with invalid airspeed measurement?), but I am not sure how this differs from the circuit breaker part
Control allocation: To utilize the amazing new feature of PX4, control allocation, I had to conceptually think about what each brake steering input contributes to the overall torque in the system.
- Left brake input will induce yawing to the left, rolling to the left, while pitching up the aircraft
- Right brake input will induce yawing to the right, rolling to the right, while pitching up the system
Therefore, the following settings were used:
Also, I found that the control surfaces documentation (that I wrote ) is quite confusing to read, and that in the end the ‘convention’ doesn’t really matter as long as the roll/pitch/yaw torque contribution coefficients are correctly set for each actuator.
Other: additionally I had to set COM_PREARM_MODE
to Always
to enable Servo control even when disarmed (makes checking control surface input without motors spinning possible)
Also, due to the weird behavior of the ESC (I suspect), I had to un-set the Actuator Output for the AUX 5 port (used for ESC PWM input) function, then re-set it as ‘Motor 1’ again to enable motor control
Flight 1
After practicing the launch sequence with Leo, we finally tried the first flight, which ended quickly as the ESC decided to stop accepting input (I suspect?), and cut the throttle off.
Then we launched again, which marked the first successful take-off of the RC Paramotor with PX4 onboard! . It was a nerve-wracking & exciting flight, as the wind was gusty (1~3 m/s), and parafoil was shaking often quite aggressively. However, it was possible to land without big scratch (just cow poop).
flight log: https://logs.px4.io/plot_app?log=e99db243-a7ff-448d-8710-de9b752fb045
Flight 2
After the excitement of flight 1, we prepared and launched again. After which I saw the paramotor roll to the right aggressively & had to abort the flight with a bit of a hard impact on the ground. Few of the lines got tangled around the motor, but it took just 2 minute to get everything set up correctly again! (I guess being a paraglider pilot helps )
For the second flight, leo actually followed me using his FPV drone, check out the footage!
flight log: https://logs.px4.io/plot_app?log=2e7e5f10-31c1-469a-9683-02859c8c112b
And this flight ended up a bit aggressively, as the paramotor went into a semi-spiral (high-speed descent maneuver), and I managed to pull a low-save, but the pendulum in pitch axis forced glider to touchdown on the ground.
In this flight, I especially experimented a bit on pitch control, which essentially confirmed my theory that only a brake input of +0.3 or more actually affects vehicle motion, as below that input brake strings don’t deform the canopy enough.
So essentially, with ‘pitch up’ (brake controls up), it is impossible to steer, even with full roll control input, as that would only produce neutral position in servo (0.0), which doesn’t affect the canopy.
Learnings from the flight ![:open_book: :open_book:](https://discuss.px4.io/images/emoji/apple/open_book.png?v=12)
Practical learnings:
- It is really fun to fly paramotor, since it’s quite different from a flying wing / multicopter
- There’s a LOT of oscillations in the system with low center of gravity (by GoPro, I presume)
- Mounting a GPS is totally doable with some hot glue on top!
- ESC is definitely weird, as it’s sometimes completely ignoring the signals
- Paramotors are quite efficient, as I can fly for 20 minutes-ish, with a small 1800mAh 3S battery (total vehicle mass is around 1.5kg?)
Learnings from flight log analysis:
- There’s a big roll/yaw oscillation (
vehicle_angular_velocity.xyz[0 and 2]
) - ‘Course’ (direction of travel over ground: GPS) graph is smoother than ‘Heading’ (
vehicle_local_position/heading
) curve (maybe natural, as heading induces course change)
The log clearly showed that it won’t be feasible to control in current configuration the heading of the system, as it is too unstable (refer to vehicle_local_position/heading
), and that oscillation will induce control inputs, which will have a delay of ~1 seconds due to the slack in the brake line (refer to mention on servo only having effective range at +0.3 … +1.0), which could lead to system instability due to delayed input.
The vehicle’s airspeed is estimated to be around ~5.5 m/s, as the vehicle_local_position/v[y:x]
scatter plot (lower right) shows a rough circle (representing airspeed in different heading conditions) with a radius of 5.5 m/s. And the wind is estimated to be around ~1 m/s, as the circle’s origin is shifted in downward direction by 1.0 m/s!
Even under no bake input condition (shown above, actuator_servos/control[0, 1]
is 0.0) the harness pod was oscillating a lot (note vehicle_angular_velocity/xyz[0, 2]
). This shows that the system is mechanically not damped enough (or has center of gravity issues) that induces perpetual oscillation.
Other learnings
It is quite fun to utilize the ‘3D View’ feature of the Flight Review web tool to compare with the onboard footage, as it just adds a new dimension to the flight log (this now reminds me of my unfinished Youtube & ULog synchronous viewer project haha).
TODOs
Now that the learnings are clear, here are some of the todos:
- Remove GoPro and check if oscillation in Roll/Yaw is reduced (with no brake input, does the system converge to a stable straight flight?)
- Try out the attitude/rate controller of the FixedWing module by testing
stabilized
mode. Check if the heading / roll is indeed stabilized & setpoints for roll gets followed. - Try out altitude flight mode, check if TECS can handle Throttle properly to maintain altitude
- Try out position mode, and check loitering capability
Thoughts on control strategy (rate vs attitude)
I suspect that since Parafoil system behaves based on drag-induced yawing mechanism, rather than yawing based on direct roll axis wise torque generation (like most flying wings), the roll angle based control wouldn’t work so effectively, but I may be wrong!
What I originally thought would work is taking the output of NPFG and generate the ‘heading’ setpoint, based on wind-triangle calculation (not sure if it works without airspeed measurement), which could then get fed into the attitude controller (and bypass rate control), to keep track of the heading.
Other
I would like to thank Leo, who provided motivation & had good time together the whole day, and being an awesome friend!