Program Listing for File agent.h¶
↰ Return to documentation for file (agents/agent.h)
#pragma once
#include <memory>
#include "lupnt/core/asset_factory.h"
#include "lupnt/core/config.h"
#include "lupnt/core/constants.h"
#include "lupnt/core/data_logger.h"
#include "lupnt/core/object.h"
#include "lupnt/dynamics/attitude_dynamics.h"
#include "lupnt/dynamics/dynamics.h"
#include "lupnt/states/state.h"
namespace lupnt {
class Simulation;
class Channel;
class Application;
class Device;
class Agent;
using DeviceFactory = AssetFactory<Device, YAML::Node&>;
using AgentFactory = AssetFactory<Agent, YAML::Node&>;
using ApplicationFactory = AssetFactory<Application, YAML::Node&>;
using DynamicsFactory = AssetFactory<Dynamics, YAML::Node&>;
using ChannelFactory = AssetFactory<Channel, YAML::Node&>;
class Agent : public Object<Agent>, public DataLogger {
protected:
// Config
std::string name_;
Simulation* sim_ = nullptr;
Config config_;
Real frequency_ = 0.0;
Real time_ = 0.0;
State state_ = State();
// Devices
std::map<std::string, Ptr<Device>> devices_;
// Application
Ptr<Application> application_;
public:
Agent() = default;
Agent(Config& agent_config);
Simulation* GetSimulation() const {
LUPNT_CHECK(sim_, "Simulation not set", "Agent");
return sim_;
}
void SetSimulation(Simulation* sim) { sim_ = sim; }
Real GetTime() const { return time_; }
void SetTime(Real t) { time_ = t; }
std::string GetName() const { return name_; }
void SetName(std::string name) { name_ = name; }
std::map<std::string, Ptr<Device>> GetDevices() const { return devices_; }
void AddDevice(Ptr<Device> device);
Ptr<Device> GetDevice(const std::string& name) const;
Ptr<Application> GetApplication() const { return application_; }
void SetApplication(Ptr<Application> app) { application_ = app; }
virtual void Setup();
virtual void Step(Real time);
State GetState() const { return State(); }
void SetState(const State& state) { state_ = state; }
virtual Cart6 GetStateAt(Real t) const = 0;
virtual void Log(Real time);
virtual void LogCesium();
};
class AgentWithDynamics : public Agent {
protected:
// Config
BodyId body_id_;
Real precompute_ = 0.0; // [s]
Real frequency_ = 0.0; // [Hz]
// State
Real time_ = 0.0; // [s]
Cart6 state_;
Attitude attitude_;
State control_;
// Dynamics
Ptr<Dynamics> dynamics_;
Ptr<AttitudeDynamics> attitude_dynamics_;
public:
AgentWithDynamics() = default;
AgentWithDynamics(Config& agent_config);
virtual void Setup() override;
virtual void Step(Real time) override;
Real GetTime() const { return time_; }
void SetTime(Real t) { time_ = t; }
Real GetFrequency() const { return frequency_; }
void SetFrequency(Real frequency) { frequency_ = frequency; }
State GetState() const { return state_; }
void SetState(const State& x) { state_ = x; }
Attitude GetAttitude() const { return attitude_; }
void SetAttitude(const Attitude& attitude) { attitude_ = attitude; }
State GetControl() const { return control_; }
void SetControl(const State& control) { control_ = control; }
Dynamics* GetDynamics() const {
LUPNT_CHECK(dynamics_, "Dynamics not set", "Agent");
return dynamics_.get();
}
void SetDynamics(Ptr<Dynamics> dyn) { dynamics_ = std::move(dyn); }
AttitudeDynamics* GetAttitudeDynamics() const {
LUPNT_CHECK(attitude_dynamics_, "Attitude dynamics not set", "Agent");
return attitude_dynamics_.get();
}
void SetAttitudeDynamics(Ptr<AttitudeDynamics> dyn) { attitude_dynamics_ = std::move(dyn); }
void SetBodyId(BodyId body_id) { body_id_ = body_id; }
BodyId GetBodyId() const { return body_id_; }
virtual void Propagate(Real t);
virtual Cart6 GetStateAt(Real t) const override;
virtual Attitude GetAttitudeAt(Real t) const;
// Log
virtual void Log(Real time) override;
virtual void LogCesium() override;
};
}; // namespace lupnt