NJointBimanualObjLevelVelController.h
Go to the documentation of this file.
1#pragma once
2
3#include <VirtualRobot/VirtualRobot.h>
4
8
10#include <armarx/control/deprecated_njoint_mp_controller/bimanual/ObjLevelControllerInterface.h>
11
12namespace armarx
13{
14 class SensorValue1DoFActuatorTorque;
15 class SensorValue1DoFActuatorVelocity;
16 class SensorValue1DoFActuatorPosition;
17 class ControlTarget1DoFActuatorVelocity;
18 class ControlTarget1DoFActuatorTorque;
20} // namespace armarx
21
23{
24 namespace tsvmp = armarx::control::deprecated_njoint_mp_controller::tsvmp;
25
28
30 {
31 public:
32 // control target from Movement Primitives
33 Eigen::Matrix4f boxPose = Eigen::Matrix4f::Identity();
34 };
35
37 public NJointControllerWithTripleBuffer<NJointBimanualObjLevelVelControlData>,
39 {
40 public:
41 // using ConfigPtrT = BimanualForceControllerConfigPtr;
43 const NJointControllerConfigPtr& config,
45
46 // NJointControllerInterface interface
47 std::string getClassName(const Ice::Current&) const;
48
49 // NJointController interface
50
51 void rtRun(const IceUtil::Time& sensorValuesTimestamp,
52 const IceUtil::Time& timeSinceLastIteration);
53
54 // NJointCCDMPControllerInterface interface
55 void learnDMPFromFiles(const Ice::StringSeq& fileNames, const Ice::Current&);
56
57 bool
58 isFinished(const Ice::Current&)
59 {
60 return finished;
61 }
62
63 Eigen::Matrix3f
64 skew(Eigen::Vector3f vec)
65 {
66 Eigen::Matrix3f mat = Eigen::MatrixXf::Zero(3, 3);
67 mat(1, 2) = -vec(0);
68 mat(0, 2) = vec(1);
69 mat(0, 1) = -vec(2);
70 mat(2, 1) = vec(0);
71 mat(2, 0) = -vec(1);
72 mat(1, 0) = vec(2);
73 return mat;
74 }
75
76 // void runDMP(const Ice::DoubleSeq& goals, Ice::Double tau, const Ice::Current&);
77 void runDMP(const Ice::DoubleSeq& goals, Ice::Double timeDuration, const Ice::Current&);
78 void runDMPWithVirtualStart(const Ice::DoubleSeq& starts,
79 const Ice::DoubleSeq& goals,
80 Ice::Double timeDuration,
81 const Ice::Current&);
82
83 void setGoals(const Ice::DoubleSeq& goals, const Ice::Current&);
84 void setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&);
85 void removeAllViaPoints(const Ice::Current&);
86
87 double
88 getVirtualTime(const Ice::Current&)
89 {
90 return virtualtimer;
91 }
92
93 void setKpImpedance(const Ice::FloatSeq& value, const Ice::Current&);
94 void setKdImpedance(const Ice::FloatSeq& value, const Ice::Current&);
95
96 std::vector<float> getCurrentObjVel(const Ice::Current&);
97
98 void setMPWeights(const DoubleSeqSeq& weights, const Ice::Current&);
99 DoubleSeqSeq getMPWeights(const Ice::Current&);
100
101 void setMPRotWeights(const DoubleSeqSeq& weights, const Ice::Current&);
102 DoubleSeqSeq getMPRotWeights(const Ice::Current&);
103 Eigen::VectorXf calcIK(VirtualRobot::DifferentialIKPtr ik,
104 const Eigen::MatrixXf& jacobi,
105 const Eigen::VectorXf& cartesianVel,
106 const Eigen::VectorXf& nullspaceVel);
107
108 protected:
109 virtual void onPublish(const SensorAndControl&,
112
115 void controllerRun();
116
117 private:
118 Eigen::VectorXf targetWrench;
119
120 struct DebugBufferData
121 {
122 StringFloatDictionary desired_vels;
123
124 float virtualPose_x;
125 float virtualPose_y;
126 float virtualPose_z;
127
128 float currentPoseLeft_x;
129 float currentPoseLeft_y;
130 float currentPoseLeft_z;
131 float leftQuat_w;
132 float leftQuat_x;
133 float leftQuat_y;
134 float leftQuat_z;
135
136 float currentPoseRight_x;
137 float currentPoseRight_y;
138 float currentPoseRight_z;
139 float rightQuat_w;
140 float rightQuat_x;
141 float rightQuat_y;
142 float rightQuat_z;
143
144
145 float dmpBoxPose_x;
146 float dmpBoxPose_y;
147 float dmpBoxPose_z;
148
149 float dmpBoxPose_qx;
150 float dmpBoxPose_qy;
151 float dmpBoxPose_qz;
152 float dmpBoxPose_qw;
153 };
154
155 TripleBuffer<DebugBufferData> debugOutputData;
156
157 struct rt2ControlData
158 {
159 double currentTime;
160 double deltaT;
161 Eigen::Matrix4f currentPose;
162 Eigen::VectorXf currentTwist;
163 };
164
165 TripleBuffer<rt2ControlData> rt2ControlBuffer;
166
167 struct ControlInterfaceData
168 {
169 Eigen::Matrix4f currentLeftPose;
170 Eigen::Matrix4f currentRightPose;
171 Eigen::Matrix4f currentObjPose;
172 Eigen::Vector3f currentObjVel;
173 };
174
175 TripleBuffer<ControlInterfaceData> controlInterfaceBuffer;
176
177 struct Inferface2rtData
178 {
179 Eigen::VectorXf KpImpedance;
180 Eigen::VectorXf KdImpedance;
181 };
182
183 TripleBuffer<Inferface2rtData> interface2rtBuffer;
184
185 std::vector<ControlTarget1DoFActuatorVelocity*> leftTargets;
186 std::vector<const SensorValue1DoFActuatorVelocity*> leftVelocitySensors;
187 std::vector<const SensorValue1DoFActuatorPosition*> leftPositionSensors;
188
189 std::vector<ControlTarget1DoFActuatorVelocity*> rightTargets;
190 std::vector<const SensorValue1DoFActuatorVelocity*> rightVelocitySensors;
191 std::vector<const SensorValue1DoFActuatorPosition*> rightPositionSensors;
192
193 NJointBimanualObjLevelVelControllerConfigPtr cfg;
194 VirtualRobot::DifferentialIKPtr leftIK;
195 VirtualRobot::DifferentialIKPtr rightIK;
196
198
199 double virtualtimer;
200
201 mutable MutexType controllerMutex;
202 mutable MutexType interfaceDataMutex;
203 Eigen::VectorXf leftDesiredJointValues;
204 Eigen::VectorXf rightDesiredJointValues;
205
206 Eigen::Matrix4f leftInitialPose;
207 Eigen::Matrix4f rightInitialPose;
208 Eigen::Matrix4f boxInitialPose;
209
210 Eigen::VectorXf KpImpedance;
211 Eigen::VectorXf KdImpedance;
212 Eigen::VectorXf KpAdmittance;
213 Eigen::VectorXf KdAdmittance;
214 Eigen::VectorXf KmAdmittance;
215 Eigen::VectorXf KmPID;
216
217 Eigen::VectorXf virtualAcc;
218 Eigen::VectorXf virtualVel;
219 Eigen::Matrix4f virtualPose;
220
221 Eigen::Matrix4f sensorFrame2TcpFrameLeft;
222 Eigen::Matrix4f sensorFrame2TcpFrameRight;
223
224 //static compensation
225 float massLeft;
226 Eigen::Vector3f CoMVecLeft;
227 Eigen::Vector3f forceOffsetLeft;
228 Eigen::Vector3f torqueOffsetLeft;
229
230 float massRight;
231 Eigen::Vector3f CoMVecRight;
232 Eigen::Vector3f forceOffsetRight;
233 Eigen::Vector3f torqueOffsetRight;
234
235 // float knull;
236 // float dnull;
237
238 std::vector<std::string> leftJointNames;
239 std::vector<std::string> rightJointNames;
240
241 // float torqueLimit;
242 VirtualRobot::RobotNodeSetPtr leftRNS;
243 VirtualRobot::RobotNodeSetPtr rightRNS;
244 VirtualRobot::RobotNodePtr tcpLeft;
245 VirtualRobot::RobotNodePtr tcpRight;
246
247 CartesianVelocityControllerPtr leftTCPController;
248 CartesianVelocityControllerPtr rightTCPController;
249
250 std::vector<PIDControllerPtr> forcePIDControllers;
251
252 // filter parameters
253 float filterCoeff;
254 Eigen::VectorXf filteredOldValue;
255 bool finished;
256 bool dmpStarted;
257 Eigen::VectorXf ftOffset;
258 Eigen::Matrix4f dmpGoal;
259
260 Eigen::Matrix3f fixedLeftRightRotOffset;
261 Eigen::Vector3f objCom2TCPLeftInObjFrame, objCom2TCPRightInObjFrame;
262
263 protected:
266 };
267
268} // namespace armarx::control::deprecated_njoint_mp_controller::bimanual
#define TYPEDEF_PTRS_HANDLE(T)
NJointControllerWithTripleBuffer(const NJointBimanualObjLevelVelControlData &initialCommands=NJointBimanualObjLevelVelControlData())
A simple triple buffer for lockfree comunication between a single writer and a single reader.
void runDMPWithVirtualStart(const Ice::DoubleSeq &starts, const Ice::DoubleSeq &goals, Ice::Double timeDuration, const Ice::Current &)
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration)
TODO make protected and use attorneys.
NJointBimanualObjLevelVelController(const RobotUnitPtr &, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
void runDMP(const Ice::DoubleSeq &goals, Ice::Double timeDuration, const Ice::Current &)
Eigen::VectorXf calcIK(VirtualRobot::DifferentialIKPtr ik, const Eigen::MatrixXf &jacobi, const Eigen::VectorXf &cartesianVel, const Eigen::VectorXf &nullspaceVel)
virtual void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &)
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::shared_ptr< CartesianVelocityController > CartesianVelocityControllerPtr
IceUtil::Handle< class RobotUnit > RobotUnitPtr
Definition FTSensor.h:34
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl