Source code for autompc.utils.simulation
# Standard library library
import sys
# Internal library includes
from .. import zeros, extend
# External library includes
import numpy as np
from tqdm import tqdm
[docs]def simulate(controller, init_obs, term_cond=None, dynamics=None, sim_model=None, max_steps=10000, silent=False):
"""
Simulate a controller with respect to a dynamics function or simulation model.
Parameters
----------
controller : Controller
Controller to simulate
init_obs : numpy array of size controller.system.obs_dim
Initial observation
term_cond : Function Trajectory -> bool
Function which returns true when termination condition is met.
dynamics : Function obs, control -> newobs
Function defining system dynamics
sim_model : Model
Simulation model. Used when dynamics is None
max_steps : int
Maximum number of simulation steps allowed. Default is 10000.
silent : bool
Suppress output if True.
"""
if dynamics is None and sim_model is None:
raise ValueError("Must specify dynamics function or simulation model")
sim_traj = zeros(controller.system, 1)
x = np.copy(init_obs)
sim_traj[0].obs[:] = x
constate = controller.traj_to_state(sim_traj)
if dynamics is None:
simstate = sim_model.traj_to_state(sim_traj)
if silent:
itr = range(max_steps)
else:
itr = tqdm(range(max_steps), file=sys.stdout)
for _ in itr:
u, constate = controller.run(constate, sim_traj[-1].obs)
if dynamics is None:
simstate = sim_model.pred(simstate, u)
x = simstate[:controller.system.obs_dim]
else:
x = dynamics(x, u)
sim_traj[-1].ctrl[:] = u
sim_traj = extend(sim_traj, [x],
np.zeros((1, controller.system.ctrl_dim)))
if term_cond is not None and term_cond(sim_traj):
break
return sim_traj