37 #include "tgCPGStringControl.h"
65 segmentNumber(segnum),
79 throw std::invalid_argument(
"segmentSpan parameter is negative.");
83 throw std::invalid_argument(
"theirMuscles parameter is negative.");
87 throw std::invalid_argument(
"Our Muscles parameter is negative.");
91 throw std::invalid_argument(
"Edge parameters is negative.");
95 throw std::invalid_argument(
"Segment number is negative.");
99 throw std::invalid_argument(
"control time is negative.");
103 throw std::invalid_argument(
"impedance control tension is negative.");
107 throw std::invalid_argument(
"impedance control position is negative.");
111 throw std::invalid_argument(
"impedance control velocity is negative.");
115 throw std::invalid_argument(
"Control Length is negative.");
129 edgeConfigFilename(ec),
130 nodeConfigFilename(nc),
131 edgeEvolution(args +
"_edge", edgeConfigFilename),
133 nodeEvolution(args +
"_node", nodeConfigFilename),
137 m_dataObserver(
"logs/TCData"),
141 nodeConfigData.readFile(nodeConfigFilename);
142 edgeConfigData.readFile(edgeConfigFilename);
143 nodeLearning = nodeConfigData.getintvalue(
"learning");
144 edgeLearning = edgeConfigData.getintvalue(
"learning");
162 std::vector<double> state;
166 array_2D nodeParams = scaleNodeActions(nodeAdapter.step(dt, state));
168 setupCPGs(subject, nodeParams, edgeParams);
170 initConditions = subject.getSegmentCOM(m_config.segmentNumber);
171 #if (0) // Conditional compile for data logging
172 m_dataObserver.
onSetup(subject);
175 #if (0) // Conditional Compile for debug info
176 std::cout << *m_pCPGSys << std::endl;
184 std::vector <tgLinearString*> allMuscles = subject.getAllMuscles();
186 for (std::size_t i = 0; i < allMuscles.size(); i++)
189 allMuscles[i]->attach(pStringControl);
190 m_allControllers.push_back(pStringControl);
195 for (std::size_t i = 0; i < m_allControllers.size(); i++)
197 m_allControllers[i]->assignNodeNumber(*m_pCPGSys, nodeActions);
201 for (std::size_t i = 0; i < m_allControllers.size(); i++)
204 assert(pStringInfo != NULL);
211 if (m_config.useDefault)
213 pStringInfo->setupControl(*p_ipc);
217 pStringInfo->setupControl(*p_ipc, m_config.controlLength);
226 if (m_updateTime >= m_config.controlTime)
228 std::size_t numControllers = subject.getNumberofMuslces();
230 double descendingCommand = 2.0;
231 std::vector<double> desComs (numControllers, descendingCommand);
233 m_pCPGSys->
update(desComs, m_updateTime);
234 #if (0) // Conditional compile for data logging
235 m_dataObserver.
onStep(subject, m_updateTime);
243 std::vector<double> scores;
246 std::vector<double> finalConditions = subject.getSegmentCOM(m_config.segmentNumber);
248 const double newX = finalConditions[0];
249 const double newZ = finalConditions[2];
250 const double oldX = initConditions[0];
251 const double oldZ = initConditions[2];
253 const double distanceMoved = sqrt((newX-oldX) * (newX-oldX) +
254 (newZ-oldZ) * (newZ-oldZ));
256 scores.push_back(distanceMoved);
260 double totalEnergySpent=0;
262 vector<tgLinearString* > tmpStrings = subject.getAllMuscles();
263 for(
int i=0; i<tmpStrings.size(); i++)
270 const double previousLength = stringHist.
restLengths[j-1];
271 const double currentLength = stringHist.
restLengths[j];
273 double motorSpeed = (currentLength-previousLength);
276 const double workDone = previousTension * motorSpeed;
277 totalEnergySpent += workDone;
281 scores.push_back(totalEnergySpent);
283 edgeAdapter.endEpisode(scores);
284 nodeAdapter.endEpisode(scores);
289 for(
size_t i = 0; i < m_allControllers.size(); i++)
291 delete m_allControllers[i];
293 m_allControllers.clear();
297 (vector< vector <double> > actions)
299 std::size_t numControllers = edgeConfigData.getintvalue(
"numberOfControllers");
302 assert(numControllers == actions.size());
303 assert(actions[0].size() == 2);
305 double lowerLimit = m_config.lowPhase;
306 double upperLimit = m_config.highPhase;
307 double range = upperLimit - lowerLimit;
309 array_4D actionList(boost::extents[m_config.segmentSpan]
310 [m_config.theirMuscles]
311 [m_config.ourMuscles]
324 while (i < m_config.segmentSpan)
326 while(j < m_config.theirMuscles)
328 while(k < m_config.ourMuscles)
332 std::cout <<
"ran out before table populated!"
338 if (i == 1 && j == k)
345 std::vector<double> edgeParam = actions.back();
347 actionList[i][j][k][0] = edgeParam[0];
349 actionList[i][j][k][1] = edgeParam[1] *
350 (range) + lowerLimit;
365 assert(actions.empty());
369 array_2D BaseSpineCPGControl::scaleNodeActions
370 (vector< vector <double> > actions)
372 std::size_t numControllers = nodeConfigData.getintvalue(
"numberOfControllers");
373 std::size_t numActions = nodeConfigData.getintvalue(
"numberOfActions");
375 assert( actions.size() == numControllers);
376 assert( actions[0].size() == numActions);
378 array_2D nodeActions(boost::extents[numControllers][numActions]);
380 array_2D limits(boost::extents[2][numActions]);
383 assert(numActions == 2);
386 for (
int i = 0; i !=2; i++)
389 limits[0][i] = m_config.lowAmp;
390 limits[1][i] = m_config.highAmp;
394 for( std::size_t i = 0; i < numControllers; i++)
396 for( std::size_t j = 0; j < numActions; j++)
398 nodeActions[i][j] = ( actions[i][j] *
399 (limits[1][j] - limits[0][j])) + limits[0][j];
virtual void onSetup(BaseSpineModelLearning &subject)
virtual void onStep(BaseSpineModelLearning &subject, double dt)
virtual void onTeardown(BaseSpineModelLearning &subject)
virtual void setupCPGs(BaseSpineModelLearning &subject, array_2D nodeActions, array_4D edgeActions)
std::deque< double > tensionHistory
A class to read a learning configuration from a .ini file.
Config(int ss, int tm, int om, int param, int segnum=6, double ct=0.1, double la=0, double ha=30, double lp=-1 *M_PI, double hp=M_PI, double kt=0.0, double kp=1000.0, double kv=100.0, bool def=true, double cl=10.0)
void update(std::vector< double > descCom, double dt)
Contains the definition of class AnnealEvolution. Adapting NeuroEvolution to do Simulated Annealing...
void setConnectivity(const std::vector< tgCPGStringControl * > &allStrings, array_4D edgeParams)
Contains the definition of class ImpedanceControl. $Id$.
Contains the definition of class tgLinearString.
Definition of class CPGEdge.
virtual array_4D scaleEdgeActions(std::vector< std::vector< double > > actions)
A controller for the template class BaseSpineModelLearning.
Definition of class CPGEquations.
BaseSpineCPGControl(BaseSpineCPGControl::Config config, std::string args, std::string ec="edgeConfig.ini", std::string nc="nodeConfig.ini")
virtual void onStep(tgModel &model, double dt)
Definition of class CPGNode.
void initialize(AnnealEvolution *evo, bool isLearning, configuration config)
virtual void onSetup(tgModel &model)
std::deque< double > restLengths