00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <ros/ros.h>
00038 #include <moveit/setup_assistant/tools/moveit_config_data.h>
00039 #include <moveit/setup_assistant/tools/file_loader.h>
00040
00041 #include <boost/program_options.hpp>
00042
00043 namespace po = boost::program_options;
00044
00045 bool loadSetupAssistantConfig(moveit_setup_assistant::MoveItConfigData& config_data, const std::string& pkg_path)
00046 {
00047 if (!config_data.setPackagePath(pkg_path))
00048 {
00049 ROS_ERROR_STREAM("Could not set package path '" << pkg_path << "'");
00050 return false;
00051 }
00052
00053 std::string setup_assistant_path;
00054 if (!config_data.getSetupAssistantYAMLPath(setup_assistant_path))
00055 {
00056 ROS_ERROR_STREAM("Could not resolve path to .setup_assistant");
00057 return false;
00058 }
00059
00060 if (!config_data.inputSetupAssistantYAML(setup_assistant_path))
00061 {
00062 ROS_ERROR_STREAM("Could not parse .setup_assistant file from '" << setup_assistant_path << "'");
00063 return false;
00064 }
00065
00066 config_data.createFullURDFPath();
00067
00068 config_data.createFullSRDFPath(config_data.config_pkg_path_);
00069
00070 return true;
00071 }
00072
00073 bool setup(moveit_setup_assistant::MoveItConfigData& config_data, bool keep_old,
00074 const std::vector<std::string>& xacro_args)
00075 {
00076 std::string urdf_string;
00077 if (!moveit_setup_assistant::loadXmlFileToString(urdf_string, config_data.urdf_path_, xacro_args))
00078 {
00079 ROS_ERROR_STREAM("Could not load URDF from '" << config_data.urdf_path_ << "'");
00080 return false;
00081 }
00082 if (!config_data.urdf_model_->initString(urdf_string))
00083 {
00084 ROS_ERROR_STREAM("Could not parse URDF from '" << config_data.urdf_path_ << "'");
00085 return false;
00086 }
00087
00088 std::string srdf_string;
00089 if (!moveit_setup_assistant::loadXmlFileToString(srdf_string, config_data.srdf_path_, xacro_args))
00090 {
00091 ROS_ERROR_STREAM("Could not load SRDF from '" << config_data.srdf_path_ << "'");
00092 return false;
00093 }
00094 if (!config_data.srdf_->initString(*config_data.urdf_model_, srdf_string))
00095 {
00096 ROS_ERROR_STREAM("Could not parse SRDF from '" << config_data.srdf_path_ << "'");
00097 return false;
00098 }
00099
00100 if (!keep_old)
00101 config_data.srdf_->disabled_collisions_.clear();
00102
00103 return true;
00104 }
00105
00106 moveit_setup_assistant::LinkPairMap compute(moveit_setup_assistant::MoveItConfigData& config_data, uint32_t trials,
00107 double min_collision_fraction, bool verbose)
00108 {
00109
00110 unsigned int collision_progress;
00111 return moveit_setup_assistant::computeDefaultCollisions(config_data.getPlanningScene(), &collision_progress,
00112 trials > 0, trials, min_collision_fraction, verbose);
00113 }
00114
00115 int main(int argc, char* argv[])
00116 {
00117 std::string config_pkg_path;
00118 std::string urdf_path;
00119 std::string srdf_path;
00120
00121 std::string output_path;
00122
00123 bool include_default = false, include_always = false, keep_old = false, verbose = false;
00124
00125 double min_collision_fraction = 1.0;
00126
00127 uint32_t never_trials = 0;
00128
00129 po::options_description desc("Allowed options");
00130 desc.add_options()("help", "show help")("config-pkg", po::value(&config_pkg_path), "path to moveit config package")(
00131 "urdf", po::value(&urdf_path),
00132 "path to URDF ( or xacro)")("srdf", po::value(&srdf_path),
00133 "path to SRDF ( or xacro)")("output", po::value(&output_path), "output path for SRDF")
00134
00135 ("xacro-args", po::value<std::vector<std::string> >()->composing(), "additional arguments for xacro")
00136
00137 ("default", po::bool_switch(&include_default), "disable default colliding pairs")(
00138 "always", po::bool_switch(&include_always), "disable always colliding pairs")
00139
00140 ("keep", po::bool_switch(&keep_old), "keep disabled link from SRDF")("verbose", po::bool_switch(&verbose),
00141 "verbose output")
00142
00143 ("trials", po::value(&never_trials), "number of trials for searching never colliding pairs")(
00144 "min-collision-fraction", po::value(&min_collision_fraction),
00145 "fraction of small sample size to determine links that are alwas colliding");
00146
00147 po::positional_options_description pos_desc;
00148 pos_desc.add("xacro-args", -1);
00149
00150 po::variables_map vm;
00151 po::store(po::command_line_parser(argc, argv).options(desc).positional(pos_desc).run(), vm);
00152 po::notify(vm);
00153
00154 if (vm.count("help"))
00155 {
00156 std::cout << desc << std::endl;
00157 return 1;
00158 }
00159
00160 moveit_setup_assistant::MoveItConfigData config_data;
00161
00162 if (!config_pkg_path.empty())
00163 {
00164 if (!loadSetupAssistantConfig(config_data, config_pkg_path))
00165 {
00166 ROS_ERROR_STREAM("Could not load config at '" << config_pkg_path << "'");
00167 return 1;
00168 }
00169 }
00170 else if (urdf_path.empty() || srdf_path.empty())
00171 {
00172 ROS_ERROR_STREAM("Please provide config package or URDF and SRDF path");
00173 return 1;
00174 }
00175 else if (moveit_setup_assistant::isXacroFile(srdf_path) && output_path.empty())
00176 {
00177 ROS_ERROR_STREAM("Please provide a different output file for SRDF xacro input file");
00178 return 1;
00179 }
00180
00181
00182 if (!urdf_path.empty())
00183 config_data.urdf_path_ = urdf_path;
00184 if (!srdf_path.empty())
00185 config_data.srdf_path_ = srdf_path;
00186
00187 std::vector<std::string> xacro_args;
00188 if (vm.count("xacro-args"))
00189 xacro_args = vm["xacro-args"].as<std::vector<std::string> >();
00190
00191 if (!setup(config_data, keep_old, xacro_args))
00192 {
00193 ROS_ERROR_STREAM("Could not setup updater");
00194 return 1;
00195 }
00196
00197 moveit_setup_assistant::LinkPairMap link_pairs = compute(config_data, never_trials, min_collision_fraction, verbose);
00198
00199 size_t skip_mask = 0;
00200 if (!include_default)
00201 skip_mask |= (1 << moveit_setup_assistant::DEFAULT);
00202 if (!include_always)
00203 skip_mask |= (1 << moveit_setup_assistant::ALWAYS);
00204
00205 config_data.setCollisionLinkPairs(link_pairs, skip_mask);
00206
00207 config_data.srdf_->writeSRDF(output_path.empty() ? config_data.srdf_path_ : output_path);
00208
00209 return 0;
00210 }