NJointBimanualDMPForceController.h
Go to the documentation of this file.
1
2#pragma once
3
4#include <VirtualRobot/VirtualRobot.h>
5
8
11
13#include <armarx/control/deprecated_njoint_mp_controller/adaptive/ControllerInterface.h>
14#include <armarx/control/deprecated_njoint_mp_controller/bimanual/ControllerInterface.h>
15
16namespace armarx
17{
18 class SensorValue1DoFActuatorTorque;
19 class SensorValue1DoFActuatorVelocity;
20 class SensorValue1DoFActuatorPosition;
21 class SensorValue1DoFActuatorAcceleration;
22 class ControlTarget1DoFActuatorTorque;
24} // namespace armarx
25
26namespace armarx
27{
30
31 using ViaPoint = std::pair<double, DMP::DVec>;
32 using ViaPointsSet = std::vector<ViaPoint>;
33
35 {
36 public:
37 Eigen::VectorXf leftTargetVel;
38 Eigen::VectorXf rightTargetVel;
39
40 Eigen::Matrix4f leftTargetPose;
41 Eigen::Matrix4f rightTargetPose;
42 };
43
45 public NJointControllerWithTripleBuffer<NJointBimanualCCDMPControllerControlData>,
47 {
48 public:
49 using ConfigPtrT = NJointBimanualCCDMPControllerConfigPtr;
50 NJointBimanualCCDMPController(NJointControllerDescriptionProviderInterfacePtr prov,
51 const NJointControllerConfigPtr& config,
53
54 // NJointControllerInterface interface
55 std::string getClassName(const Ice::Current&) const;
56
57 // NJointController interface
58
59 void rtRun(const IceUtil::Time& sensorValuesTimestamp,
60 const IceUtil::Time& timeSinceLastIteration);
61
62 // NJointBimanualCCDMPControllerInterface interface
63 void learnDMPFromFiles(const std::string&, const Ice::StringSeq&, const Ice::Current&);
64
65 bool
66 isFinished(const Ice::Current&)
67 {
68 return false;
69 }
70
71 void runDMP(const Ice::DoubleSeq& leftGoals,
72 const Ice::DoubleSeq& rightGoals,
73 const Ice::Current&);
74 void setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&);
75 void setGoals(const Ice::DoubleSeq& goals, const Ice::Current&);
76
77 void changeLeader(const Ice::Current&);
78
79 double
80 getVirtualTime(const Ice::Current&)
81 {
82 return virtualtimer;
83 }
84
85 std::string
86 getLeaderName(const Ice::Current&)
87 {
88 return leaderName;
89 }
90
91 protected:
92 virtual void onPublish(const SensorAndControl&,
95
96 void onInitComponent();
98 void controllerRun();
99
100 private:
101 Eigen::VectorXf getControlWrench(const Eigen::VectorXf& twist,
102 const Eigen::Matrix4f& currentPose,
103 const Eigen::Matrix4f& targetPose);
104
105 Eigen::Matrix4f getLocalPose(const Eigen::Matrix4f& newCoordinate,
106 const Eigen::Matrix4f& globalTargetPose);
107
108 Eigen::Matrix4f
109 getLocalPose(const std::vector<double>& newCoordinateVec,
110 const std::vector<double>& globalTargetPoseVec)
111 {
112 Eigen::Matrix4f newCoordinate =
113 VirtualRobot::MathTools::quat2eigen4f(newCoordinateVec.at(4),
114 newCoordinateVec.at(5),
115 newCoordinateVec.at(6),
116 newCoordinateVec.at(3));
117 newCoordinate(0, 3) = newCoordinateVec.at(0);
118 newCoordinate(1, 3) = newCoordinateVec.at(1);
119 newCoordinate(2, 3) = newCoordinateVec.at(2);
120
121 Eigen::Matrix4f globalTargetPose =
122 VirtualRobot::MathTools::quat2eigen4f(globalTargetPoseVec.at(4),
123 globalTargetPoseVec.at(5),
124 globalTargetPoseVec.at(6),
125 globalTargetPoseVec.at(3));
126 globalTargetPose(0, 3) = globalTargetPoseVec.at(0);
127 globalTargetPose(1, 3) = globalTargetPoseVec.at(1);
128 globalTargetPose(2, 3) = globalTargetPoseVec.at(2);
129
130 return getLocalPose(newCoordinate, globalTargetPose);
131 }
132
133 struct DebugBufferData
134 {
135 StringFloatDictionary desired_torques;
136 StringFloatDictionary constrained_force;
137 float leftTargetPose_x;
138 float leftTargetPose_y;
139 float leftTargetPose_z;
140 float rightTargetPose_x;
141 float rightTargetPose_y;
142 float rightTargetPose_z;
143
144 float leftCurrentPose_x;
145 float leftCurrentPose_y;
146 float leftCurrentPose_z;
147 float rightCurrentPose_x;
148 float rightCurrentPose_y;
149 float rightCurrentPose_z;
150
151 // StringFloatDictionary latestTargetVelocities;
152 // StringFloatDictionary dmpTargets;
153 // StringFloatDictionary currentPose;
154
155 // double leadermpcFactor;
156 // double leadererror;
157 // double leaderposError;
158 // double leaderoriError;
159 // double leaderCanVal;
160
161 // double followermpcFactor;
162 // double followererror;
163 // double followerposError;
164 // double followeroriError;
165 // double followerCanVal;
166 };
167
168 TripleBuffer<DebugBufferData> debugDataInfo;
169
170 struct NJointBimanualCCDMPControllerSensorData
171 {
172 double currentTime;
173 double deltaT;
174 Eigen::Matrix4f currentLeftPose;
175 Eigen::Matrix4f currentRightPose;
176 Eigen::VectorXf currentLeftTwist;
177 Eigen::VectorXf currentRightTwist;
178 };
179
180 TripleBuffer<NJointBimanualCCDMPControllerSensorData> controllerSensorData;
181
182
183 std::vector<ControlTarget1DoFActuatorTorque*> leftTargets;
184 std::vector<const SensorValue1DoFActuatorAcceleration*> leftAccelerationSensors;
185 std::vector<const SensorValue1DoFActuatorVelocity*> leftVelocitySensors;
186 std::vector<const SensorValue1DoFActuatorPosition*> leftPositionSensors;
187
188 std::vector<ControlTarget1DoFActuatorTorque*> rightTargets;
189 std::vector<const SensorValue1DoFActuatorAcceleration*> rightAccelerationSensors;
190 std::vector<const SensorValue1DoFActuatorVelocity*> rightVelocitySensors;
191 std::vector<const SensorValue1DoFActuatorPosition*> rightPositionSensors;
192
193 const SensorValueForceTorque* rightForceTorque;
194 const SensorValueForceTorque* leftForceTorque;
195
196 NJointBimanualCCDMPControllerConfigPtr cfg;
197 VirtualRobot::DifferentialIKPtr leftIK;
198 VirtualRobot::DifferentialIKPtr rightIK;
199
200 std::vector<TaskSpaceDMPControllerPtr> leftGroup;
201 std::vector<TaskSpaceDMPControllerPtr> rightGroup;
202 std::vector<TaskSpaceDMPControllerPtr> bothLeaderGroup;
203
204
205 std::string leaderName;
206
207 VirtualRobot::RobotNodePtr tcpLeft;
208 VirtualRobot::RobotNodePtr tcpRight;
209
210 double virtualtimer;
211
212 mutable MutexType controllerMutex;
214
215 Eigen::VectorXf leftDesiredJointValues;
216 Eigen::VectorXf rightDesiredJointValues;
217
218 float KoriFollower;
219 float KposFollower;
220 float DposFollower;
221 float DoriFollower;
222
223 Eigen::VectorXf forceC_des;
224 float boxWidth;
225
226 Eigen::Vector3f kpos;
227 Eigen::Vector3f kori;
228 Eigen::Vector3f dpos;
229 Eigen::Vector3f dori;
230 Eigen::VectorXf kpf;
231 Eigen::VectorXf kif;
232
233 float knull;
234 float dnull;
235
236 std::vector<std::string> leftJointNames;
237 std::vector<std::string> rightJointNames;
238
239 float torqueLimit;
240 VirtualRobot::RobotNodeSetPtr leftRNS;
241 VirtualRobot::RobotNodeSetPtr rightRNS;
242 VirtualRobot::RobotNodeSetPtr rnsLeftBody;
243 VirtualRobot::RobotNodeSetPtr rnsRightBody;
244
245 Eigen::Vector3f filtered_leftForce;
246 Eigen::Vector3f filtered_leftTorque;
247 Eigen::Vector3f filtered_rightForce;
248 Eigen::Vector3f filtered_rightTorque;
249 float filterTimeConstant;
250
251 std::vector<PIDControllerPtr> ftPIDController;
252
253 Eigen::Vector3f offset_leftForce;
254 Eigen::Vector3f offset_leftTorque;
255 Eigen::Vector3f offset_rightForce;
256 Eigen::Vector3f offset_rightTorque;
257
258 bool isForceCompensateDone;
259
260 // NJointBimanualCCDMPControllerInterface interface
261 };
262
263} // namespace armarx
#define TYPEDEF_PTRS_HANDLE(T)
NJointBimanualCCDMPControllerConfigPtr ConfigPtrT
void setGoals(const Ice::DoubleSeq &goals, const Ice::Current &)
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration)
TODO make protected and use attorneys.
std::string getClassName(const Ice::Current &) const
void runDMP(const Ice::DoubleSeq &leftGoals, const Ice::DoubleSeq &rightGoals, const Ice::Current &)
void onInitComponent()
Pure virtual hook for the subclass.
NJointBimanualCCDMPController(NJointControllerDescriptionProviderInterfacePtr prov, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
virtual void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &)
void setViaPoints(Ice::Double u, const Ice::DoubleSeq &viapoint, const Ice::Current &)
void learnDMPFromFiles(const std::string &, const Ice::StringSeq &, const Ice::Current &)
NJointControllerWithTripleBuffer(const NJointBimanualCCDMPControllerControlData &initialCommands=NJointBimanualCCDMPControllerControlData())
IceUtil::Handle< PeriodicTask< T > > pointer_type
Shared pointer type for convenience.
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
std::vector< ViaPoint > ViaPointsSet
std::pair< double, DMP::DVec > ViaPoint
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl