collisions_updater.cpp
Go to the documentation of this file.
1 /*********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2015, Fraunhofer IPA
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of Fraunhofer IPA nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *********************************************************************/
34 
35 /* Author: Mathias Lüdtke */
36 
39 
41 
42 #include <boost/program_options.hpp>
43 
44 namespace po = boost::program_options;
45 
46 bool loadSetupAssistantConfig(moveit_setup_assistant::MoveItConfigData& config_data, const std::string& pkg_path)
47 {
48  if (!config_data.setPackagePath(pkg_path))
49  {
50  ROS_ERROR_STREAM("Could not set package path '" << pkg_path << "'");
51  return false;
52  }
53 
54  std::string setup_assistant_path;
55  if (!config_data.getSetupAssistantYAMLPath(setup_assistant_path))
56  {
57  ROS_ERROR_STREAM("Could not resolve path to .setup_assistant");
58  return false;
59  }
60 
61  if (!config_data.inputSetupAssistantYAML(setup_assistant_path))
62  {
63  ROS_ERROR_STREAM("Could not parse .setup_assistant file from '" << setup_assistant_path << "'");
64  return false;
65  }
66 
67  config_data.createFullURDFPath(); // might fail at this point
68 
69  config_data.createFullSRDFPath(config_data.config_pkg_path_); // might fail at this point
70 
71  return true;
72 }
73 
74 bool setup(moveit_setup_assistant::MoveItConfigData& config_data, bool keep_old,
75  const std::vector<std::string>& xacro_args)
76 {
77  std::string urdf_string;
78  if (!rdf_loader::RDFLoader::loadXmlFileToString(urdf_string, config_data.urdf_path_, xacro_args))
79  {
80  ROS_ERROR_STREAM("Could not load URDF from '" << config_data.urdf_path_ << "'");
81  return false;
82  }
83  if (!config_data.urdf_model_->initString(urdf_string))
84  {
85  ROS_ERROR_STREAM("Could not parse URDF from '" << config_data.urdf_path_ << "'");
86  return false;
87  }
88 
89  std::string srdf_string;
90  if (!rdf_loader::RDFLoader::loadXmlFileToString(srdf_string, config_data.srdf_path_, xacro_args))
91  {
92  ROS_ERROR_STREAM("Could not load SRDF from '" << config_data.srdf_path_ << "'");
93  return false;
94  }
95  if (!config_data.srdf_->initString(*config_data.urdf_model_, srdf_string))
96  {
97  ROS_ERROR_STREAM("Could not parse SRDF from '" << config_data.srdf_path_ << "'");
98  return false;
99  }
100 
101  if (!keep_old)
102  {
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();
106  }
107 
108  return true;
109 }
110 
112  double min_collision_fraction, bool verbose)
113 {
114  // TODO: spin thread and print progess if verbose
115  unsigned int collision_progress;
116  return moveit_setup_assistant::computeDefaultCollisions(config_data.getPlanningScene(), &collision_progress,
117  trials > 0, trials, min_collision_fraction, verbose);
118 }
119 
120 // less operation for two CollisionPairs
122 {
124  {
125  // use std::pair's operator<: (left.link1_, left.link2_) < (right.link1_, right.link2_)
126  return left.link1_ < right.link1_ || (!(right.link1_ < left.link1_) && left.link2_ < right.link2_);
127  }
128 };
129 
130 // Update collision pairs
131 void updateCollisionLinkPairs(std::vector<srdf::Model::CollisionPair>& target_pairs,
132  const moveit_setup_assistant::LinkPairMap& source_pairs, size_t skip_mask)
133 {
134  // remove duplicates
135  std::set<srdf::Model::CollisionPair, CollisionPairLess> filtered;
136  for (auto& p : target_pairs)
137  {
138  if (p.link1_ >= p.link2_)
139  std::swap(p.link1_, p.link2_); // unify link1, link2 sorting
140  filtered.insert(p);
141  }
142 
143  // copy the data in this class's LinkPairMap datastructure to srdf::Model::CollisionPair format
144  for (const auto& link_pair : source_pairs)
145  {
146  // Only copy those that are actually disabled
147  if (!link_pair.second.disable_check)
148  continue;
149 
150  // Filter out pairs matching the skip_mask
151  if ((1 << link_pair.second.reason) & skip_mask)
152  continue;
153 
155  pair.link1_ = link_pair.first.first;
156  pair.link2_ = link_pair.first.second;
157  if (pair.link1_ >= pair.link2_)
158  std::swap(pair.link1_, pair.link2_);
159  pair.reason_ = moveit_setup_assistant::disabledReasonToString(link_pair.second.reason);
160 
161  filtered.insert(pair);
162  }
163 
164  target_pairs.assign(filtered.begin(), filtered.end());
165 }
166 
167 int main(int argc, char* argv[])
168 {
169  std::string config_pkg_path;
170  std::string urdf_path;
171  std::string srdf_path;
172 
173  std::string output_path;
174 
175  bool include_default = false, include_always = false, keep_old = false, verbose = false;
176 
177  double min_collision_fraction = 1.0;
178 
179  uint32_t never_trials = 0;
180 
181  po::options_description desc("Allowed options");
182  desc.add_options() // clang-format off
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")
195  ; // clang-format on
196 
197  po::positional_options_description pos_desc;
198  pos_desc.add("xacro-args", -1);
199 
200  po::variables_map vm;
201  po::store(po::command_line_parser(argc, argv).options(desc).positional(pos_desc).run(), vm);
202  po::notify(vm);
203 
204  if (vm.count("help"))
205  {
206  std::cout << desc << std::endl;
207  return 1;
208  }
209 
211 
212  if (!config_pkg_path.empty())
213  {
214  if (!loadSetupAssistantConfig(config_data, config_pkg_path))
215  {
216  ROS_ERROR_STREAM("Could not load config at '" << config_pkg_path << "'");
217  return 1;
218  }
219  }
220  else if (urdf_path.empty() || srdf_path.empty())
221  {
222  ROS_ERROR_STREAM("Please provide config package or URDF and SRDF path");
223  return 1;
224  }
225  else if (rdf_loader::RDFLoader::isXacroFile(srdf_path) && output_path.empty())
226  {
227  ROS_ERROR_STREAM("Please provide a different output file for SRDF xacro input file");
228  return 1;
229  }
230 
231  // overwrite config paths if applicable
232  if (!urdf_path.empty())
233  config_data.urdf_path_ = urdf_path;
234  if (!srdf_path.empty())
235  config_data.srdf_path_ = srdf_path;
236 
237  std::vector<std::string> xacro_args;
238  if (vm.count("xacro-args"))
239  xacro_args = vm["xacro-args"].as<std::vector<std::string> >();
240 
241  if (!setup(config_data, keep_old, xacro_args))
242  {
243  ROS_ERROR_STREAM("Could not setup updater");
244  return 1;
245  }
246 
247  moveit_setup_assistant::LinkPairMap link_pairs = compute(config_data, never_trials, min_collision_fraction, verbose);
248 
249  size_t skip_mask = 0;
250  if (!include_default)
251  skip_mask |= (1 << moveit_setup_assistant::DEFAULT);
252  if (!include_always)
253  skip_mask |= (1 << moveit_setup_assistant::ALWAYS);
254 
255  updateCollisionLinkPairs(config_data.srdf_->disabled_collision_pairs_, link_pairs, skip_mask);
256 
257  config_data.srdf_->writeSRDF(output_path.empty() ? config_data.srdf_path_ : output_path);
258 
259  return 0;
260 }
moveit_setup_assistant::MoveItConfigData::setPackagePath
bool setPackagePath(const std::string &pkg_path)
Definition: moveit_config_data.cpp:1676
moveit_setup_assistant::MoveItConfigData::srdf_path_
std::string srdf_path_
Full file-system path to srdf.
Definition: moveit_config_data.h:278
run
void run(class_loader::ClassLoader *loader)
moveit_setup_assistant::MoveItConfigData::createFullSRDFPath
bool createFullSRDFPath(const std::string &package_path)
Make the full SRDF path using the loaded .setup_assistant data.
Definition: moveit_config_data.cpp:1789
ROS_ERROR_STREAM
#define ROS_ERROR_STREAM(args)
loadSetupAssistantConfig
bool loadSetupAssistantConfig(moveit_setup_assistant::MoveItConfigData &config_data, const std::string &pkg_path)
Definition: collisions_updater.cpp:46
rdf_loader.h
moveit_setup_assistant::ALWAYS
@ ALWAYS
Definition: compute_default_collisions.h:57
moveit_setup_assistant::MoveItConfigData::inputSetupAssistantYAML
bool inputSetupAssistantYAML(const std::string &file_path)
Definition: moveit_config_data.cpp:1799
uint32_t
uint32_t
main
int main(int argc, char *argv[])
Definition: collisions_updater.cpp:167
moveit_setup_assistant::DEFAULT
@ DEFAULT
Definition: compute_default_collisions.h:55
setup
bool setup(moveit_setup_assistant::MoveItConfigData &config_data, bool keep_old, const std::vector< std::string > &xacro_args)
Definition: collisions_updater.cpp:74
moveit_config_data.h
moveit_setup_assistant::MoveItConfigData
This class is shared with all widgets and contains the common configuration data needed for generatin...
Definition: moveit_config_data.h:219
srdf::Model::CollisionPair::link2_
std::string link2_
compute_default_collisions.h
moveit_setup_assistant::MoveItConfigData::getPlanningScene
planning_scene::PlanningScenePtr getPlanningScene()
Provide a shared planning scene.
Definition: moveit_config_data.cpp:159
moveit_setup_assistant::MoveItConfigData::getSetupAssistantYAMLPath
bool getSetupAssistantYAMLPath(std::string &path)
Definition: moveit_config_data.cpp:1746
updateCollisionLinkPairs
void updateCollisionLinkPairs(std::vector< srdf::Model::CollisionPair > &target_pairs, const moveit_setup_assistant::LinkPairMap &source_pairs, size_t skip_mask)
Definition: collisions_updater.cpp:131
CollisionPairLess
Definition: collisions_updater.cpp:121
moveit_setup_assistant::computeDefaultCollisions
LinkPairMap computeDefaultCollisions(const planning_scene::PlanningSceneConstPtr &parent_scene, unsigned int *progress, const bool include_never_colliding, const unsigned int trials, const double min_collision_faction, const bool verbose)
Generate an adjacency list of links that are always and never in collision, to speed up collision det...
Definition: compute_default_collisions.cpp:205
moveit_setup_assistant::MoveItConfigData::srdf_
srdf::SRDFWriterPtr srdf_
SRDF Data and Writer.
Definition: moveit_config_data.h:284
moveit_setup_assistant::MoveItConfigData::createFullURDFPath
bool createFullURDFPath()
Make the full URDF path using the loaded .setup_assistant data.
Definition: moveit_config_data.cpp:1757
rdf_loader::RDFLoader::isXacroFile
static bool isXacroFile(const std::string &path)
moveit_setup_assistant::disabledReasonToString
const std::string disabledReasonToString(DisabledReason reason)
Converts a reason for disabling a link pair into a string.
Definition: compute_default_collisions.cpp:685
moveit_setup_assistant::MoveItConfigData::config_pkg_path_
std::string config_pkg_path_
Loaded configuration package path - if an existing package was loaded, holds that path.
Definition: moveit_config_data.h:297
CollisionPairLess::operator()
bool operator()(const srdf::Model::CollisionPair &left, const srdf::Model::CollisionPair &right) const
Definition: collisions_updater.cpp:123
moveit_setup_assistant::MoveItConfigData::urdf_model_
urdf::ModelSharedPtr urdf_model_
URDF robot model.
Definition: moveit_config_data.h:264
rdf_loader::RDFLoader::loadXmlFileToString
static bool loadXmlFileToString(std::string &buffer, const std::string &path, const std::vector< std::string > &xacro_args)
compute
moveit_setup_assistant::LinkPairMap compute(moveit_setup_assistant::MoveItConfigData &config_data, uint32_t trials, double min_collision_fraction, bool verbose)
Definition: collisions_updater.cpp:111
verbose
bool verbose
srdf::Model::CollisionPair
moveit_setup_assistant::MoveItConfigData::urdf_path_
std::string urdf_path_
Full file-system path to urdf.
Definition: moveit_config_data.h:250
moveit_setup_assistant::LinkPairMap
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...
Definition: compute_default_collisions.h:76
srdf::Model::CollisionPair::reason_
std::string reason_
srdf::Model::CollisionPair::link1_
std::string link1_


moveit_setup_assistant
Author(s): Dave Coleman
autogenerated on Sat May 3 2025 02:28:04