79 const std::string Component::defaultName =
"human_simulator";
101 def->optional(properties.taskPeriodMs,
"p.taskPeriodMs",
"");
102 def->optional(properties.nHumans,
"p.nHumans",
"Number of humans to spawn.");
104 def->optional(properties.humanParams.goalDistanceThreshold,
105 "p.human.goalDistanceThreshold",
107 def->optional(properties.humanParams.minLinearVelocity,
"p.human.maxLinearVelocity",
"");
108 def->optional(properties.humanParams.maxLinearVelocity,
"p.human.maxLinearVelocity",
"");
110 def->optional(properties.objectPoseProviderName,
"p.objectPoseProviderName",
"");
112 def->required(properties.robotName,
"p.robotName",
"");
128 Component::setPreferredVelocities(RVO::RVOSimulator* simulator,
129 const std::vector<RVO::Vector2>& goals)
137 for (
int i = 0; i < static_cast<int>(properties.nHumans); ++i)
146 const auto agentPosition = simulator->getAgentPosition(i);
147 auto& simulatedHuman = simulatedHumans.at(i);
150 pose.translation().x() = agentPosition.x() * 1000;
151 pose.translation().y() = agentPosition.y() * 1000;
153 simulatedHuman.reinitialize(pose);
155 const std::vector<core::Position> trajectoryPoints =
156 simulatedHuman.trajectory().positions();
158 const std::size_t lookAheadGoalIdx = std::min(trajectoryPoints.size() - 1, 5ul);
159 const auto& intermediateGoal = trajectoryPoints.at(lookAheadGoalIdx);
161 const Eigen::Vector2f rvoGoalHelper = intermediateGoal.head<2>() / 1000;
163 const RVO::Vector2 rvoGoal(rvoGoalHelper.x(), rvoGoalHelper.y());
165 RVO::Vector2 goalVector = rvoGoal - agentPosition;
167 if (RVO::absSq(goalVector) > 1.0F)
169 goalVector = RVO::normalize(goalVector);
172 simulator->setAgentPrefVelocity(i, goalVector);
192 .providerName =
"distance_to_obstacle_costmap_provider",
193 .name =
"distance_to_obstacles",
197 costmapReaderPlugin->get().query(costmapQuery);
211 return costmapResult.
costmap.value();
219 simulator.setTimeStep(
static_cast<float>(properties.taskPeriodMs) / 1000);
220 simulator.setAgentDefaults(15.0F, 10U, 1.5F, .1F, .4F, .5F);
224 properties.objectPoseProviderName);
228 VirtualRobot::ObjectIO::ObjectDescription::eCollisionModel);
234 auto layer =
arviz.layer(
"obstacles");
237 for (
const auto& obst :
objects->getCollisionModels())
241 const VirtualRobot::BoundingBox bbox = obst->getGlobalBoundingBox();
243 Eigen::Vector2f bbMin = bbox.getMin().head<2>();
244 Eigen::Vector2f bbMax = bbox.getMax().head<2>();
247 const float margin = 100;
254 ARMARX_VERBOSE <<
"Bounding box: (" << bbMin.transpose() <<
"), ("
255 << bbMax.transpose() <<
")";
258 constexpr float zHeight = 3;
261 polygon.
addPoint(Eigen::Vector3f{bbMin.x(), bbMin.y(), zHeight});
262 polygon.
addPoint(Eigen::Vector3f{bbMax.x(), bbMin.y(), zHeight});
263 polygon.
addPoint(Eigen::Vector3f{bbMax.x(), bbMax.y(), zHeight});
264 polygon.
addPoint(Eigen::Vector3f{bbMin.x(), bbMax.y(), zHeight});
266 polygon.
color(simox::Color::black());
267 polygon.
color(simox::Color::black());
273 const Eigen::Vector2d
min = bbMin.cast<
double>() / 1000;
274 const Eigen::Vector2d
max = bbMax.cast<
double>() / 1000;
276 std::vector<RVO::Vector2> obstacle;
277 obstacle.emplace_back(
min.x(),
min.y());
278 obstacle.emplace_back(
max.x(),
min.y());
279 obstacle.emplace_back(
max.x(),
max.y());
280 obstacle.emplace_back(
min.x(),
max.y());
282 simulator.addObstacle(obstacle);
288 simulator.processObstacles();
293 simulatedHumans.clear();
295 for (std::size_t i = 0U; i < properties.nHumans; ++i)
298 simulatedHumans.emplace_back(costmap);
300 const RVO::Vector2 position =
301 RVO::Vector2(
human.human().pose.translation().x() / 1000,
302 human.human().pose.translation().y() / 1000);
303 auto goal =
human.trajectory().positions().back() / 1000;
310 goals.emplace_back(goal.x(), goal.y());
316 robot = virtualRobotReaderPlugin->get().getRobotWaiting(properties.robotName);
320 const auto robotPosH = robot->getGlobalPosition();
321 const RVO::Vector2 robotPos(robotPosH.x() / 1000, robotPosH.y() / 1000);
323 robotAgentId = simulator.addAgent(robotPos);
324 simulator.setAgentMaxSpeed(robotAgentId,
326 simulator.setAgentPrefVelocity(robotAgentId, RVO::Vector2(0, 0));
327 simulator.setAgentRadius(robotAgentId, 0.6);
332 &Component::runPeriodically,
333 properties.taskPeriodMs,
353 return Component::defaultName;
359 return Component::defaultName;
363 Component::runPeriodically()
367 setPreferredVelocities(&simulator, goals);
376 const auto robotPosH = robot->getGlobalPosition();
377 const RVO::Vector2 robotPos(robotPosH.x() / 1000, robotPosH.y() / 1000);
379 simulator.setAgentPosition(robotAgentId, robotPos);
387 for (
const auto& simulatedHuman : simulatedHumans)
389 viz::Path path(std::to_string(layer.size()));
391 for (
const auto& pt : simulatedHuman.trajectory().points())
393 path.addPoint(pt.waypoint.pose.translation());
397 path.colorGlasbeyLUT(layer.size());
407 for (std::size_t i = 0; i < properties.nHumans; i++)
409 const auto pos = simulator.getAgentPosition(i);
412 human.pose.setIdentity();
413 human.pose.translation().x() = pos.x() * 1000;
414 human.pose.translation().y() = pos.y() * 1000;
416 humans.push_back(human);