57 return _output->getOutputDimension();
99 if (u_sequence->getTimeDimension() < 1)
105 u = u_sequence->getValuesMap(0);
115 std::vector<std::pair<double, ControlVector>> delayed_u_seq;
122 double cur_t = t.
toSec();
123 for (
int i = 0; i < delayed_u_seq.size(); ++i)
125 double cur_dt = delayed_u_seq[i].first;
182 if (x_init.rows() !=
_dynamics->getStateDimension())
211 #ifdef MESSAGE_SUPPORT 212 void SimulatedPlant::toMessage(messages::SimulatedPlant& message)
const 215 if (
_output)
_output->toMessage(*message.mutable_output_function());
226 void SimulatedPlant::fromMessage(
const corbo::messages::SimulatedPlant& message, std::stringstream* issues)
235 if (message.has_system_dynamics())
239 util::get_oneof_field_type_expand_isolated(message.system_dynamics(),
"system_dynamics", type,
false, 1);
245 dynamics->fromMessage(message.system_dynamics(), issues);
250 *issues <<
"SimulatedPlant: No system dynamics specified.\n";
256 if (message.has_output_function())
260 util::get_oneof_field_type_expand_isolated(message.output_function(),
"output_function", type,
false, 1);
265 output->fromMessage(message.output_function(), issues);
271 if (message.has_integrator())
275 util::get_oneof_field_type(message.integrator(),
"explicit_integrator", type,
false);
280 integrator->fromMessage(message.integrator(), issues);
288 int dim = message.x0_size();
289 Eigen::VectorXd x0(dim);
290 for (
int i = 0; i < dim; ++i) x0[i] = message.x0(i);
293 *issues <<
"Size of state x0 (" << dim <<
") does not comply with system dynamics dimension (" <<
_dynamics->getStateDimension()
298 *issues <<
"SimulatedPlant: dimension of x0 must be larger then zero.\n";
301 if (message.has_input_disturbance() && !message.input_disturbance().has_no_disturbance())
305 util::get_oneof_field_type(message.input_disturbance(),
"disturbance", type,
false);
310 disturbance->fromMessage(message.input_disturbance(), issues);
317 if (message.has_output_disturbance() && !message.output_disturbance().has_no_disturbance())
321 util::get_oneof_field_type(message.output_disturbance(),
"disturbance", type,
false);
326 disturbance->fromMessage(message.output_disturbance(), issues);
333 if (message.has_state_disturbance() && !message.state_disturbance().has_no_disturbance())
337 util::get_oneof_field_type(message.state_disturbance(),
"disturbance", type,
false);
342 disturbance->fromMessage(message.state_disturbance(), issues);
343 if (!disturbance->checkParameters(
_dynamics->getStateDimension(), issues))
return;
348 *issues <<
"SimulatedPlant: Cannot set state disturbance model.\n";
void setOutputDisturbance(DisturbanceInterface::Ptr disturbance)
Set plant output disturbance model.
#define PRINT_ERROR_NAMED(msg)
bool setInitialState(const StateVector &x_init)
Specify an initial state x0 [SystemDynamicsInterface::getStateDimension() x 1].
DisturbanceInterface::Ptr _state_disturbance
void appendValues(double t, const Eigen::Ref< const Eigen::VectorXd > &u)
A matrix or vector expression mapping an existing array of data.
void setIntegrator(NumericalIntegratorExplicitInterface::Ptr integrator)
Set a numerical integrator for continuous-time dynamics.
bool control(const TimeSeries::ConstPtr &u_sequence, const TimeSeries::ConstPtr &x_sequence, const Duration &dt, const Time &t, SignalTargetInterface *signal_target=nullptr, const std::string &ns="") override
Send commands to plant.
void setSystemDynamics(SystemDynamicsInterface::Ptr dynamics)
Set the system dynamics of the simulated plant.
virtual void sendMeasurement(Measurement::ConstPtr measurement)=0
Send a measurement to the target.
StateVector _current_state
SystemOutputInterface::Ptr _output
NumericalIntegratorExplicitInterface::Ptr _integrator
Interface class for signal targets.
Representation of time stamps.
std::shared_ptr< SystemOutputInterface > Ptr
StateVector _initial_state
DisturbanceInterface::Ptr _output_disturbance
virtual void registerMeasurement(const std::string &unique_name, int value_dimension, const std::vector< std::string > &value_labels={}, bool zero_order_hold=false)=0
Register a measurement type at current target.
bool output(OutputVector &output, const Time &t, SignalTargetInterface *signal_target=nullptr, const std::string &ns="") override
Retrieve current plant output (measurements)
void getAvailableSignals(SignalTargetInterface &signal_target, const std::string &ns="") const override
Retrieve available signals from the plant.
void setStateDisturbance(DisturbanceInterface::Ptr disturbance)
Set plant state disturbance model.
std::shared_ptr< DisturbanceInterface > Ptr
#define PRINT_WARNING_COND(cond, msg)
Print msg-stream only if cond == true.
Eigen::VectorXd StateVector
TimeValueBuffer _time_value_buffer
void reset()
Reset internal buffer.
static Factory & instance()
< Retrieve static instance of the factory
Eigen::VectorXd ControlVector
std::shared_ptr< NumericalIntegratorExplicitInterface > Ptr
double toSec() const
Return duration in seconds.
SystemDynamicsInterface::Ptr _dynamics
constexpr const int INHERITED
Inherit property.
int getOutputDimension() const override
Return the plant output dimension (y)
void setInputDisturbance(DisturbanceInterface::Ptr disturbance)
Set plant input disturbance model.
double toSec() const
Cast time stamp to seconds.
DisturbanceInterface::Ptr _input_disturbance
Eigen::VectorXd OutputVector
std::shared_ptr< Derived > create(const std::string &name, bool print_error=true) const
Create a shared instance of the desired object.
void getValues(double ts, double dt, std::vector< std::pair< double, Eigen::VectorXd >> &useq_out)
Compute the delayed values.
SimulatedPlant()
Default constructor.
void setOutputFunction(SystemOutputInterface::Ptr output)
Set the output function of the simulated plant.
std::shared_ptr< const TimeSeries > ConstPtr
int getInputDimension() const override
Return the plant input dimension (u)
Representation of time durations.
void setInitialValue(const Eigen::Ref< const Eigen::VectorXd > &uinit)
Specify initial value.
ControlVector _current_control
std::shared_ptr< SystemDynamicsInterface > Ptr