The helicopter banked at a large Angle during takeoff

The takeoff logic between manual throttle modes like stabilize and non-manual throttle modes like loiter is completely different. The landing detection does not change between the two. But we are considering that since the new method in 4.3 for takeoff is more open loop not requiring feedbacks like altitude and climb rate. It is just a straight raising of the collective. Then maybe we could just look at the collective relative to the hover collective to determine takeoff. We are still thinking this through.

Yes. Personally, I think it is a good idea to use the hover collective pitch as a reference to judge the take-off from the ground, or set the collective pitch value according to the difference of helicopters.

Thanks, though what happens after takeoff detection looks similar to me. Do you know where can I find get_alt_hold_state used in Loiter?

I would be careful about using hover collective for takeoff detection as especially for experimental and scientific helis takeoff mass can vary significantly between flights and sooner on later someone will significantly change takeoff mass causing either premature or delayed takeoff detection.

1 Like

@Leonardthall @bnsgeyer
I’m sorry, but I still can’t figure out what triggered the condition that caused controllers to think the helicopter was off the ground. The triggers I understand are as follows:

if (throttle > = 0.9 | |
(copter.pos_control-> get_z_accel_cmss() > = 0.5 * copter.pos_control-> get_max_accel_z_cmss()) ||
(copter.pos_control-> get_vel_desired_cms().z > = constrain_float(pilot_climb_rate_cm, copter.pos_control-> get_max_speed_up_cms() * 0.1, copter.pos_control-> Get_max_speed_up_cms () * 0.5) | |
(is_positive(take_off_complete_alt - take_off_start_alt) && copter.pos_control-> get_pos_target_z_cm() - take_off_start_alt > 0.5 * (take_off_complete_alt - take_off_start_alt)) {
// throttle > 90%
// acceleration > 50% maximum acceleration
// velocity > 10% maximum velocity && commanded climb rate
// velocity > 50% maximum velocity
// altitude change greater than half complete alt from start off alt


But I don’t know which one or how many triggered it? Which data should I look at in the log?

When I look at the flight log, I see that in loiter mode, after the collective pitch bar is pushed up, the integration starts as soon as the total distance starts to grow. This is the flight log

In addition, I still don’t understand why the takeoff time is named 1.5 seconds, but the actual takeoff time is 7 seconds.


Yes, I could not work it out myself. The only thing I could think of is the slow logging misses the spike that causes the event to trigger.


You can see that the last value we see the desired velocity was set to was 0.17 m/s but the measured velocity doesn’t appear to be going in that direction. This suggests we are seeing aliasing and the oscillation is actually much higher than what we see here. You are commanding a very slow climb so anything over 0.1m/s will trigger it.

(copter.pos_control-> get_vel_desired_cms().z > = constrain_float(pilot_climb_rate_cm, copter.pos_control-> get_max_speed_up_cms() * 0.1, copter.pos_control-> Get_max_speed_up_cms () * 0.5)

In particular copter.pos_control-> get_max_speed_up_cms() * 0.1

If you give it full throttle climb it will be less likely to trigger. The other thing you can do is increase your maximum climb rate.

This is because the aircraft has already taken off but is still on the ground. It then needs the I term to build up enough to lift the aircraft.

Thank you very much.

If it is due to climb velocity, it seems that the climb velocity measured before “NOT LANDED” is also quite large, even greater than the climb velocity measured at trigger time.

This is because the aircraft has already taken off but is still on the ground. It then needs the I term to build up enough to lift the aircraft.

May I ask, after the helicopter thinks it is off the ground, is the rate at which the helicopter’s collective pitch increases determined by the desired climb rate? In loiter mode, we push the lever on the remote control that controls the altitude (the lever that controls the collective pitch in stabilize mode). What amount of helicopter is controlled? Is it the expected rate of climb or the expected acceleration of climb?

Yes, but the aircraft waits for the command to lift off. It then triggers immediately due to the high levels of noise.

Up to the maximum climb rate, but then it is limited and has to wait for the I term to build up. In your case if you asked for a faster take-off the I term would build up faster.

It is the climb rate.

Ok,you are great. Thanks for your patience. Good luck!

1 Like

@bnsgeyer @Leonardthall
This problem is solved by using collective pitch to detect whether the helicopter is off the ground, which works very well. Flight control version 4.3.6.

In loiter mode, the helicopter takes off from the ground to determine the conditions are as follows.

Since my helicopter is fuel powered and has a lot of vibration, it could easily trigger acceleration and climb rate, causing the helicopter to think it is “not landed”.

My helicopter is relatively heavy, so the collective pitch from the ground is generally relatively large. In order to solve the problem of rolling caused by wrong judgment when leaving the ground. I ignore the acceleration and climb speed conditions in the ground judgment condition. Then according to the collective pitch of my helicopter off the ground, adjust the collective pitch to judge the conditions of the ground. The details are as follows:

I have used my helicopter to fly, my helicopter weighs more than 100 kg.

In response, I also modified the conditions of landing judgment in “land_detector.cpp”. I used accel_stationary and descent_rate_low to relax. At the same time, I added the collective pitch judgment condition to the landing judgment, requiring the collective pitch to be less than “H_COL_ZERO_THRST”. And I want the horizontal velocity to be less than a certain value. The landing judgment was also very accurate and useful, which solved my problem.

I’ve done a lot of flying, and it’s been very smooth. I’d like to hear your opinion. I’m not sure if this is safe or reliable.

If you think it’s feasible, I strongly encourage you to consider it in your program. Because there are a lot of fuel-powered helicopters that do vibrate a lot, but they’re very accurate with their collective pitch.

Thank you very much!

@Flying2015 could you submit a PR on GitHub?That would make it easier for us to see your changes. Or just provide a link to your branch that has these changes.

The landing detector already looks at collective and ensures it is below H_COL_LAND_MIN to detect landing. We have already tried using zero thrust and it was not always reliable. I’ve had several users have their heli’s disarm in-flight because of that. So this is not an acceptable change. The landing detector will stay the way it is.

1 Like

Ok, it’s my pleasure. I’d like to do it. But it might take a while. I’ll send a message here after I upload it.

Is it because their helicopters are too light? Or is their H_COL_LAND_MIN set too high? In fact, I set a fixed value of “0.2” here, based on my helicopter flight. When motors-> get_throttle_out()< =0.2f &&(inertial_nav.get_speed_xy_cms()< =250.0f), we think the helicopter has landed. Of course, I relaxed the requirement of acceleration and climbing speed, because the vibration of the helicopter is too high, resulting in a low reliability of acceleration and climbing speed.

You specifically said H_COL_ZERO_THRST in your post not H_COL_LAND_MIN. H_COL_LAND_MIN is the correct collective setting on which to base the landed condition for the landing detector. So we haven’t had an issue since going back to this parameter.

I am concerned that you haven’t modified the code correctly for the landing detector. Motors-> get_throttle_out() is not used by heli to determine collective for landing. In fact it is just the throttle signal for a range of 0-1. So if you set it to 0.2 then for your collective range (0.7 -5.6 deg) then it would translate to roughly 2 deg collective pitch. So you are at risk of having an in-flight motor shutdown. Unless this is what you intended.

The main parameters of my helicopter are as follows:

H_COL_ANG_MAX: 8.2 deg

Since my helicopter is relatively heavy, its hover collective pitch is usually greater than 5deg.

The condition "get_throttle_out()<=0.2f "means my collective pitch is less than 0.04deg. That’s pretty small for my helicopter.

Since I couldn’t distinguish H_COL_ZERO_THRST from H_COL_LAND_MIN in real flight, I set them both to -1deg.

These are my flight parameters, and it does fly exceptionally well. In particular, when the helicopter left the ground in loiter mode, the plane did not roll at all.

This is my flight log of repeated takeoffs and landings:
Flight log

Sorry, got you confused with another user.

So that is higher than both zero thrust and land min Params.

Not sure what you mean by this. H_COL_ZERO_THRST Is the collective that results in zero thrust and if your blades are symmetrical then it is zero.
H_COL_LAND_MIN Is used to set the collective below which the landing detector sets land complete flag. Of course this is used with other indicators like vertical speed and acceleration.

So if you wanted to change the collective it uses to determine the aircraft is landed then you don’t need to add another condition statement in the landing detector logic. Just change the H_COL_LAND_MIN parameter