I am currently an engineering student and a member of the aerospace club of my engineering school (ESILV) which is called LéoFly. We’re a team of 12 students and are building a Fusex (Experimental Rocket) for the launch campaign of the CNES in partnership with Planète Sciences association. The goal of our experiment is to counter the “natural” roll of the rocket after the boost-phase. I am the one who must program the algorithm that counters the roll using a gyroscope and four solenoid valves (2 for the clockwise direction and 2 others for the counter-clockwise direction). I decided to use Simulink to develop the closed loop control using the following image, equations and data.
The image is the cross-section of the rocket with the four fins. This is an example of a “natural” roll in the counter-clockwise direction, so the program gives the order to the two solenoid valves of the clockwise direction to eject gases and cancel the roll of the rocket.
Here are the equations we have started with:
$$\begin{align} \sum C = J \dot\omega &= J \ddot\theta \\ 2F_a R_1 + 4F_b R_2 &= J\ddot\theta \\ \dfrac{1}{J}(2F_a R_1 + 4F_b R_2) &= \ddot\theta \\ \omega(t) = \ddot\theta(t)t + \omega_0 &= \int \ddot\theta(t)\text{d}t \end{align}$$
The $C$’s are the torques considered in the experimentation (Thrust torque and Roll torque), $J$ is the inertia, $\theta$ is the angle and $\theta$ equals the derivative of $\omega$ in the time domain. After that, $F_a$ is the force of thrust, $F_b$ is the force of roll, $R_1$ and $R_2$ are two different radii of the rocket.
Here are the data, taken from our experiments and our rocket.
Then, in Simulink, I’ve crafted the closed loop thanks to the schematic representation, the equations and the data. We don’t want roll, so the input is 0 (in radians per second) and the output is the roll of the rocket (in radians per second). This is a closed loop because of the gyroscope, and the dynamic subsystem is composed of the thrust torque and the roll torque which is the disturbance in this problem.
Thêta-lim is the saturation block that represents the max roll that the rocket can have physically. The White-Noise block is here to add randomness in the representation of the roll torque. The roll torque can be clockwise or counter-clockwise and is never always at the maximum of him (here the Roll Torque block is approximately 10 N.m so the disturbance which is added to the thrust torque is between 10 N.m and -10 N.m). Thrust Torque is approximately equal to 0.29 N.m and the inverse of Inertia is equals to 90 m2.kg-1. The switch subsystem is here just to permit a better implementation in the Arduino to pin the solenoid valves in the program (which will be generated from Simulink). The PID has the next values: $P = 114$ and $I = 28$. I didn’t use the auto-tuner because it gives the values for a step of 1 while we don’t want a step of 1 but an input of 0. Thus, here is what the scope gives me.
It is what we wanted for our roll control system: counter the “natural roll” and converge to an angular velocity of 0 radians per second. Of course, it is a student Fusex so we don’t want to have a perfect curve that converges to 0, we don’t have the time and the money to do that!
But the problem is at $t = 0^+$: I put in Simulink (in the integrator block) a “natural” roll (angular velocity) of 2 radians per second. How is it possible to go from 19 rpm to approximately 0 rpm in 0 seconds? It does not seem physically possible, and we don’t know if it is a problem due to Simulink or if it is a problem in our blocks, if our closed-loop is poorly conceived or if the starting equations are not good. One of our professors told us that it can certainly be the problem of Simulink (because of the side effects apparently).
Thus, what are your impressions about this and what do you recommend me to resolve this (these) problem(s)?