42 #include <boost/program_options.hpp>
44 namespace po = boost::program_options;
54 std::string setup_assistant_path;
63 ROS_ERROR_STREAM(
"Could not parse .setup_assistant file from '" << setup_assistant_path <<
"'");
75 const std::vector<std::string>& xacro_args)
77 std::string urdf_string;
83 if (!config_data.
urdf_model_->initString(urdf_string))
89 std::string srdf_string;
103 config_data.
srdf_->no_default_collision_links_.clear();
104 config_data.
srdf_->enabled_collision_pairs_.clear();
105 config_data.
srdf_->disabled_collision_pairs_.clear();
112 double min_collision_fraction,
bool verbose)
115 unsigned int collision_progress;
117 trials > 0, trials, min_collision_fraction,
verbose);
135 std::set<srdf::Model::CollisionPair, CollisionPairLess> filtered;
136 for (
auto& p : target_pairs)
138 if (p.link1_ >= p.link2_)
139 std::swap(p.link1_, p.link2_);
144 for (
const auto& link_pair : source_pairs)
147 if (!link_pair.second.disable_check)
151 if ((1 << link_pair.second.reason) & skip_mask)
155 pair.
link1_ = link_pair.first.first;
156 pair.
link2_ = link_pair.first.second;
161 filtered.insert(pair);
164 target_pairs.assign(filtered.begin(), filtered.end());
167 int main(
int argc,
char* argv[])
169 std::string config_pkg_path;
170 std::string urdf_path;
171 std::string srdf_path;
173 std::string output_path;
175 bool include_default =
false, include_always =
false, keep_old =
false,
verbose =
false;
177 double min_collision_fraction = 1.0;
181 po::options_description desc(
"Allowed options");
183 (
"help",
"show help")
184 (
"config-pkg", po::value(&config_pkg_path),
"path to MoveIt config package")
185 (
"urdf", po::value(&urdf_path),
"path to URDF ( or xacro)")
186 (
"srdf", po::value(&srdf_path),
"path to SRDF ( or xacro)")
187 (
"output", po::value(&output_path),
"output path for SRDF")
188 (
"xacro-args", po::value<std::vector<std::string> >()->composing(),
"additional arguments for xacro")
189 (
"default", po::bool_switch(&include_default),
"disable default colliding pairs")
190 (
"always", po::bool_switch(&include_always),
"disable always colliding pairs")
191 (
"keep", po::bool_switch(&keep_old),
"keep disabled link from SRDF")
192 (
"verbose", po::bool_switch(&
verbose),
"verbose output")
193 (
"trials", po::value(&never_trials),
"number of trials for searching never colliding pairs")
194 (
"min-collision-fraction", po::value(&min_collision_fraction),
"fraction of small sample size to determine links that are alwas colliding")
197 po::positional_options_description pos_desc;
198 pos_desc.add(
"xacro-args", -1);
200 po::variables_map vm;
201 po::store(po::command_line_parser(argc, argv).options(desc).positional(pos_desc).
run(), vm);
204 if (vm.count(
"help"))
206 std::cout << desc << std::endl;
212 if (!config_pkg_path.empty())
220 else if (urdf_path.empty() || srdf_path.empty())
227 ROS_ERROR_STREAM(
"Please provide a different output file for SRDF xacro input file");
232 if (!urdf_path.empty())
234 if (!srdf_path.empty())
237 std::vector<std::string> xacro_args;
238 if (vm.count(
"xacro-args"))
239 xacro_args = vm[
"xacro-args"].as<std::vector<std::string> >();
241 if (!
setup(config_data, keep_old, xacro_args))
249 size_t skip_mask = 0;
250 if (!include_default)
257 config_data.
srdf_->writeSRDF(output_path.empty() ? config_data.
srdf_path_ : output_path);