gtsam/cpp/ControlGraph.h

134 lines
3.8 KiB
C++

/*
* @file ControlGraph.h
* @brief Graph for robot control problems
* @author Alex Cunningham
*/
#pragma once
#include <map>
#include <set>
#include "NonlinearFactorGraph.h"
#include "FactorGraph-inl.h"
#include "ControlConfig.h"
namespace gtsam {
/**
* This graph manages the relationships between time-dependent
* points in robot trajectories. Each of these points manages its
* own time, so there will need to be constraints to ensure that
* the trajectories remain in the correct temporal ordering.
*/
class ControlGraph : public gtsam::NonlinearFactorGraph<ControlConfig>, Testable<ControlGraph> {
public:
/**
* Subclass to handle the model for individual agents
*/
class DynamicsModel : Testable<DynamicsModel>{
private:
double maxVel_;
double maxAcc_;
double maxRotVel_;
double maxRotAcc_;
public:
/** Constructor with unbounded limits */
DynamicsModel();
/** Constructor with initialization */
DynamicsModel(double maxVel, double maxAcc,
double maxRotVel, double maxRotAcc);
virtual ~DynamicsModel() {}
/** Standard print function with optional label */
void print(const std::string& name="") const;
/** Equality up to a tolerance */
bool equals(const DynamicsModel& expected, double tol=1e-9) const;
};
public:
// data typedefs
typedef std::map<std::string, DynamicsModel>::const_iterator const_model_it;
private:
/** models for the agents */
std::map<std::string, DynamicsModel> models_;
/** feasible set for constraints */
ControlConfig feasible_;
public:
/** Default constructor and destructor */
ControlGraph() {}
virtual ~ControlGraph() {}
/** Standard print function with optional label */
void print(const std::string& name="") const;
/** Equality up to a tolerance */
bool equals(const ControlGraph& expected, double tol=1e-9) const;
/**
* Adds an agent with parameters for the robot itself
* @param name is the name of the agent
* @param maxVel is the maximum translational velocity in distance/time
* @param maxAcc is the maximum translational acceleration in velocity/time
* @param maxRotVel is the maximum rotational velocity in radians/time
* @param maxRotAcc is the maximum rotational acceleration in anglar velocity/time
*/
void addAgent(const std::string& name,
double maxVel, double maxAcc,
double maxRotVel, double maxRotAcc);
/**
* Adds an agent with particular model
* @param name is the name of the agent
* @param model defines the characteristics of the robot
*/
void addAgent(const std::string& name, const DynamicsModel& model);
/** number of agents */
size_t nrAgents() const { return models_.size(); }
/** list of agents */
std::set<std::string> agents() const;
/**
* Gets the dynamics model for an agent
*/
DynamicsModel agentModel(const std::string& agent) const;
/**
* Creates a trajectory segment for a robot and adds it to the
* end of the existing path for given robot
* @param name is the name of the agent
* @param states is the number of additional states after the initial state
*/
void addTrajectory(const std::string& name, size_t states);
/**
* Fixes a particular state in a trajectory to a given point using
* a NonlinearEquality constraint. Use this for setting start and
* end points of trajectories.
* @param name is the name of the agent
* @param state is the value to fix the state to
* @param state_num is the number of the state to fix (defaults to first state)
*/
void fixAgentState(const std::string& name, const ControlPoint& state, size_t state_num=0);
/**
* Returns the feasible set for all of the constraints currently constructed
* @return config with constrained values
* NOTE: this will pad trajectories with default states
*/
ControlConfig feasible() const { return feasible_; }
};
} // \namespace gtsam