BiKAC.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 * @author Jianfeng Gao ( jianfeng dot gao at kit dot edu )
17 * @date 2023
18 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
19 * GNU General Public License
20 */
21
22#include "BiKAC.h"
23
24#include <VirtualRobot/MathTools.h>
25// #include <armarx/control/common/aron_conversions.h>
27
28// #include <armarx/control/njoint_mp_controller/task_space/aron/aron_conversions.h>
29
30
32{
34
36 const NJointControllerConfigPtr& config,
37 const VirtualRobot::RobotPtr& robot) :
39 {
41 ARMARX_IMPORTANT << getClassName() + " construction done";
42 }
43
44 std::string
45 NJointBiKAC::getClassName(const Ice::Current&) const
46 {
47 return "NJointBiKAC";
48 }
49
50 void
51 NJointBiKAC::updateMPConfig(const ::armarx::aron::data::dto::DictPtr& dto,
52 const Ice::Current& iceCurrent)
53 {
54 ARMARX_IMPORTANT << "Updating MP Config";
55 if (isFinished("all"))
56 {
57 auto configData = MPListConfig::FromAron(dto);
58 isMPReady.store(false);
59 while (additionalTaskRunning.load())
60 {
61 usleep(1000);
62 }
63 for (const auto& _mp : configData.mpList)
64 {
65 if (limb.find(_mp.nodeSetName) == limb.end())
66 {
67 ARMARX_WARNING << "You have to make sure the RobotNodeSet " << _mp.nodeSetName
68 << " in your MP config "
69 << "corresponds to one of the RobotNodeSet in the controllers";
70 return;
71 }
72 }
73 mpConfig = configData;
75 // isMPReady.store(true);
76
78 ARMARX_INFO << "-- successfully updated MP config.";
79 }
80 else
81 {
82 ARMARX_WARNING << "MP is not finished yet, cannot reset MP\n"
83 "If you want to force reset, please call \n\n"
84 " ctrl->stop('all') \n\n"
85 "before you continue";
86 }
87 }
88
90 NJointBiKAC::getMPConfig(const Ice::Current& iceCurrent)
91 {
92 return mpConfig.toAronDTO();
93 }
94
95 void
96 NJointBiKAC::updateBiKACConfig(const ::armarx::aron::data::dto::DictPtr& dto,
97 const Ice::Current& iceCurrent)
98 {
99 ARMARX_IMPORTANT << "---------------------------------- Updating BiKAC Config "
100 "-------------------------------------------";
101 if (isFinished("all"))
102 {
104 isConstraintReady.store(false);
105 for (const auto& _c : configData.cList)
106 {
107 ARMARX_INFO << "reinit mp in/output data, and checking " << _c.idx
108 << "-th constraint with type " << _c.type;
109 if (limb.find(_c.rnsKpt) == limb.end())
110 {
111 ARMARX_WARNING << "You have to make sure the RobotNodeSet " << _c.rnsFrame
112 << " in your " << _c.idx
113 << "-th constraint config for a keypoint "
114 << "corresponds to one of the RobotNodeSet in the controllers";
115 return;
116 }
117
118 auto& _mp = mps.at(_c.mpName);
119 if (_c.type == "pose")
120 {
121 ARMARX_IMPORTANT << "constraint " << _c.idx << " is of type " << _c.type;
122
123 if (_mp.mp->getClassName() != "TSMP")
124 {
125 ARMARX_WARNING << "the pose constraint must have a TSMP";
126 return;
127 }
128 std::dynamic_pointer_cast<mp::TSMPInput>(_mp.input)->pose =
129 _c.currentKptPoseLocal;
130 std::dynamic_pointer_cast<mp::TSMPOutput>(_mp.output)->pose =
131 _c.currentKptPoseLocal;
132 continue;
133 }
134 else
135 {
136 ARMARX_IMPORTANT << "constraint " << _c.idx << " is of type " << _c.type;
137
138 std::dynamic_pointer_cast<mp::JSMPInput>(_mp.input)->angleRadian =
139 _c.currentKptPoseLocal.block<3, 1>(0, 3);
140 std::dynamic_pointer_cast<mp::JSMPInput>(_mp.input)->angularVel =
141 Eigen::Vector3f::Zero();
142 std::dynamic_pointer_cast<mp::JSMPOutput>(_mp.output)->angleRadian =
143 _c.currentKptPoseLocal.block<3, 1>(0, 3);
144 std::dynamic_pointer_cast<mp::JSMPOutput>(_mp.output)->angularVel =
145 Eigen::Vector3f::Zero();
146 }
147
148 if (_c.rnsFrame != "static" and limb.find(_c.rnsFrame) == limb.end())
149 {
150 ARMARX_WARNING << "You have to make sure the RobotNodeSet " << _c.rnsFrame
151 << " in your " << _c.idx << "-th constraint config for a frame "
152 << "corresponds to one of the RobotNodeSet in the controllers";
153 return;
154 }
155 }
156 ARMARX_INFO << "Some debug output";
157 for (const auto& c : configData.cList)
158 {
159 ARMARX_IMPORTANT << "----------------------- c -----------------------------";
160 ARMARX_INFO << VAROUT(c.idx) << VAROUT(c.type) << VAROUT(c.rnsFrame)
161 << VAROUT(c.rnsKpt);
162 ARMARX_INFO << VAROUT(c.currentFrameRoot);
163 ARMARX_INFO << VAROUT(c.currentKptPoseRoot);
164 ARMARX_INFO << VAROUT(c.currentKptVelocityRoot);
165 ARMARX_INFO << VAROUT(c.trackingForceRoot);
166 ARMARX_IMPORTANT << "-------------------------------------------------------";
167 }
168 biKacConfig = configData;
169 bufferBiKACConfig.reinitAllBuffers(biKacConfig);
171 isConstraintReady.store(true);
172 isMPReady.store(true);
173 }
174 else
175 {
176 ARMARX_WARNING << "MP is not finished yet, cannot reset constraints \n"
177 "If you want to force reset, please call \n\n"
178 " ctrl->stop('all') \n\n"
179 "before you continue";
180 }
181 ARMARX_IMPORTANT << "---------------------------------- BiKAC Config Updated "
182 "-------------------------------------------";
183 }
184
186 NJointBiKAC::getBiKACConfig(const Ice::Current& iceCurrent)
187 {
188 return ::armarx::toAronDict<arondto::BiKACConfig, BiKACConfig>(biKacConfig);
189 }
190
191 void
193 {
194 double deltaT = 0;
195 for (auto& c : biKacConfig.cList)
196 {
197 auto& _mp = mps.at(c.mpName);
198 auto& slaveArm = limb.at(c.rnsKpt);
199 slaveArm->rtStatusInNonRT = slaveArm->bufferRtToNonRt.getUpToDateReadBuffer();
200 const auto currentSlaveTCPPose = slaveArm->controller.tcp->getPoseInRootFrame();
201 c.currentKptPoseRoot = currentSlaveTCPPose * c.poseDiffKptLocal;
202 deltaT = slaveArm->rtStatusInNonRT.deltaT;
203
204 if (c.type == "pose")
205 {
206 // c.currentFrameRoot = itself, should not be updated
207 const auto masterFrameInv = c.currentFrameRoot.inverse();
208 c.currentKptPoseLocal = masterFrameInv * c.currentKptPoseRoot;
209 c.currentKptVelocityRoot =
210 (1 - c.keypointVelocityFilter) * c.currentKptVelocityRoot +
211 c.keypointVelocityFilter * slaveArm->rtStatusInNonRT.currentTwist.head<3>();
212 if (rtSafe)
213 {
214 c.currentKptVelocityLocal.head<3>() =
215 c.currentFrameRoot.block<3, 3>(0, 0).transpose() *
216 c.currentKptVelocityRoot.head<3>();
217 c.currentKptVelocityLocal.tail<3>() =
218 c.currentFrameRoot.block<3, 3>(0, 0).transpose() *
219 c.currentKptVelocityRoot.tail<3>();
220
221 mp::TSMPInputPtr in = std::dynamic_pointer_cast<mp::TSMPInput>(_mp.input);
222 in->pose = c.currentKptPoseLocal;
223 in->vel = c.currentKptVelocityLocal;
224 in->deltaT = deltaT;
225
226 _mp.mp->run(_mp.input, _mp.output);
227
228 mp::TSMPOutputPtr out = std::dynamic_pointer_cast<mp::TSMPOutput>(_mp.output);
229 c.targetKptPoseLocal = out->pose;
230 c.targetKptPoseRoot = c.currentFrameRoot * out->pose;
231
232 Eigen::Vector6f vel = Eigen::Vector6f::Zero();
233 vel.head<3>() = c.currentFrameRoot.block<3, 3>(0, 0) * out->vel.head<3>();
234 vel.tail<3>() = c.currentFrameRoot.block<3, 3>(0, 0) * out->vel.tail<3>();
235
236 slaveArm->nonRtData.c.desiredPose =
237 c.targetKptPoseRoot * c.poseDiffKptLocal.inverse();
238 slaveArm->nonRtData.c.desiredTwist = vel;
240 }
241 }
242 else
243 {
244 // differently from c.type==pose, here we need to explicitly update the master's local frame
245 if (c.rnsFrame != "static")
246 {
247 auto& masterArm = limb.at(c.rnsFrame);
248 const auto currentMasterTCPPose =
249 masterArm->controller.tcp->getPoseInRootFrame();
250 c.currentFrameRoot = currentMasterTCPPose * c.poseDiffFrameLocal;
251 }
252 const auto masterFrameInv = c.currentFrameRoot.inverse();
253 c.currentKptPoseLocal = masterFrameInv * c.currentKptPoseRoot;
254
255 Eigen::Vector3f angular_vel = slaveArm->rtStatusInNonRT.currentTwist.tail<3>();
256 Eigen::Vector3f vecRoot =
257 currentSlaveTCPPose.block<3, 3>(0, 0) * c.poseDiffKptLocal.block<3, 1>(0, 3);
258 c.currentKptVelocityRoot.head<3>() =
259 (1 - c.keypointVelocityFilter) * c.currentKptVelocityRoot.head<3>() +
260 c.keypointVelocityFilter * (angular_vel.cross(vecRoot) +
261 slaveArm->rtStatusInNonRT.currentTwist.head<3>());
262 /// if the local frame is moving, this is not accurate anymore
263 c.currentKptVelocityLocal.head<3>() =
264 c.currentFrameRoot.block<3, 3>(0, 0).transpose() *
265 c.currentKptVelocityRoot.head<3>();
267
268 if (rtSafe)
269 {
270 mp::JSMPInputPtr in = std::dynamic_pointer_cast<mp::JSMPInput>(_mp.input);
271 in->angleRadian = c.currentKptPoseLocal.block<3, 1>(0, 3);
272 in->angularVel = c.currentKptVelocityLocal.head<3>();
273 in->deltaT = deltaT;
274
275 _mp.mp->run(_mp.input, _mp.output);
276
277 mp::JSMPOutputPtr out = std::dynamic_pointer_cast<mp::JSMPOutput>(_mp.output);
278 c.targetKptPoseLocal.block<3, 1>(0, 3) = out->angleRadian;
279 }
280
282 Eigen::Vector3f modified_target = c.targetKptPoseLocal.block<3, 1>(0, 3);
283 if (c.p2pIdx >= 0 and c.type != "p2p")
284 {
285 const auto& p2p = biKacConfig.cList.at(c.p2pIdx);
286 Eigen::Vector3f p2p_local =
287 (masterFrameInv * p2p.currentKptPoseRoot).block<3, 1>(0, 3);
288 const auto x_ = c.targetKptPoseLocal.block<3, 1>(0, 3);
289 float radius = (c.currentKptPoseLocal.block<3, 1>(0, 3) - p2p_local).norm();
290 // modified_target = (x_ - p2p_local).normalized() * radius + p2p_local;
291 if (c.type == "p2l")
292 {
293 Eigen::Vector3f line_vec = c.pcaComponentsLocal.row(0);
294
295 auto vec_mean_to_p2p = p2p_local - c.pcaMeanLocal;
296 float proj_p2p = vec_mean_to_p2p.dot(line_vec);
297 auto proj_point_p2p = c.pcaMeanLocal + line_vec * proj_p2p;
298
299 Eigen::Vector3f line_norm_to_p2p =
300 (p2p_local - proj_point_p2p).normalized();
301 float proj_x_ = (x_ - p2p_local).dot(line_norm_to_p2p);
302 Eigen::Vector3f proj_point = p2p_local + proj_x_ * line_norm_to_p2p;
303
304 Eigen::Vector3f radial_vec = (x_ - proj_point).normalized();
305 proj_x_ = std::min(std::max(proj_x_, -radius), radius);
306 proj_point = p2p_local + proj_x_ * line_norm_to_p2p;
307 modified_target =
308 sqrt(radius * radius - proj_x_ * proj_x_) * radial_vec + proj_point;
309 }
310 else if (c.type == "p2P")
311 {
312 Eigen::Vector3f plane_norm_vec = c.pcaComponentsLocal.row(2);
313 float proj_x_ = (x_ - p2p_local).dot(plane_norm_vec);
314 Eigen::Vector3f proj_point = p2p_local + proj_x_ * plane_norm_vec;
315
316 Eigen::Vector3f radial_vec = (x_ - proj_point).normalized();
317 proj_x_ = std::min(std::max(proj_x_, -radius), radius);
318 proj_point = p2p_local + proj_x_ * plane_norm_vec;
319 modified_target =
320 sqrt(radius * radius - proj_x_ * proj_x_) * radial_vec + proj_point;
321 }
322 }
323 c.targetKptPoseLocal.block<3, 1>(0, 3) = modified_target;
324 c.targetKptPoseRoot = c.currentFrameRoot * c.targetKptPoseLocal;
326 Eigen::Vector3f kpt_error =
327 modified_target - c.currentKptPoseLocal.block<3, 1>(0, 3);
328 /// the force is in Newton since the error is in mm and the kpt_kp is scaled 1000 times smaller
329 c.trackingForceLocal =
330 (1 - c.keypointForceFilter) * c.trackingForceLocal +
331 c.keypointForceFilter *
332 (c.kptKp.cwiseProduct(kpt_error) -
333 c.kptKd.cwiseProduct(c.currentKptVelocityLocal.head<3>()));
334 c.trackingForceRoot = c.currentFrameRoot.block<3, 3>(0, 0) * c.trackingForceLocal;
336 }
337 }
338
339 for (auto& pair : biKacConfig.admittanceData)
340 {
341 auto& force_torque = pair.second.forceTorque;
342 Eigen::Vector6f force_torque_current;
343 force_torque_current.setZero();
344 Eigen::Vector3f meanKeypointPositionRoot = Eigen::Vector3f::Zero();
345 for (auto i : pair.second.constraintIdxList)
346 {
347 meanKeypointPositionRoot =
348 meanKeypointPositionRoot +
349 biKacConfig.cList.at(i).currentKptPoseRoot.block<3, 1>(0, 3);
350 }
351 meanKeypointPositionRoot =
352 meanKeypointPositionRoot / pair.second.constraintIdxList.size();
353
354 for (auto i : pair.second.constraintIdxList)
355 {
356 Eigen::Vector3f devi =
357 biKacConfig.cList.at(i).currentKptPoseRoot.block<3, 1>(0, 3) -
358 meanKeypointPositionRoot;
359 devi = devi * 0.001;
360 auto& force = biKacConfig.cList.at(i).trackingForceRoot;
361 if (force.norm() > 100.0)
362 {
363 ARMARX_RT_LOGF_WARN("force too large, set to zero");
364 force.setZero();
365 }
366 force_torque_current.head<3>() += force;
367 force_torque_current.tail<3>() += devi.cross(force);
368 }
369 force_torque = 0.1 * force_torque + 0.9 * force_torque_current;
371
372 Eigen::Vector6f acc = biKacConfig.kmAdmittance.cwiseProduct(force_torque) -
373 biKacConfig.kdAdmittance.cwiseProduct(pair.second.desiredVel);
374
375 Eigen::Vector6f vel = pair.second.desiredVel +
376 0.5 * static_cast<float>(deltaT) * (acc + pair.second.desiredAcc);
377 Eigen::VectorXf deltaPose =
378 0.5 * static_cast<float>(deltaT) * (vel + pair.second.desiredVel);
379 pair.second.desiredAcc = acc;
380 pair.second.desiredVel = vel;
381
382 Eigen::Matrix3f deltaPoseMat =
383 VirtualRobot::MathTools::rpy2eigen3f(deltaPose(3), deltaPose(4), deltaPose(5));
384 pair.second.desiredPose.block<3, 1>(0, 3) += deltaPose.head<3>();
385 pair.second.desiredPose.block<3, 3>(0, 0) =
386 deltaPoseMat * pair.second.desiredPose.block<3, 3>(0, 0);
387
389 auto& slaveArm = limb.at(pair.first);
390 slaveArm->nonRtData.c.desiredPose = pair.second.desiredPose;
391 slaveArm->nonRtData.c.desiredTwist = pair.second.desiredVel;
392 }
393 bufferBiKACConfig.getWriteBuffer() = biKacConfig;
394 bufferBiKACConfig.commitWrite();
395 }
396
397 void
399 {
400 bool rtSafe = true;
401 for (auto& pair : limb)
402 {
403 rtSafe = rtSafe and pair.second->bufferRtToNonRt.getUpToDateReadBuffer().rtSafe;
404 }
405
406 robotUnit->updateVirtualRobot(nonRtRobot);
407 if (isConstraintReady.load() and isMPReady.load())
408 {
410 }
411 for (auto& pair : limb)
412 {
413 limbNonRT(pair.second);
414 }
415 }
416
417 void
419 {
420 arm->bufferConfigNonRtToRt.getWriteBuffer() = arm->nonRtConfig;
421 arm->bufferConfigNonRtToRt.commitWrite();
422 }
423
424 // void
425 // NJointBiKAC::reInitMPInputOutputData()
426 // {
427 // ARMARX_IMPORTANT << "reconfigure MP: reinitialize the mp input output, as well as the rt related buffer values";
428 // for (auto& _mp: mps)
429 // {
430 // const auto& nodeSetName = _mp.second.mp->getNodeSetName();
431 // ARMARX_CHECK_EQUAL(nodeSetName, limb.at(nodeSetName)->kinematicChainName);
432 // VirtualRobot::RobotNodeSetPtr rns = rtGetRobot()->getRobotNodeSet(nodeSetName);
433 // Eigen::Matrix4f currentPose = rns->getTCP()->getPoseInRootFrame();
434 //
435 // if (_mp.second.mp->getClassName() == "TSMP")
436 // {
437 // ARMARX_IMPORTANT << "init input output data for " << _mp.second.mp->getMPName();
438 // std::dynamic_pointer_cast<mp::TSMPInput>(_mp.second.input)->pose = currentPose;
439 // std::dynamic_pointer_cast<mp::TSMPOutput>(_mp.second.output)->pose = currentPose;
440 // }
441 // else if (_mp.second.mp->getClassName() == "JSMP")
442 // {
443 // ARMARX_IMPORTANT << "init input output data for " << _mp.second.mp->getMPName();
444 // std::dynamic_pointer_cast<mp::JSMPInput>(_mp.second.input)->angleRadian = rns->getJointValuesEigen();
445 // std::dynamic_pointer_cast<mp::JSMPInput>(_mp.second.input)->angularVel = Eigen::VectorXf::Zero(rns->getJointValues().size());
446 // std::dynamic_pointer_cast<mp::JSMPOutput>(_mp.second.output)->angleRadian = rns->getJointValuesEigen();
447 // std::dynamic_pointer_cast<mp::JSMPOutput>(_mp.second.output)->angularVel = Eigen::VectorXf::Zero(rns->getJointValues().size());
448 // }
449 // }
450 // }
451
452 void
455 const DebugObserverInterfacePrx& debugObs)
456 {
457 for (auto& pair : limb)
458 {
459 limbPublish(pair.second, debugObs);
460 }
461
462 StringVariantBaseMap datafields;
463 biKacConfigForDebug = bufferBiKACConfig.getUpToDateReadBuffer();
464 for (const auto& c : biKacConfigForDebug.cList)
465 {
466 const std::string idx = std::to_string(c.idx);
467 common::debugEigenPose(datafields, "c_frame_root_" + idx, c.currentFrameRoot);
469 datafields, "c_kpt_posi_root_" + idx, c.currentKptPoseRoot.block<3, 1>(0, 3));
471 datafields, "c_kpt_posi_local_" + idx, c.currentKptPoseLocal.block<3, 1>(0, 3));
473 datafields, "t_kpt_posi_root_" + idx, c.targetKptPoseRoot.block<3, 1>(0, 3));
475 datafields, "t_kpt_posi_local_" + idx, c.targetKptPoseLocal.block<3, 1>(0, 3));
476 common::debugEigenVec(datafields, "c_force_root" + idx, c.trackingForceRoot);
477 common::debugEigenVec(datafields, "c_force_local" + idx, c.trackingForceLocal);
478 // ARMARX_IMPORTANT << "----------------------- c -----------------------------";
479 // ARMARX_INFO << VAROUT(c.idx) << VAROUT(c.type) << VAROUT(c.rnsFrame) << VAROUT(c.rnsKpt);
480 // ARMARX_INFO << VAROUT(c.currentFrameRoot);
481 // ARMARX_INFO << VAROUT(c.currentKptPoseRoot);
482 // ARMARX_INFO << VAROUT(c.currentKptVelocityRoot);
483 // ARMARX_INFO << VAROUT(c.trackingForce);
484 // ARMARX_IMPORTANT << "-------------------------------------------------------";
485 }
486 for (const auto& pair : biKacConfigForDebug.admittanceData)
487 {
488 common::debugEigenVec(datafields, "ft_" + pair.first, pair.second.forceTorque);
489 common::debugEigenPose(datafields, "virt_pose_" + pair.first, pair.second.desiredPose);
490 common::debugEigenVec(datafields, "virt_vel_" + pair.first, pair.second.desiredVel);
491 }
492
493 debugObs->setDebugChannel("BiKAC", datafields);
494 }
495} // namespace armarx::control::njoint_mp_controller::task_space
#define ARMARX_RT_LOGF_WARN(...)
#define VAROUT(x)
constexpr T c
void reconfigureMPs(const MPListConfig &mpListConfig)
Definition MPPool.cpp:97
bool isFinished(const std::string &mpName="all", const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:386
std::map< std::string, MPInputOutput > mps
Definition MPPool.h:146
void reInitMPInputOutputData(const std::map< std::string, VirtualRobot::RobotNodeSetPtr > &rnsMap)
Definition MPPool.cpp:760
std::atomic< bool > isMPReady
Definition MPPool.h:148
NJointTaskspaceImpedanceController(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
void limbPublish(ArmPtr &arm, const DebugObserverInterfacePrx &debugObs)
std::string getClassName(const Ice::Current &=Ice::emptyCurrent) const override
Definition BiKAC.cpp:45
void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &) override
Definition BiKAC.cpp:453
NJointBiKAC(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
Definition BiKAC.cpp:35
void updateMPConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition BiKAC.cpp:51
MPListConfig mpConfig
this variable is only needed when constructing the MP instances, therefore you don't need to use trip...
Definition BiKAC.h:131
void updateBiKACConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition BiKAC.cpp:96
::armarx::aron::data::dto::DictPtr getBiKACConfig(const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition BiKAC.cpp:186
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
Definition Logging.h:190
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:193
armarx::aron::data::dto::Dict getMPConfig()
Matrix< float, 6, 1 > Vector6f
std::shared_ptr< class Robot > RobotPtr
Definition Bus.h:19
::IceInternal::Handle< Dict > DictPtr
This file is part of ArmarX.
std::shared_ptr< TSMPOutput > TSMPOutputPtr
Definition TSMP.h:47
std::shared_ptr< TSMPInput > TSMPInputPtr
Definition TSMP.h:46
std::shared_ptr< JSMPOutput > JSMPOutputPtr
Definition JSMP.h:48
std::shared_ptr< JSMPInput > JSMPInputPtr
Definition JSMP.h:47
void debugEigenVec(StringVariantBaseMap &datafields, const std::string &name, Eigen::VectorXf vec)
Definition utils.cpp:190
void debugEigenPose(StringVariantBaseMap &datafields, const std::string &name, Eigen::Matrix4f pose)
Definition utils.cpp:140
NJointControllerRegistration< NJointBiKAC > registrationControllerNJointBiKAC("NJointBiKAC")
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
std::map< std::string, VariantBasePtr > StringVariantBaseMap
T fromAronDict(const ::armarx::aron::data::dto::DictPtr &dto)
IceUtil::Handle< class RobotUnit > RobotUnitPtr
Definition FTSensor.h:34
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl
double norm(const Point &a)
Definition point.hpp:102
double dot(const Point &x, const Point &y)
Definition point.hpp:57
#define ARMARX_TRACE
Definition trace.h:77