126 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file ControlGraph.cpp
 | |
|  * @brief Implementation of a graph for solving robot control problems
 | |
|  * @author Alex Cunningham
 | |
|  */
 | |
| 
 | |
| #include <iostream>
 | |
| #include <boost/assign/list_inserter.hpp>
 | |
| #include <boost/tuple/tuple.hpp>
 | |
| #include "ControlGraph.h"
 | |
| #include "NonlinearEquality.h"
 | |
| #include "NonlinearFactorGraph-inl.h"
 | |
| 
 | |
| using namespace std;
 | |
| using namespace gtsam;
 | |
| using namespace boost::assign;
 | |
| 
 | |
| // trick from some reading group
 | |
| #define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL)
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void ControlGraph::print(const std::string& name) const {
 | |
| 	gtsam::NonlinearFactorGraph<ControlConfig>::print(name);
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| bool ControlGraph::equals(const ControlGraph& p, double tol) const {
 | |
| 	if (&p == NULL) return false;
 | |
| 	if (models_.size() != p.models_.size()) return false;
 | |
| 	const_model_it it1 = models_.begin(), it2 = p.models_.begin();
 | |
| 	for (; it1 != models_.end(), it2 != p.models_.end(); ++it1, ++it2) {
 | |
| 		if (it1->first != it2->first) return false;
 | |
| 		if (!it1->second.equals(it2->second)) return false;
 | |
| 	}
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void ControlGraph::addAgent(const std::string& name,
 | |
| 							  double maxVel, double maxAcc,
 | |
| 							  double maxRotVel, double maxRotAcc) {
 | |
| 	addAgent(name,
 | |
| 			 ControlGraph::DynamicsModel(maxVel, maxAcc, maxRotVel, maxRotAcc));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void ControlGraph::addAgent(const std::string& name, const ControlGraph::DynamicsModel& model) {
 | |
| 	insert(models_)(name, model);
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| ControlGraph::DynamicsModel ControlGraph::agentModel(const std::string& agent) const {
 | |
| 	const_model_it it = models_.find(agent);
 | |
| 	if (it != models_.end())
 | |
| 		return it->second;
 | |
| 	else
 | |
| 		throw invalid_argument("Attempting to access invalid agent: " + agent);
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void ControlGraph::addTrajectory(const std::string& name, size_t states) {
 | |
| 	//TODO: Implement this function
 | |
| 
 | |
| 	// for each node to add
 | |
| 
 | |
| 	// add a temporal bounding constraint (first node is before second)
 | |
| 	// add a path shortening factor (move points closer)
 | |
| 	// add maximum velocity factor
 | |
| 	// add velocity and acceleration clamping
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void ControlGraph::fixAgentState(const std::string& name,
 | |
| 		const ControlPoint& state, size_t state_num) {
 | |
| 	// add a nonlinear equality constraint
 | |
| 	typedef NonlinearEquality<ControlConfig> NLE;
 | |
| 	feasible_.addAgent(name);
 | |
| 	feasible_.addPoint(name, state, state_num);
 | |
| 	boost::shared_ptr<NLE> constraint(new NLE(ControlConfig::nameGen(name, state_num),
 | |
| 			feasible_, 7, ControlConfig::compareConfigState));
 | |
| 	push_back(constraint);
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| set<string> ControlGraph::agents() const {
 | |
| 	set<string> ret;
 | |
| 	string key; ControlGraph::DynamicsModel m;
 | |
| 	FOREACH_PAIR(key, m, models_) {
 | |
| 		insert(ret)(key);
 | |
| 	}
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| // Implementation of DynamicsModel
 | |
| /* ************************************************************************* */
 | |
| ControlGraph::DynamicsModel::DynamicsModel()
 | |
| : maxVel_(100.0), maxAcc_(100.0), maxRotVel_(100.0), maxRotAcc_(100.0)
 | |
| {
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| ControlGraph::DynamicsModel::DynamicsModel(double maxVel, double maxAcc,
 | |
| 		  double maxRotVel, double maxRotAcc)
 | |
| : maxVel_(maxVel), maxAcc_(maxAcc), maxRotVel_(maxRotVel), maxRotAcc_(maxRotAcc)
 | |
| {
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void ControlGraph::DynamicsModel::print(const std::string& name) const {
 | |
| 	cout << "Dynamics Model: " << name << "\n"
 | |
| 	     << "   maxVel: " << maxVel_ << "\n"
 | |
| 	     << "   maxAcc: " << maxAcc_ << "\n"
 | |
| 	     << "   maxRotVel: " << maxRotVel_ << "\n"
 | |
| 	     << "   maxRotAcc: " << maxRotAcc_ << endl;
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| bool ControlGraph::DynamicsModel::equals(const DynamicsModel& m, double tol) const {
 | |
| 	return maxVel_ == m.maxVel_ &&
 | |
| 		   maxAcc_ == m.maxAcc_ &&
 | |
| 		   maxRotVel_ == m.maxRotVel_ &&
 | |
| 		   maxRotAcc_ == m.maxRotAcc_;
 | |
| }
 |