LaserBasedProximity.cpp
Go to the documentation of this file.
2
3#include <algorithm>
4#include <cmath>
5#include <cstddef>
6#include <cstdlib>
7#include <functional>
8#include <limits>
9#include <optional>
10#include <string>
11#include <utility>
12#include <vector>
13
14#include <boost/geometry.hpp>
15#include <boost/geometry/algorithms/append.hpp>
16#include <boost/geometry/geometries/multi_point.hpp>
17
18#include <Eigen/Core>
19#include <Eigen/Geometry>
20#include <Eigen/src/Geometry/Transform.h>
21
22#include <range/v3/algorithm/all_of.hpp>
23#include <range/v3/algorithm/min.hpp>
24#include <range/v3/range/conversion.hpp>
25#include <range/v3/view/enumerate.hpp>
26#include <range/v3/view/filter.hpp>
27#include <range/v3/view/reverse.hpp>
28#include <range/v3/view/transform.hpp>
29#include <range/v3/view/zip_with.hpp>
30
31#include <SimoxUtility/color/Color.h>
32#include <SimoxUtility/color/cmaps/colormaps.h>
33#include <SimoxUtility/shapes/OrientedBox.h>
34#include <VirtualRobot/Nodes/RobotNode.h>
35#include <VirtualRobot/Robot.h>
36
40
47
55#include <armarx/navigation/safety_guard/aron/LaserBasedProximityParams.aron.generated.h>
59
60namespace rv = ::ranges::views;
61
63{
64
65 namespace
66 {
67
68 inline core::TwistLimits
69 mergeSafetyLimits(const std::vector<std::optional<core::TwistLimits>>& resultsAll)
70 {
71 const auto isValidFn =
72 [](const std::optional<core::TwistLimits>& result) noexcept -> bool
73 { return result.has_value(); };
74
75 const std::vector<core::TwistLimits> validResults =
76 resultsAll | rv::filter(isValidFn) |
77 rv::transform(
78 [](const std::optional<core::TwistLimits>& result) noexcept -> core::TwistLimits
79 { return result.value(); }) |
80 ranges::to_vector;
81
82
83 if (validResults.empty())
84 {
86 }
87
88 const std::vector<float> linearLimits =
89 validResults |
90 rv::transform([](const core::TwistLimits& result) noexcept -> float
91 { return result.linear; }) |
92 ranges::to_vector;
93
94 const std::vector<float> angularLimits =
95 validResults |
96 rv::transform([](const core::TwistLimits& result) noexcept -> float
97 { return result.angular; }) |
98 ranges::to_vector;
99
100 const core::TwistLimits combinedResult{.linear = ranges::min(linearLimits),
101 .angular = ranges::min(angularLimits)};
102
103 return combinedResult;
104 }
105
106
107 } // namespace
108
114
117 {
118 arondto::LaserBasedProximityParams dto;
119
121
122 return dto.toAron();
123 }
124
127 {
128 arondto::LaserBasedProximityParams dto;
129 dto.fromAron(dict);
130
132 fromAron(dto, bo);
133
134 return bo;
135 }
136
138 const core::GeneralConfig& generalConfig,
139 const core::Scene& scene,
140 const Context& ctx) :
141 SafetyGuard(scene, ctx),
142 params(params),
143 generalConfig(generalConfig),
144 humanColorMap_(simox::color::cmaps::BuPu().reversed()),
145 laserColorMap_(simox::color::cmaps::OrRd().reversed())
146 {
147 }
148
150 LaserBasedProximity::computeSafetyLimits(const Eigen::Vector2f& global_V_movement)
151 {
152 ARMARX_CHECK(scene.dynamicScene.has_value());
153
154 auto layer = viz.layer("safety_guard");
155
156 const std::optional<core::TwistLimits> resultHumans = safetyLimitsHumans(layer);
157 const std::optional<core::TwistLimits> resultLaserScanners =
158 safetyLimitsLaserScanners(layer, global_V_movement);
159
160 // Commit always. This ensures that objects eventually will be cleared.
161 viz.commit(layer);
162
163 const core::TwistLimits combinedResult =
164 mergeSafetyLimits({resultHumans, resultLaserScanners});
165 ARMARX_VERBOSE << "Safety limits: " << VAROUT(combinedResult.linear)
166 << VAROUT(combinedResult.angular);
167
168 return SafetyGuardResult{.twistLimits = combinedResult};
169 }
170
171 std::optional<core::TwistLimits>
172 LaserBasedProximity::safetyLimitsLaserScanners(viz::Layer& layer,
173 const Eigen::Vector2f& global_V_movement) const
174 {
176 {
177 return std::nullopt;
178 }
179
180 if (scene.dynamicScene->laserScannerFeatures.empty())
181 {
182 ARMARX_INFO << deactivateSpam(5) << "No laser scanner features for SafetyGuard";
183
184 return std::nullopt;
185 }
186
188 auto& debugObserver = *context.debugObserver;
189
190 debugObserver.setDebugObserverDatafield("numLaserScannerFeatures",
191 scene.dynamicScene->laserScannerFeatures.size());
192 debugObserver.setDebugObserverDatafield(
193 "numFirstLaserScannerFeatures",
194 scene.dynamicScene->laserScannerFeatures.front().features.size());
195
196 ARMARX_VERBOSE << VAROUT(scene.dynamicScene->laserScannerFeatures.size());
197 ARMARX_VERBOSE << VAROUT(scene.dynamicScene->laserScannerFeatures.front().features.size());
198
199 const core::Pose global_T_robot{scene.robot->getGlobalPose()};
200 const core::Pose robot_T_global{global_T_robot.inverse()};
201
202 // compute distance based on convex hull of robot
204 {
205 boost::geometry::model::multi_point<util::geometry::point_type> robotNodes;
206 for (const auto& node : scene.robot->getRobotNodes())
207 {
208 Eigen::Vector2f pos2d = conv::to2D(core::Pose(node->getGlobalPose())).translation();
209 boost::geometry::append(robotNodes,
210 util::geometry::point_type(pos2d.x(), pos2d.y()));
211 }
212 boost::geometry::convex_hull(robotNodes, convexHull);
213 }
214
215 // Compute the minimal distance to the robot for a set of features (point clusters)
216 const auto minDistanceFn =
217 [this, &convexHull, &robot_T_global](
218 const memory::LaserScannerFeatures& features) -> DistanceAndClosestPoint
219 {
220 const core::Pose& global_T_sensor = features.frameGlobalPose;
221
222 // Compute the minimal distance to the robot for a single feature (point cluster)
223 const auto minDistanceFnInner =
224 [this, &convexHull, &global_T_sensor, &robot_T_global](
225 const memory::LaserScannerFeature& feature) -> DistanceAndClosestPoint
226 {
227 // transform points to 3D global frame
228 const std::vector<Eigen::Vector3f> points3dGlobal =
229 feature.points |
230 rv::transform([&global_T_sensor](const Eigen::Vector2f& pt) -> Eigen::Vector3f
231 { return global_T_sensor * conv::to3D(pt); }) |
232 ranges::to_vector;
233
234 return calculateMinDistance(convexHull, robot_T_global, points3dGlobal);
235 };
236
237 // Compute the minimal distance to the robot for all features (point clusters)
238 const std::vector<DistanceAndClosestPoint> distances =
239 features.features | rv::transform(minDistanceFnInner) | ranges::to_vector;
240
241 if (distances.empty())
242 {
243 return DistanceAndClosestPoint{.distance = std::numeric_limits<float>::max(),
244 .closestPoint = Eigen::Vector2f::Zero()};
245 }
246
247 return ranges::min(distances, std::less{}, &DistanceAndClosestPoint::distance);
248 };
249
250 const std::vector<DistanceAndClosestPoint> minDistanceToObstacles =
251 scene.dynamicScene->laserScannerFeatures | rv::transform(minDistanceFn) |
252 ranges::to_vector;
253
254 const auto result = [&]() -> std::optional<InternalVelocityLimitResult>
255 {
256 switch (params.laserScannerProximityField.mode)
257 {
259 return std::nullopt;
261 return velocityLimitsDirectionDependent(
262 global_V_movement, minDistanceToObstacles, global_T_robot);
264 return velocityLimitsDirectionIndependent(minDistanceToObstacles);
265 }
266
267 ARMARX_ERROR << "Unknown ProximityFieldParams::Mode: "
268 << static_cast<int>(params.laserScannerProximityField.mode);
269 return std::nullopt;
270 }();
271
272 layer.clear();
273
274 // visualize robot and obstacle-independent information (always)
275 {
276 // visualize convex hull of robot
277 simox::color::Color color = simox::Color::blue();
278 viz::Polygon vizPoly("robot_convex_hull");
279 for (const auto& p : rv::reverse(convexHull.outer()))
280 {
281 Eigen::Vector2f pt(p.x(), p.y());
282 vizPoly.addPoint(conv::to3D(pt));
283 }
284 layer.add(vizPoly.color(color).lineColor(color));
285
286 // visualize movement direction
287 layer.add(viz::Line("robot_movement_Dir")
288 .fromTo(global_T_robot.translation(),
289 global_T_robot.translation() +
290 conv::to3D(global_V_movement).normalized() * 1000)
291 .lineWidth(10.F)
292 .color(simox::Color::blue()));
293
294 // visualize ignored regions
295 for (const auto& [i, region] : ranges::views::enumerate(params.ignoredRegions))
296 {
297 viz::Polygon vizRegion("ignored_region_" + std::to_string(i));
298 vizRegion.addPoint(Eigen::Vector3f(region.min().x(), region.min().y(), 15));
299 vizRegion.addPoint(Eigen::Vector3f(region.max().x(), region.min().y(), 15));
300 vizRegion.addPoint(Eigen::Vector3f(region.max().x(), region.max().y(), 15));
301 vizRegion.addPoint(Eigen::Vector3f(region.min().x(), region.max().y(), 15));
302 layer.add(vizRegion.color(simox::Color::magenta()));
303 }
304
305 // visualize attached objects
306 for (const auto& [i, obj] :
307 ranges::views::enumerate(scene.dynamicScene->attachedObjects))
308 {
309 const auto& oobb = obj->oobbGlobal();
310 ARMARX_CHECK(oobb.has_value());
311
312 simox::OrientedBoxf inflatedOobb{
313 oobb->transformation_centered(),
314 oobb->dimensions() + Eigen::Vector3f::Ones() * params.attachedObjectsInflation};
315
316 viz::Box vizObj("attached_object_" + std::to_string(i));
317 vizObj.set(inflatedOobb);
318 layer.add(vizObj.color(simox::Color::magenta()));
319 }
320 }
321
322 if (not result.has_value())
323 {
324 return std::nullopt;
325 }
326
327 // visualize the obstacle that leads to the calculated safety limits and the corresponding velocity limits
328 {
329 // increase transparency with increased distance, but never make fully transparent
330 const auto color = laserColorMap_.at(
331 std::abs(result->twistLimits.linear), 0, generalConfig.maxVel.linear);
332
333 layer.add(viz::Line("nearest_obstacle")
334 .fromTo(global_T_robot.translation(), conv::to3D(result->closestPoint))
335 .lineWidth(50.F)
336 .color(color));
337 }
338
339 return result->twistLimits;
340 }
341
342 std::optional<core::TwistLimits>
343 LaserBasedProximity::safetyLimitsHumans(viz::Layer& layer) const
344 {
345 if (not params.enableHumans)
346 {
347 return std::nullopt;
348 }
349
350 const core::Pose global_T_robot{scene.robot->getGlobalPose()};
351
352 // Compute the minimal distance to the robot for a human
353 // TODO(utetg): is minimum distance = distance to robot center or robot edge
354 const auto minimalSegmentDistanceToRobot =
355 [&global_T_robot](const human::Human& human) -> float
356 {
357 const Eigen::Isometry3f global_T_human = conv::to3D(human.pose);
358 const Eigen::Isometry3f robot_T_human = global_T_robot.inverse() * global_T_human;
359
360 // TODO extension: if also human keypoints are available, use them to compute the minimal distance
361 return robot_T_human.translation().norm();
362 };
363
364 if (scene.dynamicScene->humans.empty())
365 {
366 ARMARX_VERBOSE << "No humans";
367 return std::nullopt;
368 }
369
370 const auto distanceRobotToHumans = scene.dynamicScene->humans |
371 rv::transform(minimalSegmentDistanceToRobot) |
372 ranges::to_vector;
373
374 const std::optional<float> minDistanceToHumans = scene.dynamicScene->humans.empty()
375 ? std::optional<float>{std::nullopt}
376 : ranges::min(distanceRobotToHumans);
377
378 // handle if no humans are detected
379 if (not minDistanceToHumans.has_value())
380 {
382 }
383
384 const auto result =
385 evaluateProximityField(params.humanProximityField, minDistanceToHumans.value());
386
387 {
388 // increase transparency with increased distance, but never make fully transparent
389 const auto color = humanColorMap_(result.second).with_alpha(1 - result.second + 0.1);
390
391 layer.add(viz::Cylinder("distance_humans")
392 .position(global_T_robot.translation() + Eigen::Vector3f{0, 0, 10})
393 .direction(Eigen::Vector3f::UnitZ())
394 .radius(minDistanceToHumans.value())
395 .height(10)
396 .color(color));
397 }
398
399 return result.first;
400 }
401
402 LaserBasedProximity::DistanceAndClosestPoint
403 LaserBasedProximity::calculateMinDistance(
404 const util::geometry::polygon_type& convexHull,
405 const core::Pose& robot_T_global,
406 const std::vector<Eigen::Vector3f>& globalPoints) const
407 {
408 // Compute the minimal distance to the robot for a list of points
409
410 // transform points to 2D global frame
411 const std::vector<Eigen::Vector2f> points2dGlobal =
412 globalPoints |
413 rv::transform([](const Eigen::Vector3f& pt) -> Eigen::Vector2f
414 { return conv::to2D(pt); }) |
415 ranges::to_vector;
416
417 if (/*isFeatureIgnored(globalPoints, points2dGlobal) or*/ globalPoints.empty())
418 {
419 ARMARX_VERBOSE << "Global points empty";
420 return {.distance = std::numeric_limits<float>::max(),
421 .closestPoint = Eigen::Vector2f::Zero()};
422 }
423
424 // calculate distance to robot center
425 const std::vector<float> pointsDistanceRobotCenter =
426 globalPoints |
427 rv::transform([&robot_T_global](const Eigen::Vector3f& pt) -> float
428 { return conv::to2D(robot_T_global * pt).norm(); }) |
429 ranges::to_vector;
430
431 if (params.enableLaserScannerFiltering &&
432 globalPoints.size() <= static_cast<std::size_t>(params.laserScannerFilteringThreshold))
433 {
434 // this is a small feature
435 ARMARX_VERBOSE << "Small feature with " << globalPoints.size()
436 << " points. Distances to robot center: " << pointsDistanceRobotCenter;
437
438 if (ranges::all_of(pointsDistanceRobotCenter,
439 [&](float distanceToCenter) noexcept
440 {
441 return std::max(distanceToCenter - params.robotRadius, 0.F) <
442 params.laserScannerMaxFilteringDistance;
443 }))
444 {
445 // the feature is close to the robot
446 // -> it should be filtered out
447 return {.distance = std::numeric_limits<float>::max(),
448 .closestPoint = Eigen::Vector2f::Zero()};
449 }
450 }
451
452 const auto distancesAndClosestPoint =
453 rv::zip_with(
454 [this, &convexHull](const Eigen::Vector2f& pt,
455 float distanceToCenter) -> DistanceAndClosestPoint
456 {
457 const auto distanceToConvexHull = static_cast<float>(boost::geometry::distance(
458 util::geometry::point_type(pt.x(), pt.y()), convexHull));
459
460 const float distanceUsingRobotRadius =
461 std::max(distanceToCenter - params.robotRadius, 0.F);
462
463 return {.distance = std::min(distanceToConvexHull, distanceUsingRobotRadius),
464 .closestPoint = pt};
465 },
466 points2dGlobal,
467 pointsDistanceRobotCenter) |
468 ranges::to_vector;
469
470 return ranges::min(
471 distancesAndClosestPoint, std::less{}, &DistanceAndClosestPoint::distance);
472 }
473
474 std::pair<core::TwistLimits, float>
475 LaserBasedProximity::evaluateProximityField(const ProximityFieldParams& proximityField,
476 float minDistance) const
477 {
478 if (minDistance < proximityField.safetyDistance)
479 {
480 return {core::TwistLimits::ZeroLimits(), 0.F};
481 }
482
483 if (minDistance > proximityField.influenceDistance)
484 {
485 return {core::TwistLimits::NoLimits(), 1.F};
486 }
487
488
489 const float proximityRange =
490 proximityField.influenceDistance - proximityField.safetyDistance;
491 const float clippedDistance =
492 std::min(minDistance, proximityField.influenceDistance) - proximityField.safetyDistance;
493
494 const float fractionalDistance = std::clamp(clippedDistance / proximityRange, 0.F, 1.F);
495
496 if (not proximityField.reduceVelocity)
497 {
498 return {core::TwistLimits::NoLimits(), fractionalDistance};
499 }
500
501 const float d_s = std::pow(1 - fractionalDistance, proximityField.k);
502
503 const auto permissibleVelocity = [&proximityField](const float d_s,
504 const float v_max) -> float
505 { return v_max / (1 + proximityField.lambda * d_s); };
506
507 const core::TwistLimits result{
508 .linear = permissibleVelocity(d_s, generalConfig.maxVel.linear),
509 .angular = permissibleVelocity(d_s, generalConfig.maxVel.angular)};
510
511 return {result, fractionalDistance};
512 }
513
514 template <class T, class Func>
515 static bool
516 allPointsInside(const std::vector<T>& points, Func isInsideFunc)
517 {
518 for (const auto& p : points)
519 {
520 if (not isInsideFunc(p))
521 {
522 // this point is not inside
523 return false;
524 }
525 }
526 return true;
527 }
528
529 bool
530 LaserBasedProximity::isFeatureIgnored(
531 const std::vector<Eigen::Vector3f>& featurePoints3DGlobal,
532 const std::vector<Eigen::Vector2f>& featurePoints2DGlobal) const
533 {
534 return false; // FIXME: enable this again after testing, currently disabled to not filter out any features while testing the new safety guard implementation
535
536 // first check against ignored regions
537 for (const auto& region : params.ignoredRegions)
538 {
539 ARMARX_CHECK(not region.isEmpty());
540
541 if (allPointsInside(featurePoints2DGlobal,
542 [&region](const Eigen::Vector2f& p) { return region.contains(p); }))
543 {
544 // the feature lies fully inside this region -> it is ignored
545 return true;
546 }
547 }
548
549 // then check against attached objects
550 for (const auto* o : scene.dynamicScene->attachedObjects)
551 {
552 const auto& oobbGlobal = o->oobbGlobal();
553 ARMARX_CHECK(oobbGlobal.has_value());
554
555 simox::OrientedBoxf inflatedOobb{oobbGlobal->transformation_centered(),
556 oobbGlobal->dimensions() +
557 Eigen::Vector3f::Ones() *
558 params.attachedObjectsInflation};
559
560 if (allPointsInside(featurePoints3DGlobal,
561 [&inflatedOobb](const Eigen::Vector3f& p)
562 { return inflatedOobb.contains(p); }))
563 {
564 // the feature lies fully inside the objects oobb -> it is ignored
565 return true;
566 }
567 }
568
569 return false;
570 }
571
572 LaserBasedProximity::InternalVelocityLimitResult
573 LaserBasedProximity::velocityLimitsDirectionDependent(
574 const Eigen::Vector2f& global_V_movement,
575 const std::vector<DistanceAndClosestPoint>& minDistanceToObstacles,
576 const Eigen::Isometry3f& global_T_robot) const
577 {
578
579 float maxPermissibleRelativeVelocityLinear = generalConfig.maxVel.linear;
580
581 Eigen::Vector2f minPoint = Eigen::Vector2f::Zero();
582 float minDistance = std::numeric_limits<float>::max();
583
584 const Eigen::Isometry3f robot_T_global = global_T_robot.inverse();
585
586 ARMARX_CHECK_NOT_NULL(context.debugObserver);
587 auto& debugObserver = *context.debugObserver;
588
589 debugObserver.setDebugObserverDatafield("numObstacles", minDistanceToObstacles.size());
590
591 // ARMARX_VERBOSE << VAROUT(minDistanceToObstacles.size());
592
593 for (const auto& [distance, global_P_obstacle_pt] : minDistanceToObstacles)
594 {
595 const float ds = params.laserScannerProximityField.safetyDistance;
596 const float di = params.laserScannerProximityField.influenceDistance;
597 const float d = distance;
598
599 float velocity_damper = generalConfig.maxVel.linear * (distance - ds) / (di - ds);
600
601 ARMARX_VERBOSE << VAROUT(velocity_damper);
602
603 const Eigen::Vector2f minPointGlobal = global_P_obstacle_pt;
604
605 ARMARX_VERBOSE << VAROUT(minPointGlobal);
606 ARMARX_VERBOSE << VAROUT(robot_T_global.translation().head<2>());
607
608 const Eigen::Vector2f directionRobotToObstacle =
609 (minPointGlobal - global_T_robot.translation().head<2>()).normalized();
610
611 ARMARX_VERBOSE << VAROUT(directionRobotToObstacle);
612
613 // Cases:
614 // 1) > 0: approaching object
615 // 2) < 0: moving away from object
616 const float relativeVelocityScaling =
617 directionRobotToObstacle.dot(global_V_movement.normalized());
618
620 ARMARX_VERBOSE << VAROUT(relativeVelocityScaling);
621
622 // moving away from obstacle?
623 if (relativeVelocityScaling < 0)
624 {
625 continue;
626 }
627
628 if (d <= ds) // we must stop, if an obstacle is too close
629 {
630 maxPermissibleRelativeVelocityLinear = 0;
631 minPoint = minPointGlobal;
632 minDistance = d;
633 continue;
634 }
635
636 // if not exactly tangential
637 if (std::abs(relativeVelocityScaling) > 1e-4)
638 {
639 const float thisMaxPermissibileRelVelLinear =
640 velocity_damper / relativeVelocityScaling;
641 ARMARX_VERBOSE << VAROUT(thisMaxPermissibileRelVelLinear);
642
643 if (thisMaxPermissibileRelVelLinear < maxPermissibleRelativeVelocityLinear)
644 {
645 maxPermissibleRelativeVelocityLinear = thisMaxPermissibileRelVelLinear;
646 minPoint = minPointGlobal;
647 }
648 }
649 }
650
651 debugObserver.setDebugObserverDatafield("maxPermissibleRelativeVelocityLinear",
652 maxPermissibleRelativeVelocityLinear);
653 debugObserver.setDebugObserverDatafield("minDistance", minDistance);
654
655 core::TwistLimits result{.linear = std::max<float>(0, maxPermissibleRelativeVelocityLinear),
656 .angular = generalConfig.maxVel.angular};
657 return {.twistLimits = result, .minDistance = minDistance, .closestPoint = minPoint};
658 }
659
660 LaserBasedProximity::InternalVelocityLimitResult
661 LaserBasedProximity::velocityLimitsDirectionIndependent(
662 const std::vector<DistanceAndClosestPoint>& minDistanceToObstacles) const
663 {
664 const DistanceAndClosestPoint minDistance =
665 ranges::min(minDistanceToObstacles, std::less{}, &DistanceAndClosestPoint::distance);
666
667 const auto result =
668 evaluateProximityField(params.laserScannerProximityField, minDistance.distance);
669
670 return {.twistLimits = result.first,
671 .minDistance = minDistance.distance,
672 .closestPoint = minDistance.closestPoint};
673 }
674} // namespace armarx::navigation::safety_guard
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
Definition Logging.cpp:75
#define VAROUT(x)
SafetyGuardResult computeSafetyLimits(const Eigen::Vector2f &global_V_movement) override
LaserBasedProximity(const Params &params, const core::GeneralConfig &generalConfig, const core::Scene &scene, const Context &ctx)
SafetyGuard(const core::Scene &scene, const Context &ctx)
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#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...
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
Definition Logging.h:196
#define ARMARX_VERBOSE
The logging level for verbose information.
Definition Logging.h:187
ConvexHull< Point >::type convexHull(const std::vector< Point > &points)
std::shared_ptr< Dict > DictPtr
Definition Dict.h:42
std::vector< Eigen::Vector2f > to2D(const std::vector< Eigen::Vector3f > &v)
Definition eigen.cpp:29
std::vector< Eigen::Vector3f > to3D(const std::vector< Eigen::Vector2f > &v)
Definition eigen.cpp:14
Eigen::Isometry3f Pose
Definition basic_types.h:31
This file is part of ArmarX.
Definition fwd.h:55
void fromAron(const arondto::ProximityFieldParams &dto, ProximityFieldParams &bo)
void toAron(arondto::ProximityFieldParams &dto, const ProximityFieldParams &bo)
boost::geometry::model::d2::point_xy< float > point_type
Definition geometry.h:35
boost::geometry::model::polygon< point_type > polygon_type
Definition geometry.h:36
This file is part of ArmarX.
Definition Impl.cpp:41
double distance(const Point &a, const Point &b)
Definition point.hpp:95
VirtualRobot::RobotPtr robot
Definition types.h:73
std::optional< core::DynamicScene > dynamicScene
Definition types.h:71
static TwistLimits ZeroLimits()
Definition types.h:99
static TwistLimits NoLimits()
Definition types.h:92
static LaserBasedProximityParams FromAron(const aron::data::DictPtr &dict)
std::experimental::observer_ptr< DebugObserverComponentPluginUser > debugObserver
Definition SafetyGuard.h:81
void add(ElementT const &element)
Definition Layer.h:31