what's wrong with this robust control scheme?

I'm learning how to control a double integrator with $H_\infty$.

my model is simply

$$\begin{gather} \dot{r} = v \\ \dot{v} = F/m \\ r(t_0) = 0\text{ m}, v(t_0) = 0\text{ m/s}, m = 1000\text{ kg} \end{gather}$$

so I want to be able to track a step command. I have noise on measurements of position, velocity and force, assumed with a noise having a std of 0.02 m, 0.01 m/s and 0.2 N.

I want to have closed-loop bandwidth equal to 0.2 Hz with a steady-state error of 0.1 m, and a sensitivity peak at $f_{p} = 1$.

The scheme I implemented is the following:

The weigthing functions are the following. Since I want to track low-frequency changing signals, I imposed $$W_{ref,r} = \frac{1}{s/\omega_{lpt} +1 }$$ with the low-pass tracking function $f_{lpt}$ equal to $2\pi f_{lpt}$, and $f_{lpt}$ equal to 0.2.

The noise weighting functions are constants corresponding to the values mentioned above, while there is no feedforward contribution, so $W_{ref_F}$ is equal to 1, and so does $W_{ctrl_inn}$ (perfect inner dynamics). If I understand the theory correctly, the functions $W_{p_r}$ and $W_u$ play a similar role as the matrices $Q$ and $R$ in LQR, except that we can shape them frequency-wise, and that we are minimizing the $\infty$ norm instead of the Euclidean one. So, as recommended by Skogestad in his wonderful book I specified $$W_{p_r} = \frac{s/M+2\pi f_{p}}{1+2\pi f_{p} A}$$ with $A = 0.1$, $f_p = 1$, and the peak for the sensitivity transfer function M equal to 2.

The transfer function for control performance is a high-pass filter needed to penalize high-frequencies such that the controller does not waste efforts in trying to control high-frequency dynamics (in my case > 10 Hz) $$W_u = \frac{3+ 2 \pi f_{hpf}/2}{1+2 \pi f_{hpf}}$$ with the high pass frequency $f_{hpf}$ equal to 10 Hz.

I get this bode plot of the inverses of $W_{p_r}$ and $W_u$, so at small frequency the sensitivity tf $S$ is small, and at large frequency $KS$ is small, that is, no big control efforts.

If I synthesize the Hinf with matlab I get a $\gamma$ equal to 10. I would expect a small value because we want to make the z output small for the expected exogenous inputs. Can someone tell me what I'm doing wrong?

P.S. I'm getting the generalized plant by using linmod on the above specified Simulink model to get A,B,C,D and I transform it into P by doing

P = ss(A,B,C,D)
P = minreal(P)


P.P.S. The step response also diverges.

Where's the rest of your block diagram?

It looks like you have a polarity problem - You give a step of +1 and your pos_meas_Hinf goes down instead of up.

Nothing you've shown in your diagram looks like a controller. You have a position reference that doesn't appear to go anywhere, except to a position error block, and you have a force reference that just feeds directly into an actuator model.

Where is your controller in that diagram?

Typically a feedback controller uses reference - feedback as the error signal to drive the controller, but it looks like you're adding your control force with the ref_F. But again, I don't see where you're actually doing any control. You make a position error signal... do you actually use it? How are you using it? How does that signal get back to... ref_F?

What is control force, if you're using ref_F to control? Why would a control force be an input to an actuator? Wouldn't the force be the output of the actuator?

In re-reading the question, it's not even clear to me what you're stepping. You have two things labeled as references in your block diagram - ref_Pos and ref_F. Your step response just has command, which is a pretty meaningless label. Are you stepping position reference or force reference?

What are the state space matrices you're using?

• Hi, You're right, I was not accurate enough. What you see on top is the plant augmented with weighting functions that is linearized and used for the Hinf synthesis. The results on the bottom (the step response) are obtained by using a plant almost identical (but without I/O weighting functions), and by closing the loop with an LTI system containing the Hinf controller. This controller uses as input what I call measured velocity and position and computes the force (here referred as control force). Inputs to ref_F is 0. the reference - feedback you mention is the first output. – venom Aug 3 '18 at 21:55
• @venom Hard to troubleshoot the controller without any data. How are you handling the reference tracking? Did you model actuator saturation? I would have guessed the gains were too high, or the system too slow to respond (windup), except the initial motion is in the wrong direction. – Chuck Aug 4 '18 at 0:35
• Lol I don't normally frequent engineering (I'm a mod over at robotics), but thought this question looked interesting so I figured I'd check it out. Skimmed the question, but it already had an answer, so I figured I'd just read through the answer. I was reading and thought, "wow, this person writes like I do, and it WAS me! Lol. Greetings from late April, 2020, the (hopefully) peak of the coronavirus pandemic. – Chuck Apr 26 '20 at 17:00