Working with INDI
Example Airframe Section
To use INDI for your drone, you have to specify:
<module name="stabilization" type="indi"/>
<module name="stabilization" type="rate_indi"/>
if you want to fly manual rate control.
Below you can see an example of how INDI can be configured in the airframe file:
<section name="STABILIZATION_ATTITUDE_INDI" prefix="STABILIZATION_INDI_"> <!-- control effectiveness --> <define name="G1_P" value="0.0639"/> <define name="G1_Q" value="0.0361"/> <define name="G1_R" value="0.0022"/> <define name="G2_R" value="0.1450"/> <!-- reference acceleration for attitude control --> <define name="REF_ERR_P" value="600.0"/> <define name="REF_ERR_Q" value="600.0"/> <define name="REF_ERR_R" value="600.0"/> <define name="REF_RATE_P" value="28.0"/> <define name="REF_RATE_Q" value="28.0"/> <define name="REF_RATE_R" value="28.0"/> <!--Maxium yaw rate, to avoid instability--> <define name="MAX_R" value="120.0" unit="deg/s"/> <!-- second order filter parameters --> <define name="FILT_OMEGA" value="50.0"/> <define name="FILT_ZETA" value="0.55"/> <define name="FILT_OMEGA_R" value="50.0"/> <define name="FILT_ZETA_R" value="0.55"/> <!-- first order actuator dynamics --> <define name="ACT_DYN_P" value="0.1"/> <define name="ACT_DYN_Q" value="0.1"/> <define name="ACT_DYN_R" value="0.1"/> <!-- Adaptive Learning Rate --> <define name="USE_ADAPTIVE" value="FALSE"/> <define name="ADAPTIVE_MU" value="0.0001"/> </section>
The control effectiveness is what relates inputs to the actuators to angular accelerations. These values are not meant to be tuned. They can be obtained from flight logs, or by using the adaptive algorithm. Note that if you change the inertia of the drone, by adding weight, the control effectiveness is probably different than before. This is also the case when you add or remove bumpers/a flight hull.
Also note that for quadrotors, a G2 value is introduced, which is there to account for the inertia of the rotors. When the rotors have a certain RPM, they have a certain drag, which is why they provide a yawing moment. More RPM, more drag, more moment. But to change the RPM of the rotors, the motors need to apply a moment to accelerate the rotors. This moment is applied to the drone as well (action = -reaction). To obtain best performance, we have to account for this effect in the controller. That is why there is a control effectiveness value for it.
The INDI controller itself controls angular accelerations. This means that if we want to command angular rates or attitude angles, we need to come up with a angular acceleration reference (or virtual control) that will result in the desired rate/attitude. This can be done with a simple PD controller. Since the control effectiveness (which includes the inertia of the vehicle) is accounted for by INDI, the P and D gains do not depend on the size of the drone. Instead, they only depend on the actuator dynamics.
Actuators don't react instantly. Motors need time to spin up, and servos can only move so many degrees per second. This means that if the input is suddenly changed, the angular acceleration is not immediately expected to change. If there is actuator feedback available, we know exactly how much the actuator has moved and at what moment how much angular acceleration we should expect. If actuator feedback is not available, an estimate of the actuator position has to be made.
For electric motors, a first order system can be an accurate model. This can be written as: act(i+1) = act(i) + alpha*(input - act(i)), where alpha is the value that can be specified in the airframe file. There are a few vehicles for which this value has been determined, such as the ARDrone, Bebop and AscTec Hummingbird. It can be obtained with a step response of the motors, using for instance a logic analyzer and a light sensor to record the spinup profile.
Use Adaptive INDI on your own discretion
If you enable adaptive INDI, a Least Mean Squares (LMS) algorithm will estimate the control effectiveness values online. It does this by taking the current estimate of the control effectiveness multiplied with the most recent change in input. This is the expected change in angular acceleration. This is then compared to the actual angular acceleration, and the control effectiveness is changed proportional to the error. The parameter ADAPTIVE_MU is the learning rate of the algorithm. A high value will adapt quicker, but can also respond more to disturbances and noise.
Note that this assumes that all angular accelerations are caused by the inputs. This assumption usually holds indoors, but outside the wind can cause part of the angular acceleration. This can result in faulty adaptation. Also, when taking off with adaptation enabled, faulty learning can occur. This is because while on the ground, inputs will not result in angular accelerations. The algorithm may then estimate a very low control effectiveness. Lastly, if you have no actuator feedback/a bad estimate of the actuator dynamics, the learning may deteriorate.
One approach is to only use the adaptation for estimation of the control effectiveness after airframe changes. Start flying the drone, and activate the learning while flying through the INDI settings. More importantly, de-activate the learning before landing, or kill the drone before touching the ground. Again, interaction with the ground may result in faulty learning. Save the control effectiveness values.