26#include <VirtualRobot/RobotNodeSet.h>
49 NJointControllerRegistration<NJointTaskspaceCollisionAvoidanceMixedImpedanceVelocityController>
51 "NJointTaskspaceCollisionAvoidanceMixedImpedanceVelocityController");
56 const NJointControllerConfigPtr& config,
60 ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
62 userCfgWithColl = CollisionCtrlCfg::FromAron(cfg->config);
64 std::map<std::string, std::vector<size_t>> velCtrlIndices;
65 for (
auto& arm : this->
limb)
67 velCtrlIndices.emplace(arm.first, arm.second->rtStatus.jointIDVelocityMode);
69 coll = std::make_shared<core::CollisionAvoidanceBase>(
70 rtGetRobot(), userCfgWithColl.coll, velCtrlIndices);
71 collReady.store(
true);
72 const std::string rootNodeName =
"root";
73 rootNode =
rtGetRobot()->getRobotNode(rootNodeName);
79 const Ice::Current&)
const
81 return "NJointTaskspaceCollisionAvoidanceMixedImpedanceVelocityController";
92 arm->controller.run(arm->rtConfig, arm->rtStatus);
98 const std::string rootNodeName =
"root";
100 coll->collLimb.at(arm->kinematicChainName).rts.globalPose =
102 coll->rtLimbControllerRun(arm->kinematicChainName,
103 arm->rtStatus.jointPosition,
104 arm->rtStatus.qvelFiltered,
105 arm->rtConfig.torqueLimit,
106 arm->rtStatus.desiredJointTorque,
111 if (collReady.load())
114 arm->rtStatus.nDoFTorque,
115 arm->rtStatus.nDoFVelocity,
116 coll->collLimb.at(arm->kinematicChainName).rts.desiredJointTorques,
117 arm->rtStatus.desiredJointVelocity);
122 arm->rtStatus.nDoFTorque,
123 arm->rtStatus.nDoFVelocity,
124 arm->rtStatus.desiredJointTorque,
125 arm->rtStatus.desiredJointVelocity);
151 const IceUtil::Time& sensorValuesTimestamp,
152 const IceUtil::Time& timeSinceLastIteration)
154 double deltaT = timeSinceLastIteration.toSecondsDouble();
157 if (collReady.load())
160 coll->updateRtConfigFromUser();
161 coll->rtCollisionChecking();
163 for (
auto& pair :
limb)
170 for (
auto& pair :
limb)
172 this->
limbRT(pair.second, deltaT);
176 hands->updateRTStatus(deltaT);
183 const Ice::Current& iceCurrent)
186 auto cfg = common::control_law::arondto::CollisionAvoidanceConfigDict::FromAron(dto);
187 coll->setUserCfg(cfg);
192 const Ice::Current& iceCurrent)
194 if (not collReady.load())
198 return coll->userCfg.toAronDTO();
203 const ::armarx::aron::data::dto::DictPtr& dto,
204 const Ice::Current& iceCurrent)
207 userCfgWithColl = CollisionCtrlCfg::FromAron(dto);
209 coll->setUserCfg(userCfgWithColl.coll);
214 const Ice::Current& iceCurrent)
216 for (
auto& pair :
limb)
219 pair.second->bufferConfigRtToUser.getUpToDateReadBuffer();
222 return userCfgWithColl.toAronDTO();
235 datafields[
"trackingError"] =
new Variant(rtStatus.trackingError);
241 datafields,
"projectedImpedanceTorque", rtStatus.projImpedanceJointTorque);
247 const Eigen::VectorXf selfCollNullspace = rtStatus.selfCollNullSpace.diagonal();
248 const Eigen::VectorXf jointLimNullspace = rtStatus.jointLimNullSpace.diagonal();
271 datafields[
"collisionPairsNum"] =
new Variant(rtStatus.collisionPairsNum);
272 datafields[
"activeCollPairsNum"] =
new Variant(rtStatus.activeCollPairsNum);
274 datafields[
"collisionPairTime"] =
new Variant(rtStatus.collisionPairTime);
275 datafields[
"collisionTorqueTime"] =
new Variant(rtStatus.collisionTorqueTime);
276 datafields[
"jointLimitTorqueTime"] =
new Variant(rtStatus.jointLimitTorqueTime);
277 datafields[
"collNullspaceTime"] =
new Variant(rtStatus.selfCollNullspaceTime);
278 datafields[
"jointLimitNullspaceTime"] =
new Variant(rtStatus.jointLimitNullspaceTime);
280 datafields[
"impForceRatio"] =
new Variant(rtStatus.impForceRatio);
281 datafields[
"impTorqueRatio"] =
new Variant(rtStatus.impTorqueRatio);
297 for (
unsigned int i = 0; i < rtStatus.activeCollPairsNum; ++i)
326 datafields[std::to_string(i) +
"_minDistance"] =
327 new Variant(rtStatus.collDataVec[i].minDistance);
328 datafields[std::to_string(i) +
"_repForce"] =
329 new Variant(rtStatus.collDataVec[i].repulsiveForce);
330 datafields[std::to_string(i) +
"_dampingForce"] =
new Variant(
331 -1.0f * rtStatus.collDataVec[i].damping * rtStatus.collDataVec[i].distanceVelocity);
332 datafields[std::to_string(i) +
"_n_des(d)"] =
333 new Variant(rtStatus.collDataVec[i].desiredNSColl);
335 datafields, std::to_string(i) +
"_point", rtStatus.collDataVec[i].point1);
337 datafields, std::to_string(i) +
"_dir", rtStatus.collDataVec[i].direction);
622 debugObs->setDebugChannel(
"CollAvoid_ImpCtrl_" + arm.
nodeSetName, datafields);
634 for (
auto& pair : coll->collLimb)
645 "NJointTaskspaceCollisionAvoidanceMixedImpedanceVelocityController");
648 if (collReady.load())
651 coll->rtPreActivate();
659 if (collReady.load())
662 coll->rtPostDeactivate();
665 "NJointTaskspaceCollisionAvoidanceMixedImpedanceVelocityController");
671 const std::map<std::string, ConstControlDevicePtr>& controlDevices,
672 const std::map<std::string, ConstSensorDevicePtr>&)
678 ::armarx::WidgetDescription::WidgetSeq widgets;
681 LabelPtr label =
new Label;
682 label->text =
"select a controller config";
684 StringComboBoxPtr cfgBox =
new StringComboBox;
685 cfgBox->name =
"config_box";
686 cfgBox->defaultIndex = 0;
687 cfgBox->multiSelect =
false;
689 cfgBox->options = std::vector<std::string>{
"default",
691 "default_a7_right_zero_torque",
693 "default_a7_left_zero_torque",
694 "default_a7_with_hands",
695 "default_a7_zero_torque"};
698 layout->children.emplace_back(label);
699 layout->children.emplace_back(cfgBox);
702 layout->children.insert(layout->children.end(), widgets.begin(), widgets.end());
711 auto cfgName = values.at(
"config_box")->getString();
714 "controller_config/NJointTaskspaceCollisionAvoidanceMixedImpedanceVelocityController/" +
722 return new ConfigurableNJointControllerConfig{cfgDTO.toAronDTO()};
#define ARMARX_RT_LOGF_INFO(...)
const VirtualRobot::RobotPtr & rtGetRobot()
TODO make protected and use attorneys.
static std::filesystem::path toSystemPath(const data::PackagePath &pp)
const T & getUpToDateReadBuffer() const
The Variant class is described here: Variants.
std::string getClassName(const Ice::Current &=Ice::emptyCurrent) const override
static WidgetDescription::WidgetPtr GenerateConfigDescription(const VirtualRobot::RobotPtr &, const std::map< std::string, ConstControlDevicePtr > &, const std::map< std::string, ConstSensorDevicePtr > &)
ConfigurableNJointControllerConfigPtr ConfigPtrT
void limbRT(ArmPtr &arm, const double deltaT)
NJointTaskspaceCollisionAvoidanceMixedImpedanceVelocityController(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &robot)
void rtPostDeactivateController() override
This function is called after the controller is deactivated.
static ConfigPtrT GenerateConfigFromVariants(const StringVariantBaseMap &values)
void updateCollisionAvoidanceConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
NJointController interface for collision avoidance.
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration) override
TODO make protected and use attorneys.
void collLimbPublish(core::CollisionAvoidanceBase::NodeSetData &arm, const DebugObserverInterfacePrx &debugObs)
void onPublish(const SensorAndControl &sc, const DebugDrawerInterfacePrx &drawer, const DebugObserverInterfacePrx &) override
::armarx::aron::data::dto::DictPtr getConfig(const Ice::Current &iceCurrent) override
void rtPreActivateController() override
NJointControllerBase interface.
void updateConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent) override
void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &) override
std::map< std::string, ArmPtr > limb
void limbRTSetTarget(ArmPtr &arm, const size_t nDoFTorque, const size_t nDoFVelocity, const Eigen::VectorXf &targetTorque, const Eigen::VectorXf &targetVelocity)
core::HandControlPtr hands
void rtPostDeactivateController() override
This function is called after the controller is deactivated.
void rtRunCoordinator(double deltaT)
coordinator
std::unique_ptr< ArmData > ArmPtr
void updateConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
NJointController interface.
NJointTaskspaceMixedImpedanceVelocityController(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
void rtPreActivateController() override
This function is called before the controller is activated.
void limbRTUpdateStatus(ArmPtr &arm, const double deltaT)
-----------------------------— Real time cotnrol --------------------------------------—
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_INFO
The normal logging level.
armarx::aron::data::dto::Dict getCollisionAvoidanceConfig()
std::shared_ptr< class Robot > RobotPtr
::IceInternal::Handle< Dict > DictPtr
void debugEigenVec(StringVariantBaseMap &datafields, const std::string &name, Eigen::VectorXf vec)
NJointControllerRegistration< NJointTaskspaceCollisionAvoidanceMixedImpedanceVelocityController > registrationControllerNJointTaskspaceCollisionAvoidanceMixedImpedanceVelocityController("NJointTaskspaceCollisionAvoidanceMixedImpedanceVelocityController")
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
std::map< std::string, VariantBasePtr > StringVariantBaseMap
AronDTO readFromJson(const std::filesystem::path &filename)
IceUtil::Handle< class RobotUnit > RobotUnitPtr
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl
armarx::TripleBuffer< RtStatus > bufferRTtoPublish