示例#1
0
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.;
#

import os, sys, json
sys.path.insert(0, '../common')

from acados_template import AcadosSim, AcadosSimSolver, acados_dae_model_json_dump
from pendulum_model import export_pendulum_ode_model
from utils import plot_pendulum
import numpy as np
import matplotlib.pyplot as plt

sim = AcadosSim()

# export model 
model = export_pendulum_ode_model()

# set model_name 
sim.model = model

Tf = 0.1
nx = model.x.size()[0]
nu = model.u.size()[0]
N = 200

# set simulation time
sim.solver_options.T = Tf
# set options
示例#2
0
#################################
### MHE
#################################
Nmhe = 50
Qe = nmp.diag((2, 2))
Re = nmp.array(0.0001)
# Q0e = 10* nmp.eye(nx+2)
#x = q1 q2 dq1 dq2 b1 b2
Q0e = nmp.diag((1e0, 1e0, 2e0, 2e0, 1e3, 1e4))
acados_mhe_solver = export_pend_mhe_solver(model, Nmhe, dt, Qe, Q0e, Re)

#################################
### Dynamics Simulation
#################################
sim = AcadosSim()
sim.model = model
# set simulation time
sim.solver_options.T = dt
# set options
sim.solver_options.num_stages = 4
sim.solver_options.num_steps = 6

acados_integrator = AcadosSimSolver(sim)
acados_integrator.set("p", p)

Tsim = 40
Nsim = int(Tsim / dt)

simX = nmp.zeros((Nsim + 1, nx + 2))
simXref = nmp.zeros((Nsim + 1, 2))
示例#3
0
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.;
#

from acados_template import AcadosSim, AcadosSimSolver
from export_sine_wave_mhe_ode_model import export_sine_wave_mhe_ode_model
from export_sine_wave_mhe_solver import export_sine_wave_mhe_solver
from utils import *
from casadi import *
import numpy as nmp
import csv
import matplotlib.pyplot as plt

sinFunction = lambda x, tVec : x[0] + x[1]*sin(2*pi*x[2]*tVec + x[3]) + x[4]*tVec
sim = AcadosSim()
# export model
model = export_sine_wave_mhe_ode_model()

dt = 0.01
Tf = 2.0
N = int(Tf/dt)
sim.model = model
t = 0

sim.parameter_values = np.array([t])
# set simulation time
sim.solver_options.T = dt
# set options
sim.solver_options.integrator_type = 'ERK'
sim.solver_options.num_stages = 4
示例#4
0
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.;
#

from acados_template import AcadosSim, AcadosSimSolver
from export_so_ode_model_continous_and_discrete import export_so_ode_ct, export_so_ode_dt_rk4
from utils import *
from casadi import *
import numpy as nmp
import matplotlib.pyplot as plt

dt = 0.05
Tf = 10.0
N = int(Tf / dt)

sim_ct = AcadosSim()
sim_dt = AcadosSim()
# export model
model_ct = export_so_ode_ct()
zeta = 0.5  #Under Damped
ts = 0.125  #Time Constant
Kp = 1.0  #Steady State Gain

inputDelay = 0.553
model_dt = export_so_ode_dt_rk4(dt, inputDelay)

sim_ct.model = model_ct
sim_dt.model = model_dt

sim_ct.parameter_values = np.array([zeta, ts, Kp])
sim_dt.parameter_values = np.array(
示例#5
0
def main(use_cython=True):
    # (very) simple crane model
    beta = 0.001
    k = 0.9
    a_max = 10
    dt_max = 2.0

    # states
    p1 = SX.sym('p1')
    v1 = SX.sym('v1')
    p2 = SX.sym('p2')
    v2 = SX.sym('v2')

    x = vertcat(p1, v1, p2, v2)

    # controls
    a = SX.sym('a')
    dt = SX.sym('dt')

    u = vertcat(a, dt)

    f_expl = dt * vertcat(v1, a, v2, -beta * v2 - k * (p2 - p1))

    model = AcadosModel()

    model.f_expl_expr = f_expl
    model.x = x
    model.u = u
    model.name = 'crane_time_opt'

    # create ocp object to formulate the OCP

    x0 = np.array([2.0, 0.0, 2.0, 0.0])
    xf = np.array([0.0, 0.0, 0.0, 0.0])

    ocp = AcadosOcp()
    ocp.model = model

    # N - maximum number of bangs
    N = 7
    Tf = N
    nx = model.x.size()[0]
    nu = model.u.size()[0]

    # set dimensions
    ocp.dims.N = N

    # set cost
    ocp.cost.cost_type = 'EXTERNAL'
    ocp.cost.cost_type_e = 'EXTERNAL'

    ocp.model.cost_expr_ext_cost = dt
    ocp.model.cost_expr_ext_cost_e = 0

    ocp.constraints.lbu = np.array([-a_max, 0.0])
    ocp.constraints.ubu = np.array([+a_max, dt_max])
    ocp.constraints.idxbu = np.array([0, 1])

    ocp.constraints.x0 = x0
    ocp.constraints.lbx_e = xf
    ocp.constraints.ubx_e = xf
    ocp.constraints.idxbx_e = np.array([0, 1, 2, 3])

    # set prediction horizon
    ocp.solver_options.tf = Tf

    # set options
    ocp.solver_options.qp_solver = 'FULL_CONDENSING_QPOASES'  #'PARTIAL_CONDENSING_HPIPM' # FULL_CONDENSING_QPOASES
    ocp.solver_options.integrator_type = 'ERK'
    ocp.solver_options.print_level = 3
    ocp.solver_options.nlp_solver_type = 'SQP'  # SQP_RTI, SQP
    ocp.solver_options.globalization = 'MERIT_BACKTRACKING'
    ocp.solver_options.nlp_solver_max_iter = 5000
    ocp.solver_options.nlp_solver_tol_stat = 1e-6
    ocp.solver_options.levenberg_marquardt = 0.1
    ocp.solver_options.sim_method_num_steps = 15
    ocp.solver_options.qp_solver_iter_max = 100
    ocp.code_export_directory = 'c_generated_code'
    ocp.solver_options.hessian_approx = 'EXACT'
    ocp.solver_options.exact_hess_constr = 0
    ocp.solver_options.exact_hess_dyn = 0

    if use_cython:
        AcadosOcpSolver.generate(ocp, json_file='acados_ocp.json')
        AcadosOcpSolver.build(ocp.code_export_directory, with_cython=True)
        ocp_solver = AcadosOcpSolver.create_cython_solver('acados_ocp.json')
    else:  # ctypes
        ## Note: skip generate and build assuming this is done before (in cython run)
        ocp_solver = AcadosOcpSolver(ocp,
                                     json_file='acados_ocp.json',
                                     build=False,
                                     generate=False)

    ocp_solver.reset()

    for i, tau in enumerate(np.linspace(0, 1, N)):
        ocp_solver.set(i, 'x', (1 - tau) * x0 + tau * xf)
        ocp_solver.set(i, 'u', np.array([0.1, 0.5]))

    simX = np.zeros((N + 1, nx))
    simU = np.zeros((N, nu))

    status = ocp_solver.solve()

    if status != 0:
        ocp_solver.print_statistics()
        raise Exception(f'acados returned status {status}.')

    # get solution
    for i in range(N):
        simX[i, :] = ocp_solver.get(i, "x")
        simU[i, :] = ocp_solver.get(i, "u")
    simX[N, :] = ocp_solver.get(N, "x")

    dts = simU[:, 1]

    print(
        "acados solved OCP successfully, creating integrator to simulate the solution"
    )

    # simulate on finer grid
    sim = AcadosSim()

    # set model
    sim.model = model

    # set options
    sim.solver_options.integrator_type = 'ERK'
    sim.solver_options.num_stages = 4
    sim.solver_options.num_steps = 3
    sim.solver_options.T = 1.0  # dummy value

    dt_approx = 0.0005

    dts_fine = np.zeros((N, ))
    Ns_fine = np.zeros((N, ), dtype='int16')

    # compute number of simulation steps for bang interval + dt_fine
    for i in range(N):
        N_approx = max(int(dts[i] / dt_approx), 1)
        dts_fine[i] = dts[i] / N_approx
        Ns_fine[i] = int(round(dts[i] / dts_fine[i]))

    N_fine = int(np.sum(Ns_fine))

    simU_fine = np.zeros((N_fine, nu))
    ts_fine = np.zeros((N_fine + 1, ))
    simX_fine = np.zeros((N_fine + 1, nx))
    simX_fine[0, :] = x0

    acados_integrator = AcadosSimSolver(sim)

    k = 0
    for i in range(N):
        u = simU[i, 0]
        acados_integrator.set("u", np.hstack((u, np.ones(1, ))))

        # set simulation time
        acados_integrator.set("T", dts_fine[i])

        for j in range(Ns_fine[i]):
            acados_integrator.set("x", simX_fine[k, :])
            status = acados_integrator.solve()
            if status != 0:
                raise Exception(f'acados returned status {status}.')

            simX_fine[k + 1, :] = acados_integrator.get("x")
            simU_fine[k, :] = u
            ts_fine[k + 1] = ts_fine[k] + dts_fine[i]

            k += 1

    # visualize
    if os.environ.get('ACADOS_ON_TRAVIS'):
        plt.figure()

        state_labels = ['p1', 'v1', 'p2', 'v2']

        for i, l in enumerate(state_labels):
            plt.subplot(5, 1, i + 1)

            plt.plot(ts_fine, simX_fine[:, i], label='time optimal solution')
            plt.grid(True)
            plt.ylabel(l)
            if i == 0:
                plt.legend(loc=1)

        plt.subplot(5, 1, 5)
        plt.step(ts_fine,
                 np.hstack((simU_fine[:, 0], simU_fine[-1, 0])),
                 '-',
                 where='post')
        plt.grid(True)
        plt.ylabel('a')
        plt.xlabel('t')

        plt.show()
#################################
### MHE
#################################
Nmhe = 50
Qe = nmp.diag((1, 1))
Re = nmp.array(0.0001)
# Q0e = 10* nmp.eye(nx+2)
#x = q1 q2 dq1 dq2 b1 b2
Q0e = nmp.diag((1e0, 1e0, 2e0, 2e0, 1e3, 1e4))
acados_mhe_solver = export_pend_mhe_solver(mhe_model, Nmhe, dt, Qe, Q0e, Re)

#################################
### Dynamics Simulation
#################################
sim = AcadosSim()
sim.model = sim_model
sim.parameter_values = nmp.array([m1, m2, l1, l2, lc1, lc2, g])
# set simulation time
sim.solver_options.T = dt
# set options
sim.solver_options.num_stages = 4
sim.solver_options.num_steps = 6

acados_integrator = AcadosSimSolver(sim)

Tsim = 10
Nsim = int(Tsim / dt)

simX = nmp.zeros((Nsim + 1, nx + 2))
simXref = nmp.zeros((Nsim + 1, 2))
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.;
#

from acados_template import AcadosSim, AcadosSimSolver
from export_quad_ode_model import export_quad_ode_model
from utils import *
import numpy as np
import matplotlib.pyplot as plt

sim = AcadosSim()

# export model
model = export_quad_ode_model()

#Parameters
rho = 1.225
A = 0.1
Cl = 0.125
Cd = 0.075
m = 10.0
g = 9.81
J3 = 0.25
J2 = J3 * 4
J1 = J3 * 4
p = np.array([rho, A, Cl, Cd, m, g, J1, J2, J3])