diff --git a/data/RobotAPI/VariantInfo-RobotAPI.xml b/data/RobotAPI/VariantInfo-RobotAPI.xml index fac11b677edbf7fc26cd2538e453981601e94f13..9d9342ab21b51d11fd188a70c5e4cf6066afff24 100644 --- a/data/RobotAPI/VariantInfo-RobotAPI.xml +++ b/data/RobotAPI/VariantInfo-RobotAPI.xml @@ -43,10 +43,18 @@ <Proxy include="RobotAPI/interface/units/PlatformUnitInterface.h" humanName="Platform Unit (obstacle avoiding)" typeName="PlatformUnitInterfacePrx" - memberName="obstacleAvoidingPlatformUnit" - getterName="getObstacleAvoidingPlatformUnit" - propertyName="ObstacleAvoidingPlatformUnitName" + memberName="platformUnit1" + getterName="getPlatformUnit1" + propertyName="PlatformUnitName1" propertyDefaultValue="ObstacleAvoidingPlatformUnit" + propertyIsOptional="true" /> + <Proxy include="RobotAPI/interface/units/PlatformUnitInterface.h" + humanName="Platform Unit (obstacle aware)" + typeName="PlatformUnitInterfacePrx" + memberName="platformUnit2" + getterName="getPlatformUnit2" + propertyName="PlatformUnitName2" + propertyDefaultValue="ObstacleAwarePlatformUnit" propertyIsOptional="true" /> <Proxy include="RobotAPI/interface/observers/PlatformUnitObserverInterface.h" humanName="Platform Unit Observer" diff --git a/scenarios/dasd/config/DynamicObstacleManager.cfg b/scenarios/dasd/config/DynamicObstacleManager.cfg index fa54617910f49a719e8a00a6e430cb815c0e9fb2..0eabec6c1f57706ae48e25fe4b2f92f67c85c8a5 100644 --- a/scenarios/dasd/config/DynamicObstacleManager.cfg +++ b/scenarios/dasd/config/DynamicObstacleManager.cfg @@ -179,7 +179,7 @@ ArmarX.DynamicObstacleManager.MinObstacleValueForAccepting = 50 # - Default: 0.899999976 # - Case sensitivity: yes # - Required: no -# ArmarX.DynamicObstacleManager.MinSampleRatioPerLineSegment = 0.899999976 +ArmarX.DynamicObstacleManager.MinSampleRatioPerLineSegment = 0.5 # ArmarX.DynamicObstacleManager.MinimumLoggingLevel: Local logging level only for this component @@ -188,7 +188,7 @@ ArmarX.DynamicObstacleManager.MinObstacleValueForAccepting = 50 # - Case sensitivity: yes # - Required: no # - Possible values: {Debug, Error, Fatal, Important, Info, Undefined, Verbose, Warning} -# ArmarX.DynamicObstacleManager.MinimumLoggingLevel = Undefined +ArmarX.DynamicObstacleManager.MinimumLoggingLevel = Debug # ArmarX.DynamicObstacleManager.ObjectName: Name of IceGrid well-known object @@ -229,7 +229,7 @@ ArmarX.DynamicObstacleManager.ObstacleSecurityMargin = 300 # - Default: 500 # - Case sensitivity: yes # - Required: no -# ArmarX.DynamicObstacleManager.UpdateInterval = 500 +ArmarX.DynamicObstacleManager.UpdateInterval = 350 # ArmarX.EnableProfiling: Enable profiling of CPU load produced by this application diff --git a/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.cpp b/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.cpp index 42cad7e869e398d5dca9c0505014e052dac0f408..41fc3e85f7a6a7250c47fe58c0730973a16480be 100644 --- a/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.cpp +++ b/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.cpp @@ -120,6 +120,7 @@ namespace armarx void DynamicObstacleManager::add_decayable_line_segment(const Eigen::Vector2f& line_start, const Eigen::Vector2f& line_end, const Ice::Current&) { + TIMING_START(add_decayable_line_segment); const Eigen::Vector2f difference_vec = line_end - line_start; const float length = difference_vec.norm(); const Eigen::Vector2f center_vec = line_start + 0.5 * difference_vec; @@ -141,6 +142,7 @@ namespace armarx { std::shared_lock<std::shared_mutex> l(m_managed_obstacles_mutex); + TIMING_START(add_decayable_line_segment_mutex); // First check own obstacles for (ManagedObstaclePtr& managed_obstacle : m_managed_obstacles) { @@ -156,13 +158,15 @@ namespace armarx managed_obstacle->line_matches.push_back(line_start); managed_obstacle->line_matches.push_back(line_end); managed_obstacle->m_last_matched = IceUtil::Time::now(); + TIMING_END(add_decayable_line_segment_mutex); return; } } + TIMING_END(add_decayable_line_segment_mutex); } // Second check the obstacles from the obstacle avoidance - for (const auto& published_obstacle : m_obstacle_detection->getObstacles()) + /*for (const auto& published_obstacle : m_obstacle_detection->getObstacles()) { float coverage = ManagedObstacle::line_segment_ellipsis_coverage( {published_obstacle.posX, published_obstacle.posY}, published_obstacle.axisLengthX, published_obstacle.axisLengthY, published_obstacle.yaw, @@ -173,7 +177,7 @@ namespace armarx ARMARX_DEBUG << "Found the obstacle in the static obstacle list! Matching name: " << published_obstacle.name; return; } - } + }*/ ARMARX_DEBUG << " No matching obstacle found. Create new obstacle and add to list"; ManagedObstaclePtr new_managed_obstacle(new ManagedObstacle()); @@ -199,6 +203,15 @@ namespace armarx std::lock_guard<std::shared_mutex> l(m_managed_obstacles_mutex); m_managed_obstacles.push_back(new_managed_obstacle); } + TIMING_END(add_decayable_line_segment); + } + + void DynamicObstacleManager::add_decayable_line_segments(const dynamicobstaclemanager::LineSegments& lines, const Ice::Current& c) + { + for (const auto& line : lines) + { + add_decayable_line_segment(line.lineStart, line.lineEnd, c); + } } @@ -248,7 +261,7 @@ namespace armarx const float sample_step = 5; // in [mm], sample step size towards goal. const float distance_to_goal = (goal - agentPosition).norm() + safetyRadius; - float current_distance = sample_step; + float current_distance = safetyRadius; while (current_distance < distance_to_goal) { diff --git a/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.h b/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.h index b6a4371232cd0c6d60359bb1ec473c1e15360e38..5f2d8065a307706ea16789930c12f5165d6044eb 100644 --- a/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.h +++ b/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.h @@ -69,6 +69,7 @@ namespace armarx void add_decayable_obstacle(const Eigen::Vector2f&, float, float, float, const Ice::Current& = Ice::Current()) override; void add_decayable_line_segment(const Eigen::Vector2f&, const Eigen::Vector2f&, const Ice::Current& = Ice::Current()) override; + void add_decayable_line_segments(const dynamicobstaclemanager::LineSegments& lines, const Ice::Current& = Ice::Current()) override; void remove_all_decayable_obstacles(const Ice::Current& = Ice::Current()) override; void directly_update_obstacle(const std::string& name, const Eigen::Vector2f&, float, float, float, const Ice::Current& = Ice::Current()) override; void remove_obstacle(const std::string& name, const Ice::Current& = Ice::Current()) override; diff --git a/source/RobotAPI/components/DynamicObstacleManager/ManagedObstacle.cpp b/source/RobotAPI/components/DynamicObstacleManager/ManagedObstacle.cpp index fe21cc4e46558b3a70102592ee77ef56715421f8..f718a45434ec538fbd5d2541fb9413568f3e79f0 100644 --- a/source/RobotAPI/components/DynamicObstacleManager/ManagedObstacle.cpp +++ b/source/RobotAPI/components/DynamicObstacleManager/ManagedObstacle.cpp @@ -94,10 +94,25 @@ namespace armarx float ManagedObstacle::line_segment_ellipsis_coverage(const Eigen::Vector2f e_origin, const float e_rx, const float e_ry, const float e_yaw, const Eigen::Vector2f line_seg_start, const Eigen::Vector2f line_seg_end) { // Again we discretize the line into n points and we check the coverage of those points - const unsigned int SAMPLES = 40; const Eigen::Vector2f difference_vec = line_seg_end - line_seg_start; const Eigen::Vector2f difference_vec_normed = difference_vec.normalized(); const float distance = difference_vec.norm(); + const unsigned int SAMPLES = std::max(distance / 10.0, 40.0); + + const Vector2f difference_start_origin = e_origin - line_seg_start; + const Vector2f difference_end_origin = e_origin - line_seg_end; + + if (difference_start_origin.norm() > std::max(e_rx, e_ry) && distance < std::max(e_rx, e_ry)) + { + return 0.0; + } + + if (difference_end_origin.norm() > std::max(e_rx, e_ry) && distance < std::max(e_rx, e_ry)) + { + return 0.0; + } + + const float step_size = distance / SAMPLES; const Eigen::Vector2f dir = difference_vec_normed * step_size; diff --git a/source/RobotAPI/interface/components/ObstacleAvoidance/DynamicObstacleManagerInterface.ice b/source/RobotAPI/interface/components/ObstacleAvoidance/DynamicObstacleManagerInterface.ice index 313de2b9d41a3e89f634ccab7b933fb8d4ca15c3..5ff2649fae12cb906f5821f73ba1fb1fd21647fe 100644 --- a/source/RobotAPI/interface/components/ObstacleAvoidance/DynamicObstacleManagerInterface.ice +++ b/source/RobotAPI/interface/components/ObstacleAvoidance/DynamicObstacleManagerInterface.ice @@ -30,6 +30,18 @@ module armarx { + module dynamicobstaclemanager + { + struct LineSegment + { + Eigen::Vector2f lineStart; + Eigen::Vector2f lineEnd; + }; + + sequence<LineSegment> LineSegments; + } + + interface DynamicObstacleManagerInterface { void @@ -38,6 +50,9 @@ module armarx void add_decayable_line_segment(Eigen::Vector2f line_start, Eigen::Vector2f line_end); + void + add_decayable_line_segments(dynamicobstaclemanager::LineSegments lines); + void remove_all_decayable_obstacles();