NJointTaskSpaceImpedanceDMPController.h
Go to the documentation of this file.
1#pragma once
2// DMP
3#include <dmp/representation/dmp/umidmp.h>
4
5// armarx
8
9// control
10#include <armarx/control/deprecated_njoint_mp_controller/task_space/TaskSpaceImpedanceDMPControllerInterface.h>
11
12namespace armarx
13{
14 class SensorValue1DoFActuatorTorque;
15 class SensorValue1DoFActuatorVelocity;
16 class SensorValue1DoFActuatorPosition;
17 class ControlTarget1DoFActuatorTorque;
19} // namespace armarx
20
21namespace armarx
22{
24
25 class ControlTarget1DoFActuatorTorque;
26
28 {
30
31 using TaskSpaceDMPControllerPtr = std::shared_ptr<TaskSpaceDMPController>;
32 } // namespace control::deprecated_njoint_mp_controller::tsvmp
33} // namespace armarx
34
36{
38
41
43 {
44 public:
45 Eigen::VectorXf targetVel;
46 Eigen::Matrix4f targetPose;
48 double canVal;
49 double mpcFactor;
50 };
51
52 /**
53 * @brief The NJointTaskSpaceImpedanceDMPController class
54 * @ingroup Library-RobotUnit-NJointControllers
55 */
57 public NJointControllerWithTripleBuffer<NJointTaskSpaceImpedanceDMPControllerControlData>,
59 {
60 public:
61 using ConfigPtrT = NJointTaskSpaceImpedanceDMPControllerConfigPtr;
63 const NJointControllerConfigPtr& config,
65
66 // NJointControllerInterface interface
67 std::string getClassName(const Ice::Current&) const override;
68
69 // NJointController interface
70
71 void rtRun(const IceUtil::Time& sensorValuesTimestamp,
72 const IceUtil::Time& timeSinceLastIteration) override;
73
74 // NJointTaskSpaceImpedanceDMPControllerInterface interface
75 void learnDMPFromFiles(const Ice::StringSeq& fileNames, const Ice::Current&) override;
76
77 bool
78 isFinished(const Ice::Current&) override
79 {
80 return finished;
81 }
82
83 bool
84 isDMPRunning(const Ice::Current&) override
85 {
86 return started;
87 }
88
89 void
90 setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&) override;
91 void setGoals(const Ice::DoubleSeq& goals, const Ice::Current&) override;
92
93 void learnJointDMPFromFiles(const std::string& fileName,
94 const Ice::FloatSeq& currentJVS,
95 const Ice::Current&) override;
96 void runDMP(const Ice::DoubleSeq& goals,
97 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
98 void runDMPWithTime(const Ice::DoubleSeq& goals,
99 Ice::Double timeDuration,
100 const Ice::Current&) override;
101
102 Ice::Double getVirtualTime(const Ice::Current&) override;
103
104 void stopDMP(const Ice::Current&) override;
105 void resumeDMP(const Ice::Current&) override;
106 void resetDMP(const Ice::Current&) override;
107
108 void setMPWeights(const DoubleSeqSeq& weights, const Ice::Current&) override;
109 DoubleSeqSeq getMPWeights(const Ice::Current&) override;
110
111 void removeAllViaPoints(const Ice::Current&) override;
112
113 void setLinearVelocityKd(const Eigen::Vector3f& kd, const Ice::Current&) override;
114 void setLinearVelocityKp(const Eigen::Vector3f& kp, const Ice::Current&) override;
115 void setAngularVelocityKd(const Eigen::Vector3f& kd, const Ice::Current&) override;
116 void setAngularVelocityKp(const Eigen::Vector3f& kp, const Ice::Current&) override;
117 void setNullspaceVelocityKd(const Eigen::VectorXf& kd, const Ice::Current&) override;
118 void setNullspaceVelocityKp(const Eigen::VectorXf& kp, const Ice::Current&) override;
119 void setUseNullSpaceJointDMP(bool enable, const Ice::Current&) override;
120 void setDefaultNullSpaceJointValues(const Eigen::VectorXf& jointValues,
121 const Ice::Current&) override;
122
123 void
124 enableForceStop(const Ice::Current&) override
125 {
126 useForceStop = true;
127 }
128
129 void
130 disableForceStop(const Ice::Current&) override
131 {
132 useForceStop = false;
133 }
134
135 void
136 setForceThreshold(const Eigen::Vector3f& f, const Ice::Current& current) override
137 {
138 forceThreshold.getWriteBuffer() = f;
139 forceThreshold.commitWrite();
140 }
141
142 protected:
143 virtual void onPublish(const SensorAndControl&,
145 const DebugObserverInterfacePrx&) override;
146
147 void onInitNJointController() override;
148 void onDisconnectNJointController() override;
149 void controllerRun();
150
151 private:
152 struct DebugBufferData
153 {
154 double currentCanVal;
155 double mpcfactor;
156 float targetPose_x;
157 float targetPose_y;
158 float targetPose_z;
159 float targetPose_qw;
160 float targetPose_qx;
161 float targetPose_qy;
162 float targetPose_qz;
163
164 float currentPose_x;
165 float currentPose_y;
166 float currentPose_z;
167 float currentPose_qw;
168 float currentPose_qx;
169 float currentPose_qy;
170 float currentPose_qz;
171
172 float currentKpos_x;
173 float currentKpos_y;
174 float currentKpos_z;
175 float currentKori_x;
176 float currentKori_y;
177 float currentKori_z;
178 float currentKnull_x;
179 float currentKnull_y;
180 float currentKnull_z;
181
182 float currentDpos_x;
183 float currentDpos_y;
184 float currentDpos_z;
185 float currentDori_x;
186 float currentDori_y;
187 float currentDori_z;
188 float currentDnull_x;
189 float currentDnull_y;
190 float currentDnull_z;
191
192 StringFloatDictionary desired_torques;
193 StringFloatDictionary desired_nullspaceJoint;
194 float forceDesired_x;
195 float forceDesired_y;
196 float forceDesired_z;
197 float forceDesired_rx;
198 float forceDesired_ry;
199 float forceDesired_rz;
200
201 float deltaT;
202 };
203
205
206 struct NJointTaskSpaceImpedanceDMPControllerSensorData
207 {
208 double currentTime;
209 double deltaT;
210 Eigen::Matrix4f currentPose;
211 Eigen::VectorXf currentTwist;
212 };
213
215 controllerSensorData;
216
217 struct NJointTaskSpaceImpedanceDMPControllerInterfaceData
218 {
219 Eigen::Matrix4f currentTcpPose;
220 };
221
223
224 struct CtrlParams
225 {
226 Eigen::Vector3f kpos;
227 Eigen::Vector3f dpos;
228 Eigen::Vector3f kori;
229 Eigen::Vector3f dori;
230 Eigen::VectorXf knull;
231 Eigen::VectorXf dnull;
232 };
233
234 WriteBufferedTripleBuffer<CtrlParams> ctrlParams;
235
236
237 DMP::Vec<DMP::DMPState> currentJointState;
238 DMP::UMIDMPPtr nullSpaceJointDMPPtr;
239
241
242 std::vector<const SensorValue1DoFActuatorTorque*> torqueSensors;
243 std::vector<const SensorValue1DoFActuatorVelocity*> velocitySensors;
244 std::vector<const SensorValue1DoFActuatorPosition*> positionSensors;
245 std::vector<ControlTarget1DoFActuatorTorque*> targets;
246
247 // velocity ik controller parameters
248 // dmp parameters
249 double timeDuration;
250 bool finished;
251 VirtualRobot::RobotNodeSetPtr rns;
252
253 // phaseStop parameters
254 double phaseL;
255 double phaseK;
256 double phaseDist0;
257 double phaseDist1;
258 double posToOriRatio;
259
260
261 NJointTaskSpaceImpedanceDMPControllerConfigPtr cfg;
262 VirtualRobot::DifferentialIKPtr ik;
263 VirtualRobot::RobotNodePtr tcp;
264
265 float torqueLimit;
266
267 // Eigen::Vector3f kpos;
268 // Eigen::Vector3f kori;
269 // Eigen::Vector3f dpos;
270 // Eigen::Vector3f dori;
271 // Eigen::VectorXf knull;
272 // Eigen::VectorXf dnull;
273 int numOfJoints;
274
275 std::atomic_bool useNullSpaceJointDMP;
276 bool isNullSpaceJointDMPLearned;
277
278
279 WriteBufferedTripleBuffer<Eigen::VectorXf> defaultNullSpaceJointValues;
280 std::vector<std::string> jointNames;
281 mutable MutexType controllerMutex;
283 std::atomic_bool firstRun;
284 std::atomic_bool started = false;
285 std::atomic_bool stopped = false;
286 std::atomic_bool prematurely_stopped = false;
287
288 Eigen::Matrix4f stopPose;
289
290 Eigen::Vector3f filteredForce;
291 Eigen::Vector3f forceOffset;
292 Eigen::Vector3f filteredForceInRoot;
293 WriteBufferedTripleBuffer<Eigen::Vector3f> forceThreshold;
294 std::atomic<bool> useForceStop;
295 std::atomic<float> timeForCalibration;
296 const SensorValueForceTorque* forceSensor;
297
298 Eigen::Matrix4f oldPose;
299 // NJointController interface
300 protected:
302 };
303
304} // namespace armarx::control::deprecated_njoint_mp_controller::task_space
#define TYPEDEF_PTRS_HANDLE(T)
NJointControllerWithTripleBuffer(const NJointTaskSpaceImpedanceDMPControllerControlData &initialCommands=NJointTaskSpaceImpedanceDMPControllerControlData())
IceUtil::Handle< PeriodicTask< T > > pointer_type
Shared pointer type for convenience.
Same as the TripleBuffer, but partial writes of the data structure are ok. The write operation may be...
virtual void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &) override
void runDMP(const Ice::DoubleSeq &goals, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
void learnJointDMPFromFiles(const std::string &fileName, const Ice::FloatSeq &currentJVS, const Ice::Current &) override
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration) override
TODO make protected and use attorneys.
void setViaPoints(Ice::Double u, const Ice::DoubleSeq &viapoint, const Ice::Current &) override
NJointTaskSpaceImpedanceDMPController(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
void runDMPWithTime(const Ice::DoubleSeq &goals, Ice::Double timeDuration, const Ice::Current &) override
boost::shared_ptr< class UMIDMP > UMIDMPPtr
std::shared_ptr< class Robot > RobotPtr
Definition Bus.h:19
This file offers overloads of toIce() and fromIce() functions for STL container types.
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
IceUtil::Handle< class RobotUnit > RobotUnitPtr
Definition FTSensor.h:34
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl