From b284e3a29289301a4f3cd02e0302c9c90fabae93 Mon Sep 17 00:00:00 2001 From: Lennart Grosskreutz <lennart.grosskreutz@student.kit.edu> Date: Mon, 29 Aug 2022 18:46:17 +0200 Subject: [PATCH 1/5] Provide costmap to homotopy class planner --- source/armarx/navigation/algorithms/Costmap.h | 6 +++-- .../navigation/local_planning/CMakeLists.txt | 1 + .../local_planning/TimedElasticBands.cpp | 21 ++++++++++++++-- .../local_planning/TimedElasticBands.h | 2 ++ .../local_planning/ros_conversions.cpp | 25 +++++++++++++++++++ .../local_planning/ros_conversions.h | 4 +++ 6 files changed, 55 insertions(+), 4 deletions(-) diff --git a/source/armarx/navigation/algorithms/Costmap.h b/source/armarx/navigation/algorithms/Costmap.h index 6f452b7d..d168ef7d 100644 --- a/source/armarx/navigation/algorithms/Costmap.h +++ b/source/armarx/navigation/algorithms/Costmap.h @@ -68,8 +68,10 @@ namespace armarx::navigation::algorithms centerPose() const { const Eigen::Vector2f costmap_P_center{ - (getLocalSceneBounds().max.x() - getLocalSceneBounds().min.x())/2 + getLocalSceneBounds().min.x(), - (getLocalSceneBounds().max.y() - getLocalSceneBounds().min.y())/2 + getLocalSceneBounds().min.y()}; + (getLocalSceneBounds().max.x() - getLocalSceneBounds().min.x()) / 2 + + getLocalSceneBounds().min.x(), + (getLocalSceneBounds().max.y() - getLocalSceneBounds().min.y()) / 2 + + getLocalSceneBounds().min.y()}; return global_T_costmap * Eigen::Translation2f(costmap_P_center); } diff --git a/source/armarx/navigation/local_planning/CMakeLists.txt b/source/armarx/navigation/local_planning/CMakeLists.txt index ae184519..4b5d36b1 100644 --- a/source/armarx/navigation/local_planning/CMakeLists.txt +++ b/source/armarx/navigation/local_planning/CMakeLists.txt @@ -10,6 +10,7 @@ armarx_add_library(local_planning ArViz armarx_navigation::core armarx_navigation::conversions + armarx_navigation::algorithms armarx_navigation::local_planning_aron armarx_navigation::teb_human teb_extension::obstacles diff --git a/source/armarx/navigation/local_planning/TimedElasticBands.cpp b/source/armarx/navigation/local_planning/TimedElasticBands.cpp index 91483e74..1b86f5d3 100644 --- a/source/armarx/navigation/local_planning/TimedElasticBands.cpp +++ b/source/armarx/navigation/local_planning/TimedElasticBands.cpp @@ -67,8 +67,12 @@ namespace armarx::navigation::local_planning hcp_ = std::make_unique<teb_local_planner::HomotopyClassPlanner>(); hcp_->initialize( - cfg_, &teb_obstacles, robot_model, teb_local_planner::TebVisualizationPtr(), nullptr); - + cfg_, &teb_obstacles, robot_model, teb_local_planner::TebVisualizationPtr(), nullptr); + //set member teb_costmap + setTebCostmap(); + if (teb_costmap) { + hcp_->setCostmap(&teb_costmap.value()); + } ros::Time::init(); // we have to init time before we can use the planner } @@ -198,4 +202,17 @@ namespace armarx::navigation::local_planning ARMARX_INFO << "TEB: added " << obstManager.size() << " obstacles"; } + //export algorithms::Costmap to costmap type of teb local planner and provide costmap to planner + void + TimedElasticBands::setTebCostmap() + { + if (!scene.staticScene) + return; + if (!scene.staticScene->distanceToObstaclesCostmap) + return; + const algorithms::Costmap& navigationCostmap = + scene.staticScene->distanceToObstaclesCostmap.value(); + teb_costmap.emplace(conv::toRos(navigationCostmap)); + } + } // namespace armarx::navigation::local_planning diff --git a/source/armarx/navigation/local_planning/TimedElasticBands.h b/source/armarx/navigation/local_planning/TimedElasticBands.h index 9eba4d52..1c1db279 100644 --- a/source/armarx/navigation/local_planning/TimedElasticBands.h +++ b/source/armarx/navigation/local_planning/TimedElasticBands.h @@ -61,6 +61,7 @@ namespace armarx::navigation::local_planning private: void readDefaultConfig(arondto::TimedElasticBandsParams& target); void fillObstacles(); + void setTebCostmap(); protected: Params params; @@ -72,6 +73,7 @@ namespace armarx::navigation::local_planning teb_local_planner::ObstContainer teb_obstacles; TebObstacleManager obstManager; teb_local_planner::PoseSequence teb_globalPath; + std::optional<teb_local_planner::Costmap> teb_costmap; std::unique_ptr<teb_local_planner::HomotopyClassPlanner> hcp_{nullptr}; }; } // namespace armarx::navigation::local_planning diff --git a/source/armarx/navigation/local_planning/ros_conversions.cpp b/source/armarx/navigation/local_planning/ros_conversions.cpp index 86fd6a2c..91736c32 100644 --- a/source/armarx/navigation/local_planning/ros_conversions.cpp +++ b/source/armarx/navigation/local_planning/ros_conversions.cpp @@ -164,4 +164,29 @@ namespace armarx::navigation::conv return {.a = ellipse.b / 1000, .b = ellipse.a / 1000}; // [mm] to [m] } + teb_local_planner::Costmap + toRos(const algorithms::Costmap& costmap) + { + const algorithms::Costmap::Parameters& params = costmap.params(); + const teb_local_planner::Costmap::Parameters teb_params = { + params.binaryGrid, params.cellSize / 1000}; // [mm] to [m] + + const algorithms::SceneBounds& bounds = costmap.getLocalSceneBounds(); + const teb_local_planner::Costmap::SceneBounds teb_bounds = { + toRos2D(bounds.min).cast<float>(), toRos2D(bounds.max).cast<float>()}; + + const std::optional<algorithms::Costmap::Mask>& mask = costmap.getMask(); + boost::optional<teb_local_planner::Costmap::Mask> teb_mask = boost::none; + if (mask) + { + teb_mask = mask.value(); + } + + teb_local_planner::Costmap::Pose2D teb_origin = costmap.origin(); + teb_origin.translation() /= 1000; // [mm] to[m] + + return teb_local_planner::Costmap{ + costmap.getGrid(), teb_params, teb_bounds, teb_mask, teb_origin}; + } + } // namespace armarx::navigation::conv diff --git a/source/armarx/navigation/local_planning/ros_conversions.h b/source/armarx/navigation/local_planning/ros_conversions.h index 548dce73..05b52e77 100644 --- a/source/armarx/navigation/local_planning/ros_conversions.h +++ b/source/armarx/navigation/local_planning/ros_conversions.h @@ -27,6 +27,8 @@ #include <geometry_msgs/Twist.h> #include <teb_local_planner/pose_se2.h> #include <teb_local_planner/timed_elastic_band.h> +#include <teb_local_planner/costmap.h> +#include <armarx/navigation/algorithms/Costmap.h> namespace armarx::navigation::conv { @@ -49,4 +51,6 @@ namespace armarx::navigation::conv human::shapes::Ellipse toRos(const human::shapes::Ellipse& ellipse); + teb_local_planner::Costmap toRos(const algorithms::Costmap& costmap); + } // namespace armarx::navigation::conv -- GitLab From fc5d357f69845c6f0bbe83c9bda51986c7dd7dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Gr=C3=B6ger?= <tobias.groeger@student.kit.edu> Date: Thu, 22 Sep 2022 19:06:55 +0200 Subject: [PATCH 2/5] Fix costmap conversion Convert armarx costmap from mm to m to teb. --- .../local_planner_config/TimedElasticBands/default.json | 2 +- source/armarx/navigation/local_planning/ros_conversions.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/data/armarx_navigation/local_planner_config/TimedElasticBands/default.json b/data/armarx_navigation/local_planner_config/TimedElasticBands/default.json index 34d3506a..4265bf31 100644 --- a/data/armarx_navigation/local_planner_config/TimedElasticBands/default.json +++ b/data/armarx_navigation/local_planner_config/TimedElasticBands/default.json @@ -6,7 +6,7 @@ "pse": { "pse_costum_obstacle_penalties": true, "pse_costum_obstacle_penalties_dynamic": true, - "weight_costmap": 0.5, + "weight_costmap": 1, "weight_global_path_position": 0.3, "weight_global_path_orientation": 0.3, "lrk_use_alternative_approach": false, diff --git a/source/armarx/navigation/local_planning/ros_conversions.cpp b/source/armarx/navigation/local_planning/ros_conversions.cpp index 91736c32..2303b64c 100644 --- a/source/armarx/navigation/local_planning/ros_conversions.cpp +++ b/source/armarx/navigation/local_planning/ros_conversions.cpp @@ -185,8 +185,10 @@ namespace armarx::navigation::conv teb_local_planner::Costmap::Pose2D teb_origin = costmap.origin(); teb_origin.translation() /= 1000; // [mm] to[m] - return teb_local_planner::Costmap{ - costmap.getGrid(), teb_params, teb_bounds, teb_mask, teb_origin}; + algorithms::Costmap::Grid teb_grid = costmap.getGrid(); + teb_grid /= 1000; // [mm] to [m] + + return teb_local_planner::Costmap{teb_grid, teb_params, teb_bounds, teb_mask, teb_origin}; } } // namespace armarx::navigation::conv -- GitLab From da60b8ca1bbdce1c7ce451ce632b0f08851283cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Gr=C3=B6ger?= <tobias.groeger@student.kit.edu> Date: Thu, 22 Sep 2022 19:15:21 +0200 Subject: [PATCH 3/5] Add penalty model conversions --- source/armarx/navigation/human/types.h | 6 ++++++ .../local_planning/TebObstacleManager.cpp | 7 +++---- .../navigation/local_planning/ros_conversions.cpp | 15 +++++++++++++++ .../navigation/local_planning/ros_conversions.h | 9 +++++++-- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/source/armarx/navigation/human/types.h b/source/armarx/navigation/human/types.h index fe5490d5..0c3e0804 100644 --- a/source/armarx/navigation/human/types.h +++ b/source/armarx/navigation/human/types.h @@ -57,6 +57,12 @@ namespace armarx::navigation::human using HumanGroups = std::vector<HumanGroup>; + struct LinearPenaltyModel + { + float minDistance; // [m] + float epsilon; // [m] + }; + struct ExponentialPenaltyModel { float minDistance; // [m] diff --git a/source/armarx/navigation/local_planning/TebObstacleManager.cpp b/source/armarx/navigation/local_planning/TebObstacleManager.cpp index 8f82f74d..add2038f 100644 --- a/source/armarx/navigation/local_planning/TebObstacleManager.cpp +++ b/source/armarx/navigation/local_planning/TebObstacleManager.cpp @@ -70,9 +70,7 @@ namespace armarx::navigation::local_planning const auto& penalty = proxemicZone.penalty; - obst->setPenaltyModel(boost::make_shared<teb_local_planner::ExponentialPenaltyModel>( - teb_local_planner::LinearPenaltyModel(penalty.minDistance, penalty.epsilon), - penalty.exponent)); + obst->setPenaltyModel(conv::toRos(penalty)); obst->setWeight(proxemicZone.weight); obst->setHomotopicRelevance(proxemicZone.homotopicRelevance); @@ -87,7 +85,8 @@ namespace armarx::navigation::local_planning // visualize proxemic zone if layer is available if (visLayer != nullptr) { - const Eigen::Vector3f axisLength(proxemicZone.shape.a, proxemicZone.shape.b, 10.f-i); + const Eigen::Vector3f axisLength( + proxemicZone.shape.a, proxemicZone.shape.b, 10.f - i); const core::Pose pose3d = conv::to3D(proxemicZone.pose); visLayer->add(viz::Ellipsoid("proxemicZone_" + std::to_string(visualizationIndex++)) diff --git a/source/armarx/navigation/local_planning/ros_conversions.cpp b/source/armarx/navigation/local_planning/ros_conversions.cpp index 2303b64c..657db4c4 100644 --- a/source/armarx/navigation/local_planning/ros_conversions.cpp +++ b/source/armarx/navigation/local_planning/ros_conversions.cpp @@ -191,4 +191,19 @@ namespace armarx::navigation::conv return teb_local_planner::Costmap{teb_grid, teb_params, teb_bounds, teb_mask, teb_origin}; } + teb_local_planner::PenaltyModelPtr + toRos(const human::LinearPenaltyModel& model) + { + return boost::make_shared<teb_local_planner::LinearPenaltyModel>( + teb_local_planner::LinearPenaltyModel(model.minDistance, model.epsilon)); + } + + teb_local_planner::PenaltyModelPtr + toRos(const human::ExponentialPenaltyModel& model) + { + return boost::make_shared<teb_local_planner::ExponentialPenaltyModel>( + teb_local_planner::LinearPenaltyModel(model.minDistance, model.epsilon), + model.exponent); + } + } // namespace armarx::navigation::conv diff --git a/source/armarx/navigation/local_planning/ros_conversions.h b/source/armarx/navigation/local_planning/ros_conversions.h index 05b52e77..083ddcc5 100644 --- a/source/armarx/navigation/local_planning/ros_conversions.h +++ b/source/armarx/navigation/local_planning/ros_conversions.h @@ -21,14 +21,15 @@ #pragma once +#include <armarx/navigation/algorithms/Costmap.h> #include <armarx/navigation/core/basic_types.h> #include <armarx/navigation/core/types.h> #include <armarx/navigation/human/shapes.h> #include <geometry_msgs/Twist.h> +#include <teb_local_planner/costmap.h> +#include <teb_local_planner/penalty_models.h> #include <teb_local_planner/pose_se2.h> #include <teb_local_planner/timed_elastic_band.h> -#include <teb_local_planner/costmap.h> -#include <armarx/navigation/algorithms/Costmap.h> namespace armarx::navigation::conv { @@ -53,4 +54,8 @@ namespace armarx::navigation::conv teb_local_planner::Costmap toRos(const algorithms::Costmap& costmap); + teb_local_planner::PenaltyModelPtr toRos(const human::LinearPenaltyModel& model); + + teb_local_planner::PenaltyModelPtr toRos(const human::ExponentialPenaltyModel& model); + } // namespace armarx::navigation::conv -- GitLab From 2188d923d6e63466058a81289a31ca9eafb70d50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Gr=C3=B6ger?= <tobias.groeger@student.kit.edu> Date: Thu, 22 Sep 2022 19:16:28 +0200 Subject: [PATCH 4/5] Add costmap with custom penalty to optimization --- .../navigation/human/ProxemicZoneCreator.cpp | 15 ++++++++++----- .../local_planning/TebObstacleManager.cpp | 1 + .../local_planning/TimedElasticBands.cpp | 13 ++++++++++--- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/source/armarx/navigation/human/ProxemicZoneCreator.cpp b/source/armarx/navigation/human/ProxemicZoneCreator.cpp index 8a6aac53..acd453fa 100644 --- a/source/armarx/navigation/human/ProxemicZoneCreator.cpp +++ b/source/armarx/navigation/human/ProxemicZoneCreator.cpp @@ -9,10 +9,13 @@ namespace armarx::navigation::human ProxemicZoneCreator::createProxemicZones(const Human& human) { // intimate zone - ProxemicZone intimate{.pose = human.pose, - .shape = {.a = params.intimateRadius, .b = params.intimateRadius}, - .penalty = intimatePenalty, - .weight = params.intimateWeight}; + ProxemicZone intimate{ + .pose = human.pose, + .shape = {.a = params.intimateRadius, .b = params.intimateRadius}, + .penalty = intimatePenalty, + .weight = params.intimateWeight, + .homotopicRelevance = true, + }; // personal zone auto& global_R_human = human.pose.linear(); @@ -38,7 +41,9 @@ namespace armarx::navigation::human .pose = pose, .shape = {.a = params.personalRadius, .b = movementStretch * params.personalRadius}, .penalty = personalPenalty, - .weight = params.personalWeight}; + .weight = params.personalWeight, + .homotopicRelevance = false, + }; return {intimate, personal}; } diff --git a/source/armarx/navigation/local_planning/TebObstacleManager.cpp b/source/armarx/navigation/local_planning/TebObstacleManager.cpp index add2038f..e2402e12 100644 --- a/source/armarx/navigation/local_planning/TebObstacleManager.cpp +++ b/source/armarx/navigation/local_planning/TebObstacleManager.cpp @@ -37,6 +37,7 @@ namespace armarx::navigation::local_planning obst->pushBackVertex(max.x(), min.y()); obst->finalizePolygon(); + obst->setUseForOptimization(false); container.push_back(obst); // visualize bounding box if layer is available diff --git a/source/armarx/navigation/local_planning/TimedElasticBands.cpp b/source/armarx/navigation/local_planning/TimedElasticBands.cpp index 7bd970f0..8f86171a 100644 --- a/source/armarx/navigation/local_planning/TimedElasticBands.cpp +++ b/source/armarx/navigation/local_planning/TimedElasticBands.cpp @@ -1,4 +1,5 @@ #include "TimedElasticBands.h" + #include <optional> #include <SimoxUtility/algorithm/apply.hpp> @@ -68,10 +69,16 @@ namespace armarx::navigation::local_planning hcp_ = std::make_unique<teb_local_planner::HomotopyClassPlanner>(); hcp_->initialize( - cfg_, &teb_obstacles, robot_model, teb_local_planner::TebVisualizationPtr(), nullptr); + cfg_, &teb_obstacles, robot_model, teb_local_planner::TebVisualizationPtr(), nullptr); //set member teb_costmap setTebCostmap(); - if (teb_costmap) { + if (teb_costmap) + { + // TODO: where to put all the parameters + const human::ExponentialPenaltyModel penalty{ + .minDistance = 0.5, .epsilon = 0, .exponent = 1.2}; + + teb_costmap->setPenaltyModel(conv::toRos(penalty)); hcp_->setCostmap(&teb_costmap.value()); } ros::Time::init(); // we have to init time before we can use the planner @@ -130,7 +137,7 @@ namespace armarx::navigation::local_planning return {}; } - if(hcp_->getTrajectoryContainer().empty()) + if (hcp_->getTrajectoryContainer().empty()) { ARMARX_VERBOSE << "Did not find any trajectory!"; return std::nullopt; -- GitLab From 84cb65920cff918e75c0af61451318bee2c309c2 Mon Sep 17 00:00:00 2001 From: Fabian Reister <fabian.reister@kit.edu> Date: Mon, 26 Sep 2022 09:55:47 +0200 Subject: [PATCH 5/5] minor fixes (code style) --- .../navigation/local_planning/TimedElasticBands.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/source/armarx/navigation/local_planning/TimedElasticBands.cpp b/source/armarx/navigation/local_planning/TimedElasticBands.cpp index 8f86171a..86f63c95 100644 --- a/source/armarx/navigation/local_planning/TimedElasticBands.cpp +++ b/source/armarx/navigation/local_planning/TimedElasticBands.cpp @@ -221,10 +221,16 @@ namespace armarx::navigation::local_planning void TimedElasticBands::setTebCostmap() { - if (!scene.staticScene) + if (not scene.staticScene.has_value()) + { return; - if (!scene.staticScene->distanceToObstaclesCostmap) + } + + if (not scene.staticScene->distanceToObstaclesCostmap.has_value()) + { return; + } + const algorithms::Costmap& navigationCostmap = scene.staticScene->distanceToObstaclesCostmap.value(); teb_costmap.emplace(conv::toRos(navigationCostmap)); -- GitLab