41 #include <boost/filesystem.hpp> 42 #include <boost/algorithm/string.hpp> 51 namespace fs = boost::filesystem;
107 ROS_INFO(
"Updating kinematic model");
144 for (std::vector<srdf::Model::DisabledCollision>::const_iterator pair_it =
srdf_->disabled_collisions_.begin();
145 pair_it !=
srdf_->disabled_collisions_.end(); ++pair_it)
156 YAML::Emitter emitter;
157 emitter << YAML::BeginMap;
160 emitter << YAML::Key <<
"moveit_setup_assistant_config";
162 emitter << YAML::Value << YAML::BeginMap;
165 emitter << YAML::Key <<
"URDF";
166 emitter << YAML::Value << YAML::BeginMap;
167 emitter << YAML::Key <<
"package" << YAML::Value <<
urdf_pkg_name_;
169 emitter << YAML::Key <<
"xacro_args" << YAML::Value <<
xacro_args_;
170 emitter << YAML::EndMap;
173 emitter << YAML::Key <<
"SRDF";
174 emitter << YAML::Value << YAML::BeginMap;
176 emitter << YAML::EndMap;
179 emitter << YAML::Key <<
"CONFIG";
180 emitter << YAML::Value << YAML::BeginMap;
181 emitter << YAML::Key <<
"author_name" << YAML::Value <<
author_name_;
182 emitter << YAML::Key <<
"author_email" << YAML::Value <<
author_email_;
183 emitter << YAML::Key <<
"generated_timestamp" << YAML::Value << std::time(
NULL);
184 emitter << YAML::EndMap;
186 emitter << YAML::EndMap;
188 std::ofstream output_stream(file_path.c_str(), std::ios_base::trunc);
189 if (!output_stream.good())
195 output_stream << emitter.c_str();
196 output_stream.close();
206 YAML::Emitter emitter;
207 emitter << YAML::BeginMap;
210 emitter << YAML::Key <<
"planner_configs";
212 emitter << YAML::Value << YAML::BeginMap;
217 std::vector<std::string> pconfigs;
218 for (std::size_t i = 0; i < planner_des.size(); ++i)
220 std::string defaultconfig = planner_des[i].name_;
221 emitter << YAML::Key << defaultconfig;
222 emitter << YAML::Value << YAML::BeginMap;
223 emitter << YAML::Key <<
"type" << YAML::Value <<
"geometric::" + planner_des[i].name_;
224 for (std::size_t j = 0; j < planner_des[i].parameter_list_.size(); j++)
226 emitter << YAML::Key << planner_des[i].parameter_list_[j].name;
227 emitter << YAML::Value << planner_des[i].parameter_list_[j].value;
228 emitter << YAML::Comment(planner_des[i].parameter_list_[j].comment.c_str());
230 emitter << YAML::EndMap;
232 pconfigs.push_back(defaultconfig);
236 emitter << YAML::EndMap;
239 for (std::vector<srdf::Model::Group>::iterator group_it =
srdf_->groups_.begin(); group_it !=
srdf_->groups_.end();
242 emitter << YAML::Key << group_it->name_;
243 emitter << YAML::Value << YAML::BeginMap;
245 emitter << YAML::Key <<
"default_planner_config" << YAML::Value
247 emitter << YAML::Key <<
"planner_configs";
248 emitter << YAML::Value << YAML::BeginSeq;
249 for (std::size_t i = 0; i < pconfigs.size(); ++i)
250 emitter << pconfigs[i];
251 emitter << YAML::EndSeq;
255 if (!projection_joints.empty())
257 emitter << YAML::Key <<
"projection_evaluator";
258 emitter << YAML::Value << projection_joints;
260 emitter << YAML::Key <<
"longest_valid_segment_fraction";
261 emitter << YAML::Value <<
"0.005";
264 emitter << YAML::EndMap;
267 emitter << YAML::EndMap;
269 std::ofstream output_stream(file_path.c_str(), std::ios_base::trunc);
270 if (!output_stream.good())
276 output_stream << emitter.c_str();
277 output_stream.close();
287 YAML::Emitter emitter;
289 emitter << YAML::Value << YAML::BeginMap;
290 emitter << YAML::Key <<
"planning_time_limit" << YAML::Value <<
"10.0";
291 emitter << YAML::Key <<
"max_iterations" << YAML::Value <<
"200";
292 emitter << YAML::Key <<
"max_iterations_after_collision_free" << YAML::Value <<
"5";
293 emitter << YAML::Key <<
"smoothness_cost_weight" << YAML::Value <<
"0.1";
294 emitter << YAML::Key <<
"obstacle_cost_weight" << YAML::Value <<
"1.0";
295 emitter << YAML::Key <<
"learning_rate" << YAML::Value <<
"0.01";
296 emitter << YAML::Key <<
"smoothness_cost_velocity" << YAML::Value <<
"0.0";
297 emitter << YAML::Key <<
"smoothness_cost_acceleration" << YAML::Value <<
"1.0";
298 emitter << YAML::Key <<
"smoothness_cost_jerk" << YAML::Value <<
"0.0";
299 emitter << YAML::Key <<
"ridge_factor" << YAML::Value <<
"0.01";
300 emitter << YAML::Key <<
"use_pseudo_inverse" << YAML::Value <<
"false";
301 emitter << YAML::Key <<
"pseudo_inverse_ridge_factor" << YAML::Value <<
"1e-4";
302 emitter << YAML::Key <<
"joint_update_limit" << YAML::Value <<
"0.1";
303 emitter << YAML::Key <<
"collision_clearence" << YAML::Value <<
"0.2";
304 emitter << YAML::Key <<
"collision_threshold" << YAML::Value <<
"0.07";
305 emitter << YAML::Key <<
"use_stochastic_descent" << YAML::Value <<
"true";
306 emitter << YAML::Key <<
"enable_failure_recovery" << YAML::Value <<
"true";
307 emitter << YAML::Key <<
"max_recovery_attempts" << YAML::Value <<
"5";
308 emitter << YAML::EndMap;
310 std::ofstream output_stream(file_path.c_str(), std::ios_base::trunc);
311 if (!output_stream.good())
317 output_stream << emitter.c_str();
318 output_stream.close();
328 YAML::Emitter emitter;
329 emitter << YAML::BeginMap;
332 for (std::vector<srdf::Model::Group>::iterator group_it =
srdf_->groups_.begin(); group_it !=
srdf_->groups_.end();
340 emitter << YAML::Key << group_it->name_;
341 emitter << YAML::Value << YAML::BeginMap;
344 emitter << YAML::Key <<
"kinematics_solver";
345 emitter << YAML::Value <<
group_meta_data_[group_it->name_].kinematics_solver_;
348 emitter << YAML::Key <<
"kinematics_solver_search_resolution";
349 emitter << YAML::Value <<
group_meta_data_[group_it->name_].kinematics_solver_search_resolution_;
352 emitter << YAML::Key <<
"kinematics_solver_timeout";
353 emitter << YAML::Value <<
group_meta_data_[group_it->name_].kinematics_solver_timeout_;
356 emitter << YAML::Key <<
"kinematics_solver_attempts";
357 emitter << YAML::Value <<
group_meta_data_[group_it->name_].kinematics_solver_attempts_;
359 emitter << YAML::EndMap;
362 emitter << YAML::EndMap;
364 std::ofstream output_stream(file_path.c_str(), std::ios_base::trunc);
365 if (!output_stream.good())
371 output_stream << emitter.c_str();
372 output_stream.close();
384 std::vector<std::string>::iterator joint_it =
389 return "hardware_interface/PositionJointInterface";
391 return "hardware_interface/VelocityJointInterface";
394 return "hardware_interface/EffortJointInterface";
398 return "hardware_interface/EffortJointInterface";
406 bool new_urdf_needed =
false;
407 TiXmlDocument urdf_document;
410 TiXmlPrinter printer;
411 urdf_document.Parse((
const char*)
urdf_string_.c_str(), 0, TIXML_ENCODING_UTF8);
414 for (TiXmlElement* doc_element = urdf_document.RootElement()->FirstChildElement(); doc_element !=
NULL;
415 doc_element = doc_element->NextSiblingElement())
417 if (static_cast<std::string>(doc_element->Value()).find(
"link") != std::string::npos)
420 if (doc_element->FirstChildElement(
"inertial") ==
NULL && doc_element->FirstChildElement(
"collision") !=
NULL)
422 new_urdf_needed =
true;
423 TiXmlElement inertia_link(
"inertial");
424 TiXmlElement mass(
"mass");
425 TiXmlElement inertia_joint(
"inertia");
427 mass.SetAttribute(
"value",
"0.1");
429 inertia_joint.SetAttribute(
"ixx",
"0.03");
430 inertia_joint.SetAttribute(
"iyy",
"0.03");
431 inertia_joint.SetAttribute(
"izz",
"0.03");
432 inertia_joint.SetAttribute(
"ixy",
"0.0");
433 inertia_joint.SetAttribute(
"ixz",
"0.0");
434 inertia_joint.SetAttribute(
"iyz",
"0.0");
436 inertia_link.InsertEndChild(mass);
437 inertia_link.InsertEndChild(inertia_joint);
439 doc_element->InsertEndChild(inertia_link);
442 else if (static_cast<std::string>(doc_element->Value()).find(
"joint") != std::string::npos)
445 if (static_cast<std::string>(doc_element->Attribute(
"type")) !=
"fixed")
447 new_urdf_needed =
true;
448 std::string joint_name =
static_cast<std::string
>(doc_element->Attribute(
"name"));
449 TiXmlElement transmission(
"transmission");
450 TiXmlElement type(
"type");
451 TiXmlElement joint(
"joint");
452 TiXmlElement hardwareInterface(
"hardwareInterface");
453 TiXmlElement actuator(
"actuator");
454 TiXmlElement mechanical_reduction(
"mechanicalReduction");
456 transmission.SetAttribute(
"name", std::string(
"trans_") + joint_name);
457 joint.SetAttribute(
"name", joint_name);
458 actuator.SetAttribute(
"name", joint_name + std::string(
"_motor"));
460 type.InsertEndChild(TiXmlText(
"transmission_interface/SimpleTransmission"));
461 transmission.InsertEndChild(type);
464 joint.InsertEndChild(hardwareInterface);
465 transmission.InsertEndChild(joint);
467 mechanical_reduction.InsertEndChild(TiXmlText(
"1"));
468 actuator.InsertEndChild(hardwareInterface);
469 actuator.InsertEndChild(mechanical_reduction);
470 transmission.InsertEndChild(actuator);
472 urdf_document.RootElement()->InsertEndChild(transmission);
478 TiXmlElement gazebo(
"gazebo");
479 TiXmlElement plugin(
"plugin");
480 TiXmlElement robot_namespace(
"robotNamespace");
482 plugin.SetAttribute(
"name",
"gazebo_ros_control");
483 plugin.SetAttribute(
"filename",
"libgazebo_ros_control.so");
484 robot_namespace.InsertEndChild(TiXmlText(std::string(
"/")));
486 plugin.InsertEndChild(robot_namespace);
487 gazebo.InsertEndChild(plugin);
489 urdf_document.RootElement()->InsertEndChild(gazebo);
491 catch (YAML::ParserException& e)
494 return std::string(
"");
499 urdf_document.Accept(&printer);
500 return std::string(printer.CStr());
503 return std::string(
"");
508 YAML::Emitter emitter;
509 emitter << YAML::BeginMap;
511 emitter << YAML::Key <<
"controller_list";
512 emitter << YAML::Value << YAML::BeginSeq;
515 for (std::vector<srdf::Model::Group>::iterator group_it =
srdf_->groups_.begin(); group_it !=
srdf_->groups_.end();
519 const robot_model::JointModelGroup* joint_model_group =
getRobotModel()->getJointModelGroup(group_it->name_);
520 emitter << YAML::BeginMap;
521 const std::vector<const robot_model::JointModel*>& joint_models = joint_model_group->getActiveJointModels();
522 emitter << YAML::Key <<
"name";
523 emitter << YAML::Value <<
"fake_" + group_it->name_ +
"_controller";
524 emitter << YAML::Key <<
"joints";
525 emitter << YAML::Value << YAML::BeginSeq;
528 for (
const robot_model::JointModel* joint : joint_models)
530 if (joint->isPassive() || joint->getMimic() !=
NULL || joint->getType() == robot_model::JointModel::FIXED)
532 emitter << joint->getName();
534 emitter << YAML::EndSeq;
535 emitter << YAML::EndMap;
537 emitter << YAML::EndSeq;
538 emitter << YAML::EndMap;
540 std::ofstream output_stream(file_path.c_str(), std::ios_base::trunc);
541 if (!output_stream.good())
547 output_stream << emitter.c_str();
548 output_stream.close();
555 std::vector<OMPLPlannerDescription> planner_des;
558 SBL.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()");
559 planner_des.push_back(SBL);
562 EST.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0 setup()");
563 EST.
addParameter(
"goal_bias",
"0.05",
"When close to goal select goal, with this probability. default: 0.05");
564 planner_des.push_back(EST);
567 LBKPIECE.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 569 LBKPIECE.
addParameter(
"border_fraction",
"0.9",
"Fraction of time focused on boarder default: 0.9");
570 LBKPIECE.
addParameter(
"min_valid_path_fraction",
"0.5",
"Accept partially valid moves above fraction. default: 0.5");
571 planner_des.push_back(LBKPIECE);
574 BKPIECE.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 576 BKPIECE.
addParameter(
"border_fraction",
"0.9",
"Fraction of time focused on boarder default: 0.9");
577 BKPIECE.
addParameter(
"failed_expansion_score_factor",
"0.5",
"When extending motion fails, scale score by factor. " 579 BKPIECE.
addParameter(
"min_valid_path_fraction",
"0.5",
"Accept partially valid moves above fraction. default: 0.5");
580 planner_des.push_back(BKPIECE);
583 KPIECE.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 585 KPIECE.
addParameter(
"goal_bias",
"0.05",
"When close to goal select goal, with this probability. default: 0.05");
586 KPIECE.
addParameter(
"border_fraction",
"0.9",
"Fraction of time focused on boarder default: 0.9 (0.0,1.]");
587 KPIECE.
addParameter(
"failed_expansion_score_factor",
"0.5",
"When extending motion fails, scale score by factor. " 589 KPIECE.
addParameter(
"min_valid_path_fraction",
"0.5",
"Accept partially valid moves above fraction. default: 0.5");
590 planner_des.push_back(KPIECE);
593 RRT.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()");
594 RRT.
addParameter(
"goal_bias",
"0.05",
"When close to goal select goal, with this probability? default: 0.05");
595 planner_des.push_back(RRT);
598 RRTConnect.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 600 planner_des.push_back(RRTConnect);
603 RRTstar.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 605 RRTstar.
addParameter(
"goal_bias",
"0.05",
"When close to goal select goal, with this probability? default: 0.05");
606 RRTstar.
addParameter(
"delay_collision_checking",
"1",
"Stop collision checking as soon as C-free parent found. " 608 planner_des.push_back(RRTstar);
611 TRRT.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()");
612 TRRT.
addParameter(
"goal_bias",
"0.05",
"When close to goal select goal, with this probability? default: 0.05");
613 TRRT.
addParameter(
"max_states_failed",
"10",
"when to start increasing temp. default: 10");
614 TRRT.
addParameter(
"temp_change_factor",
"2.0",
"how much to increase or decrease temp. default: 2.0");
615 TRRT.
addParameter(
"min_temperature",
"10e-10",
"lower limit of temp change. default: 10e-10");
616 TRRT.
addParameter(
"init_temperature",
"10e-6",
"initial temperature. default: 10e-6");
617 TRRT.
addParameter(
"frountier_threshold",
"0.0",
"dist new state to nearest neighbor to disqualify as frontier. " 618 "default: 0.0 set in setup()");
619 TRRT.
addParameter(
"frountierNodeRatio",
"0.1",
"1/10, or 1 nonfrontier for every 10 frontier. default: 0.1");
620 TRRT.
addParameter(
"k_constant",
"0.0",
"value used to normalize expresssion. default: 0.0 set in setup()");
621 planner_des.push_back(TRRT);
624 PRM.
addParameter(
"max_nearest_neighbors",
"10",
"use k nearest neighbors. default: 10");
625 planner_des.push_back(PRM);
628 planner_des.push_back(PRMstar);
631 FMT.
addParameter(
"num_samples",
"1000",
"number of states that the planner should sample. default: 1000");
632 FMT.
addParameter(
"radius_multiplier",
"1.1",
"multiplier used for the nearest neighbors search radius. default: 1.1");
633 FMT.
addParameter(
"nearest_k",
"1",
"use Knearest strategy. default: 1");
634 FMT.
addParameter(
"cache_cc",
"1",
"use collision checking cache. default: 1");
635 FMT.
addParameter(
"heuristics",
"0",
"activate cost to go heuristics. default: 0");
636 FMT.
addParameter(
"extended_fmt",
"1",
"activate the extended FMT*: adding new samples if planner does not finish " 637 "successfully. default: 1");
638 planner_des.push_back(FMT);
641 BFMT.
addParameter(
"num_samples",
"1000",
"number of states that the planner should sample. default: 1000");
642 BFMT.
addParameter(
"radius_multiplier",
"1.0",
"multiplier used for the nearest neighbors search radius. default: " 644 BFMT.
addParameter(
"nearest_k",
"1",
"use the Knearest strategy. default: 1");
645 BFMT.
addParameter(
"balanced",
"0",
"exploration strategy: balanced true expands one tree every iteration. False will " 646 "select the tree with lowest maximum cost to go. default: 1");
647 BFMT.
addParameter(
"optimality",
"1",
"termination strategy: optimality true finishes when the best possible path is " 648 "found. Otherwise, the algorithm will finish when the first feasible path is " 649 "found. default: 1");
650 BFMT.
addParameter(
"heuristics",
"1",
"activates cost to go heuristics. default: 1");
651 BFMT.
addParameter(
"cache_cc",
"1",
"use the collision checking cache. default: 1");
652 BFMT.
addParameter(
"extended_fmt",
"1",
"Activates the extended FMT*: adding new samples if planner does not finish " 653 "successfully. default: 1");
654 planner_des.push_back(BFMT);
657 RRT.
addParameter(
"goal_bias",
"0.05",
"When close to goal select goal, with this probability? default: 0.05");
658 planner_des.push_back(PDST);
661 STRIDE.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 663 STRIDE.
addParameter(
"goal_bias",
"0.05",
"When close to goal select goal, with this probability. default: 0.05");
664 STRIDE.
addParameter(
"use_projected_distance",
"0",
"whether nearest neighbors are computed based on distances in a " 665 "projection of the state rather distances in the state space " 666 "itself. default: 0");
667 STRIDE.
addParameter(
"degree",
"16",
"desired degree of a node in the Geometric Near-neightbor Access Tree (GNAT). " 669 STRIDE.
addParameter(
"max_degree",
"18",
"max degree of a node in the GNAT. default: 12");
670 STRIDE.
addParameter(
"min_degree",
"12",
"min degree of a node in the GNAT. default: 12");
671 STRIDE.
addParameter(
"max_pts_per_leaf",
"6",
"max points per leaf in the GNAT. default: 6");
672 STRIDE.
addParameter(
"estimated_dimension",
"0.0",
"estimated dimension of the free space. default: 0.0");
673 STRIDE.
addParameter(
"min_valid_path_fraction",
"0.2",
"Accept partially valid moves above fraction. default: 0.2");
674 planner_des.push_back(STRIDE);
677 BiTRRT.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 679 BiTRRT.
addParameter(
"temp_change_factor",
"0.1",
"how much to increase or decrease temp. default: 0.1");
680 BiTRRT.
addParameter(
"init_temperature",
"100",
"initial temperature. default: 100");
681 BiTRRT.
addParameter(
"frountier_threshold",
"0.0",
"dist new state to nearest neighbor to disqualify as frontier. " 682 "default: 0.0 set in setup()");
683 BiTRRT.
addParameter(
"frountier_node_ratio",
"0.1",
"1/10, or 1 nonfrontier for every 10 frontier. default: 0.1");
684 BiTRRT.
addParameter(
"cost_threshold",
"1e300",
"the cost threshold. Any motion cost that is not better will not be " 685 "expanded. default: inf");
686 planner_des.push_back(BiTRRT);
689 LBTRRT.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 691 LBTRRT.
addParameter(
"goal_bias",
"0.05",
"When close to goal select goal, with this probability. default: 0.05");
692 LBTRRT.
addParameter(
"epsilon",
"0.4",
"optimality approximation factor. default: 0.4");
693 planner_des.push_back(LBTRRT);
696 BiEST.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 698 planner_des.push_back(BiEST);
701 ProjEST.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 703 ProjEST.
addParameter(
"goal_bias",
"0.05",
"When close to goal select goal, with this probability. default: 0.05");
704 planner_des.push_back(ProjEST);
707 LazyPRM.
addParameter(
"range",
"0.0",
"Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on " 709 planner_des.push_back(LazyPRM);
712 planner_des.push_back(LazyPRMstar);
715 SPARS.
addParameter(
"stretch_factor",
"3.0",
"roadmap spanner stretch factor. multiplicative upper bound on path " 716 "quality. It does not make sense to make this parameter more than 3. " 718 SPARS.
addParameter(
"sparse_delta_fraction",
"0.25",
"delta fraction for connection distance. This value represents " 719 "the visibility range of sparse samples. default: 0.25");
720 SPARS.
addParameter(
"dense_delta_fraction",
"0.001",
"delta fraction for interface detection. default: 0.001");
721 SPARS.
addParameter(
"max_failures",
"1000",
"maximum consecutive failure limit. default: 1000");
722 planner_des.push_back(SPARS);
725 SPARStwo.
addParameter(
"stretch_factor",
"3.0",
"roadmap spanner stretch factor. multiplicative upper bound on path " 726 "quality. It does not make sense to make this parameter more than 3. " 729 "delta fraction for connection distance. This value represents " 730 "the visibility range of sparse samples. default: 0.25");
731 SPARStwo.
addParameter(
"dense_delta_fraction",
"0.001",
"delta fraction for interface detection. default: 0.001");
732 SPARStwo.
addParameter(
"max_failures",
"5000",
"maximum consecutive failure limit. default: 5000");
733 planner_des.push_back(SPARStwo);
744 std::vector<ROSControlConfig>& ros_controllers_config_output)
747 emitter << YAML::Key <<
"controller_list";
748 emitter << YAML::Value << YAML::BeginSeq;
750 for (std::vector<ROSControlConfig>::iterator controller_it = ros_controllers_config_output.begin();
751 controller_it != ros_controllers_config_output.end();)
754 if (controller_it->type_ ==
"FollowJointTrajectory")
756 emitter << YAML::BeginMap;
757 emitter << YAML::Key <<
"name";
758 emitter << YAML::Value << controller_it->name_;
759 emitter << YAML::Key <<
"action_ns";
760 emitter << YAML::Value <<
"follow_joint_trajectory";
761 emitter << YAML::Key <<
"default";
762 emitter << YAML::Value <<
"True";
763 emitter << YAML::Key <<
"type";
764 emitter << YAML::Value << controller_it->type_;
766 emitter << YAML::Key <<
"joints";
768 if (controller_it->joints_.size() != 1)
770 emitter << YAML::Value << YAML::BeginSeq;
773 for (std::vector<std::string>::iterator joint_it = controller_it->joints_.begin();
774 joint_it != controller_it->joints_.end(); ++joint_it)
776 emitter << *joint_it;
778 emitter << YAML::EndSeq;
782 emitter << YAML::Value << YAML::BeginMap;
783 emitter << controller_it->joints_[0];
784 emitter << YAML::EndMap;
787 ros_controllers_config_output.erase(controller_it);
788 emitter << YAML::EndMap;
795 emitter << YAML::EndSeq;
804 if (!
srdf_->srdf_model_->getGroups().empty())
805 return srdf_->srdf_model_->getGroups()[0].name_;
806 return "todo_no_group_selected";
814 if (!
srdf_->group_states_.empty())
815 return srdf_->group_states_[0].name_;
816 return "todo_no_pose_selected";
828 std::vector<std::vector<std::string>> planning_groups;
829 std::vector<std::string> group_joints;
833 for (std::vector<srdf::Model::Group>::iterator group_it =
srdf_->groups_.begin(); group_it !=
srdf_->groups_.end();
837 const robot_model::JointModelGroup* joint_model_group =
getRobotModel()->getJointModelGroup(group_it->name_);
838 const std::vector<const robot_model::JointModel*>& joint_models = joint_model_group->getActiveJointModels();
840 for (
const robot_model::JointModel* joint : joint_models)
842 if (joint->isPassive() || joint->getMimic() !=
NULL || joint->getType() == robot_model::JointModel::FIXED)
845 group_joints.push_back(joint->getName());
848 planning_groups.push_back(group_joints);
849 group_joints.clear();
852 YAML::Emitter emitter;
853 emitter << YAML::BeginMap;
856 emitter << YAML::Comment(
"Simulation settings for using moveit_sim_controllers");
857 emitter << YAML::Key <<
"moveit_sim_hw_interface" << YAML::Value << YAML::BeginMap;
861 emitter << YAML::Key <<
"joint_model_group";
865 emitter << YAML::Key <<
"joint_model_group_pose";
868 emitter << YAML::EndMap;
871 emitter << YAML::Newline;
872 emitter << YAML::Comment(
"Settings for ros_control_boilerplate control loop");
873 emitter << YAML::Key <<
"generic_hw_control_loop" << YAML::Value << YAML::BeginMap;
875 emitter << YAML::Key <<
"loop_hz";
876 emitter << YAML::Value <<
"300";
877 emitter << YAML::Key <<
"cycle_time_error_threshold";
878 emitter << YAML::Value <<
"0.01";
879 emitter << YAML::EndMap;
882 emitter << YAML::Newline;
883 emitter << YAML::Comment(
"Settings for ros_control hardware interface");
884 emitter << YAML::Key <<
"hardware_interface" << YAML::Value << YAML::BeginMap;
887 const std::vector<const robot_model::JointModel*>& joint_models =
getRobotModel()->getJointModels();
889 emitter << YAML::Key <<
"joints";
891 if (joint_models.size() != 1)
893 emitter << YAML::Value << YAML::BeginSeq;
895 for (std::vector<const robot_model::JointModel*>::const_iterator joint_it = joint_models.begin();
896 joint_it < joint_models.end(); ++joint_it)
898 if ((*joint_it)->isPassive() || (*joint_it)->getMimic() !=
NULL ||
899 (*joint_it)->getType() == robot_model::JointModel::FIXED)
902 emitter << (*joint_it)->getName();
904 emitter << YAML::EndSeq;
908 emitter << YAML::Value << YAML::BeginMap;
909 emitter << joint_models[0]->getName();
910 emitter << YAML::EndMap;
913 emitter << YAML::Key <<
"sim_control_mode";
914 emitter << YAML::Value <<
"1";
915 emitter << YAML::Comment(
"0: position, 1: velocity");
916 emitter << YAML::Newline;
917 emitter << YAML::EndMap;
920 emitter << YAML::Comment(
"Publish all joint states");
921 emitter << YAML::Newline << YAML::Comment(
"Creates the /joint_states topic necessary in ROS");
922 emitter << YAML::Key <<
"joint_state_controller" << YAML::Value << YAML::BeginMap;
924 emitter << YAML::Key <<
"type";
925 emitter << YAML::Value <<
"joint_state_controller/JointStateController";
926 emitter << YAML::Key <<
"publish_rate";
927 emitter << YAML::Value <<
"50";
928 emitter << YAML::EndMap;
934 for (std::vector<ROSControlConfig>::const_iterator controller_it = ros_controllers_config_output.begin();
935 controller_it != ros_controllers_config_output.end(); ++controller_it)
937 emitter << YAML::Key << controller_it->name_;
938 emitter << YAML::Value << YAML::BeginMap;
939 emitter << YAML::Key <<
"type";
940 emitter << YAML::Value << controller_it->type_;
943 emitter << YAML::Key <<
"joints";
945 if (controller_it->joints_.size() != 1)
947 emitter << YAML::Value << YAML::BeginSeq;
950 for (std::vector<std::string>::const_iterator joint_it = controller_it->joints_.begin();
951 joint_it != controller_it->joints_.end(); ++joint_it)
953 emitter << *joint_it;
955 emitter << YAML::EndSeq;
959 emitter << YAML::Value << YAML::BeginMap;
960 emitter << controller_it->joints_[0];
961 emitter << YAML::EndMap;
965 emitter << YAML::Key <<
"gains";
966 emitter << YAML::Value << YAML::BeginMap;
969 for (std::vector<std::string>::const_iterator joint_it = controller_it->joints_.begin();
970 joint_it != controller_it->joints_.end(); ++joint_it)
972 emitter << YAML::Key << *joint_it << YAML::Value << YAML::BeginMap;
973 emitter << YAML::Key <<
"p";
974 emitter << YAML::Value <<
"100";
975 emitter << YAML::Key <<
"d";
976 emitter << YAML::Value <<
"1";
977 emitter << YAML::Key <<
"i";
978 emitter << YAML::Value <<
"1";
979 emitter << YAML::Key <<
"i_clamp";
980 emitter << YAML::Value <<
"1" << YAML::EndMap;
982 emitter << YAML::EndMap;
984 emitter << YAML::EndMap;
988 std::ofstream output_stream(file_path.c_str(), std::ios_base::trunc);
989 if (!output_stream.good())
994 output_stream << emitter.c_str();
995 output_stream.close();
1005 YAML::Emitter emitter;
1006 emitter << YAML::BeginMap;
1008 emitter << YAML::Comment(
"The name of this file shouldn't be changed, or else the Setup Assistant won't detect it");
1009 emitter << YAML::Key <<
"sensors";
1010 emitter << YAML::Value << YAML::BeginSeq;
1013 emitter << YAML::BeginMap;
1020 emitter << YAML::Key << parameter.first;
1021 emitter << YAML::Value << parameter.second.getValue();
1025 emitter << YAML::EndMap;
1027 emitter << YAML::EndSeq;
1029 emitter << YAML::EndMap;
1031 std::ofstream output_stream(file_path.c_str(), std::ios_base::trunc);
1032 if (!output_stream.good())
1038 output_stream << emitter.c_str();
1039 output_stream.close();
1049 YAML::Emitter emitter;
1050 emitter << YAML::BeginMap;
1052 emitter << YAML::Key <<
"joint_limits";
1053 emitter << YAML::Value << YAML::BeginMap;
1056 std::set<const robot_model::JointModel*, joint_model_compare> joints;
1059 for (std::vector<srdf::Model::Group>::iterator group_it =
srdf_->groups_.begin(); group_it !=
srdf_->groups_.end();
1063 const robot_model::JointModelGroup* joint_model_group =
getRobotModel()->getJointModelGroup(group_it->name_);
1065 const std::vector<const robot_model::JointModel*>& joint_models = joint_model_group->getJointModels();
1068 for (std::vector<const robot_model::JointModel*>::const_iterator joint_it = joint_models.begin();
1069 joint_it != joint_models.end(); ++joint_it)
1072 if ((*joint_it)->getVariableCount() == 1)
1073 joints.insert(*joint_it);
1078 for (std::set<const robot_model::JointModel*>::iterator joint_it = joints.begin(); joint_it != joints.end();
1081 emitter << YAML::Key << (*joint_it)->getName();
1082 emitter << YAML::Value << YAML::BeginMap;
1084 const robot_model::VariableBounds& b = (*joint_it)->getVariableBounds()[0];
1087 emitter << YAML::Key <<
"has_velocity_limits";
1088 if (b.velocity_bounded_)
1089 emitter << YAML::Value <<
"true";
1091 emitter << YAML::Value <<
"false";
1094 emitter << YAML::Key <<
"max_velocity";
1095 emitter << YAML::Value << std::min(fabs(b.max_velocity_), fabs(b.min_velocity_));
1098 emitter << YAML::Key <<
"has_acceleration_limits";
1099 if (b.acceleration_bounded_)
1100 emitter << YAML::Value <<
"true";
1102 emitter << YAML::Value <<
"false";
1105 emitter << YAML::Key <<
"max_acceleration";
1106 emitter << YAML::Value << std::min(fabs(b.max_acceleration_), fabs(b.min_acceleration_));
1108 emitter << YAML::EndMap;
1111 emitter << YAML::EndMap;
1113 std::ofstream output_stream(file_path.c_str(), std::ios_base::trunc);
1114 if (!output_stream.good())
1120 output_stream <<
"# joint_limits.yaml allows the dynamics properties specified in the URDF to be overwritten or " 1121 "augmented as needed" 1123 output_stream <<
"# Specific joint properties can be changed with the keys [max_position, min_position, " 1124 "max_velocity, max_acceleration]" 1126 output_stream <<
"# Joint limits can be turned off with [has_velocity_limits, has_acceleration_limits]" << std::endl;
1127 output_stream << emitter.c_str();
1128 output_stream.close();
1141 : dc_(dc), key_(dc.link1_ < dc.link2_ ? (dc.link1_ +
"|" + dc.link2_) : (dc.link2_ +
"|" + dc.link1_))
1150 return key_ < other.
key_;
1163 std::set<SortableDisabledCollision> disabled_collisions;
1164 disabled_collisions.insert(
srdf_->disabled_collisions_.begin(),
srdf_->disabled_collisions_.end());
1167 for (moveit_setup_assistant::LinkPairMap::const_iterator pair_it = link_pairs.begin(); pair_it != link_pairs.end();
1171 if (pair_it->second.disable_check)
1173 if ((1 << pair_it->second.reason) & skip_mask)
1176 dc.
link1_ = pair_it->first.first;
1177 dc.
link2_ = pair_it->first.second;
1184 srdf_->disabled_collisions_.assign(disabled_collisions.begin(), disabled_collisions.end());
1192 std::string joint_pair =
"";
1195 const robot_model::RobotModelConstPtr& model =
getRobotModel();
1198 if (!model->hasJointModelGroup(planning_group))
1202 const robot_model::JointModelGroup*
group = model->getJointModelGroup(planning_group);
1205 const std::vector<std::string> joints = group->getJointModelNames();
1207 if (joints.size() >= 2)
1210 if (group->getJointModel(joints[0])->getVariableCount() == 1 &&
1211 group->getJointModel(joints[1])->getVariableCount() == 1)
1214 joint_pair =
"joints(" + joints[0] +
"," + joints[1] +
")";
1221 template <
typename T>
1222 bool parse(
const YAML::Node& node,
const std::string& key, T& storage,
const T& default_value = T())
1224 const YAML::Node& n = node[key];
1233 std::ifstream input_stream(file_path.c_str());
1234 if (!input_stream.good())
1243 YAML::Node doc = YAML::Load(input_stream);
1246 for (YAML::const_iterator group_it = doc.begin(); group_it != doc.end(); ++group_it)
1249 const std::string group_name = group_it->first.as<std::string>();
1252 std::map<std::string, GroupMetaData>::iterator group_meta_it;
1256 std::string planner;
1257 parse(group_it->second,
"default_planner_config", planner);
1258 std::size_t pos = planner.find(
"kConfigDefault");
1259 if (pos != std::string::npos)
1261 planner = planner.substr(0, pos);
1267 catch (YAML::ParserException& e)
1281 std::ifstream input_stream(file_path.c_str());
1282 if (!input_stream.good())
1291 YAML::Node doc = YAML::Load(input_stream);
1294 for (YAML::const_iterator group_it = doc.begin(); group_it != doc.end(); ++group_it)
1296 const std::string& group_name = group_it->first.as<std::string>();
1297 const YAML::Node&
group = group_it->second;
1312 catch (YAML::ParserException& e)
1329 if (
const YAML::Node& trajectory_controllers = controller)
1331 for (std::size_t trajectory_id = 0; trajectory_id < trajectory_controllers.size(); ++trajectory_id)
1334 if (
const YAML::Node& controller_node = trajectory_controllers[trajectory_id])
1336 if (
const YAML::Node& joints = controller_node[
"joints"])
1338 control_setting.
joints_.clear();
1339 for (YAML::const_iterator joint_it = joints.begin(); joint_it != joints.end(); ++joint_it)
1341 control_setting.
joints_.push_back(joint_it->as<std::string>());
1343 if (!
parse(controller_node,
"name", control_setting.
name_))
1348 if (!
parse(controller_node,
"type", control_setting.
type_))
1374 YAML::Node controllers = YAML::Load(input_stream);
1377 for (YAML::const_iterator controller_it = controllers.begin(); controller_it != controllers.end(); ++controller_it)
1380 if (controller_it->first.as<std::string>() ==
"controller_list")
1388 const std::string& controller_name = controller_it->first.as<std::string>();
1389 control_setting.
joints_.clear();
1392 if (
const YAML::Node& joints = controller_it->second[
"joints"])
1394 if (joints.IsSequence())
1396 for (YAML::const_iterator joint_it = joints.begin(); joint_it != joints.end(); ++joint_it)
1398 control_setting.
joints_.push_back(joint_it->as<std::string>());
1403 control_setting.
joints_.push_back(joints.as<std::string>());
1408 if (!control_setting.
joints_.empty())
1410 if (
const YAML::Node& urdf_node = controller_it->second[
"type"])
1412 control_setting.
type_ = controller_it->second[
"type"].as<std::string>();
1413 control_setting.
name_ = controller_name;
1415 control_setting.
joints_.clear();
1429 std::ifstream input_stream(file_path.c_str());
1430 if (!input_stream.good())
1441 catch (YAML::ParserException& e)
1455 if (
srdf_->srdf_model_->getGroups().empty())
1458 for (std::vector<srdf::Model::Group>::const_iterator group_it =
srdf_->srdf_model_->getGroups().begin();
1459 group_it !=
srdf_->srdf_model_->getGroups().end(); ++group_it)
1463 const robot_model::JointModelGroup* joint_model_group =
getRobotModel()->getJointModelGroup(group_it->name_);
1464 const std::vector<const robot_model::JointModel*>& joint_models = joint_model_group->getActiveJointModels();
1467 for (
const robot_model::JointModel* joint : joint_models)
1469 if (joint->isPassive() || joint->getMimic() !=
NULL || joint->getType() == robot_model::JointModel::FIXED)
1471 group_controller.
joints_.push_back(joint->getName());
1473 if (!group_controller.
joints_.empty())
1475 group_controller.
name_ = group_it->name_ +
"_controller";
1476 group_controller.
type_ =
"FollowJointTrajectory";
1488 std::string full_package_path;
1491 if (!fs::is_directory(pkg_path))
1497 if (!fs::is_directory(full_package_path))
1505 full_package_path = pkg_path;
1521 return fs::is_regular_file(path);
1542 if (robot_desc_pkg_path.empty())
1572 std::ifstream input_stream(file_path.c_str());
1573 if (!input_stream.good())
1582 const YAML::Node& doc = YAML::Load(input_stream);
1585 if (
const YAML::Node& title_node = doc[
"moveit_setup_assistant_config"])
1588 if (
const YAML::Node& urdf_node = title_node[
"URDF"])
1599 if (
const YAML::Node& srdf_node = title_node[
"SRDF"])
1605 if (
const YAML::Node& config_node = title_node[
"CONFIG"])
1614 catch (YAML::ParserException& e)
1628 std::ifstream default_input_stream(default_file_path.c_str());
1629 if (!default_input_stream.good())
1638 const YAML::Node& doc = YAML::Load(default_input_stream);
1641 if (
const YAML::Node& sensors_node = doc[
"sensors"])
1644 if (sensors_node.IsSequence())
1647 std::map<std::string, GenericParameter> sensor_map;
1650 for (std::size_t i = 0; i < sensors_node.size(); ++i)
1652 if (
const YAML::Node& sensor_node = sensors_node[i])
1654 for (YAML::const_iterator sensor_it = sensor_node.begin(); sensor_it != sensor_node.end(); ++sensor_it)
1656 sensor_param.
setName(sensor_it->first.as<std::string>());
1657 sensor_param.
setValue(sensor_it->second.as<std::string>());
1660 sensor_map[sensor_it->first.as<std::string>()] = sensor_param;
1668 catch (YAML::ParserException& e)
1674 if (file_path.empty())
1680 std::ifstream input_stream(file_path.c_str());
1681 if (!input_stream.good())
1690 const YAML::Node& doc = YAML::Load(input_stream);
1692 const YAML::Node& sensors_node = doc[
"sensors"];
1695 if (sensors_node && sensors_node.IsSequence())
1698 std::map<std::string, GenericParameter> sensor_map;
1699 bool empty_node =
true;
1702 for (std::size_t i = 0; i < sensors_node.size(); ++i)
1704 if (
const YAML::Node& sensor_node = sensors_node[i])
1706 for (YAML::const_iterator sensor_it = sensor_node.begin(); sensor_it != sensor_node.end(); ++sensor_it)
1709 sensor_param.
setName(sensor_it->first.as<std::string>());
1710 sensor_param.
setValue(sensor_it->second.as<std::string>());
1713 sensor_map[sensor_it->first.as<std::string>()] = sensor_param;
1723 catch (YAML::ParserException& e)
1736 fs::path result = path1;
1738 return result.make_preferred().native().c_str();
1746 for (std::vector<srdf::Model::Group>::iterator group_it =
srdf_->groups_.begin(); group_it !=
srdf_->groups_.end();
1749 if (group_it->name_ == name)
1751 searched_group = &(*group_it);
1757 if (searched_group ==
NULL)
1758 ROS_FATAL_STREAM(
"An internal error has occured while searching for groups. Group '" << name <<
"' was not found " 1761 return searched_group;
1775 if (controller_it->name_ == controller_name)
1777 searched_ros_controller = &(*controller_it);
1782 return searched_ros_controller;
1793 if (controller_it->name_ == controller_name)
1814 if (searched_ros_controller && searched_ros_controller->
type_ == new_controller.
type_)
1833 const std::string& comment)
std::time_t config_pkg_generated_timestamp_
Timestamp when configuration package was generated, if it was previously generated.
bool addDefaultControllers()
Add a Follow Joint Trajectory action Controller for each Planning Group.
std::string urdf_pkg_relative_path_
Path relative to urdf package (note: this may be same as urdf_path_)
std::string getGazeboCompatibleURDF()
Parses the existing urdf and constructs a string from it with the elements required by gazebo simulat...
static const int DEFAULT_KIN_SOLVER_ATTEMPTS_
#define ROS_ERROR_STREAM_NAMED(name, args)
void setRobotModel(robot_model::RobotModelPtr robot_model)
Load a robot model.
std::string srdf_pkg_relative_path_
Path relative to loaded configuration package.
bool inputOMPLYAML(const std::string &file_path)
bool outputKinematicsYAML(const std::string &file_path)
robot_model::RobotModelPtr robot_model_
Shared kinematic model.
bool operator<(const SortableDisabledCollision &other) const
bool outputSetupAssistantFile(const std::string &file_path)
std::string getDefaultStartPose()
Helper function to get the default start pose for moveit_sim_hw_interface.
urdf::ModelSharedPtr urdf_model_
URDF robot model.
bool setPackagePath(const std::string &pkg_path)
bool inputSetupAssistantYAML(const std::string &file_path)
bool addROSController(const ROSControlConfig &new_controller)
Adds a ROS controller to ros_controllers_config_ vector.
std::vector< std::string > joints_
bool createFullURDFPath()
Make the full URDF path using the loaded .setup_assistant data.
static const double DEFAULT_KIN_SOLVER_TIMEOUT_
bool outputCHOMPPlanningYAML(const std::string &file_path)
std::vector< OMPLPlannerDescription > getOMPLPlanners()
std::vector< ROSControlConfig > ros_controllers_config_
ROS Controllers config data.
bool parse(const YAML::Node &node, const std::string &key, T &storage, const T &default_value=T())
std::string decideProjectionJoints(std::string planning_group)
Decide the best two joints to be used for the projection evaluator.
std::vector< ROSControlConfig > & getROSControllers()
Gets ros_controllers_config_ vector.
bool outputFakeControllersYAML(const std::string &file_path)
bool output3DSensorPluginYAML(const std::string &file_path)
#define ROS_FATAL_STREAM(args)
bool input3DSensorsYAML(const std::string &default_file_path, const std::string &file_path="")
SortableDisabledCollision(const srdf::Model::DisabledCollision &dc)
std::string getDefaultStartStateGroup()
Helper function to get the default start state group for moveit_sim_hw_interface. ...
planning_scene::PlanningScenePtr getPlanningScene()
Provide a shared planning scene.
std::vector< std::map< std::string, GenericParameter > > getSensorPluginConfig()
Used for adding a sensor plugin configuation parameter to the sensor plugin configuration parameter l...
srdf::SRDFWriterPtr srdf_
SRDF Data and Writer.
std::string author_name_
Name of the author of this config.
bool deleteROSController(const std::string &controller_name)
const std::string disabledReasonToString(DisabledReason reason)
Converts a reason for disabling a link pair into a string.
void setCollisionLinkPairs(const moveit_setup_assistant::LinkPairMap &link_pairs, size_t skip_mask=0)
Set list of collision link pairs in SRDF; sorted; with optional filter.
bool outputJointLimitsYAML(const std::string &file_path)
std::map< std::string, GroupMetaData > group_meta_data_
Planning groups extra data not found in srdf but used in config files.
bool parseROSController(const YAML::Node &controller)
std::string setup_assistant_path_
Setup Assistants package's path for when we use its templates.
static const double DEFAULT_KIN_SOLVER_SEARCH_RESOLUTION_
void clearSensorPluginConfig()
Clear the sensor plugin configuration parameter list.
std::string urdf_string_
URDF robot model string.
void setValue(std::string value)
robot_model::RobotModelConstPtr getRobotModel()
Provide a shared kinematic model loader.
void addGenericParameterToSensorPluginConfig(const std::string &name, const std::string &value="", const std::string &comment="")
Used for adding a sensor plugin configuation prameter to the sensor plugin configuration parameter li...
ROSLIB_DECL std::string getPath(const std::string &package_name)
std::string getJointHardwareInterface(const std::string &joint_name)
Helper function to get the controller that is controlling the joint.
This class describes the OMPL planners by name, type, and parameter list, used to create the ompl_pla...
std::string srdf_path_
Full file-system path to srdf.
ROSControlConfig * findROSControllerByName(const std::string &controller_name)
std::string author_email_
Email of the author of this config.
bool outputROSControllersYAML(const std::string &file_path)
bool outputOMPLPlanningYAML(const std::string &file_path)
void setEntry(const std::string &name1, const std::string &name2, bool allowed)
bool inputKinematicsYAML(const std::string &file_path)
bool getSetupAssistantYAMLPath(std::string &path)
bool createFullSRDFPath(const std::string &package_path)
Make the full SRDF path using the loaded .setup_assistant data.
void outputFollowJointTrajectoryYAML(YAML::Emitter &emitter, std::vector< ROSControlConfig > &ros_controllers_config_output)
bool inputROSControllersYAML(const std::string &file_path)
srdf::Model::Group * findGroupByName(const std::string &name)
#define ROS_ERROR_STREAM(args)
std::string xacro_args_
xacro arguments
bool debug_
Is this application in debug mode?
std::string appendPaths(const std::string &path1, const std::string &path2)
bool processROSControllers(std::ifstream &input_stream)
std::string urdf_pkg_name_
Name of package containig urdf (note: this may be empty b/c user may not have urdf in pkg) ...
std::string urdf_path_
Full file-system path to urdf.
collision_detection::AllowedCollisionMatrix allowed_collision_matrix_
Allowed collision matrix for robot poses.
void addParameter(const std::string &name, const std::string &value="", const std::string &comment="")
adds a parameter to the planner description
void updateRobotModel()
Update the Kinematic Model with latest SRDF modifications.
void setName(std::string name)
std::string config_pkg_path_
Loaded configuration package path - if an existing package was loaded, holds that path...
const srdf::Model::DisabledCollision dc_
std::vector< std::map< std::string, GenericParameter > > sensors_plugin_config_parameter_list_
Sensor plugin configuration parameter list, each sensor plugin type is a map.
std::map< std::pair< std::string, std::string >, LinkPairData > LinkPairMap
LinkPairMap is an adjacency list structure containing links in string-based form. Used for disabled l...
#define ROS_WARN_STREAM_NAMED(name, args)
planning_scene::PlanningScenePtr planning_scene_
Shared planning scene.
void loadAllowedCollisionMatrix()
Load the allowed collision matrix from the SRDF's list of link pairs.