Hi, I have recently started using
acados through the Python interface.
I run the
minimal_example_closed_loop.py from the
In this example, the initial condition is [0, np.pi, 0, 0] (pendulum downward), and the reference is specified in the
setup function as follows
ocp = AcadosOcp() ... ocp.cost.yref = np.zeros((ny, )) # pendulum up ocp.cost.yref_e = np.zeros((ny_e, )) ...
so it is constant for the entire duration of the simulation and it enters at t=0.
I would like to specify an arbitrary reference trajectory for the state variables, for example I want a step on the angle theta at t=1 s and not at t=0s. A step reference is unfeasible by all continuous time dynamical systems, and that’s why I would like to try to impose it with an MPC which is able to “filter” the discontinuous signal and produce a state evolution compatible with the dynamics.
race_cars example I see that the reference is set at every simulation iteration for all the shooting steps using the functions
acados_solver.set(j, "yref", yref) acados_solver.set(N, "yref", yref_N)
Now, to impose the step after 1s I first define the reference as follows
# Reference definition ref_signal = np.zeros((Nsim+N_horizon, nx+nu)) # initialization ref_signal[:round(Nsim/2), 1] = np.pi
N_sim is the total number of discrete steps of the simulation and
N_horizon is the number of shooting steps (which discretizes a time interval of
Then, in the main loop of the simulation, I update
yref assigning the corresponding slice of the reference signal (note that I use the
cost_set function which should be equivalent to
for i in range(Nsim): ... # Reference assignment to the prediction horizon for kk in range(N_horizon): yref = ref_signal[i+kk,:] ocp_solver.cost_set(kk, 'yref', yref) yref_N = ref_signal[i+kk,0:nx] # consider only 4 elements (no output) ocp_solver.cost_set(N_horizon, 'yref', yref_N) ...
I think the same procedure could be repeated to track an arbitrary time-varying signal.
The problem is that after some iterations (when the step enters in the prediction horizon) I receive
Exception: acados acados_ocp_solver returned status 2
which should mean that the solver doesn’t converge.
The cost type is
NONLINEAR_LS and the cost weights are
Q_mat = 2*np.diag([1e2, 1e2, 1e-2, 1e-2]) and
R_mat = 2*np.diag([1e-2]).
Is this the correct way to define a time-varying reference trajectory?
If so, how can I solve the error?