I am new to acados and would like to set up MPC problems in Matlab with constraints, reference, weights, expressions etc that change over time (time dependent, time varying, dynamic).
To explore the possibilities, I first tried to add some changes to the minimal_example_ocp with the pendulum_on_cart_model that was given at github as an example to acados.
I already saw that after setting up the solver, it should be possible to change all those things for specific time steps (“stages”) with:
ocp.set('constr_lbx', lbx_i, i)
So this would change the lower bound for x to the values in lb_x_i for stage i.
And similar one could do this for other bounds, references, expressions.
In the minimal_example_ocp code, there was already this line:
ocp.set('constr_lbx', x0, 0)
This line works fine. In general, if the stage is i=0, setting the lower or upper bound for x for only this stage works (at least it is runnable like this, I did not check if it in this case has an effect).
If using another stage, e.g.
ubx_6=[0.5; inf; inf; inf]; ocp.set('constr_ubx', ubx_6, 6);
this error message appears:
Error using ocp_set ocp_set: error setting constr_ubx, wrong dimension, got 4, need 0 Error in acados_ocp/set (line 260) ocp_set(obj.cost_ext_fun_type, obj.cost_ext_fun_type_e, obj.C_ocp, obj.C_ocp_ext_fun, field, value, stage); Error in minimal_example_ocp (line 129) ocp.set('constr_ubx', x_bound_step_6, 6);
I do not understand why this happens. Just to try, I also ran:
ocp.set('constr_ubx', , ubx_6, 6);
to achieve the 0-dimension. Then the code is actually runnable, but I do not see the expected change in the result. To me it seems like nothing has changed by adding this constraint to stage 6.
Another thing I already tried was to change the reference y_ref:
ocp.set('cost_y_ref', [0;1;0;0], 10);
There, I got the error message:
Error using ocp_set ocp_set: error setting cost_y_ref, wrong dimension, got 4, need 5 Error in acados_ocp/set (line 260) ocp_set(obj.cost_ext_fun_type, obj.cost_ext_fun_type_e, obj.C_ocp, obj.C_ocp_ext_fun, field, value, stage); Error in minimal_example_ocp (line 142) ocp.set('cost_y_ref', [0;1;0;0], 10);
So also here, I just tried to satisfy the dimensions demanded by changing it to:
ocp.set('cost_y_ref', [0;1;0;0;0], 10);
In this case, it again was runnable and even gave the expected result. So this seems to work, I would just like to know why changing the dimensions was necessary and what the additional number exactly means.
The lines written above are the only thing I changed in the public available example.
I added them right after the line
ocp.set('constr_lbx', x0, 0) .
So my questions are:
- First, for this might already solve everything: Is there maybe a documentation I overlooked, which lists the things that can be adjusted for specific stages and how to do this for each of them?
- How do I achieve to change the lower and upper bound of x for a specific ctage i?
- Why does the error message with the dimensions appear?
- For the y_ref case, why is the additional value required and what does it mean?
- Or maybe is there other possibilities to achieve different constraints etc for different stages?
I hope my problem is understandable.
Thank you very much for your help!