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.