forked from JustinSi/ROCIN_prototype
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathControllerHelper.h
204 lines (153 loc) · 5.71 KB
/
ControllerHelper.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#ifndef OPENSIM_CONTROLLERHELPER_H_
#define OPENSIM_CONTROLLERHELPER_H_
#include <OpenSim/Simulation/Model/Model.h>
#include <OpenSim/Common/FunctionSet.h>
#include "SimTKmath.h"
#include <OpenSim/Common/Signal.h>
#include <OpenSim/Simulation/Control/Controller.h>
#include <OpenSim/Simulation/Model/ControllerSet.h>
#include <OpenSim/Simulation/Control/ControlConstant.h>
#include "SimTKsimbody.h"
#include "SimTKcommon/internal/SubsystemGuts.h"
#include "SimTKcommon/internal/SystemGuts.h"
#include <OpenSim/Simulation/Control/ControlLinear.h>
#include <OpenSim/Simulation/Control/ControlSet.h>
using SimTK::Matrix;
using SimTK::Vector;
using SimTK::Vec3;
using namespace OpenSim;
class ROCINActuatorSystemRep : public SimTK::System::Guts{
public:
ROCINActuatorSystemRep() : SimTK::System::Guts( "CMCActuatorSystem", "2.0") {}
// Required by the System::Guts interface.
ROCINActuatorSystemRep* cloneImpl() const
{ return new ROCINActuatorSystemRep(*this); }
// This system doesn't have constraints, prescribed motion, or events so
// we don't need to implement any of the related System::Guts methods.
SimTK_DOWNCAST( ROCINActuatorSystemRep, SimTK::System::Guts );
};
class ROCINActuatorSystem : public SimTK::System {
public:
explicit ROCINActuatorSystem() {
adoptSystemGuts( new ROCINActuatorSystemRep() );
SimTK::DefaultSystemSubsystem defsub(*this);
}
SimTK_PIMPL_DOWNCAST( ROCINActuatorSystem, SimTK::System );
};
class ROCINActuatorSubsystemRep : public SimTK::Subsystem::Guts {
public:
ROCINActuatorSubsystemRep( Model* model);
ROCINActuatorSubsystemRep* cloneImpl() const;
~ROCINActuatorSubsystemRep();
void setCompleteState(const SimTK::State& s);
const SimTK::State& getCompleteState() const;
int realizeSubsystemTopologyImpl(SimTK::State& s) const;
int realizeSubsystemDynamicsImpl(const SimTK::State& s) const;
void setSpeedCorrections(const double corrections[] );
void setCoordinateCorrections(const double corrections[] );
// void setDesiredCoords(const double desiredCoords[]);
// void setDesiredSpeeds(const double desiredCoords[]);
void setTransitTargetTime(double t, double interval) { _targetTime_transit = t; _interval_transit = interval; }
void setIntegTargetTime(double t) { _targetTime_integ = t; }
double getIntegTargetTime() { return _targetTime_integ; }
void assignQU(double t, SimTK::Vector& q, SimTK::Vector& u) const;
void getEstimatedUDot(double t, SimTK::Vector& uDot) const;
void assignTimeAndQU(double t, SimTK::State& s) const;
void setSpeedTrajectories(FunctionSet *aSet);
void setCoordinateTrajectories(FunctionSet *aSet);
FunctionSet* getCoordinateTrajectories() const ;
FunctionSet* getSpeedTrajectories() const ;
Model* getModel() const ;
void holdCoordinatesConstant( double t );
void releaseCoordinates();
SimTK::State _completeState;
Model* _model;
bool _holdCoordinatesConstant;
double _holdTime;
Array<double> _qCorrections;
Array<double> _uCorrections;
// Array<double> _qDesired;
// Array<double> _uDesired;
double _targetTime_integ;
double _targetTime_transit;
double _interval_transit;
mutable Array<double> _qWork;
mutable Array<double> _uWork;
FunctionSet *_qSet;
FunctionSet *_uSet;
SimTK_DOWNCAST( ROCINActuatorSubsystemRep, SimTK::Subsystem::Guts );
};
class ROCINActuatorSubsystem : public SimTK::Subsystem {
public:
explicit ROCINActuatorSubsystem( ROCINActuatorSystem& sys, Model* model);
ROCINActuatorSubsystemRep *rep;
void setCompleteState(const SimTK::State& s) {
rep->setCompleteState( s );
}
const SimTK::State& getCompleteState() const {
return( rep->getCompleteState());
}
void setSpeedTrajectories(FunctionSet* aSet) {
rep->setSpeedTrajectories(aSet);
}
void setCoordinateTrajectories(FunctionSet *aSet) {
rep->setCoordinateTrajectories( aSet );
}
FunctionSet* getSpeedTrajectories() const {
return ( rep->getSpeedTrajectories());
}
FunctionSet* getCoordinateTrajectories() const {
return( rep->getCoordinateTrajectories() );
}
void setSpeedCorrections(const double *corrections ) {
rep->setSpeedCorrections( corrections );
}
void setCoordinateCorrections(const double *corrections ) {
rep->setCoordinateCorrections( corrections );
}
// void setDesiredCoords(const double* desiredCoords){
// rep->setDesiredCoords(desiredCoords);
// }
// void setDesiredSpeeds(const double* desiredSpeeds){
// rep->setDesiredSpeeds(desiredSpeeds);
// }
void setTransitTargetTime(double t, double interval){
rep->setTransitTargetTime(t,interval);
}
void setIntegTargetTime(double t){
rep->setIntegTargetTime(t);
}
double getIntegTargetTime(){
return rep->getIntegTargetTime();
}
Model* getModel() const {
return( rep->getModel() );
}
void getEstimatedUDot(double t, SimTK::Vector& uDot) const {
rep->getEstimatedUDot(t,uDot);
}
void assignTimeAndQU(double t, SimTK::State& s) const {
rep->assignTimeAndQU(t,s);
}
void holdCoordinatesConstant(double t) {
rep->holdCoordinatesConstant(t);
}
void releaseCoordinates() {
rep->releaseCoordinates();
}
SimTK_PIMPL_DOWNCAST(ROCINActuatorSubsystem, SimTK::Subsystem);
};
class ConstantController : public Controller{
OpenSim_DECLARE_CONCRETE_OBJECT(ConstantController, Controller)
public:
ConstantController(int N);
~ConstantController() {}
//void setControls(const SimTK::Vector& controls, double t);
void setControls(const double* controls, double t);
void computeControls(const SimTK::State& s, SimTK::Vector& controls) const;
ControlSet& getControlSet() { return _controlSet; }
private:
Vector _controls;
ControlSet _controlSet;
};
#endif