RobotUnitModuleUnits.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 RobotAPI::ArmarXObjects::RobotUnit
17  * @author Raphael Grimm ( raphael dot grimm at kit dot edu )
18  * @date 2018
19  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20  * GNU General Public License
21  */
22 
23 #include "RobotUnitModuleUnits.h"
24 
27 
31 
32 #include "../RobotUnit.h"
33 #include "../SensorValues/SensorValue1DoFActuator.h"
34 #include "../Units/ForceTorqueSubUnit.h"
35 #include "../Units/InertialMeasurementSubUnit.h"
36 #include "../Units/KinematicSubUnit.h"
37 #include "../Units/PlatformSubUnit.h"
38 #include "../Units/TCPControllerSubUnit.h"
39 #include "../Units/TrajectoryControllerSubUnit.h"
40 
42 {
43  /**
44  * \brief This class allows minimal access to private members of \ref ControlThread in a sane fashion for \ref RobotUnitEmergencyStopMaster.
45  * \warning !! DO NOT ADD ADDITIONAL FRIENDS IF YOU DO NOT KNOW WAHT YOU ARE DOING! IF YOU DO SOMETHING WRONG YOU WILL CAUSE UNDEFINED BEHAVIOUR !!
46  */
48  {
50 
51  static void
52  SetEmergencyStopStateNoReportToTopic(ControlThread* controlThreadModule,
53  EmergencyStopState state)
54  {
55  controlThreadModule->setEmergencyStopStateNoReportToTopic(state);
56  }
57  };
58 } // namespace armarx::RobotUnitModule
59 
61 {
63  virtual public ManagedIceObject,
64  virtual public EmergencyStopMasterInterface
65  {
66  public:
68  std::string emergencyStopTopicName) :
70  {
73  }
74 
75  void
76  setEmergencyStopState(EmergencyStopState state,
77  const Ice::Current& = Ice::emptyCurrent) final override
78  {
79  if (getEmergencyStopState() == state)
80  {
81  return;
82  }
83  ControlThreadAttorneyForRobotUnitEmergencyStopMaster::
84  SetEmergencyStopStateNoReportToTopic(controlThreadModule, state);
85  emergencyStopTopic->reportEmergencyStopState(state);
86  }
87 
88  EmergencyStopState
89  getEmergencyStopState(const Ice::Current& = Ice::emptyCurrent) const final override
90  {
92  }
93 
94  protected:
95  void
96  onInitComponent() final override
97  {
99  }
100 
101  void
102  onConnectComponent() final override
103  {
104  emergencyStopTopic = armarx::ManagedIceObject::getTopic<EmergencyStopListenerPrx>(
106  setEmergencyStopState(EmergencyStopState::eEmergencyStopInactive);
107  }
108 
109  std::string
110  getDefaultName() const final override
111  {
112  return "EmergencyStopMaster";
113  }
114 
115  protected:
117  const std::string emergencyStopTopicName;
118  EmergencyStopListenerPrx emergencyStopTopic;
119  };
120 } // namespace armarx::RobotUnitModule
121 
122 namespace armarx::RobotUnitModule
123 {
124  Ice::ObjectProxySeq
125  Units::getUnits(const Ice::Current&) const
126  {
127  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
128  std::vector<ManagedIceObjectPtr> unitsCopy;
129  {
130  auto guard = getGuard();
131  //copy to keep lock retention time low
132  unitsCopy = units;
133  }
134  Ice::ObjectProxySeq r;
135  r.reserve(unitsCopy.size());
136  for (const ManagedIceObjectPtr& unit : unitsCopy)
137  {
138  r.emplace_back(unit->getProxy(-1, true));
139  }
140  return r;
141  }
142 
143  Ice::ObjectPrx
144  Units::getUnit(const std::string& staticIceId, const Ice::Current&) const
145  {
146  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
147  //no lock required
148  ManagedIceObjectPtr unit = getUnit(staticIceId);
149  if (unit)
150  {
151  return unit->getProxy(-1, true);
152  }
153  return nullptr;
154  }
155 
156  const EmergencyStopMasterInterfacePtr&
158  {
159  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
160  return emergencyStopMaster;
161  }
162 
163  void
165  {
166  ARMARX_TRACE;
167  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
168  auto beg = TimeUtil::GetTime(true);
169  {
170  ARMARX_TRACE;
171  auto guard = getGuard();
172 
173  ARMARX_TRACE;
175  ARMARX_INFO << "initializing default units";
176 
177  ARMARX_TRACE;
179  ARMARX_DEBUG << "KinematicUnit initialized";
180 
181  ARMARX_TRACE;
182  if (_module<RobotData>().arePlatformAndLocalizationUnitsEnabled())
183  {
184  ARMARX_DEBUG << "initializing LocalizationUnit";
186  ARMARX_DEBUG << "LocalizationUnit initialized";
187  }
188  ARMARX_TRACE;
189 
190  if (_module<RobotData>().arePlatformAndLocalizationUnitsEnabled())
191  {
192  ARMARX_DEBUG << "initializing PlatformUnit";
194  ARMARX_DEBUG << "PlatformUnit initialized";
195  }
196 
197  ARMARX_TRACE;
199  ARMARX_DEBUG << "ForceTorqueUnit initialized";
200 
201  ARMARX_TRACE;
203  ARMARX_DEBUG << "InertialMeasurementUnit initialized";
204 
205  ARMARX_TRACE;
207  ARMARX_DEBUG << "TrajectoryControllerUnit initialized";
208 
209  ARMARX_TRACE;
211  ARMARX_DEBUG << "TcpControllerUnit initialized";
212 
213  ARMARX_TRACE;
214  }
215  ARMARX_INFO << "initializing default units...done! "
216  << (TimeUtil::GetTime(true) - beg).toMicroSeconds() << " us";
217  }
218 
219  void
221  {
222  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
223  using IfaceT = KinematicUnitInterface;
224 
225  auto guard = getGuard();
227  //check if unit is already added
228  if (getUnit(IfaceT::ice_staticId()))
229  {
230  return;
231  }
232  auto unit = createKinematicSubUnit(getIceProperties()->clone());
233  //add
234  if (unit)
235  {
236  addUnit(std::move(unit));
237  }
238  }
239 
242  const std::string& positionControlMode,
243  const std::string& velocityControlMode,
244  const std::string& torqueControlMode,
245  const std::string& pwmControlMode)
246  {
247  ARMARX_TRACE;
248  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
249  /// TODO move init code to Kinematic sub unit
250  using UnitT = KinematicSubUnit;
251 
252  //add ctrl et al
253  ARMARX_DEBUG << "createKinematicSubUnit...";
254  std::map<std::string, UnitT::ActuatorData> devs;
255  for (const ControlDevicePtr& controlDevice :
256  _module<Devices>().getControlDevices().values())
257  {
258  ARMARX_CHECK_NOT_NULL(controlDevice);
259  const auto& controlDeviceName = controlDevice->getDeviceName();
260  ARMARX_DEBUG << "looking at device " << controlDeviceName
261  << controlDevice->getJointControllerToTargetTypeNameMap();
262  if (!controlDevice->hasTag(ControlDeviceTags::CreateNoDefaultController))
263  {
264  UnitT::ActuatorData ad;
265  ad.name = controlDeviceName;
266  ARMARX_DEBUG << "has sensor device: "
267  << _module<Devices>().getSensorDevices().has(controlDeviceName);
268  ad.sensorDeviceIndex =
269  _module<Devices>().getSensorDevices().has(controlDeviceName)
270  ? _module<Devices>().getSensorDevices().index(controlDeviceName)
272 
273  const auto init_controller =
274  [&](const std::string& requestedControlMode, auto& ctrl, const auto* tpptr)
275  {
276  auto controlMode = requestedControlMode;
277  using CtargT = std::remove_const_t<std::remove_reference_t<decltype(*tpptr)>>;
278  NJointKinematicUnitPassThroughControllerPtr& pt = ctrl;
279 
280  auto testMode = [&](const auto& m)
281  {
282  JointController* jointCtrl = controlDevice->getJointController(m);
283  return jointCtrl && jointCtrl->getControlTarget()->isA<CtargT>();
284  };
285 
286  if (!testMode(controlMode))
287  {
288  controlMode = "";
289  //try to find the correct mode (maybe the specified target was derived!
290  //this only works, if exactly one controller provides this mode
291  const JointController* selected_ctrl{nullptr};
292  auto jointControllers = controlDevice->getJointControllers();
293  for (const auto* jointController : jointControllers)
294  {
295  if (jointController->getControlTarget()->isA<CtargT>())
296  {
297  if (selected_ctrl)
298  {
299  selected_ctrl = nullptr;
300  ARMARX_INFO << "Autodetected two controllers supporting "
301  << requestedControlMode << "! autoselection failed";
302  break;
303  }
304  selected_ctrl = jointController;
305  }
306  }
307  if (selected_ctrl)
308  {
309  controlMode = selected_ctrl->getControlMode();
310  ARMARX_INFO << "Autodetected controller with mode " << controlMode
311  << "(the requested mode was " << requestedControlMode
312  << ")";
313  }
314  }
315 
316  if (!controlMode.empty())
317  {
318  NJointKinematicUnitPassThroughControllerConfigPtr config =
320  config->controlMode = controlMode;
321  config->deviceName = controlDeviceName;
322  auto ctrl_name = getName() + "_" + "NJointKU_PTCtrl_" + controlDeviceName +
323  "_" + controlMode;
324  std::replace(ctrl_name.begin(), ctrl_name.end(), '.', '_');
325  std::replace(ctrl_name.begin(), ctrl_name.end(), '-', '_');
326  std::replace(ctrl_name.begin(), ctrl_name.end(), ':', '_');
327  const NJointControllerBasePtr& nJointCtrl =
328  _module<ControllerManagement>().createNJointController(
329  "NJointKinematicUnitPassThroughController",
330  ctrl_name,
331  config,
332  false,
333  true);
334  pt = NJointKinematicUnitPassThroughControllerPtr::dynamicCast(nJointCtrl);
336  }
337  };
338  init_controller(
339  positionControlMode, ad.ctrlPos, (ControlTarget1DoFActuatorPosition*)0);
340  init_controller(
341  velocityControlMode, ad.ctrlVel, (ControlTarget1DoFActuatorVelocity*)0);
342  init_controller(torqueControlMode, ad.ctrlTor, (ControlTarget1DoFActuatorTorque*)0);
343  if (!ad.ctrlTor)
344  {
345  init_controller(pwmControlMode, ad.ctrlTor, (ControlTarget1DoFActuatorPWM*)0);
346  }
347 
348  if (ad.ctrlPos || ad.ctrlTor || ad.ctrlVel)
349  {
350  ARMARX_DEBUG << "created controllers for " << controlDeviceName
351  << " pos/tor/vel " << ad.ctrlPos.get() << " / " << ad.ctrlTor.get()
352  << " / " << ad.ctrlVel.get();
353  devs[controlDeviceName] = std::move(ad);
354  }
355  }
356  }
357  if (devs.empty())
358  {
359  ARMARX_IMPORTANT << "No joint devices found - skipping adding of KinematicUnit";
360  return nullptr;
361  }
362  ARMARX_IMPORTANT << "Found " << devs.size() << " joint devices - adding KinematicUnit";
363  ARMARX_CHECK_EXPRESSION(!devs.empty())
364  << "no 1DoF ControlDevice found with matching SensorDevice";
365  //add it
366  const std::string configName = getProperty<std::string>("KinematicUnitName");
367  const std::string confPre = getConfigDomain() + "." + configName + ".";
368  //properties->setProperty(confPre + "MinimumLoggingLevel", getProperty<std::string>("MinimumLoggingLevel").getValue());
369  //fill properties
370  properties->setProperty(confPre + "RobotNodeSetName",
371  _module<RobotData>().getRobotNodetSeName());
372  properties->setProperty(confPre + "RobotFileName", _module<RobotData>().getRobotFileName());
373  properties->setProperty(confPre + "RobotFileNameProject",
374  _module<RobotData>().getRobotProjectName());
375  properties->setProperty(confPre + "TopicPrefix",
376  getProperty<std::string>("KinematicUnitNameTopicPrefix"));
377 
378  ARMARX_DEBUG << "creating unit " << configName
379  << " using these properties: " << properties->getPropertiesForPrefix("");
381  Component::create<UnitT>(properties, configName, getConfigDomain());
382 
383  //fill devices (sensor + controller)
384  unit->setupData(getProperty<std::string>("RobotFileName").getValue(),
385  _module<RobotData>().cloneRobot(),
386  std::move(devs),
387  _module<Devices>().getControlModeGroups().groups,
388  _module<Devices>().getControlModeGroups().groupsMerged,
389  dynamic_cast<RobotUnit*>(this));
390  return unit;
391  }
392 
393  void
395  {
396  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
397  using UnitT = PlatformSubUnit;
398  using IfaceT = PlatformUnitInterface;
399 
400  ARMARX_TRACE;
401 
402  auto guard = getGuard();
404  //check if unit is already added
405  if (getUnit(IfaceT::ice_staticId()))
406  {
407  return;
408  }
409  ARMARX_TRACE;
410  //is there a platform dev?
411  if (_module<RobotData>().getRobotPlatformName().empty())
412  {
413  ARMARX_INFO << "no platform unit created since no platform name was given";
414  return;
415  }
416  ARMARX_TRACE;
417  if (!_module<Devices>().getControlDevices().has(
418  _module<RobotData>().getRobotPlatformName()))
419  {
421  << "no platform unit created since the platform control device with name '"
422  << _module<RobotData>().getRobotPlatformName() << "' was not found";
423  return;
424  }
425  ARMARX_TRACE;
426  const ControlDevicePtr& controlDevice =
427  _module<Devices>().getControlDevices().at(_module<RobotData>().getRobotPlatformName());
428  const SensorDevicePtr& sensorDevice =
429  _module<Devices>().getSensorDevices().at(_module<RobotData>().getRobotPlatformName());
430  JointController* jointVel =
431  controlDevice->getJointController(ControlModes::HolonomicPlatformVelocity);
432  ARMARX_TRACE;
433  ARMARX_CHECK_EXPRESSION(jointVel);
435  sensorDevice->getSensorValue()->asA<SensorValueHolonomicPlatform>());
436  //add it
437  ARMARX_TRACE;
438  const std::string configName = getProperty<std::string>("PlatformUnitName");
439  const std::string confPre = getConfigDomain() + "." + configName + ".";
440  Ice::PropertiesPtr properties = getIceProperties()->clone();
441  //properties->setProperty(confPre + "MinimumLoggingLevel", getProperty<std::string>("MinimumLoggingLevel").getValue());
442  //fill properties
443  properties->setProperty(confPre + "PlatformName",
444  _module<RobotData>().getRobotPlatformInstanceName());
445  ARMARX_DEBUG << "creating unit " << configName
446  << " using these properties: " << properties->getPropertiesForPrefix("");
447  ARMARX_TRACE;
449  Component::create<UnitT>(properties, configName, getConfigDomain());
450  //config
451  ARMARX_TRACE;
452  NJointHolonomicPlatformUnitVelocityPassThroughControllerConfigPtr config =
454  config->initialVelocityX = 0;
455  config->initialVelocityY = 0;
456  config->initialVelocityRotation = 0;
457  config->platformName = _module<RobotData>().getRobotPlatformName();
458  auto ctrl = NJointHolonomicPlatformUnitVelocityPassThroughControllerPtr::dynamicCast(
459  _module<ControllerManagement>().createNJointController(
460  "NJointHolonomicPlatformUnitVelocityPassThroughController",
461  getName() + "_" + configName + "_VelPTContoller",
462  config,
463  false,
464  true));
465  ARMARX_TRACE;
467  unit->pt = ctrl;
468  ARMARX_TRACE;
469 
470  NJointHolonomicPlatformRelativePositionControllerConfigPtr configRelativePositionCtrlCfg =
472  configRelativePositionCtrlCfg->platformName = _module<RobotData>().getRobotPlatformName();
473  auto ctrlRelativePosition =
474  NJointHolonomicPlatformRelativePositionControllerPtr::dynamicCast(
475  _module<ControllerManagement>().createNJointController(
476  "NJointHolonomicPlatformRelativePositionController",
477  getName() + "_" + configName + "_RelativePositionContoller",
478  configRelativePositionCtrlCfg,
479  false,
480  true));
481  ARMARX_CHECK_EXPRESSION(ctrlRelativePosition);
482  unit->pt = ctrl;
483  unit->relativePosCtrl = ctrlRelativePosition;
484 
485  // unit->platformSensorIndex = _module<Devices>().getSensorDevices().index(_module<RobotData>().getRobotPlatformName());
486 
487  NJointHolonomicPlatformGlobalPositionControllerConfigPtr configGlobalPositionCtrlCfg =
489  configGlobalPositionCtrlCfg->platformName = _module<RobotData>().getRobotPlatformName();
490  auto ctrlGlobalPosition = NJointHolonomicPlatformGlobalPositionControllerPtr::dynamicCast(
491  _module<ControllerManagement>().createNJointController(
492  "NJointHolonomicPlatformGlobalPositionController",
493  getName() + "_" + configName + "_GlobalPositionContoller",
494  configGlobalPositionCtrlCfg,
495  false,
496  true));
497  ARMARX_TRACE;
498  ARMARX_CHECK_EXPRESSION(ctrlGlobalPosition);
499  unit->pt = ctrl;
500  unit->globalPosCtrl = ctrlGlobalPosition;
501  ARMARX_TRACE;
502 
503  unit->platformSensorIndex = _module<Devices>().getSensorDevices().index(
504  _module<RobotData>().getRobotPlatformName());
505  //add
506  addUnit(std::move(unit));
507  }
508 
509  void
511  {
512  ARMARX_TRACE;
513  ARMARX_DEBUG << "initializeLocalizationUnit";
514 
515  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
516  using UnitT = LocalizationSubUnit;
517  using IfaceT = LocalizationUnitInterface;
518 
519  ARMARX_TRACE;
520  auto guard = getGuard();
522  //check if unit is already added
523  if (getUnit(IfaceT::ice_staticId()))
524  {
525  return;
526  }
527  ARMARX_TRACE;
528 
529  ARMARX_DEBUG << "Getting device SensorValueHolonomicPlatformRelativePosition";
530  ARMARX_CHECK(
531  _module<Devices>().getSensorDevices().has(_module<RobotData>().getRobotPlatformName()))
532  << _module<RobotData>().getRobotPlatformName();
533  const SensorDevicePtr& sensorDeviceRelativePosition =
534  _module<Devices>().getSensorDevices().at(_module<RobotData>().getRobotPlatformName());
535  ARMARX_CHECK_EXPRESSION(sensorDeviceRelativePosition->getSensorValue()
537 
538  ARMARX_TRACE;
539  // const SensorDevicePtr& sensorDevicePoseCorrection = _module<Devices>().getSensorDevices().at(GlobalRobotPoseCorrectionSensorDevice::DeviceName());
540  // ARMARX_CHECK_EXPRESSION(sensorDeviceRelativePosition->getSensorValue()->asA<SensorValueGlobalPoseCorrection>());
541 
542 
543  //add it
544  const std::string configName = "LocalizationUnit";
545  const std::string confPre = getConfigDomain() + "." + configName + ".";
546  Ice::PropertiesPtr properties = getIceProperties()->clone();
547  //properties->setProperty(confPre + "MinimumLoggingLevel", getProperty<std::string>("MinimumLoggingLevel").getValue());
548  //fill properties
549  // properties->setProperty(confPre + "PlatformName", _module<RobotData>().getRobotPlatformInstanceName());
550  ARMARX_DEBUG << "creating unit " << configName
551  << " using these properties: " << properties->getPropertiesForPrefix("");
553  Component::create<UnitT>(properties, configName, getConfigDomain());
554  //config
555 
556  ARMARX_DEBUG << "Setting device GlobalRobotPoseCorrectionSensorDevice";
557  unit->globalPositionCorrectionSensorDevice =
558  dynamic_cast<decltype(unit->globalPositionCorrectionSensorDevice)>(
559  _module<Devices>()
560  .getSensorDevices()
562  .get());
563 
564 
565  const SensorDevicePtr& sensorDeviceGlobalRobotLocalization =
566  _module<Devices>().getSensorDevices().at(
568  ARMARX_CHECK_EXPRESSION(sensorDeviceGlobalRobotLocalization->getSensorValue()
570 
571  dynamic_cast<GlobalRobotLocalizationSensorDevice&>(*sensorDeviceGlobalRobotLocalization)
572  .sensorRelativePosition = sensorDeviceRelativePosition->getSensorValue()
574  dynamic_cast<GlobalRobotLocalizationSensorDevice&>(*sensorDeviceGlobalRobotLocalization)
576  unit->globalPositionCorrectionSensorDevice->getSensorValue()
578 
579  //add
580  addUnit(unit);
581  }
582 
583  void
585  {
586  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
587  using UnitT = ForceTorqueSubUnit;
588  using IfaceT = ForceTorqueUnitInterface;
589 
590  auto guard = getGuard();
592  //check if unit is already added
593  if (getUnit(IfaceT::ice_staticId()))
594  {
595  return;
596  }
597  //check if it is required
598  std::vector<ForceTorqueSubUnit::DeviceData> ftdevs;
599  for (const SensorDevicePtr& ftSensorDevice : _module<Devices>().getSensorDevices().values())
600  {
601  if (ftSensorDevice->getSensorValue()->isA<SensorValueForceTorque>())
602  {
603  ForceTorqueSubUnit::DeviceData ftSensorData;
604  ftSensorData.sensorIndex =
605  _module<Devices>().getSensorDevices().index(ftSensorDevice->getDeviceName());
606  ftSensorData.deviceName = ftSensorDevice->getDeviceName();
607  ftSensorData.frame = ftSensorDevice->getReportingFrame();
608  ARMARX_CHECK_EXPRESSION(!ftSensorData.frame.empty())
609  << "The sensor device '" << ftSensorData.deviceName
610  << "' (index: " << ftSensorData.sensorIndex
611  << ") reports force torque values but returns an empty string as reporting "
612  "frame";
613  ARMARX_CHECK_EXPRESSION(unitCreateRobot->hasRobotNode(ftSensorData.frame))
614  << "The sensor device '" << ftSensorData.deviceName
615  << "' (index: " << ftSensorData.sensorIndex
616  << ") reports force torque values but returns a reporting frame '"
617  << ftSensorData.frame << "' which is not present in the robot '"
618  << _module<RobotData>().getRobotName() << "'";
619  ftdevs.emplace_back(std::move(ftSensorData));
620  }
621  }
622  if (ftdevs.empty())
623  {
625  << "no force torque unit created since there are no force torque sensor devices";
626  return;
627  }
628  //add it
629  const std::string configName = getProperty<std::string>("ForceTorqueUnitName");
630  const std::string confPre = getConfigDomain() + "." + configName + ".";
631  Ice::PropertiesPtr properties = getIceProperties()->clone();
632  //properties->setProperty(confPre + "MinimumLoggingLevel", getProperty<std::string>("MinimumLoggingLevel").getValue());
633  //fill properties
634  properties->setProperty(confPre + "AgentName", _module<RobotData>().getRobotName());
635  properties->setProperty(confPre + "ForceTorqueTopicName",
636  getProperty<std::string>("ForceTorqueTopicName").getValue());
637  ARMARX_DEBUG << "creating unit " << configName
638  << " using these properties: " << properties->getPropertiesForPrefix("");
640  Component::create<UnitT>(properties, configName, getConfigDomain());
641  unit->devs = ftdevs;
642  //add
643  addUnit(std::move(unit));
644  }
645 
646  void
648  {
649  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
650  using UnitT = InertialMeasurementSubUnit;
651  using IfaceT = InertialMeasurementUnitInterface;
652 
653  auto guard = getGuard();
655  //check if unit is already added
656  if (getUnit(IfaceT::ice_staticId()))
657  {
658  return;
659  }
660  //check if it is required
661  std::map<std::string, std::size_t> imudevs;
662  for (auto i : getIndices(_module<Devices>().getSensorDevices().keys()))
663  {
664  const SensorDevicePtr& sensorDevice = _module<Devices>().getSensorDevices().at(i);
665  if (sensorDevice->getSensorValue()->isA<SensorValueIMU>())
666  {
667  imudevs[sensorDevice->getDeviceName()] = i;
668  }
669  }
670  if (imudevs.empty())
671  {
673  << "no inertial measurement unit created since there are no imu sensor devices";
674  return;
675  }
676  //add it
677  const std::string configName = getProperty<std::string>("InertialMeasurementUnitName");
678  const std::string confPre = getConfigDomain() + "." + configName + ".";
679  Ice::PropertiesPtr properties = getIceProperties()->clone();
680  //properties->setProperty(confPre + "MinimumLoggingLevel", getProperty<std::string>("MinimumLoggingLevel").getValue());
681  //fill properties
682  properties->setProperty(confPre + "IMUTopicName",
683  getProperty<std::string>("IMUTopicName").getValue());
685  Component::create<UnitT>(properties, configName, getConfigDomain());
686  unit->devs = imudevs;
687  //add
688  addUnit(std::move(unit));
689  }
690 
691  void
693  {
694  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
695  auto guard = getGuard();
697  using UnitT = TrajectoryControllerSubUnit;
698  if (!getProperty<bool>("CreateTrajectoryPlayer").getValue())
699  {
700  return;
701  }
702 
703  //check if unit is already added
704  if (getUnit(UnitT::ice_staticId()) || !trajectoryControllerSubUnit)
705  {
706  return;
707  }
708  (TrajectoryControllerSubUnitPtr::dynamicCast(trajectoryControllerSubUnit))
709  ->setup(_modulePtr<RobotUnit>());
710  addUnit(trajectoryControllerSubUnit);
711  trajectoryControllerSubUnit = nullptr;
712  }
713 
714  void
716  {
717  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
718  auto guard = getGuard();
720 
721  if (!getProperty<bool>("CreateTCPControlUnit").getValue())
722  {
723  return;
724  }
725  using UnitT = TCPControllerSubUnit;
726 
727  //check if unit is already added
728  if (getUnit(UnitT::ice_staticId()))
729  {
730  return;
731  }
732  (TCPControllerSubUnitPtr::dynamicCast(tcpControllerSubUnit))
733  ->setup(_modulePtr<RobotUnit>(), _module<RobotData>().cloneRobot());
734  addUnit(tcpControllerSubUnit);
735  tcpControllerSubUnit = nullptr;
736  }
737 
738  void
740  {
741  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
742  ARMARX_CHECK_NOT_NULL(unit);
743  auto guard = getGuard();
745  getArmarXManager()->addObjectAsync(unit, "", true, false);
746  //maybe add it to the sub units
747  RobotUnitSubUnitPtr rsu = RobotUnitSubUnitPtr::dynamicCast(unit);
748  if (rsu)
749  {
750  subUnits.emplace_back(std::move(rsu));
751  }
752  units.emplace_back(std::move(unit));
753  }
754 
755  void
756  Units::_icePropertiesInitialized()
757  {
758  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
759  Ice::PropertiesPtr properties = getIceProperties()->clone();
760  const std::string& configDomain = "ArmarX";
761  // create TCPControlSubUnit
762 
763  {
764  const std::string configNameTCPControlUnit =
765  getProperty<std::string>("TCPControlUnitName");
766  tcpControllerSubUnit = Component::create<TCPControllerSubUnit, TCPControllerSubUnitPtr>(
767  properties, configNameTCPControlUnit, configDomain);
768  addPropertyUser(PropertyUserPtr::dynamicCast(tcpControllerSubUnit));
769  }
770 
771  // create TrajectoryControllerSubUnit
772 
773  {
774  const std::string configNameTrajectoryControllerUnit =
775  getProperty<std::string>("TrajectoryControllerUnitName");
776  const std::string confPre =
777  configDomain + "." + configNameTrajectoryControllerUnit + ".";
778  properties->setProperty(confPre + "KinematicUnitName",
779  getProperty<std::string>("KinematicUnitName").getValue());
780  trajectoryControllerSubUnit =
781  Component::create<TrajectoryControllerSubUnit, TrajectoryControllerSubUnitPtr>(
782  properties, configNameTrajectoryControllerUnit, configDomain);
783  addPropertyUser(PropertyUserPtr::dynamicCast(trajectoryControllerSubUnit));
784  }
785  }
786 
787  void
788  Units::_preFinishRunning()
789  {
790  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
791  //remove all units
792  subUnits.clear();
793  for (ManagedIceObjectPtr& unit : units)
794  {
795  getArmarXManager()->removeObjectBlocking(unit->getName());
796  }
797  units.clear();
798  }
799 
800  void
801  Units::_preOnInitRobotUnit()
802  {
803  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
804  unitCreateRobot = _module<RobotData>().cloneRobot();
805  ARMARX_DEBUG << "add emergency stop master";
806  {
807  emergencyStopMaster = new RobotUnitEmergencyStopMaster{
808  &_module<ControlThread>(),
809  getProperty<std::string>("EmergencyStopTopic").getValue()};
810  ManagedIceObjectPtr obj = ManagedIceObjectPtr::dynamicCast(emergencyStopMaster);
811  ARMARX_CHECK_EXPRESSION(obj) << "RobotUnitEmergencyStopMaster";
812  getArmarXManager()->addObject(
813  obj, getProperty<std::string>("EmergencyStopMasterName").getValue(), true);
814  auto prx = obj->getProxy(-1);
815  try
816  {
817  getArmarXManager()->getIceManager()->getIceGridSession()->getAdmin()->addObject(
818  prx);
819  }
820  catch (const IceGrid::ObjectExistsException&)
821  {
822  getArmarXManager()->getIceManager()->getIceGridSession()->getAdmin()->updateObject(
823  prx);
824  }
825  catch (std::exception& e)
826  {
827  ARMARX_WARNING << "add the robot unit as emergency stop master to the ice grid "
828  "admin!\nThere was an exception:\n"
829  << e.what();
830  }
831  }
832  ARMARX_DEBUG << "add emergency stop master...done!";
833  }
834 
835  void
836  Units::_postOnExitRobotUnit()
837  {
838  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
839  ARMARX_DEBUG << "remove EmergencyStopMaster";
840  try
841  {
842  getArmarXManager()->removeObjectBlocking(
843  ManagedIceObjectPtr::dynamicCast(emergencyStopMaster));
844  getArmarXManager()->getIceManager()->removeObject(
845  getProperty<std::string>("EmergencyStopMasterName").getValue());
846  }
847  catch (...)
848  {
849  }
850  ARMARX_DEBUG << "remove EmergencyStopMaster...done!";
851  }
852 
853  const ManagedIceObjectPtr&
854  Units::getUnit(const std::string& staticIceId) const
855  {
856  throwIfInControlThread(BOOST_CURRENT_FUNCTION);
857  auto guard = getGuard();
858  for (const ManagedIceObjectPtr& unit : units)
859  {
860  if (unit->ice_isA(staticIceId))
861  {
862  return unit;
863  }
864  }
866  }
867 } // namespace armarx::RobotUnitModule
armarx::SensorValueGlobalRobotPose
Definition: GlobalRobotPoseSensorDevice.h:41
armarx::RobotUnitModule::Units::initializePlatformUnit
virtual void initializePlatformUnit()
Initializes the PlatformUnit.
Definition: RobotUnitModuleUnits.cpp:394
armarx::RobotUnitModule::Units::initializeDefaultUnits
virtual void initializeDefaultUnits()
Calls all init hooks for all managed Units.
Definition: RobotUnitModuleUnits.cpp:164
armarx::RobotUnitModule::Units::initializeForceTorqueUnit
virtual void initializeForceTorqueUnit()
Initializes the ForceTorqueUnit.
Definition: RobotUnitModuleUnits.cpp:584
armarx::NJointHolonomicPlatformGlobalPositionControllerConfig
Definition: NJointHolonomicPlatformGlobalPositionController.h:48
armarx::RobotUnitModule::Units::addUnit
void addUnit(ManagedIceObjectPtr unit)
Registers a unit for management (the Unit is added and removed to the ArmarXManager and updated with ...
Definition: RobotUnitModuleUnits.cpp:739
RobotUnitModuleUnits.h
armarx::KinematicSubUnit
Definition: KinematicSubUnit.h:43
armarx::SensorValueHolonomicPlatform
Definition: SensorValueHolonomicPlatform.h:128
armarx::SensorValueHolonomicPlatformRelativePosition
The robot's position relative to its initial pose when starting the robot unit based on odometry info...
Definition: SensorValueHolonomicPlatform.h:83
armarx::Component::addPropertyUser
void addPropertyUser(const PropertyUserPtr &subPropertyUser)
Add additional property users here that should show up in the application help text.
Definition: Component.cpp:140
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:183
armarx::SensorValueBase::asA
const T * asA() const
Definition: SensorValueBase.h:82
SensorValueHolonomicPlatform.h
armarx::ForceTorqueSubUnit::DeviceData::sensorIndex
std::size_t sensorIndex
Definition: ForceTorqueSubUnit.h:61
armarx::ControlTarget1DoFActuatorPWM
Definition: ControlTarget1DoFActuator.h:177
armarx::ManagedIceObject::NullPtr
static const ManagedIceObjectPtr NullPtr
A nullptr to be used when a const ref to a nullptr is required.
Definition: ManagedIceObject.h:222
armarx::GlobalRobotLocalizationSensorDevice::DeviceName
static std::string DeviceName()
Definition: GlobalRobotPoseSensorDevice.cpp:109
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:206
armarx::getIndices
std::vector< KeyT > getIndices(const std::map< KeyT, ValT > &c)
Definition: algorithm.h:275
armarx::NJointKinematicUnitPassThroughControllerConfig
Definition: NJointKinematicUnitPassThroughController.h:39
armarx::NJointHolonomicPlatformRelativePositionControllerConfig
Definition: NJointHolonomicPlatformRelativePositionController.h:46
armarx::NJointHolonomicPlatformUnitVelocityPassThroughControllerConfig
Definition: NJointHolonomicPlatformUnitVelocityPassThroughController.h:36
armarx::ManagedIceObject::getArmarXManager
ArmarXManagerPtr getArmarXManager() const
Returns the ArmarX manager used to add and remove components.
Definition: ManagedIceObject.cpp:348
armarx::RobotUnitModule::Units::createKinematicSubUnit
ManagedIceObjectPtr createKinematicSubUnit(const Ice::PropertiesPtr &properties, const std::string &positionControlMode=ControlModes::Position1DoF, const std::string &velocityControlMode=ControlModes::Velocity1DoF, const std::string &torqueControlMode=ControlModes::Torque1DoF, const std::string &pwmControlMode=ControlModes::PWM1DoF)
Create the KinematicUnit (this function should be called in initializeKinematicUnit)
Definition: RobotUnitModuleUnits.cpp:241
armarx::RobotUnitModule::Units::getUnits
Ice::ObjectProxySeq getUnits(const Ice::Current &) const override
Returns proxies to all units.
Definition: RobotUnitModuleUnits.cpp:125
ProsthesisInterface.values
values
Definition: ProsthesisInterface.py:190
armarx::RobotUnitModule::RobotUnitEmergencyStopMaster::getEmergencyStopState
EmergencyStopState getEmergencyStopState(const Ice::Current &=Ice::emptyCurrent) const final override
Definition: RobotUnitModuleUnits.cpp:89
armarx::TrajectoryControllerSubUnit
Definition: TrajectoryControllerSubUnit.h:80
armarx::JointController
The JointController class represents one joint in one control mode.
Definition: JointController.h:51
armarx::PlatformSubUnit
Definition: PlatformSubUnit.h:47
armarx::RobotUnitModule::Units::initializeInertialMeasurementUnit
virtual void initializeInertialMeasurementUnit()
Initializes the InertialMeasurementUnit.
Definition: RobotUnitModuleUnits.cpp:647
armarx::RobotUnitModule::RobotUnitEmergencyStopMaster::RobotUnitEmergencyStopMaster
RobotUnitEmergencyStopMaster(ControlThread *controlThreadModule, std::string emergencyStopTopicName)
Definition: RobotUnitModuleUnits.cpp:67
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
armarx::NJointHolonomicPlatformRelativePositionControllerConfig::platformName
std::string platformName
Definition: NJointHolonomicPlatformRelativePositionController.h:50
cxxopts::empty
bool empty(const std::string &s)
Definition: cxxopts.hpp:255
IceInternal::Handle< ManagedIceObject >
armarx::RobotUnitState::InitializingUnits
@ InitializingUnits
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:69
armarx::RobotUnitModule::Units::initializeTcpControllerUnit
virtual void initializeTcpControllerUnit()
Initializes the TcpControllerUnit.
Definition: RobotUnitModuleUnits.cpp:715
armarx::RobotUnitModule::ControlThread
This Module manages the ControlThread.
Definition: RobotUnitModuleControlThread.h:83
armarx::RobotUnitModule::Units::getUnit
T::PointerType getUnit() const
Returns a pointer to the Unit for the given type (or null if there is none)
Definition: RobotUnitModuleUnits.ipp:66
armarx::RobotUnitModule::ControlThread::getEmergencyStopState
EmergencyStopState getEmergencyStopState(const Ice::Current &=Ice::emptyCurrent) const override
Returns the ControlThread's target EmergencyStopState.
Definition: RobotUnitModuleControlThread.cpp:1006
armarx::InertialMeasurementSubUnit
Definition: InertialMeasurementSubUnit.h:36
armarx::RobotUnitModule::ControlThreadAttorneyForRobotUnitEmergencyStopMaster
This class allows minimal access to private members of ControlThread in a sane fashion for RobotUnitE...
Definition: RobotUnitModuleUnits.cpp:47
armarx::GlobalRobotLocalizationSensorDevice
Definition: GlobalRobotPoseSensorDevice.h:104
armarx::RobotUnitModule::RobotUnitEmergencyStopMaster
Definition: RobotUnitModuleUnits.cpp:62
armarx::RobotUnitModule::RobotUnitEmergencyStopMaster::controlThreadModule
ControlThread *const controlThreadModule
Definition: RobotUnitModuleUnits.cpp:116
armarx::GlobalRobotPoseCorrectionSensorDevice::DeviceName
static std::string DeviceName()
Definition: GlobalRobotPoseSensorDevice.cpp:40
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
armarx::RobotUnitModule::Units::initializeKinematicUnit
virtual void initializeKinematicUnit()
Initializes the KinematicUnit.
Definition: RobotUnitModuleUnits.cpp:220
armarx::ManagedIceObjectPtr
IceInternal::Handle< ManagedIceObject > ManagedIceObjectPtr
Definition: ArmarXFwd.h:42
armarx::RobotUnitModule::ModuleBase::getGuard
GuardType getGuard() const
Returns a guard to the RobotUnits mutex.
Definition: RobotUnitModuleBase.cpp:430
armarx::LocalizationSubUnit
Definition: LocalizationSubUnit.h:69
IceManager.h
max
T max(T t1, T t2)
Definition: gdiam.h:48
IceGridAdmin.h
armarx::RobotUnitModule::Units::getEmergencyStopMaster
const EmergencyStopMasterInterfacePtr & getEmergencyStopMaster() const
Returns a pointer to the EmergencyStopMaster.
Definition: RobotUnitModuleUnits.cpp:157
armarx::Component::getConfigDomain
std::string getConfigDomain()
Retrieve config domain for this component as set in constructor.
Definition: Component.cpp:60
armarx::SensorValueGlobalPoseCorrection
The pose correction to obtain the robot's global pose.
Definition: GlobalRobotPoseSensorDevice.h:26
armarx::ForceTorqueSubUnit::DeviceData::frame
std::string frame
Definition: ForceTorqueSubUnit.h:62
armarx::TimeUtil::GetTime
static IceUtil::Time GetTime(TimeMode timeMode=TimeMode::VirtualTime)
Get the current time.
Definition: TimeUtil.cpp:42
armarx::NJointKinematicUnitPassThroughControllerConfig::controlMode
std::string controlMode
Definition: NJointKinematicUnitPassThroughController.h:43
armarx::control::common::getValue
T getValue(nlohmann::json &userConfig, nlohmann::json &defaultConfig, const std::string &entryName)
Definition: utils.h:55
armarx::TCPControllerSubUnit
Definition: TCPControllerSubUnit.h:55
armarx::ManagedIceObject
The ManagedIceObject is the base class for all ArmarX objects.
Definition: ManagedIceObject.h:163
armarx::RobotUnitModule::RobotUnitEmergencyStopMaster::setEmergencyStopState
void setEmergencyStopState(EmergencyStopState state, const Ice::Current &=Ice::emptyCurrent) final override
Definition: RobotUnitModuleUnits.cpp:76
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
armarx::ControlTargetBase::isA
bool isA() const
Definition: ControlTargetBase.h:69
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:174
armarx::RobotUnitModule::Units::initializeTrajectoryControllerUnit
virtual void initializeTrajectoryControllerUnit()
Initializes the TrajectoryControllerUnit.
Definition: RobotUnitModuleUnits.cpp:692
armarx::ManagedIceObject::offeringTopic
void offeringTopic(const std::string &name)
Registers a topic for retrival after initialization.
Definition: ManagedIceObject.cpp:290
armarx::ForceTorqueSubUnit::DeviceData::deviceName
std::string deviceName
Definition: ForceTorqueSubUnit.h:60
armarx::RobotUnit
The RobotUnit class manages a robot and its controllers.
Definition: RobotUnit.h:180
armarx::RobotUnitModule::RobotUnitEmergencyStopMaster::onInitComponent
void onInitComponent() final override
Pure virtual hook for the subclass.
Definition: RobotUnitModuleUnits.cpp:96
LocalizationSubUnit.h
armarx::RobotUnitModule::Units::initializeLocalizationUnit
virtual void initializeLocalizationUnit()
Initializes the TcpControllerUnit.
Definition: RobotUnitModuleUnits.cpp:510
armarx::ForceTorqueSubUnit
Definition: ForceTorqueSubUnit.h:34
armarx::RobotUnitModule::RobotUnitEmergencyStopMaster::emergencyStopTopic
EmergencyStopListenerPrx emergencyStopTopic
Definition: RobotUnitModuleUnits.cpp:118
armarx::RobotUnitModule::ModuleBase::throwIfInControlThread
void throwIfInControlThread(const std::string &fnc) const
Throws if the current thread is the ControlThread.
Definition: RobotUnitModuleBase.cpp:416
armarx::NJointHolonomicPlatformUnitVelocityPassThroughControllerConfig::initialVelocityX
float initialVelocityX
Definition: NJointHolonomicPlatformUnitVelocityPassThroughController.h:41
armarx::ForceTorqueSubUnit::DeviceData
Definition: ForceTorqueSubUnit.h:58
armarx::RobotUnitModule::RobotUnitEmergencyStopMaster::getDefaultName
std::string getDefaultName() const final override
Retrieve default name of component.
Definition: RobotUnitModuleUnits.cpp:110
GlobalRobotPoseSensorDevice.h
armarx::ManagedIceObject::getName
std::string getName() const
Retrieve name of object.
Definition: ManagedIceObject.cpp:107
armarx::GlobalRobotLocalizationSensorDevice::sensorGlobalPositionCorrection
const SensorValueGlobalPoseCorrection * sensorGlobalPositionCorrection
Definition: GlobalRobotPoseSensorDevice.h:114
armarx::RobotUnitModule::ModuleBase::throwIfStateIsNot
void throwIfStateIsNot(const std::set< RobotUnitState > &stateSet, const std::string &fnc, bool onlyWarn=false) const
Throws an exception if the current state is not in.
Definition: RobotUnitModuleBase.cpp:456
armarx::RobotUnitModule
Definition: ControlDevice.h:34
armarx::PropertyUser::getIceProperties
Ice::PropertiesPtr getIceProperties() const
Returns the set of Ice properties.
Definition: PropertyUser.cpp:229
armarx::JointController::getControlTarget
virtual ControlTargetBase * getControlTarget()=0
Definition: JointController.h:144
armarx::NJointHolonomicPlatformGlobalPositionControllerConfig::platformName
std::string platformName
Definition: NJointHolonomicPlatformGlobalPositionController.h:52
armarx::RobotUnitModule::RobotUnitEmergencyStopMaster::emergencyStopTopicName
const std::string emergencyStopTopicName
Definition: RobotUnitModuleUnits.cpp:117
armarx::SensorValueForceTorque
Definition: SensorValueForceTorque.h:31
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
armarx::GlobalRobotLocalizationSensorDevice::sensorRelativePosition
const SensorValueHolonomicPlatformRelativePosition * sensorRelativePosition
Definition: GlobalRobotPoseSensorDevice.h:115
armarx::RobotUnitModule::RobotUnitEmergencyStopMaster::onConnectComponent
void onConnectComponent() final override
Pure virtual hook for the subclass.
Definition: RobotUnitModuleUnits.cpp:102
armarx::SensorValueIMU
Definition: SensorValueIMU.h:35