27#include <range/v3/range/conversion.hpp>
28#include <range/v3/view/transform.hpp>
40 <<
"The obstacle distance the limit is normalized by must be positive.";
46 const float clippedDistance =
47 std::clamp(obstacleDistance, 0.F, params_.obstacleMaxDistance);
49 const float proximity = std::pow(1.F - clippedDistance / params_.obstacleMaxDistance,
50 params_.obstacleCostExponent);
52 return params_.maxVelocity / (1.F + params_.obstacleDistanceWeight * proximity);
60 return atDistance(costmap_.value(position).value_or(0.F));
66 const auto limitAt = [
this](
const core::Position& position) ->
float
67 {
return at(Eigen::Vector2f{position.head<2>()}); };
69 return positions | ranges::views::transform(limitAt) | ranges::to_vector;
ObstacleAwareVelocityLimit(const Costmap &costmap, const Parameters ¶ms)
const Parameters & params() const noexcept
float at(const Eigen::Vector2f &position) const
The limit at a position in the costmap's global frame.
float atDistance(float obstacleDistance) const
The limit for a given distance to the closest obstacle [mm].
#define ARMARX_CHECK_GREATER(lhs, rhs)
This macro evaluates whether lhs is greater (>) than rhs and if it turns out to be false it will thro...
This file is part of ArmarX.
This file is part of ArmarX.
std::vector< Position > Positions