SyncCoordination.cpp
Go to the documentation of this file.
1#include "SyncCoordination.h"
2
3#include <cmath>
4#include <cstddef>
5#include <mutex>
6
7#include <VirtualRobot/MathTools.h>
8
9#include "../utils.h"
10
12{
13
14 SyncCoordination::SyncCoordination(const ::armarx::aron::data::dto::DictPtr& dto)
15 {
16 updateConfig(dto, true);
17 }
18
19 void
20 SyncCoordination::setObjPoseFromHandPoses(Eigen::Matrix4f& objPose,
21 const Eigen::Matrix4f& poseL,
22 const Eigen::Matrix4f& poseR)
23 {
24 /// TODO replaced by update current pose
25 setPos(objPose, 0.5f * (getPos(poseL) + getPos(poseR)));
26 setOri(objPose, getOri(poseL));
27 }
28
29 void
30 SyncCoordination::Data::reset(const Eigen::Matrix4f& desiredPose,
31 Eigen::Matrix4f& leftPose,
32 Eigen::Matrix4f& rightPose,
33 PoseFrameMode leftPoseMode,
34 PoseFrameMode rightPoseMode
35 /*bool followerInLeaderLocalFrame*/)
36 {
37 /// all positions in poses are in milli-meter
38 virtualAcc.setZero();
39 virtualVel.setZero();
40
41 virtualPose = desiredPose;
42 // setObjPoseFromHandPoses(virtualPose, leftPose, rightPose);
43
44 targetPose = desiredPose;
45 currentPose = desiredPose;
46 currentVel.setZero();
47 bimanualVel.setZero(12);
48
49 currentFT.setZero();
50 bimanualFT.setZero(12);
51 // wrenchTarget.setZero(12);
54
55 rvec.setZero();
56 poseError.setZero();
57 oriError.setZero();
58 tempAcc.setZero();
59 tempVel.setZero();
60 deltaObjPose.setZero();
61
62 graspMatrix.setZero(6, 12);
63 pinvGraspMatrixT.setZero(6, 12);
64 dOriInObjL.setZero();
65 dOriInObjR.setZero();
66 dOriInTCPL.setZero();
67 dOriInTCPR.setZero();
68 obj2TcpInMeterL.setZero();
69 obj2TcpInMeterR.setZero();
70 tcp2ObjInMilliMeterL.setZero();
71 tcp2ObjInMilliMeterR.setZero();
72
73
74 // resetGraspVariable(desiredPose,
75 // leftPose,
76 // rightPose,
77 // leftPoseMode,
78 // rightPoseMode,
79 // true,
80 // true,
81 // followerInLeaderLocalFrame);
82 // ARMARX_INFO << "rt run, reset rtData" << VAROUT(desiredPose) << VAROUT(leftPose)
83 // << VAROUT(rightPose);
84 // ARMARX_INFO << VAROUT(obj2TcpInMeterL) << VAROUT(obj2TcpInMeterR);
85 }
86
87 void
88 SyncCoordination::Data::resetGraspVariableLeft(const Eigen::Matrix4f& desiredPose,
89 Eigen::Matrix4f& leftPose,
90 PoseFrameMode leftPoseMode/*,
91 bool followerInLeaderLocalFrame*/)
92 {
93 /// Left hand group is a follower
94 if (leftPoseMode == PoseFrameMode::leader)
95 {
96 /// leftPose is represented in the local frame of desiredPose of the object in right hand group
97 obj2TcpInMeterL = getPos(leftPose) * 0.001f;
98 dOriInObjL = getOri(leftPose);
99
100 tcp2ObjInMilliMeterL = -getOriT(leftPose) * getPos(leftPose);
101 dOriInTCPL = getOriT(leftPose);
102 // ARMARX_INFO << "update left in local: " << VAROUT(leftPoseMode)
103 // << VAROUT(obj2TcpInMeterL) << VAROUT(dOriInObjL);
104 }
105 else /// Left hand group is leader, or follower in sync mode
106 {
107 /// representation in object local frame (meter)
109 getOriT(desiredPose) * (getPos(leftPose) - getPos(desiredPose)) * 0.001f;
110 dOriInObjL = getOriT(desiredPose) * getOri(leftPose);
111
112 /// representation in tcp local frame (milli meter)
113 tcp2ObjInMilliMeterL = getOriT(leftPose) * (getPos(desiredPose) - getPos(leftPose));
114 dOriInTCPL = getOriT(leftPose) * getOri(desiredPose);
115 // ARMARX_INFO << "update left in root: " << VAROUT(obj2TcpInMeterL) << VAROUT(dOriInObjL);
116 }
117 }
118
119 void
120 SyncCoordination::Data::resetGraspVariableRight(const Eigen::Matrix4f& desiredPose,
121 Eigen::Matrix4f& rightPose,
122 PoseFrameMode rightPoseMode/*,
123 bool followerInLeaderLocalFrame*/)
124 {
125 /// Right hand group is a follower
126 if (rightPoseMode == PoseFrameMode::leader)
127 {
128 /// rightPose is represented in the local frame of desiredPose of the object in left hand group
129 obj2TcpInMeterR = getPos(rightPose) * 0.001f;
130 dOriInObjR = getOri(rightPose);
131
132 tcp2ObjInMilliMeterR = -getOriT(rightPose) * getPos(rightPose);
133 dOriInTCPR = getOriT(rightPose);
134 // ARMARX_INFO << "update right in local: " << VAROUT(rightPoseMode) << " "
135 // << VAROUT(rightPose) << "\n"
136 // << VAROUT(desiredPose) << VAROUT(obj2TcpInMeterR) << VAROUT(dOriInObjR);
137 }
138 else
139 {
140 /// Right hand group is a follower
141 /// representation in object local frame (meter)
143 getOriT(desiredPose) * (getPos(rightPose) - getPos(desiredPose)) * 0.001f;
144 dOriInObjR = getOriT(desiredPose) * getOri(rightPose);
145
146 /// representation in tcp local frame (milli meter)
147 tcp2ObjInMilliMeterR = getOriT(rightPose) * (getPos(desiredPose) - getPos(rightPose));
148 dOriInTCPR = getOriT(rightPose) * getOri(desiredPose);
149 // ARMARX_INFO << "update right in root: " << VAROUT(obj2TcpInMeterR)
150 // << VAROUT(dOriInObjR);
151 }
152 }
153
154
155 void
157 {
158 // Reinit all buffers
159
160 if (cfg_.flagResetRt)
161 {
162 initialized_.store(false);
163 }
164
165 if (not cfgBufferInitialized_.load())
166 {
167 bufferNonRtCfgToRt_.reinitAllBuffers(cfg_);
168 bufferUserCfgToNonRt_.reinitAllBuffers(cfg_);
169 bufferUserCfgToPublish.reinitAllBuffers(cfg_);
170 cfgBufferInitialized_.store(true);
171 }
172 else
173 {
174 bufferNonRtCfgToRt_.getWriteBuffer() = cfg_;
175 bufferNonRtCfgToRt_.commitWrite();
176 bufferUserCfgToNonRt_.getWriteBuffer() = cfg_;
177 bufferUserCfgToNonRt_.commitWrite();
178 bufferUserCfgToPublish.getWriteBuffer() = cfg_;
179 bufferUserCfgToPublish.commitWrite();
180 }
181 }
182
183 void
184 SyncCoordination::reset(std::map<std::string, Eigen::Matrix4f>& initPose)
185 {
186 /// Not used anymore
187 // const std::scoped_lock lock(mtx_data_non_rt);
188 // dataRt_.reset(initPose.at(cfg_.nodesetLeft), initPose.at(cfg_.nodesetRight));
189 // dataNonRt = dataRt_;
190 // bufferDataRtToNonRt_.reinitAllBuffers(dataRt_);
191 // initialized_.store(true);
192 // ARMARX_INFO << "coordinator initialized";
193 }
194
195 void
197 {
198 const std::scoped_lock lock(mtx_data_non_rt);
199 dataNonRt = bufferDataRtToNonRt_.getUpToDateReadBuffer();
200 cfgInNonRt = bufferUserCfgToNonRt_.getUpToDateReadBuffer();
201 }
202
203 void
205 {
206 bufferNonRtCfgToRt_.getWriteBuffer() = cfgInNonRt;
207 bufferNonRtCfgToRt_.commitWrite();
208 }
209
210 void
212 {
213 bufferUserCfgToNonRt_.reinitAllBuffers(cfgInNonRt);
214 }
215
216 void
218 const bool rightAsLeader,
219 const bool followerIsolation
220 /*const Eigen::Matrix4f& desiredPose,
221 Eigen::Matrix4f& leftPose,
222 Eigen::Matrix4f& rightPose,
223 PoseFrameMode leftPoseMode,
224 PoseFrameMode rightPoseMode,
225 const bool followerInLeaderLocalFrame*/)
226 {
227 graspMatrix.setZero(6, 12);
228
229 // /// Reset the grasp variables when one arm is a leader and the other a follower
230 // if (rightAsLeader)
231 // {
232 // /// always reset left grasp variable
233 // resetGraspVariableLeft(desiredPose, leftPose, leftPoseMode, followerInLeaderLocalFrame);
234 // }
235 // if (leftAsLeader)
236 // {
237 // /// reset right grasp variable
238 // resetGraspVariableRight(
239 // desiredPose, rightPose, rightPoseMode, followerInLeaderLocalFrame);
240 // }
241 // graspMatrix.block<3, 3>(0, 0) = Eigen::MatrixXf::Identity(3, 3);
242 // graspMatrix.block<3, 3>(0, 6) = Eigen::MatrixXf::Identity(3, 3);
243 if (not followerIsolation or not rightAsLeader)
244 {
245 graspMatrix.block<6, 6>(0, 0) = Eigen::MatrixXf::Identity(6, 6);
247 skew(rvec, graspMatrix.block<3, 3>(3, 0));
248 }
249 if (not followerIsolation or not leftAsLeader)
250 {
251 graspMatrix.block<6, 6>(0, 6) = Eigen::MatrixXf::Identity(6, 6);
253 skew(rvec, graspMatrix.block<3, 3>(3, 6));
254 }
255
256 float lambda = 1;
258 VirtualRobot::MathTools::getPseudoInverseDamped(graspMatrix.transpose(), lambda);
259 }
260
261 void
262 SyncCoordination::computeWrenchControl(Eigen::Vector6f& deltaPos,
263 const Eigen::Vector6f& wrenchTarget,
264 const Eigen::Vector6f& stiffness)
265 {
266 deltaPos.setZero();
267 for (size_t i = 0; i < 6; ++i)
268 {
269 if (stiffness(i) == 0)
270 {
271 deltaPos(i) = 0;
272 }
273 else
274 {
275 deltaPos(i) = wrenchTarget(i) / stiffness(i);
276 if (deltaPos(i) > 0.1f)
277 {
278 deltaPos(i) = 0.1f;
279 }
280 else if (deltaPos(i) < -0.1f)
281 {
282 deltaPos(i) = -0.1f;
283 }
284 }
285 }
286 }
287
288 void
289 SyncCoordination::updateCurrentPose(Eigen::Matrix4f& leftPose, Eigen::Matrix4f& rightPose)
290 {
291 /// when current pose is None, it will be updated based on either left or right arm poses with rigid connection assumption
292 /// if one arm is leader, current pose can be updated based on rigid transformation to leader
293 /// otherwise both arms are follower paired to leader object, pose is updated based on both arms
294
295 if (cfgInRT_.currentPose.has_value())
296 {
297 dataRt_.currentPose = cfgInRT_.currentPose.value();
298 return;
299 }
300
301 if (cfgInRT_.leadershipMode == arondto::LeadershipMode::left_as_leader)
302 {
303 setPos(dataRt_.currentPose,
304 getPos(leftPose) + getOri(leftPose) * dataRt_.tcp2ObjInMilliMeterL);
305 setOri(dataRt_.currentPose, getOri(leftPose) * dataRt_.dOriInTCPL);
306 // ARMARX_INFO << "left leader: " << VAROUT(getPos(leftPose))
307 // << VAROUT(dataRt_.tcp2ObjInMilliMeterL) << VAROUT(dataRt_.currentPose);
308 return;
309 }
310
311 if (cfgInRT_.leadershipMode == arondto::LeadershipMode::right_as_leader)
312 {
313 setPos(dataRt_.currentPose,
314 getPos(rightPose) + getOri(rightPose) * dataRt_.tcp2ObjInMilliMeterR);
315 setOri(dataRt_.currentPose, getOri(rightPose) * dataRt_.dOriInTCPR);
316 return;
317 }
318
319 /// both left and right arms are follower
320 setPos(dataRt_.currentPose,
321 0.5f * (getPos(leftPose) + getOri(leftPose) * dataRt_.tcp2ObjInMilliMeterL +
322 getPos(rightPose) + getOri(rightPose) * dataRt_.tcp2ObjInMilliMeterR));
323
324 const Eigen::Matrix3f R1 = (getOri(leftPose) * dataRt_.dOriInTCPL).topLeftCorner<3, 3>();
325 const Eigen::Matrix3f R2 = (getOri(rightPose) * dataRt_.dOriInTCPR).topLeftCorner<3, 3>();
326
327 // Convert to quaternions (no dynamic allocation here?)
328 Eigen::Quaternionf q1(R1);
329 Eigen::Quaternionf q2(R2);
330
331 // Slerp rotation (t=0.5 midpoint)
332 Eigen::Quaternionf q_avg = q1.slerp(0.5f, q2);
333 q_avg.normalize();
334
335 setOri(dataRt_.currentPose, q_avg.toRotationMatrix());
336 }
337
338 // // In-place average of two SE(3) matrices without heap allocation
339 // static void
340 // SyncCoordination::averageSE3(const Eigen::Matrix4f& pose1,
341 // const Eigen::Matrix4f& pose2,
342 // Eigen::Matrix4f& pose_avg)
343 // {
344 // // Extract rotation matrices
345 // const Eigen::Matrix3f R1 = pose1.topLeftCorner<3,3>();
346 // const Eigen::Matrix3f R2 = pose2.topLeftCorner<3,3>();
347 //
348 // // Convert to quaternions (no dynamic allocation here)
349 // Eigen::Quaternionf q1(R1);
350 // Eigen::Quaternionf q2(R2);
351 //
352 // // Slerp rotation (t=0.5 midpoint)
353 // Eigen::Quaternionf q_avg = q1.slerp(0.5f, q2);
354 // q_avg.normalize();
355 //
356 // // Average translation directly
357 // const Eigen::Vector3f pose1 = pose1.topRightCorner<3,1>();
358 // const Eigen::Vector3f pose2 = pose2.topRightCorner<3,1>();
359 // const Eigen::Vector3f t_avg = 0.5f * (pose1 + pose2);
360 //
361 // // Assemble averaged transformation (overwrite in-place)
362 // pose_avg.setIdentity();
363 // pose_avg.topLeftCorner<3,3>() = q_avg.toRotationMatrix();
364 // pose_avg.topRightCorner<3,1>() = t_avg;
365 // }
366
367
368 void
369 SyncCoordination::runRT(std::map<std::string, InputData>& input, double deltaT)
370 {
371 dataRt_.deltaT = deltaT;
372 cfgInRT_ = bufferNonRtCfgToRt_.getUpToDateReadBuffer();
373
374 auto& iL = input.at(cfgInRT_.nodesetLeft);
375 auto& iR = input.at(cfgInRT_.nodesetRight);
376
377 // not changing left/right pose if coordination is not initialized,
378 if (not initialized_.load())
379 {
380 if (not cfgInRT_.flagResetRt)
381 {
382 return;
383 }
384
385 const std::scoped_lock lock(mtx_data_non_rt);
386 dataRt_.reset(cfgInRT_.desiredPose,
387 iL.targetPose,
388 iR.targetPose,
389 iL.targetPoseMode,
390 iR.targetPoseMode/*,
391 cfgInRT_.followerInLeaderLocalFrame*/);
392 // ARMARX_INFO << VAROUT(iL.targetPoseMode) << VAROUT(iR.targetPoseMode);
393 }
394
395 /// init left grasp variable: local mode targetPoseMode is in leader
396 const bool leftAsLeader =
397 cfgInRT_.leadershipMode == arondto::LeadershipMode::left_as_leader;
398 const bool rightAsLeader =
399 cfgInRT_.leadershipMode == arondto::LeadershipMode::right_as_leader;
400 if (not initialized_.load() or rightAsLeader)
401 {
402 dataRt_.resetGraspVariableLeft(cfgInRT_.desiredPose, iL.targetPose, iL.targetPoseMode);
403 }
404 if (not initialized_.load() or leftAsLeader)
405 {
406 dataRt_.resetGraspVariableRight(cfgInRT_.desiredPose, iR.targetPose, iR.targetPoseMode);
407 }
408 dataRt_.updateGraspMatrix(leftAsLeader,
409 rightAsLeader,
410 cfgInRT_.followerConnectionMode ==
411 arondto::ConnectionMode::follower_isolated);
412 if (not initialized_.load())
413 {
414 dataNonRt = dataRt_;
415 bufferDataRtToNonRt_.reinitAllBuffers(dataRt_);
416 bufferDataRtToPublish.reinitAllBuffers(dataRt_);
417 initialized_.store(true);
418 ARMARX_INFO << "coordinator initialized";
419 }
420
421 /// position in milli-meter
422 updateCurrentPose(iL.pose, iR.pose);
423 // setPos(dataRt_.currentPose, 0.5f * (getPos(iL.pose) + getPos(iR.pose)));
424 // setOri(dataRt_.currentPose, getOri(iL.pose));
425
426 dataRt_.bimanualVel << iL.vel, iR.vel;
427 dataRt_.currentVel = dataRt_.pinvGraspMatrixT * dataRt_.bimanualVel;
428
429 dataRt_.bimanualFT << iL.ft, iR.ft;
430 /// TODO look into force mapping from hand to obj
431 dataRt_.currentFT = dataRt_.graspMatrix * dataRt_.bimanualFT;
432 for (size_t i = 0; i < 6; i++)
433 {
434 if (fabs(dataRt_.currentFT(i)) < cfg_.forceDeadzone(i))
435 {
436 dataRt_.currentFT(i) = 0.0f;
437 }
438 else
439 {
440 dataRt_.currentFT(i) -=
441 cfg_.forceDeadzone(i) * dataRt_.currentFT(i) / fabs(dataRt_.currentFT(i));
442 }
443 }
444
445 computeWrenchControl(
446 dataRt_.deltaPosForWrenchControlL, cfg_.targetWrenchLeft, iL.stiffness);
447 computeWrenchControl(
448 dataRt_.deltaPosForWrenchControlR, cfg_.targetWrenchRight, iR.stiffness);
449
450 /// ------------------------ Object level admittance control ------------------------
451 dataRt_.targetPose = cfgInRT_.desiredPose;
452 dataRt_.poseError.head<3>() = getPos(dataRt_.virtualPose) - getPos(dataRt_.targetPose);
453 dataRt_.oriError = getOri(dataRt_.virtualPose) * getOriT(dataRt_.targetPose);
454 dataRt_.poseError.tail<3>() = VirtualRobot::MathTools::eigen3f2rpy(dataRt_.oriError);
455
456 for (int i = 0; i < 6; i++)
457 {
458 dataRt_.tempAcc(i) = dataRt_.currentFT(i) / cfg_.virtualInertia(i) -
459 cfg_.virtualStiffness(i) * dataRt_.poseError(i) -
460 cfg_.virtualDamping(i) * dataRt_.virtualVel(i);
461 }
462 // dataRt_.tempAcc = cfg_.virtualInertia.cwiseProduct(dataRt_.currentFT) -
463 // cfg_.virtualStiffness.cwiseProduct(dataRt_.poseError) -
464 // cfg_.virtualDamping.cwiseProduct(dataRt_.virtualVel);
465 dataRt_.tempVel = dataRt_.virtualVel + 0.5f * static_cast<float>(deltaT) *
466 (dataRt_.tempAcc + dataRt_.virtualAcc);
467
468 dataRt_.poseError =
469 0.5f * static_cast<float>(deltaT) * (dataRt_.virtualVel + dataRt_.tempVel);
470
471 dataRt_.virtualVel = dataRt_.tempVel;
472 dataRt_.virtualAcc = dataRt_.tempAcc;
473 setOri(dataRt_.virtualPose,
474 VirtualRobot::MathTools::rpy2eigen3f(
475 dataRt_.poseError(3), dataRt_.poseError(4), dataRt_.poseError(5)) *
476 getOri(dataRt_.virtualPose));
477 setPos(dataRt_.virtualPose, getPos(dataRt_.virtualPose) + dataRt_.poseError.head<3>());
478
479 /// ------------------------------- convert to tcp pose -------------------------------
480 setOri(iL.targetPose, getOri(dataRt_.virtualPose) * dataRt_.dOriInObjL);
481 setOri(iR.targetPose, getOri(dataRt_.virtualPose) * dataRt_.dOriInObjR);
482 setPos(iL.targetPose,
483 getPos(dataRt_.virtualPose) +
484 getOri(dataRt_.virtualPose) * (1000.0f * dataRt_.obj2TcpInMeterL -
485 dataRt_.deltaPosForWrenchControlL.head<3>()));
486 setPos(iR.targetPose,
487 getPos(dataRt_.virtualPose) +
488 getOri(dataRt_.virtualPose) * (1000.0f * dataRt_.obj2TcpInMeterR -
489 dataRt_.deltaPosForWrenchControlR.head<3>()));
490
491 bufferDataRtToNonRt_.getWriteBuffer() = dataRt_;
492 bufferDataRtToNonRt_.commitWrite();
493 bufferDataRtToPublish.getWriteBuffer() = dataRt_;
494 bufferDataRtToPublish.commitWrite();
495 }
496
497 void
498 SyncCoordination::updateConfig(const ::armarx::aron::data::dto::DictPtr& dto,
499 const bool flagResetRt)
500 {
501 // auto prevCfg = cfg_;
502 cfg_.fromAron(dto);
503 // validate cfg_
504 // if not valid, cfg_ = prevCfg;
505 // if (cfg_.leftAsLeader and cfg_.rightAsLeader)
506 // {
507 // ARMARX_WARNING
508 // << "It is not allowed to set both arms as leader, reconfigure your setting";
509 // return;
510 // }
511 if (cfg_.leadershipMode == arondto::LeadershipMode::object_as_leader and
512 cfg_.followerConnectionMode == arondto::ConnectionMode::follower_isolated)
513 {
514 ARMARX_WARNING << "When both arms are follower, you cannot set follower isolation "
515 "flag. I changed to `ConnectionMode::follower_connected` for you";
516 cfg_.followerConnectionMode = arondto::ConnectionMode::follower_connected;
517 }
518 if (flagResetRt)
519 {
520 cfg_.flagResetRt = flagResetRt;
521 }
522 if (cfg_.flagResetRt)
523 {
524 initialized_.store(false);
525 }
526
527 /// TODO: check if current pose is all zero and unset it, seems a bug in ARON
528 if (cfg_.currentPose.has_value())
529 {
530 ARMARX_INFO << "current object pose: " << VAROUT(cfg_.currentPose.value());
531 if (cfg_.currentPose.value()(3, 3) < 1.0)
532 {
533 cfg_.currentPose.reset();
534 }
535 ARMARX_INFO << "unset current pose, has value? "
536 << VAROUT(cfg_.currentPose.has_value());
537 }
538 else
539 {
540 ARMARX_INFO << "User does not provide a current pose";
541 }
542
543 // /// TODO: just for comparison, vector works but matrix not
544 // if (cfg_.currentTest.has_value())
545 // {
546 // ARMARX_INFO << "current object test: " << VAROUT(cfg_.currentTest.value());
547 // }
548 // else
549 // {
550 // ARMARX_INFO << "User does not provide a current test";
551 // }
552
553 if (not cfgBufferInitialized_.load())
554 {
555 bufferNonRtCfgToRt_.reinitAllBuffers(cfg_);
556 bufferUserCfgToNonRt_.reinitAllBuffers(cfg_);
557 bufferUserCfgToPublish.reinitAllBuffers(cfg_);
558 cfgBufferInitialized_.store(true);
559 }
560 else
561 {
562 bufferNonRtCfgToRt_.getWriteBuffer() = cfg_;
563 bufferNonRtCfgToRt_.commitWrite();
564 bufferUserCfgToNonRt_.getWriteBuffer() = cfg_;
565 bufferUserCfgToNonRt_.commitWrite();
566 bufferUserCfgToPublish.getWriteBuffer() = cfg_;
567 bufferUserCfgToPublish.commitWrite();
568 }
569
570 setNodesetList(cfg_.nodesetLeft, cfg_.nodesetRight);
571 std::string role;
572 if (cfg_.leadershipMode == arondto::LeadershipMode::left_as_leader)
573 {
574 role = cfg_.nodesetLeft + " as leader";
575 }
576 else if (cfg_.leadershipMode == arondto::LeadershipMode::right_as_leader)
577 {
578 role = cfg_.nodesetRight + " as leader";
579 }
580 else
581 {
582 role = "object as leader";
583 }
584
585
586 if (cfg_.followerFrameMode == armarx::control::common::arondto::PoseFrameMode::leader)
587 {
588 role += ", follower in local frame of leader";
589 }
590 ARMARX_INFO << "Request coordinator with " << role;
591 }
592
593 void
594 SyncCoordination::updateTargetPose(const Eigen::Matrix4f& targetPose)
595 {
596 cfg_.desiredPose = targetPose;
597 bufferUserCfgToNonRt_.getWriteBuffer() = cfg_;
598 bufferUserCfgToNonRt_.commitWrite();
599 bufferUserCfgToPublish.getWriteBuffer() = cfg_;
600 bufferUserCfgToPublish.commitWrite();
601 }
602
603} // namespace armarx::control::common::coordination
#define VAROUT(x)
void setNodesetList(const std::string &nodesetLeft, const std::string &nodesetRight)
void reset(std::map< std::string, Eigen::Matrix4f > &initPose) override
SyncCoordination(const ::armarx::aron::data::dto::DictPtr &dto)
void runRT(std::map< std::string, InputData > &input, double deltaT) override
void updateTargetPose(const Eigen::Matrix4f &targetPose)
void updateConfig(const ::armarx::aron::data::dto::DictPtr &dto, bool flagResetRt=false) override
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:193
Quaternion< float, 0 > Quaternionf
Matrix< float, 6, 1 > Vector6f
armarx::control::common::arondto::PoseFrameMode PoseFrameMode
Eigen::Matrix3f getOriT(const Eigen::Matrix4f &matrix)
Definition utils.cpp:289
void setOri(Eigen::Matrix4f &matrix, const Eigen::Ref< const Eigen::Matrix3f > &ori)
Definition utils.cpp:295
Eigen::Block< Eigen::Matrix4f, 3, 3 > getOri(Eigen::Matrix4f &matrix)
Definition utils.cpp:265
void setPos(Eigen::Matrix4f &matrix, const Eigen::Ref< const Eigen::Vector3f > &pos)
Definition utils.cpp:307
void skew(const Eigen::Vector3f &vec, Eigen::Ref< Eigen::Matrix3f > result)
Definition utils.cpp:277
Eigen::Block< Eigen::Matrix4f, 3, 1 > getPos(Eigen::Matrix4f &matrix)
Definition utils.cpp:301
void updateGraspMatrix(const bool leftAsLeader, const bool rightAsLeader, const bool followerIsolation)
void resetGraspVariableLeft(const Eigen::Matrix4f &desiredPose, Eigen::Matrix4f &leftPose, PoseFrameMode leftPoseMode)
Eigen::Vector3f rvec
Temporal variables to avoid memory allocation.
void reset(const Eigen::Matrix4f &desiredPose, Eigen::Matrix4f &leftPose, Eigen::Matrix4f &rightPose, PoseFrameMode leftPoseMode, PoseFrameMode rightPoseMode)
void resetGraspVariableRight(const Eigen::Matrix4f &desiredPose, Eigen::Matrix4f &rightPose, PoseFrameMode rightPoseMode)
Eigen::Vector3f obj2TcpInMeterL
vectors represented in the object local frame