42 #include "dev/btietz/hardwareSineWaves/tgSineStringControl.h"
46 #include <json/json.h>
59 m_dataObserver(
"logs/TCData")
68 #ifdef LOGGING // Conditional compile for data logging
69 m_dataObserver.
onSetup(subject);
80 if (m_updateTime >= m_controlTime)
83 #ifdef LOGGING // Conditional compile for data logging
84 m_dataObserver.
onStep(subject, m_updateTime);
93 for(
size_t i = 0; i < m_sineControllers.size(); i++)
95 delete m_sineControllers[i];
97 m_sineControllers.clear();
102 std::vector <tgSpringCableActuator*> allMuscles = subject.getAllMuscles();
107 double controlLength;
117 bool parsingSuccessful = reader.parse( FileHelpers::getFileString(
"controlVars.json"), root );
118 if ( !parsingSuccessful )
121 std::cout <<
"Failed to parse configuration\n"
122 << reader.getFormattedErrorMessages();
124 throw std::invalid_argument(
"Bad JSON filename");
127 m_controlTime = root.get(
"updateFrequency",
"UTF-8").asDouble();
128 double frequency = root.get(
"cpg_frequency",
"UTF-8").asDouble();
129 double bodywaves = root.get(
"body_waves",
"UTF-8").asDouble() * 2.0 * M_PI / (allMuscles.size() / 6.0);
131 for (std::size_t i = 0; i < allMuscles.size(); i++)
133 if (allMuscles[i]->hasTag(
"inner top"))
138 controlLength = allMuscles[i]->getStartLength();
140 amplitude = root.get(
"in_top_amp_a",
"UTF-8").asDouble();
142 phase = i * bodywaves + root.get(
"in_top_offset",
"UTF-8").asDouble();
146 else if (allMuscles[i]->hasTag(
"outer top"))
153 amplitude = root.get(
"out_top_amp_a",
"UTF-8").asDouble();
154 phase = i * bodywaves + root.get(
"out_top_offset",
"UTF-8").asDouble();
155 controlLength = allMuscles[i]->getStartLength();
158 else if (allMuscles[i]->hasTag(
"inner left"))
163 controlLength = allMuscles[i]->getStartLength();
165 amplitude = root.get(
"in_bottom_amp_a",
"UTF-8").asDouble();
166 phase = i * bodywaves + root.get(
"in_left_offset",
"UTF-8").asDouble();
169 else if (allMuscles[i]->hasTag(
"outer left"))
174 controlLength = allMuscles[i]->getStartLength();
176 amplitude = root.get(
"out_bottom_amp_a",
"UTF-8").asDouble();
177 phase = i * bodywaves + root.get(
"out_left_offset",
"UTF-8").asDouble();
182 else if (allMuscles[i]->hasTag(
"inner right"))
187 controlLength = allMuscles[i]->getStartLength();
189 amplitude = root.get(
"in_bottom_amp_a",
"UTF-8").asDouble();
190 phase = i * bodywaves + root.get(
"in_right_offset",
"UTF-8").asDouble();
193 else if (allMuscles[i]->hasTag(
"outer right"))
198 controlLength = allMuscles[i]->getStartLength();
200 amplitude = root.get(
"out_bottom_amp_a",
"UTF-8").asDouble();
201 phase = i * bodywaves + root.get(
"out_right_offset",
"UTF-8").asDouble();
208 throw std::runtime_error(
"Missing tags!");
226 allMuscles[i]->attach(pStringControl);
227 m_sineControllers.push_back(pStringControl);
230 assert(m_sineControllers.size() == allMuscles.size());
Contains the definition of class ImpedanceControl. $Id$.
A class to read a learning configuration from a .ini file.
Contains the definition of abstract base class tgSpringCableActuator. Assumes that the string is line...
A series of functions to assist with file input/output.
virtual void onTeardown(BaseSpineModelLearning &subject)
Contains the definition of class AnnealEvolution. Adapting NeuroEvolution to do Simulated Annealing...
Controller for TetraSpineCollisions.
virtual void onSetup(BaseSpineModelLearning &subject)
virtual void onStep(tgModel &model, double dt)
virtual void onSetup(tgModel &model)
virtual void setupWaves(BaseSpineModelLearning &subject)
virtual void onStep(BaseSpineModelLearning &subject, double dt)