AdmittanceController.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @package ...
17  * @author Jianfeng Gao ( jianfeng dot gao at kit dot edu )
18  * @date 2021
19  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20  * GNU General Public License
21  */
22 
23 #include "AdmittanceController.h"
24 
25 #include <VirtualRobot/MathTools.h>
26 #include <VirtualRobot/Nodes/RobotNode.h>
27 #include <VirtualRobot/RobotNodeSet.h>
28 
30 #include <ArmarXCore/core/PackagePath.h> // for GUI
34 
38 
39 #include <armarx/control/common/aron_conversions.h> // for GUI
42 
44 {
47  "NJointTaskspaceAdmittanceController");
48 
49  void
50  NJointTaskspaceAdmittanceController::limbInit(const std::string nodeSetName,
51  ArmPtr& arm,
52  Config& cfg,
53  VirtualRobot::RobotPtr& nonRtRobotPtr)
54  {
55  arm->kinematicChainName = nodeSetName;
56  VirtualRobot::RobotNodeSetPtr rtRns =
57  rtGetRobot()->getRobotNodeSet(arm->kinematicChainName);
58  VirtualRobot::RobotNodeSetPtr nonRtRns =
59  nonRtRobotPtr->getRobotNodeSet(arm->kinematicChainName);
60  ARMARX_CHECK_EXPRESSION(rtRns) << arm->kinematicChainName;
61  ARMARX_CHECK_EXPRESSION(nonRtRns) << arm->kinematicChainName;
62  ARMARX_IMPORTANT << "Creating Taskspace Impedance controller with kinematic chain: "
63  << arm->kinematicChainName << " with num of joints: (RT robot) "
64  << rtRns->getSize() << ", and (non-RT robot) " << nonRtRns->getSize();
65 
66  arm->controller.initialize(nonRtRns, rtRns);
67  arm->controller.ftsensor.initialize(rtRns, robotUnit, cfg.ftConfig);
68  arm->jointNames.clear();
69  for (size_t i = 0; i < rtRns->getSize(); ++i)
70  {
71  std::string jointName = rtRns->getNode(i)->getName();
72  arm->jointNames.push_back(jointName);
73 
74  ControlTargetBase* ct = useControlTarget(jointName, ControlModes::Torque1DoF);
76  auto* casted_ct = ct->asA<ControlTarget1DoFActuatorTorque>();
77  ARMARX_CHECK_EXPRESSION(casted_ct);
78  arm->targets.push_back(casted_ct);
79 
80  const SensorValueBase* sv = useSensorValue(jointName);
82  arm->sensorDevices.append(sv, jointName);
83  };
84 
85  validateConfigData(cfg, arm);
86  arm->rtConfig = cfg;
87  arm->nonRtConfig = cfg;
88  arm->rtStatus.reset(rtRns->getSize());
89  }
90 
92  const RobotUnitPtr& robotUnit,
93  const NJointControllerConfigPtr& config,
94  const VirtualRobot::RobotPtr&) :
95  robotUnit(robotUnit)
96  {
98 
99  ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
101  userConfig.fromAron(cfg->config);
102 
104  nonRtRobot = robotUnit->cloneRobot();
105  robotUnit->updateVirtualRobot(nonRtRobot);
106 
107  for (auto& pair : userConfig.limbs)
108  {
109  limb.emplace(pair.first, std::make_unique<ArmData>());
110  limbInit(pair.first, limb.at(pair.first), pair.second, nonRtRobot);
111  controllableNodeSets.emplace(pair.first, nonRtRobot->getRobotNodeSet(pair.first));
112  }
113 
114  if (not userConfig.hands.empty())
115  {
116  hands = std::make_shared<core::HandControlBase>(nonRtRobot, userConfig.hands);
117  for (auto& pair : userConfig.hands)
118  {
119  for (auto& jointName : hands->hands.at(pair.first)->jointNames)
120  {
121  hands->appendDevice(pair.first,
122  useSensorValue(jointName),
123  useControlTarget(jointName, ControlModes::Position1DoF),
124  jointName);
125  }
126  ARMARX_INFO << "construction of hand "
127  << hands->hands.at(pair.first)->kinematicChainName;
128  controllableNodeSets.emplace(pair.first, nonRtRobot->getRobotNodeSet(pair.first));
129  }
130  }
131  }
132 
133  std::string
135  {
136  return "NJointTaskspaceAdmittanceController";
137  }
138 
139  void
141  {
142  std::string taskName = getClassName() + "AdditionalTask";
143  runTask(taskName,
144  [&]
145  {
147  4); // please don't set this to 0 as it is the rtRun/control thread
150 
151  CycleUtil c(1);
152  getObjectScheduler()->waitForObjectStateMinimum(eManagedIceObjectStarted);
153  ARMARX_IMPORTANT << "Create a new thread for " << getClassName();
154  while (getState() == eManagedIceObjectStarted)
155  {
156  if (isControllerActive())
157  {
158  additionalTask();
159  }
160  c.waitForCycleDuration();
161  }
162  });
163  }
164 
165  void
167  {
168  arm->bufferConfigNonRtToRt.getWriteBuffer() = arm->nonRtConfig;
169  arm->bufferConfigNonRtToRt.commitWrite();
170  }
171 
172  void
174  {
175  bool rtSafe = additionalTaskUpdateStatus();
177  if (not rtSafe)
178  {
180  }
181  }
182 
183  bool
185  {
186  robotUnit->updateVirtualRobot(nonRtRobot);
187  bool rtSafe = true;
188  for (auto& pair : limb)
189  {
190  auto& arm = pair.second;
191  arm->nonRtConfig = arm->bufferConfigUserToNonRt.getUpToDateReadBuffer();
192  arm->rtStatusInNonRT = arm->bufferRtStatusToNonRt.getUpToDateReadBuffer();
193  rtSafe = rtSafe and pair.second->rtStatusInNonRT.rtSafe;
194  }
195  if (hands)
196  {
197  hands->nonRTUpdateStatus();
198  }
199  return rtSafe;
200  }
201 
202  void
204  {
205  for (auto& pair : limb)
206  {
207  limbNonRT(pair.second);
208  }
209  if (hands)
210  {
211  hands->nonRTSetTarget();
212  }
213  }
214 
215  void
217  {
218  for (auto& pair : limb)
219  {
220  if (not pair.second->rtReady)
221  continue;
222 
223  if (not pair.second->rtStatusInNonRT.rtTargetSafe)
224  {
225  pair.second->rtStatusInNonRT =
226  pair.second->bufferRtStatusToNonRt.getUpToDateReadBuffer();
228  pair.second->rtStatusInNonRT.currentPose,
229  pair.second->nonRtConfig.desiredPose,
230  "current pose",
231  "desired pose");
232  }
233  }
234  }
235 
236  /// -------------------------------- Real time cotnrol -----------------------------------------
237  void
239  {
240  arm->rtConfig = arm->bufferConfigNonRtToRt.getUpToDateReadBuffer();
241  arm->rtStatus.deltaT = deltaT;
242  arm->rtStatus.accumulateTime += deltaT;
243 
244  if (arm->rtFirstRun.load())
245  {
246  arm->controller.firstRun();
247  }
248 
249  arm->controller.ftsensor.updateStatus(arm->rtConfig.ftConfig,
250  arm->rtStatus.currentForceTorque,
251  arm->rtStatus.deltaT,
252  arm->rtFirstRun.load());
253 
254  arm->sensorDevices.updateJointValues(
255  arm->rtStatus.jointPos, arm->rtStatus.jointVel, arm->rtStatus.jointTor);
256 
257 
258  arm->bufferRtStatusToNonRt.getWriteBuffer() = arm->rtStatus;
259  arm->bufferRtStatusToNonRt.commitWrite();
260  arm->bufferRtStatusToUser.getWriteBuffer() = arm->rtStatus;
261  arm->bufferRtStatusToUser.commitWrite();
262  }
263 
264  void
266  const Eigen::VectorXf& targetTorque)
267  {
268  for (unsigned int i = 0; i < targetTorque.size(); i++)
269  {
270  arm->targets.at(i)->torque = targetTorque(i);
271  if (!arm->targets.at(i)->isValid())
272  {
273  arm->targets.at(i)->torque = 0;
274  }
275  }
276  arm->bufferRtStatusToOnPublish.getWriteBuffer() = arm->rtStatus;
277  arm->bufferRtStatusToOnPublish.commitWrite();
278 
279  arm->bufferConfigRtToOnPublish.getWriteBuffer() = arm->rtConfig;
280  arm->bufferConfigRtToOnPublish.commitWrite();
281 
282  arm->bufferConfigRtToUser.getWriteBuffer() = arm->rtConfig;
283  arm->bufferConfigRtToUser.commitWrite();
284 
285  if (arm->rtFirstRun.load())
286  {
287  arm->rtFirstRun.store(false);
288  arm->rtReady.store(true);
289  }
290  }
291 
292  void
294  {
295  double time_measure = IceUtil::Time::now().toMicroSecondsDouble();
296  limbRTUpdateStatus(arm, deltaT);
297  double time_update_status = IceUtil::Time::now().toMicroSecondsDouble() - time_measure;
298 
299  arm->controller.run(arm->rtConfig, arm->rtStatus);
300  double time_run_rt = IceUtil::Time::now().toMicroSecondsDouble() - time_measure;
301 
302  limbRTSetTarget(arm, arm->rtStatus.desiredJointTorques);
303 
304  double time_set_target = IceUtil::Time::now().toMicroSecondsDouble() - time_measure;
305  time_measure = IceUtil::Time::now().toMicroSecondsDouble() - time_measure;
306 
307  if (time_measure > 100)
308  {
309  ARMARX_RT_LOGF_WARN("---- rt too slow: "
310  "time_update_status: %.2f\n"
311  "run_rt_limb: %.2f\n"
312  "set_target_limb: %.2f\n"
313  "time all: %.2f\n",
314  time_update_status, // 0-1 us
315  time_run_rt - time_update_status, //
316  time_set_target - time_run_rt, //
317  time_measure)
318  .deactivateSpam(1.0f); // 0-1 us
319  }
320  }
321 
322  void
324  const IceUtil::Time& timeSinceLastIteration)
325  {
326  double deltaT = timeSinceLastIteration.toSecondsDouble();
327  for (auto& pair : limb)
328  {
329  limbRT(pair.second, deltaT);
330  }
331  if (hands)
332  {
333  hands->updateRTStatus(deltaT);
334  hands->setTargets();
335  }
336  }
337 
338  /// ------------------------------ update/get config -------------------------------------------
339  void
341  const Ice::Current& iceCurrent)
342  {
343  auto prevCfg = userConfig;
344  userConfig.fromAron(dto);
345 
346  for (auto& pair : userConfig.limbs)
347  {
348  validateConfigData(pair.second, limb.at(pair.first));
350  pair.second.desiredPose,
351  prevCfg.limbs.at(pair.first).desiredPose,
352  "new desired pose",
353  "previous desired pose",
354  pair.second.safeDistanceMMToGoal,
355  pair.second.safeRotAngleDegreeToGoal,
356  "updateConfig_" + pair.first))
357  {
358  ARMARX_INFO << "use the existing target pose";
359  pair.second.desiredPose = prevCfg.limbs.at(pair.first).desiredPose;
360  }
361  limb.at(pair.first)->bufferConfigUserToNonRt.getWriteBuffer() = pair.second;
362  limb.at(pair.first)->bufferConfigUserToNonRt.commitWrite();
363  }
364  if (hands)
365  {
366  hands->updateConfig(userConfig.hands);
367  }
368  }
369 
371  NJointTaskspaceAdmittanceController::getConfig(const Ice::Current& iceCurrent)
372  {
373  for (auto& pair : limb)
374  {
375  userConfig.limbs.at(pair.first) =
376  pair.second->bufferConfigRtToUser.getUpToDateReadBuffer();
377  }
378  if (hands)
379  {
380  hands->getConfig(userConfig.hands);
381  }
382  return userConfig.toAronDTO();
383  }
384 
385  void
387  const bool forceGuard,
388  const bool torqueGuard,
389  const Ice::Current& iceCurrent)
390  {
391  auto it = userConfig.limbs.find(nodeSetName);
392  if (it != userConfig.limbs.end())
393  {
394  it->second.ftConfig.enableSafeGuardForce = forceGuard;
395  it->second.ftConfig.enableSafeGuardTorque = torqueGuard;
396  limb.at(nodeSetName)->controller.ftsensor.enableSafeGuard(forceGuard, torqueGuard);
398  << "reset safe guard with force torque sensors: safe? "
399  << limb.at(nodeSetName)->controller.ftsensor.isSafe(it->second.ftConfig);
400  limb.at(nodeSetName)->bufferConfigUserToNonRt.getWriteBuffer() = it->second;
401  limb.at(nodeSetName)->bufferConfigUserToNonRt.commitWrite();
402  }
403  else
404  {
405  ARMARX_WARNING << "no robot node set with name " << nodeSetName
406  << " found in the controllers.";
407  }
408  }
409 
410  /// -------------------------------- Other interaces -------------------------------------------
411  bool
413  const Ice::Current& iceCurrent)
414  {
415  auto it = userConfig.limbs.find(nodeSetName);
416  if (it != userConfig.limbs.end())
417  {
418  return limb.at(nodeSetName)->controller.ftsensor.ftSafe.load();
419  }
420  else
421  {
422  ARMARX_WARNING << "no robot node set with name " << nodeSetName
423  << " found in the controllers.";
424  }
425  return false;
426  }
427 
428  Ice::FloatSeq
430  const Ice::Current& iceCurrent)
431  {
432  std::vector<float> tcpVel;
433  auto& arm = limb.at(rns);
434  auto s = arm->bufferRtStatusToUser.getUpToDateReadBuffer();
435  for (int i = 0; i < s.currentTwist.size(); i++)
436  {
437  tcpVel.push_back(s.currentTwist[i]);
438  }
439  return tcpVel;
440  }
441 
442  bool
444  const TargetPoseMap& targetPoseMap,
445  const TargetNullspaceMap& targetNullspaceMap,
446  const Ice::Current& iceCurrent)
447  {
448  for (auto& pair : userConfig.limbs)
449  {
450  for (size_t i = 0; i < 4; ++i)
451  {
452  for (int j = 0; j < 4; ++j)
453  {
454  pair.second.desiredPose(i, j) = targetPoseMap.at(pair.first)[i][j];
455  }
456  }
457  if (targetNullspaceMap.at(pair.first).size() > 0)
458  {
459  const size_t nDoF = pair.second.desiredNullspaceJointAngles.value().size();
460  ARMARX_CHECK_EQUAL(targetNullspaceMap.at(pair.first).size(), nDoF)
461  << "the joint numbers does not match";
462  for (size_t i = 0; i < nDoF; ++i)
463  {
464  pair.second.desiredNullspaceJointAngles.value()(i) =
465  targetNullspaceMap.at(pair.first)[i];
466  }
467  }
468  limb.at(pair.first)->bufferConfigUserToNonRt.getWriteBuffer() = pair.second;
469  limb.at(pair.first)->bufferConfigUserToNonRt.commitWrite();
470  }
471  return true;
472  }
473 
474  void
476  {
477  const auto nDoF = arm->controller.numOfJoints;
478 
479  const auto checkSize = [nDoF](const auto& v) { ARMARX_CHECK_EQUAL(v.rows(), nDoF); };
480  const auto checkNonNegative = [](const auto& v) { ARMARX_CHECK((v.array() >= 0).all()); };
481 
482  if (!configData.desiredNullspaceJointAngles.has_value())
483  {
484  if (!isControllerActive())
485  {
486  ARMARX_INFO << "No user defined nullspace target, reset to zero with "
487  << VAROUT(nDoF);
488  configData.desiredNullspaceJointAngles = Eigen::VectorXf::Zero(nDoF);
489  arm->reInitPreActivate.store(true);
490  }
491  else
492  {
493  auto currentValue =
494  arm->bufferConfigRtToUser.getUpToDateReadBuffer().desiredNullspaceJointAngles;
496  << "Controller is active, but no user defined nullspace target. \n"
497  "You should first get up-to-date config of this controller and then update "
498  "it:\n"
499  " auto cfg = ctrl->getConfig(); \n"
500  " cfg.desiredPose = xxx;\n"
501  " ctrl->updateConfig(cfg);\n"
502  "Now, I decide by myself to use the existing values of nullspace target\n"
503  << currentValue.value();
504  configData.desiredNullspaceJointAngles = currentValue;
505  }
506  }
507  ARMARX_CHECK_GREATER(configData.safeDistanceMMToGoal, 100.0f);
508  checkSize(configData.desiredNullspaceJointAngles.value());
509  checkSize(configData.kdNullspace);
510  checkSize(configData.kpNullspace);
511 
512  checkNonNegative(configData.kdNullspace);
513  checkNonNegative(configData.kpNullspace);
514  checkNonNegative(configData.kdImpedance);
515  checkNonNegative(configData.kpImpedance);
516  }
517 
518  void
520  const DebugObserverInterfacePrx& debugObs)
521  {
522  StringVariantBaseMap datafields;
523  auto rtData = arm->bufferConfigRtToOnPublish.getUpToDateReadBuffer();
524  auto rtStatus = arm->bufferRtStatusToOnPublish.getUpToDateReadBuffer();
525 
526 
527  common::debugEigenPose(datafields, "current_pose", rtStatus.currentPose);
528  common::debugEigenPose(datafields, "desired_pose", rtStatus.desiredPose);
529  common::debugEigenVec(datafields, "kpImpedance", rtData.kpImpedance);
530  common::debugEigenVec(datafields, "kdImpedance", rtData.kdImpedance);
531 
532  common::debugEigenPose(datafields, "virtual_pose", rtStatus.virtualPose);
533  common::debugEigenVec(datafields, "virtual_vel", rtStatus.virtualVel);
534  common::debugEigenVec(datafields, "virtual_acc", rtStatus.virtualAcc);
535  common::debugEigenVec(datafields, "currentForceTorque", rtStatus.currentForceTorque);
536 
537  common::debugEigenVec(datafields, "forceImpedance", rtStatus.forceImpedance);
538  common::debugEigenVec(datafields, "nullspaceTorque", rtStatus.nullspaceTorque);
539  common::debugEigenVec(datafields, "desiredJointTorques", rtStatus.desiredJointTorques);
540  debugObs->setDebugChannel(getClassName() + "_" + arm->kinematicChainName, datafields);
541  }
542 
543  void
546  const DebugObserverInterfacePrx& debugObs)
547  {
548  for (auto& pair : limb)
549  {
550  if (not pair.second->rtReady.load())
551  continue;
552  limbPublish(pair.second, debugObs);
553  }
554  }
555 
556  void
558  {
559  for (auto& pair : limb)
560  {
561  pair.second->rtReady.store(false);
562  }
563  }
564 
565  void
567  const Ice::Current&)
568  {
569  for (auto& pair : limb)
570  {
571  pair.second->rtReady.store(false);
572  }
573  }
574 
575  void
577  {
578  VirtualRobot::RobotNodeSetPtr rns = rtGetRobot()->getRobotNodeSet(arm->kinematicChainName);
579  const auto& currentPose = rns->getTCP()->getPoseInRootFrame();
580  auto quat = VirtualRobot::MathTools::eigen4f2quat(currentPose);
581  ARMARX_RT_LOGF_INFO("rt preactivate controller with target pose\n\n "
582  "[ %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f ].",
583  currentPose(0, 3),
584  currentPose(1, 3),
585  currentPose(2, 3),
586  quat.w,
587  quat.x,
588  quat.y,
589  quat.z);
590 
591  if (arm->reInitPreActivate.load())
592  {
593  arm->rtConfig.desiredNullspaceJointAngles.value() = rns->getJointValuesEigen();
594  arm->rtConfig.desiredPose = currentPose;
595 
596  arm->bufferConfigUserToNonRt.reinitAllBuffers(arm->rtConfig);
597  arm->reInitPreActivate.store(false);
598  }
599  {
600  arm->nonRtConfig = arm->rtConfig;
601  arm->bufferConfigNonRtToRt.reinitAllBuffers(arm->rtConfig);
602  arm->bufferConfigRtToOnPublish.reinitAllBuffers(arm->rtConfig);
603  arm->bufferConfigRtToUser.reinitAllBuffers(arm->rtConfig);
604  }
605  {
606  arm->sensorDevices.updateJointValues(
607  arm->rtStatus.jointPos, arm->rtStatus.jointVel, arm->rtStatus.jointTor);
608  arm->rtStatus.rtPreActivate(currentPose);
609 
610  arm->rtStatusInNonRT = arm->rtStatus;
611  arm->nonRTDeltaT = 0.0;
612  arm->nonRTAccumulateTime = 0.0;
613  arm->bufferRtStatusToOnPublish.reinitAllBuffers(arm->rtStatus);
614  arm->bufferRtStatusToNonRt.reinitAllBuffers(arm->rtStatus);
615  arm->bufferRtStatusToUser.reinitAllBuffers(arm->rtStatus);
616  }
617 
618  arm->controller.preactivateInit(rns);
619  }
620 
621  void
623  {
624  for (auto& pair : limb)
625  {
626  ARMARX_RT_LOGF_INFO("rtPreActivateController for %s", pair.first.c_str());
627  limbReInit(pair.second);
628  userConfig.limbs.at(pair.first) = pair.second->rtConfig;
629  }
630  if (hands)
631  {
632  hands->rtPreActivate();
633  }
634  }
635 
636  void
638  {
639  // for (auto& pair : limb)
640  // {
641  // pair.second->controller.isInitialized.store(false);
642  // }
643  }
644 
645  /// ----------------------------------- GUI Widget ---------------------------------------------
648  const VirtualRobot::RobotPtr& robot,
649  const std::map<std::string, ConstControlDevicePtr>& controlDevices,
650  const std::map<std::string, ConstSensorDevicePtr>&)
651  {
652  using namespace armarx::WidgetDescription;
653  HBoxLayoutPtr layout = new HBoxLayout;
654 
655 
656  ::armarx::WidgetDescription::WidgetSeq widgets;
657 
658  /// select default config
659  LabelPtr label = new Label;
660  label->text = "select a controller config";
661 
662  StringComboBoxPtr cfgBox = new StringComboBox;
663  cfgBox->name = "config_box";
664  cfgBox->defaultIndex = 0;
665  cfgBox->multiSelect = false;
666 
667  cfgBox->options = std::vector<std::string>{"default", "default_right", "default_right_a7"};
668  ARMARX_TRACE;
669 
670  layout->children.emplace_back(label);
671  layout->children.emplace_back(cfgBox);
672  ARMARX_TRACE;
673 
674  layout->children.insert(layout->children.end(), widgets.begin(), widgets.end());
675  ARMARX_INFO_S << "Layout done";
676  return layout;
677  }
678 
682  {
683  auto cfgName = values.at("config_box")->getString();
684  const armarx::PackagePath configPath(
685  "armarx_control",
686  "controller_config/NJointTaskspaceAdmittanceController/" + cfgName + ".json");
687  ARMARX_INFO_S << "Loading config from " << configPath.toSystemPath();
688  ARMARX_CHECK(std::filesystem::exists(configPath.toSystemPath()));
689 
690  auto cfgDTO = armarx::readFromJson<ConfigDict>(configPath.toSystemPath());
691 
692  ARMARX_TRACE;
693  return new ConfigurableNJointControllerConfig{cfgDTO.toAronDTO()};
694  }
695 
696 } // namespace armarx::control::njoint_controller::task_space
armarx::ControlTargetBase::asA
const T * asA() const
Definition: ControlTargetBase.h:76
ARMARX_RT_LOGF_INFO
#define ARMARX_RT_LOGF_INFO(...)
Definition: ControlThreadOutputBuffer.h:344
SingleTypeVariantList.h
armarx::control::common::debugEigenPose
void debugEigenPose(StringVariantBaseMap &datafields, const std::string &name, Eigen::Matrix4f pose)
Definition: utils.cpp:113
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::limb
std::map< std::string, ArmPtr > limb
Definition: AdmittanceController.h:162
armarx::control::ethercat::RTUtility::RT_THREAD_PRIORITY
static constexpr int RT_THREAD_PRIORITY
The thread priority for rt-threads.
Definition: RTUtility.h:24
armarx::NJointControllerRegistration
Definition: NJointControllerRegistry.h:74
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::toggleGravityCompensation
void toggleGravityCompensation(const bool toggle, const Ice::Current &) override
ft sensor
Definition: AdmittanceController.cpp:566
armarx::NJointControllerBase::useSynchronizedRtRobot
const VirtualRobot::RobotPtr & useSynchronizedRtRobot(bool updateCollisionModel=false)
Requests a VirtualRobot for use in rtRun *.
Definition: NJointController.cpp:293
armarx::StringVariantBaseMap
std::map< std::string, VariantBasePtr > StringVariantBaseMap
Definition: ManagedIceObject.h:110
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:190
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::robotUnit
RobotUnitPtr robotUnit
Definition: AdmittanceController.h:164
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::limbNonRT
void limbNonRT(ArmPtr &arm)
Definition: AdmittanceController.cpp:166
armarx::SensorValueBase
The SensorValueBase class.
Definition: SensorValueBase.h:40
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::rtPostDeactivateController
void rtPostDeactivateController() override
This function is called after the controller is deactivated.
Definition: AdmittanceController.cpp:637
armarx::ControlTargetBase
Brief description of class JointControlTargetBase.
Definition: ControlTargetBase.h:47
RobotUnit.h
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::controllableNodeSets
std::map< std::string, VirtualRobot::RobotNodeSetPtr > controllableNodeSets
Definition: AdmittanceController.h:167
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::limbRTUpdateStatus
void limbRTUpdateStatus(ArmPtr &arm, const double deltaT)
-----------------------------— Real time cotnrol --------------------------------------—
Definition: AdmittanceController.cpp:238
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::isSafeForceTorque
bool isSafeForceTorque(const std::string &nodeSetName, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
-----------------------------— Other interaces ----------------------------------------—
Definition: AdmittanceController.cpp:412
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::limbInit
void limbInit(const std::string nodeSetName, ArmPtr &arm, Config &cfg, VirtualRobot::RobotPtr &nonRtRobotPtr)
Definition: AdmittanceController.cpp:50
armarx::NJointControllerBase::useControlTarget
ControlTargetBase * useControlTarget(const std::string &deviceName, const std::string &controlMode)
Declares to calculate the ControlTarget for the given ControlDevice in the given ControlMode when rtR...
Definition: NJointController.cpp:410
armarx::control::common::detectAndReportPoseDeviationWarning
bool detectAndReportPoseDeviationWarning(const Eigen::Matrix4f &pose1, const Eigen::Matrix4f &pose2, const std::string &namePose1, const std::string &namePose2, float positionThrMM, float angleThrDeg, const std::string &who)
Definition: utils.cpp:646
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::onPublish
void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &) override
Definition: AdmittanceController.cpp:544
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::additionalTaskSetTarget
void additionalTaskSetTarget()
Definition: AdmittanceController.cpp:203
armarx::control::njoint_controller::task_space
Definition: AdmittanceController.cpp:43
armarx::control::ethercat::RTUtility::pinThreadToCPU
static bool pinThreadToCPU(unsigned int cpu)
Pins the calling thread to the CPU with the given id.
Definition: RTUtility.cpp:52
ARMARX_CHECK_GREATER
#define ARMARX_CHECK_GREATER(lhs, rhs)
This macro evaluates whether lhs is greater (>) than rhs and if it turns out to be false it will thro...
Definition: ExpressionException.h:116
armarx::CycleUtil
This util class helps with keeping a cycle time during a control cycle.
Definition: CycleUtil.h:40
armarx::ManagedIceObject::getState
int getState() const
Retrieve current state of the ManagedIceObject.
Definition: ManagedIceObject.cpp:769
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::userConfig
ConfigDict userConfig
Definition: AdmittanceController.h:165
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::ArmPtr
std::unique_ptr< ArmData > ArmPtr
Definition: AdmittanceController.h:98
ProsthesisInterface.values
values
Definition: ProsthesisInterface.py:190
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::enableSafeGuardForceTorque
void enableSafeGuardForceTorque(const std::string &nodeSetName, const bool forceGuard, const bool torqueGuard, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition: AdmittanceController.cpp:386
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::nonRtRobot
VirtualRobot::RobotPtr nonRtRobot
Definition: AdmittanceController.h:163
armarx::NJointControllerBase::ConfigPtrT
NJointControllerConfigPtr ConfigPtrT
Definition: NJointControllerBase.h:587
aron_conversions.h
armarx::control::common::reportPoseDeviationWarning
void reportPoseDeviationWarning(const std::string &who, const Eigen::Matrix4f &pose1, const Eigen::Matrix4f &pose2, const std::string &namePose1, const std::string &namePose2)
Definition: utils.cpp:623
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::rtPreActivateController
void rtPreActivateController() override
This function is called before the controller is activated.
Definition: AdmittanceController.cpp:622
armarx::control::njoint_controller::task_space::registrationControllerNJointTaskspaceAdmittanceController
NJointControllerRegistration< NJointTaskspaceAdmittanceController > registrationControllerNJointTaskspaceAdmittanceController("NJointTaskspaceAdmittanceController")
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::rtRun
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration) override
TODO make protected and use attorneys.
Definition: AdmittanceController.cpp:323
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::hands
core::HandControlPtr hands
Definition: AdmittanceController.h:166
IceInternal::Handle
Definition: forward_declarations.h:8
armarx::NJointControllerBase::rtGetRobot
const VirtualRobot::RobotPtr & rtGetRobot()
TODO make protected and use attorneys.
Definition: NJointControllerBase.h:846
armarx::detail::ControlThreadOutputBufferEntry
Definition: ControlThreadOutputBuffer.h:182
visionx::voxelgrid::Label
uint32_t Label
Type of an object label.
Definition: types.h:6
armarx::control::TargetNullspaceMap
dictionary< string, Ice::FloatSeq > TargetNullspaceMap
Definition: ControllerInterface.ice:40
armarx::WidgetDescription
Definition: DefaultWidgetDescriptions.cpp:27
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::additionalTask
virtual void additionalTask()
Definition: AdmittanceController.cpp:173
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::limbRTSetTarget
void limbRTSetTarget(ArmPtr &arm, const Eigen::VectorXf &targetTorque)
Definition: AdmittanceController.cpp:265
armarx::PackagePath::toSystemPath
static std::filesystem::path toSystemPath(const data::PackagePath &pp)
Definition: PackagePath.cpp:47
AdmittanceController.h
armarx::NJointControllerBase::isControllerActive
bool isControllerActive(const Ice::Current &=Ice::emptyCurrent) const final override
Definition: NJointControllerBase.h:778
armarx::NJointControllerBase::runTask
void runTask(const std::string &taskName, Task &&task)
Executes a given task in a separate thread from the Application ThreadPool.
Definition: NJointControllerBase.h:754
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::ConfigPtrT
ConfigurableNJointControllerConfigPtr ConfigPtrT
Definition: AdmittanceController.h:54
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::limbRT
void limbRT(ArmPtr &arm, const double deltaT)
Definition: AdmittanceController.cpp:293
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::limbPublish
void limbPublish(ArmPtr &arm, const DebugObserverInterfacePrx &debugObs)
Definition: AdmittanceController.cpp:519
ArmarXObjectScheduler.h
ControlTarget1DoFActuator.h
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::additionalTaskUpdateStatus
bool additionalTaskUpdateStatus()
Definition: AdmittanceController.cpp:184
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::GenerateConfigDescription
static WidgetDescription::WidgetPtr GenerateConfigDescription(const VirtualRobot::RobotPtr &, const std::map< std::string, ConstControlDevicePtr > &, const std::map< std::string, ConstSensorDevicePtr > &)
--------------------------------— GUI Widget ------------------------------------------—
Definition: AdmittanceController.cpp:647
armarx::control::ethercat::RTUtility::elevateThreadPriority
static bool elevateThreadPriority(int priority)
Elevate the thread priority of the calling thread to the given priority.
Definition: RTUtility.cpp:17
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
armarx::control::common::debugEigenVec
void debugEigenVec(StringVariantBaseMap &datafields, const std::string &name, Eigen::VectorXf vec)
Definition: utils.cpp:125
utils.h
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::handleRTNotSafeInNonRT
void handleRTNotSafeInNonRT()
Definition: AdmittanceController.cpp:216
CycleUtil.h
armarx::RemoteGui::Client::HBoxLayout
Definition: Widgets.h:160
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::limbReInit
void limbReInit(ArmPtr &arm)
Definition: AdmittanceController.cpp:576
NJointController.h
armarx::aron::data::DictPtr
std::shared_ptr< Dict > DictPtr
Definition: Dict.h:41
armarx::ctrlutil::v
double v(double t, double v0, double a0, double j)
Definition: CtrlUtil.h:39
ARMARX_CHECK_EXPRESSION
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
Definition: ExpressionException.h:73
TimeUtil.h
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::getConfig
::armarx::aron::data::dto::DictPtr getConfig(const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition: AdmittanceController.cpp:371
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::updateTargetPose
bool updateTargetPose(const TargetPoseMap &targetPoseMap, const TargetNullspaceMap &targetNullspaceMap, const Ice::Current &=Ice::emptyCurrent) override
Definition: AdmittanceController.cpp:443
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:198
IceUtil::Handle< class RobotUnit >
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::getTCPVel
Ice::FloatSeq getTCPVel(const std::string &rns, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition: AdmittanceController.cpp:429
IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface >
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::updateConfig
void updateConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
NJointController interface.
Definition: AdmittanceController.cpp:340
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::getClassName
std::string getClassName(const Ice::Current &=Ice::emptyCurrent) const override
Definition: AdmittanceController.cpp:134
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::validateConfigData
void validateConfigData(Config &config, ArmPtr &arm)
Definition: AdmittanceController.cpp:475
armarx::control::TargetPoseMap
dictionary< string, FloatSeqSeq > TargetPoseMap
Definition: ControllerInterface.ice:39
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::Config
law::TaskspaceAdmittanceController::Config Config
Definition: AdmittanceController.h:55
armarx::control::NJointTaskspaceAdmittanceControllerInterface::calibrateFTSensor
void calibrateFTSensor()
ARMARX_INFO_S
#define ARMARX_INFO_S
Definition: Logging.h:202
ARMARX_CHECK_EQUAL
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
Definition: ExpressionException.h:130
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
ARMARX_RT_LOGF_WARN
#define ARMARX_RT_LOGF_WARN(...)
Definition: ControlThreadOutputBuffer.h:350
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::onInitNJointController
void onInitNJointController() override
NJointControllerBase interface.
Definition: AdmittanceController.cpp:140
armarx::PackagePath
Definition: PackagePath.h:52
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::GenerateConfigFromVariants
static ConfigPtrT GenerateConfigFromVariants(const StringVariantBaseMap &values)
Definition: AdmittanceController.cpp:680
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
armarx::control::njoint_controller::task_space::NJointTaskspaceAdmittanceController::NJointTaskspaceAdmittanceController
NJointTaskspaceAdmittanceController(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
Definition: AdmittanceController.cpp:91
RTUtility.h
armarx::ManagedIceObject::getObjectScheduler
ArmarXObjectSchedulerPtr getObjectScheduler() const
Definition: ManagedIceObject.cpp:776
armarx::NJointControllerBase::useSensorValue
const SensorValueBase * useSensorValue(const std::string &sensorDeviceName) const
Get a const ptr to the given SensorDevice's SensorValue.
Definition: NJointController.cpp:383
VirtualRobot::RobotPtr
std::shared_ptr< class Robot > RobotPtr
Definition: Bus.h:19
PackagePath.h