38 # define M_PI 3.14159265358979323846
44 m_initialLengths(initialLength),
50 this->m_totalTime=0.0;
51 const double olecranonfascia_length = 4;
52 const double brachioradialis_length = 12;
53 const double anconeus_length = 6;
54 const double supportstring_length = 0.5;
56 const std::vector<tgBasicActuator*> olecranonfascia = subject.
find<
tgBasicActuator>(
"olecranon");
58 const std::vector<tgBasicActuator*> brachioradialis = subject.
find<
tgBasicActuator>(
"brachioradialis");
59 const std::vector<tgBasicActuator*> supportstrings = subject.
find<
tgBasicActuator>(
"support");
61 for (
size_t i=0; i<olecranonfascia.size(); i++) {
63 assert(pMuscle != NULL);
68 for (
size_t i=0; i<anconeus.size(); i++) {
70 assert(pMuscle != NULL);
74 for (
size_t i=0; i<brachioradialis.size(); i++) {
76 assert(pMuscle != NULL);
80 for (
size_t i=0; i<supportstrings.size(); i++) {
82 assert(pMuscle != NULL);
84 cout <<
"string " << i <<
"\n";
91 if (dt <= 0.0) {
throw std::invalid_argument(
"dt is not positive"); }
94 setBrachioradialisTargetLength(subject, dt);
95 setAnconeusTargetLength(subject, dt);
96 moveAllMotors(subject, dt);
100 void ScarrArmController::setBrachioradialisTargetLength(
ScarrArmModel& subject,
double dt) {
101 const double mean_brachioradialis_length = 12;
102 double newLength = 0;
103 const double amplitude = mean_brachioradialis_length/1;
104 const double angular_freq = 2;
105 const double phase = 0;
106 const double dcOffset = mean_brachioradialis_length;
107 const std::vector<tgBasicActuator*> brachioradialis = subject.
find<
tgBasicActuator>(
"brachioradialis");
109 for (
size_t i=0; i<brachioradialis.size(); i++) {
111 assert(pMuscle != NULL);
114 newLength = dcOffset - amplitude*m_totalTime/5;
115 if(newLength < dcOffset/8) {
116 newLength = dcOffset/8;
119 if(m_totalTime > 15) {
122 std::cout<<
"calculating brachioradialis target length:" << newLength <<
"\n";
123 std::cout<<
"m_totalTime: " << m_totalTime <<
"\n";
129 void ScarrArmController::setAnconeusTargetLength(
ScarrArmModel& subject,
double dt) {
130 const double mean_anconeus_length = 6;
131 double newLength = 0;
132 const double amplitude = mean_anconeus_length/1;
133 const double angular_freq = 2;
134 const double phaseleft = 0;
135 const double phaseright = phaseleft + M_PI;
136 const double dcOffset = mean_anconeus_length;
137 const std::vector<tgBasicActuator*> anconeusleft = subject.
find<
tgBasicActuator>(
"right anconeus");
138 const std::vector<tgBasicActuator*> anconeusright = subject.
find<
tgBasicActuator>(
"left anconeus");
140 for (
size_t i=0; i<anconeusleft.size(); i++) {
142 assert(pMuscle != NULL);
143 if(m_totalTime > 5) {
144 newLength = amplitude * sin(angular_freq * m_totalTime + phaseleft) + dcOffset;
146 newLength = dcOffset;
151 for (
size_t i=0; i<anconeusright.size(); i++) {
153 assert(pMuscle != NULL);
154 if(m_totalTime > 5) {
155 newLength = amplitude * sin(angular_freq * m_totalTime + phaseright) + dcOffset;
157 newLength = dcOffset;
164 void ScarrArmController::moveAllMotors(
ScarrArmModel& subject,
double dt) {
165 const std::vector<tgBasicActuator*> muscles = subject.
getAllMuscles();
166 for (
size_t i = 0; i < muscles.size(); ++i) {
168 assert(pMuscle != NULL);
175 void ScarrArmController::updateActions(
ScarrArmModel& subject,
double dt) {
191 vector< vector <double> > ScarrArmController::transformActions(vector< vector <double> > actions)
195 double range=max-min;
197 for(
unsigned i=0;i<actions.size();i++) {
198 for(
unsigned j=0;j<actions[i].size();j++) {
199 scaledAct=actions[i][j]*(range)+min;
200 actions[i][j]=scaledAct;
207 void ScarrArmController::applyActions(
ScarrArmModel& subject, vector< vector <double> > act)
210 const std::vector<tgBasicActuator*> muscles = subject.
getAllMuscles();
212 if(act.size() != muscles.size()) {
213 cout<<
"Warning: # of muscles: "<< muscles.size() <<
" != # of actions: "<< act.size()<<endl;
217 for (
size_t i = 0; i < muscles.size(); ++i) {
219 assert(pMuscle != NULL);
virtual void moveMotors(double dt)
virtual void setControlInput(double input)
virtual void onSetup(ScarrArmModel &subject)
Contains the definition of class ScarrArmController.
Contains the definition of class tgBasicActuator.
std::vector< T * > find(const tgTagSearch &tagSearch)
virtual void onStep(ScarrArmModel &subject, double dt)
Contains the definition of class ScarrArmModel. $Id$.
const std::vector< tgBasicActuator * > & getAllMuscles() const
virtual const double getCurrentLength() const
ScarrArmController(const double prefLength, double timestep)