While trying to understand the code of L1 controller, I think I’ve found a mistake in AP_L1_Controller.cpp. In AP_L1_Control::update_waypoint() there are lines:

//Limit sine of Nu1 to provide a controlled track capture angle of 45 deg
sine_Nu1 = constrain_float(sine_Nu1, -0.7854f, 0.7854f);

Instead of limitting to +/-0.7071f = +/- sin(45 deg) it limits to +/-0.7854f = +/- pi/4

Is there any documentation on L1 navigation? I’d like to know why L1_dist is calculated as 1/pi * _L1_damping * _L1_period * groundSpeed. Does anyone have any idea?

In update_waypoint() most of the time the drone is in track capture or in tracking modes. In track capture mode it aims at a point on the track that beta = 45 degrees, in tracking mode it aims at a point on the track that is L1_dist away.
However, in track capture mode if the angle between the track and the line connected the drone and the next waypoint > 45 degrees and in tracking mode if the distance to next waypoint is less than L1_dist then I think it’s more reasonable to aim directly to next waypoint

I’ve read the navigation tuning, but there is no word about the reason, only the formula of L1_dist. It’s a feeling that it is somehow misleading as L1_dist can be passed in much shorter time than L1_period.