collision_operations_generator_test.cpp
Go to the documentation of this file.
00001 /*********************************************************************
00002  *
00003  * Software License Agreement (BSD License)
00004  *
00005  *  Copyright (c) 2008, Willow Garage, Inc.
00006  *  All rights reserved.
00007  *
00008  *  Redistribution and use in source and binary forms, with or without
00009  *  modification, are permitted provided that the following conditions
00010  *  are met:
00011  *
00012  *   * Redistributions of source code must retain the above copyright
00013  *     notice, this list of conditions and the following disclaimer.
00014  *   * Redistributions in binary form must reproduce the above
00015  *     copyright notice, this list of conditions and the following
00016  *     disclaimer in the documentation and/or other materials provided
00017  *     with the distribution.
00018  *   * Neither the name of the Willow Garage nor the names of its
00019  *     contributors may be used to endorse or promote products derived
00020  *     from this software without specific prior written permission.
00021  *
00022  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00023  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00024  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00025  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00026  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00027  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00028  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00029  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00030  *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00031  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00032  *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00033  *  POSSIBILITY OF SUCH DAMAGE.
00034  *
00035  *  \author E. Gil Jones
00036  *********************************************************************/
00037 
00038 #include <ros/ros.h>
00039 
00040 #include <map>
00041 #include <string>
00042 #include <vector>
00043 #include <fstream>
00044 
00045 #include <planning_models/kinematic_model.h>
00046 #include <planning_models/kinematic_state.h>
00047 #include <collision_space/environmentODE.h>
00048 #include <yaml-cpp/yaml.h>
00049 
00050 double gen_rand(double min, double max)
00051 {
00052   int rand_num = rand()%100+1;
00053   double result = min + (double)((max-min)*rand_num)/101.0;
00054   return result;
00055 }
00056 
00057 static const unsigned int ESTABLISH_ALWAYS_NUM = 100;
00058 static const unsigned int ESTABLISH_OFTEN_NUM = 500;
00059 static const double ESTABLISH_OFTEN_PERCENTAGE = .5;
00060 static const unsigned int PERFORMANCE_TESTING_NUM = 500;
00061 
00062 class CollisionOperationsGenerator {
00063 
00064 public:
00065 
00066   CollisionOperationsGenerator(const std::string& full_path_name) {
00067     
00068     ok_ = false;
00069 
00070     bool urdf_ok = urdf_model_.initFile(full_path_name);
00071 
00072     if(!urdf_ok) {
00073       ROS_WARN_STREAM("Urdf file " << full_path_name << " not ok");
00074       return;
00075     }
00076     std::vector<planning_models::KinematicModel::GroupConfig> gcs;
00077     std::vector<planning_models::KinematicModel::MultiDofConfig> multi_dof_configs;
00078     const urdf::Link *root = urdf_model_.getRoot().get();
00079 
00080     //now this should work with an non-identity transform
00081     planning_models::KinematicModel::MultiDofConfig config("world_joint");
00082     config.type = "Floating";
00083     config.parent_frame_id = root->name;
00084     config.child_frame_id = root->name;
00085     multi_dof_configs.push_back(config);
00086     
00087     kmodel_ = new planning_models::KinematicModel(urdf_model_,gcs, multi_dof_configs);    
00088     if(kmodel_->getRoot() == NULL) {
00089       ROS_INFO_STREAM("Kinematic root is NULL");
00090       return;
00091     }
00092 
00093     ode_collision_model_ = new collision_space::EnvironmentModelODE();
00094 
00095     const std::vector<planning_models::KinematicModel::LinkModel*>& coll_links = kmodel_->getLinkModelsWithCollisionGeometry();
00096   
00097     std::vector<std::string> coll_names;
00098     for(unsigned int i = 0; i < coll_links.size(); i++) {
00099       coll_names.push_back(coll_links[i]->getName());
00100     }
00101     collision_space::EnvironmentModel::AllowedCollisionMatrix default_collision_matrix(coll_names,false);
00102     std::map<std::string, double> default_link_padding_map;
00103     ode_collision_model_->setRobotModel(kmodel_, default_collision_matrix, 
00104                                         default_link_padding_map, 0.0, 1.0);
00105     generateSamplingStructures();
00106     ok_ = true;
00107   }
00108 
00109   ~CollisionOperationsGenerator() {
00110     delete ode_collision_model_;
00111     delete kmodel_;
00112   }
00113 
00114   void generateSamplingStructures() {
00115     const std::vector<planning_models::KinematicModel::JointModel*>& jmv = kmodel_->getJointModels();
00116     //assuming that 0th is world joint, which we don't want to include
00117     for(unsigned int i = 1; i < jmv.size(); i++) {
00118       const std::map<std::string, std::pair<double, double> >& joint_bounds = jmv[i]->getAllVariableBounds();
00119       for(std::map<std::string, std::pair<double, double> >::const_iterator it = joint_bounds.begin();
00120           it != joint_bounds.end();
00121           it++) {
00122         if(joint_bounds_map_.find(it->first) != joint_bounds_map_.end()) {
00123           ROS_WARN_STREAM("Have repeat DOF names for " << it->first);
00124           continue;
00125         }
00126         if(it->second.first > it->second.second) {
00127           ROS_WARN_STREAM("Lower bound for DOF " << it->first << " is greater than upper bound");
00128         } else if(it->second.first == -DBL_MAX) {
00129           ROS_WARN_STREAM("Some non-root DOF " << it->first << " has negative inf lower bound");
00130         } 
00131         if(it->second.second == DBL_MAX) {
00132           ROS_WARN_STREAM("Some non-root DOF " << it->first << " has inf upper[ bound");
00133         } 
00134         joint_bounds_map_[it->first] = it->second;        
00135       }
00136     }
00137   }
00138 
00139   void generateOutputCollisionOperations(unsigned int num, const std::string& output_file) {
00140     sampleAndCountCollisions(ESTABLISH_ALWAYS_NUM);
00141     
00142     ROS_INFO_STREAM("Established always in collision pairs");
00143 
00144     planning_models::KinematicState state(kmodel_);
00145     collision_space::EnvironmentModel::AllowedCollisionMatrix altered_acm = ode_collision_model_->getCurrentAllowedCollisionMatrix();
00146 
00147     altered_acm.changeEntry(false);
00148     for(unsigned int i = 0; i < always_in_collision_.size(); i++) {
00149       altered_acm.changeEntry(always_in_collision_[i].first,
00150                                always_in_collision_[i].second,
00151                                true);
00152     }    
00153 
00154     ode_collision_model_->setAlteredCollisionMatrix(altered_acm);
00155 
00156     saved_always_in_collision_ = always_in_collision_;
00157 
00158     sampleAndCountCollisions(ESTABLISH_OFTEN_NUM);
00159     for(unsigned int i = 0; i < often_in_collision_.size(); i++) {
00160       altered_acm.changeEntry(often_in_collision_[i].first,
00161                               often_in_collision_[i].second,
00162                               true);
00163     }    
00164     ode_collision_model_->setAlteredCollisionMatrix(altered_acm);
00165     saved_often_in_collision_ = often_in_collision_;
00166     often_percentage_map_ = percentage_map_;
00167     ROS_INFO_STREAM("Established often in collision pairs");
00168     
00169     sampleAndCountCollisions(num);
00170     emitYamlOutputStructures(output_file);
00171     printOutputStructures(output_file);
00172   }
00173 
00174   void sampleAndCountCollisions(unsigned int num) {
00175     resetCountingMap();
00176 
00177     planning_models::KinematicState state(kmodel_);
00178 
00179     ros::WallTime n1 = ros::WallTime::now();
00180     for(unsigned int i = 0; i < num; i++) {
00181       generateRandomState(state);
00182       ode_collision_model_->updateRobotModel(&state);
00183       std::vector<collision_space::EnvironmentModel::AllowedContact> allowed_contacts;
00184       std::vector<collision_space::EnvironmentModel::Contact> coll_space_contacts;
00185       ode_collision_model_->getAllCollisionContacts(allowed_contacts,
00186                                                     coll_space_contacts,
00187                                                     1);
00188       if(i != 0 && i % 1000 == 0) {
00189         ROS_INFO_STREAM("Num " << i << " getting all contacts takes " << (ros::WallTime::now()-n1).toSec());
00190         n1 = ros::WallTime::now();
00191       }
00192       for(unsigned int i = 0; i < coll_space_contacts.size(); i++) {
00193         collision_space::EnvironmentModel::Contact& contact = coll_space_contacts[i];
00194         if(collision_count_map_.find(contact.body_name_1) == collision_count_map_.end()) {
00195           ROS_WARN_STREAM("Problem - have no count for collision body " << contact.body_name_1);
00196         }
00197         if(collision_count_map_.find(contact.body_name_2) == collision_count_map_.end()) {
00198           ROS_WARN_STREAM("Problem - have no count for collision body " << contact.body_name_2);
00199         }
00200         collision_count_map_[contact.body_name_1][contact.body_name_2]++;
00201         collision_count_map_[contact.body_name_2][contact.body_name_1]++;
00202       }
00203     }
00204     buildOutputStructures(num);
00205   }
00206 
00207   void generateAndCompareOutputStructures(unsigned int num) {
00208     sampleAndCountCollisions(ESTABLISH_ALWAYS_NUM);
00209     
00210     ROS_INFO_STREAM("Established always in collision pairs");
00211 
00212     planning_models::KinematicState state(kmodel_);
00213     collision_space::EnvironmentModel::AllowedCollisionMatrix altered_acm = ode_collision_model_->getCurrentAllowedCollisionMatrix();
00214 
00215     altered_acm.changeEntry(false);
00216     for(unsigned int i = 0; i < always_in_collision_.size(); i++) {
00217       altered_acm.changeEntry(always_in_collision_[i].first,
00218                               always_in_collision_[i].second,
00219                               true);
00220     }    
00221     ode_collision_model_->setAlteredCollisionMatrix(altered_acm);
00222     saved_always_in_collision_ = always_in_collision_;
00223 
00224     sampleAndCountCollisions(ESTABLISH_OFTEN_NUM);
00225     for(unsigned int i = 0; i < often_in_collision_.size(); i++) {
00226       altered_acm.changeEntry(often_in_collision_[i].first,
00227                               often_in_collision_[i].second,
00228                               true);
00229     }    
00230     ode_collision_model_->setAlteredCollisionMatrix(altered_acm);
00231     saved_often_in_collision_ = often_in_collision_;
00232     ROS_INFO_STREAM("Established often in collision pairs");
00233 
00234     std::map<std::string, std::map<std::string, double> > first_percentage_map;
00235     sampleAndCountCollisions(num);
00236     first_percentage_map = percentage_map_;
00237     
00238     ROS_INFO_STREAM("Done with first");
00239 
00240     sampleAndCountCollisions(num);
00241 
00242     ROS_INFO_STREAM("Done with second");
00243 
00244     for(std::map<std::string, std::map<std::string, double> >::iterator it = first_percentage_map.begin();
00245         it != first_percentage_map.end();
00246         it++) {
00247       for(std::map<std::string, double>::iterator it2 = it->second.begin();
00248           it2 != it->second.end();
00249           it2++) {
00250         bool first_all = (it2->second == num);
00251         bool second_all = (percentage_map_[it->first][it2->first] == num);
00252         
00253         if(first_all != second_all) {
00254           ROS_INFO_STREAM("Links " << it->first << " and " << it2->first << " different all");
00255         }
00256         
00257         bool first_never = (it2->second == 0);
00258         bool second_never = (percentage_map_[it->first][it2->first] == 0);
00259         
00260         if(first_never != second_never) {
00261           ROS_INFO_STREAM("Links " << it->first << " and " << it2->first << " different never " << it2->second << " " << percentage_map_[it->first][it2->first]);
00262         }
00263       }
00264     }
00265   }
00266 
00267   void buildOutputStructures(unsigned int num) {
00268     always_in_collision_.clear();
00269     never_in_collision_.clear();    
00270     often_in_collision_.clear();
00271     occasionally_in_collision_.clear();
00272     percentage_map_.clear();
00273     for(std::map<std::string, std::map<std::string, unsigned int> >::iterator it = collision_count_map_.begin();
00274         it != collision_count_map_.end();
00275         it++) {
00276       for(std::map<std::string, unsigned int>::iterator it2 = it->second.begin();
00277           it2 != it->second.end();
00278           it2++) {
00279         if(it->first == it2->first) {
00280           continue;
00281         }
00282         bool already_in_lists = false;
00283         //if we've already registered this pair continue
00284         if(percentage_map_.find(it->first) != percentage_map_.end()) {
00285           if(percentage_map_.find(it->first)->second.find(it2->first) != 
00286              percentage_map_.find(it->first)->second.end()) {
00287             already_in_lists = true;
00288           }
00289         }
00290         if(percentage_map_.find(it2->first) != percentage_map_.end()) {
00291           if(percentage_map_.find(it2->first)->second.find(it->first) != 
00292              percentage_map_.find(it2->first)->second.end()) {
00293             already_in_lists = true;
00294           }
00295         }
00296         if(it2->second == num) {
00297           if(!already_in_lists) {
00298             always_in_collision_.push_back(std::pair<std::string, std::string>(it->first, it2->first));
00299           }
00300           percentage_map_[it->first][it2->first] = 1.0;
00301           percentage_map_[it2->first][it->first] = 1.0;
00302         } else if(it2->second == 0) {
00303           if(!already_in_lists) {
00304             never_in_collision_.push_back(std::pair<std::string, std::string>(it->first, it2->first));
00305           }
00306           percentage_map_[it->first][it2->first] = 0.0;
00307           percentage_map_[it2->first][it->first] = 0.0;          
00308         } else {
00309           double per = (it2->second*1.0)/(num*1.0);
00310           if(!already_in_lists) {
00311             if(per > ESTABLISH_OFTEN_PERCENTAGE) {
00312               often_in_collision_.push_back(std::pair<std::string, std::string>(it->first, it2->first));
00313             } else {
00314               occasionally_in_collision_.push_back(std::pair<std::string, std::string>(it->first, it2->first));
00315             }
00316           }
00317           percentage_map_[it->first][it2->first] = per;
00318           percentage_map_[it2->first][it->first] = per;                    
00319         }
00320       }
00321     }
00322   }
00323 
00324   void printOutputStructures(const std::string& filename) {
00325     std::ofstream outfile((filename+".txt").c_str());
00326 
00327     outfile << "Always in collision pairs: " << std::endl;
00328     for(unsigned int i = 0; i < saved_always_in_collision_.size(); i++) {
00329       outfile << saved_always_in_collision_[i].first << " " << saved_always_in_collision_[i].second << std::endl;
00330     }
00331     outfile << std::endl;
00332 
00333     outfile << "Often in collision pairs: " << std::endl;
00334     for(unsigned int i = 0; i < saved_often_in_collision_.size(); i++) {
00335       outfile << saved_often_in_collision_[i].first << " " << saved_often_in_collision_[i].second;
00336       outfile << " " << often_percentage_map_[saved_often_in_collision_[i].first][saved_often_in_collision_[i].second] << std::endl;
00337     }
00338     outfile << std::endl;
00339 
00340     outfile << "Never in collision pairs: " << std::endl;
00341     for(unsigned int i = 0; i < never_in_collision_.size(); i++) {
00342       outfile << never_in_collision_[i].first << " " << never_in_collision_[i].second << std::endl;
00343     }
00344     outfile << std::endl;
00345 
00346     outfile << "Occasionally in collision pairs: " << std::endl;
00347     for(unsigned int i = 0; i < occasionally_in_collision_.size(); i++) {
00348       outfile << occasionally_in_collision_[i].first << " " << occasionally_in_collision_[i].second;
00349       outfile << " " << percentage_map_[occasionally_in_collision_[i].first][occasionally_in_collision_[i].second] << std::endl;
00350     }
00351   }
00352 
00353   void emitYamlOutputStructures(const std::string& filename) {
00354     std::ofstream outfile((filename+".yaml").c_str());
00355 
00356     YAML::Emitter outy;
00357     outy << YAML::BeginMap;
00358     outy << YAML::Key << "default_collision_operations";
00359     outy << YAML::Value << YAML::BeginSeq; 
00360     for(unsigned int i = 0; i < saved_often_in_collision_.size(); i++) {
00361       outy << YAML::BeginMap; 
00362       outy << YAML::Key << "object1" << YAML::Value << saved_often_in_collision_[i].first;
00363       outy << YAML::Key << "object2" << YAML::Value << saved_often_in_collision_[i].second;
00364       outy << YAML::Key << "operation" << YAML::Value << "disable";
00365       outy << YAML::Comment("Often in collision");
00366       outy << YAML::EndMap;
00367     }
00368     for(unsigned int i = 0; i < saved_always_in_collision_.size(); i++) {
00369       outy << YAML::BeginMap; 
00370       outy << YAML::Key << "object1" << YAML::Value << saved_always_in_collision_[i].first;
00371       outy << YAML::Key << "object2" << YAML::Value << saved_always_in_collision_[i].second;
00372       outy << YAML::Key << "operation" << YAML::Value << "disable";
00373       outy << YAML::Comment("Always in collision");
00374       outy << YAML::EndMap;
00375     }
00376     for(unsigned int i = 0; i < never_in_collision_.size(); i++) {
00377       outy << YAML::BeginMap; 
00378       outy << YAML::Key << "object1" << YAML::Value << never_in_collision_[i].first;
00379       outy << YAML::Key << "object2" << YAML::Value << never_in_collision_[i].second;
00380       outy << YAML::Key << "operation" << YAML::Value << "disable";
00381       outy << YAML::Comment("Never in collision");
00382       outy << YAML::EndMap;
00383     }
00384     outy << YAML::EndMap;
00385     outfile << outy.c_str();
00386   }
00387 
00388   void performanceTestFromOutputStructures() {
00389     unsigned int num = PERFORMANCE_TESTING_NUM;
00390     planning_models::KinematicState state(kmodel_);
00391     collision_space::EnvironmentModel::AllowedCollisionMatrix altered_acm = ode_collision_model_->getCurrentAllowedCollisionMatrix();
00392 
00393     altered_acm.changeEntry(false);
00394     ode_collision_model_->setAlteredCollisionMatrix(altered_acm);
00395     ros::WallTime n1 = ros::WallTime::now();
00396     for(unsigned int i = 0; i < num; i++) {
00397       generateRandomState(state);
00398       ode_collision_model_->updateRobotModel(&state);
00399       std::vector<collision_space::EnvironmentModel::AllowedContact> allowed_contacts;
00400       std::vector<collision_space::EnvironmentModel::Contact> coll_space_contacts;
00401       ode_collision_model_->getAllCollisionContacts(allowed_contacts,
00402                                                     coll_space_contacts,
00403                                                     1);
00404     }
00405     ROS_INFO_STREAM("All enabled collision check average " <<
00406                     (ros::WallTime::now()-n1).toSec()/(num*1.0));
00407 
00408     for(unsigned int i = 0; i < saved_always_in_collision_.size(); i++) {
00409       altered_acm.changeEntry(saved_always_in_collision_[i].first,
00410                                saved_always_in_collision_[i].second,
00411                                true);
00412     }    
00413 
00414     ode_collision_model_->setAlteredCollisionMatrix(altered_acm);
00415     n1 = ros::WallTime::now();
00416     for(unsigned int i = 0; i < num; i++) {
00417       generateRandomState(state);
00418       ode_collision_model_->updateRobotModel(&state);
00419       std::vector<collision_space::EnvironmentModel::AllowedContact> allowed_contacts;
00420       std::vector<collision_space::EnvironmentModel::Contact> coll_space_contacts;
00421       ode_collision_model_->getAllCollisionContacts(allowed_contacts,
00422                                                     coll_space_contacts,
00423                                                     1);
00424     }
00425     ROS_INFO_STREAM("Always disabled collision check average " <<
00426                     (ros::WallTime::now()-n1).toSec()/(num*1.0));
00427 
00428     for(unsigned int i = 0; i < saved_often_in_collision_.size(); i++) {
00429       altered_acm.changeEntry(saved_often_in_collision_[i].first,
00430                                saved_often_in_collision_[i].second,
00431                                true);
00432     }    
00433 
00434     ode_collision_model_->setAlteredCollisionMatrix(altered_acm);
00435     n1 = ros::WallTime::now();
00436     for(unsigned int i = 0; i < num; i++) {
00437       generateRandomState(state);
00438       ode_collision_model_->updateRobotModel(&state);
00439       std::vector<collision_space::EnvironmentModel::AllowedContact> allowed_contacts;
00440       std::vector<collision_space::EnvironmentModel::Contact> coll_space_contacts;
00441       ode_collision_model_->getAllCollisionContacts(allowed_contacts,
00442                                                     coll_space_contacts,
00443                                                     1);
00444     }
00445     ROS_INFO_STREAM("Often disabled collision check average " <<
00446                     (ros::WallTime::now()-n1).toSec()/(num*1.0));
00447 
00448     for(unsigned int i = 0; i < never_in_collision_.size(); i++) {
00449       altered_acm.changeEntry(never_in_collision_[i].first,
00450                                never_in_collision_[i].second,
00451                                true);
00452     }    
00453     ode_collision_model_->setAlteredCollisionMatrix(altered_acm);
00454     n1 = ros::WallTime::now();
00455     for(unsigned int i = 0; i < num; i++) {
00456       generateRandomState(state);
00457       ode_collision_model_->updateRobotModel(&state);
00458       std::vector<collision_space::EnvironmentModel::AllowedContact> allowed_contacts;
00459       std::vector<collision_space::EnvironmentModel::Contact> coll_space_contacts;
00460       ode_collision_model_->getAllCollisionContacts(allowed_contacts,
00461                                                     coll_space_contacts,
00462                                                     1);
00463     }
00464     ROS_INFO_STREAM("Never disabled collision check average " <<
00465                     (ros::WallTime::now()-n1).toSec()/(num*1.0));
00466     
00467   }
00468 
00469 
00470   bool isOk() const {
00471     return ok_;
00472   }
00473 
00474 protected:
00475 
00476   void resetCountingMap() {
00477     const std::vector<planning_models::KinematicModel::LinkModel*>& lmv = kmodel_->getLinkModelsWithCollisionGeometry();
00478 
00479     collision_count_map_.clear();
00480 
00481     //assuming that 0th is world joint, which we don't want to include
00482     std::map<std::string, unsigned int> all_link_zero;
00483     for(unsigned int i = 0; i < lmv.size(); i++) {
00484       all_link_zero[lmv[i]->getName()] = 0;
00485     }
00486     for(unsigned int i = 0; i < lmv.size(); i++) {
00487       collision_count_map_[lmv[i]->getName()] = all_link_zero;
00488     }
00489   }
00490 
00491   void generateRandomState(planning_models::KinematicState& state) {
00492     std::map<std::string, double> values;
00493     for(std::map<std::string, std::pair<double, double> >::iterator it = joint_bounds_map_.begin();
00494         it != joint_bounds_map_.end();
00495         it++) {
00496       values[it->first] = gen_rand(it->second.first, it->second.second);
00497       //ROS_INFO_STREAM("Value for " << it->first << " is " << values[it->first] << " bounds " << 
00498       //                it->second.first << " " << it->second.second);
00499     }
00500     state.setKinematicState(values);
00501   }
00502 
00503   bool ok_;
00504 
00505   collision_space::EnvironmentModel* ode_collision_model_;
00506   planning_models::KinematicModel* kmodel_;
00507   urdf::Model urdf_model_;
00508 
00509   std::map<std::string, std::pair<double, double> > joint_bounds_map_;
00510   std::map<std::string, std::map<std::string, unsigned int> > collision_count_map_;
00511 
00512   std::vector<std::pair<std::string, std::string> > always_in_collision_;
00513   std::vector<std::pair<std::string, std::string> > saved_always_in_collision_;
00514   std::vector<std::pair<std::string, std::string> > never_in_collision_;
00515   std::vector<std::pair<std::string, std::string> > often_in_collision_;
00516   std::vector<std::pair<std::string, std::string> > saved_often_in_collision_;
00517   std::vector<std::pair<std::string, std::string> > occasionally_in_collision_;
00518   std::map<std::string, std::map<std::string, double> > percentage_map_;
00519   std::map<std::string, std::map<std::string, double> > often_percentage_map_;
00520 
00521 };
00522 
00523 static const unsigned int TIMES = 50000;
00524 
00525 int main(int argc, char** argv) {
00526 
00527   ros::init(argc, argv, "collision_operations_generator");
00528 
00529   srand(time(NULL));
00530   
00531   if(argc < 2) {
00532     ROS_INFO_STREAM("Must specify a urdf file");
00533     exit(0);
00534   }
00535 
00536   std::string urdf_file = argv[1];
00537   std::string output_file;
00538   if(argc == 3) {
00539     output_file = argv[2];
00540   }
00541 
00542   CollisionOperationsGenerator cog(urdf_file);
00543 
00544   if(!cog.isOk()) {
00545     ROS_INFO_STREAM("Something wrong with urdf");
00546     exit(0);
00547   }
00548 
00549   if(argc == 3) {
00550     cog.generateOutputCollisionOperations(TIMES, output_file);
00551     cog.performanceTestFromOutputStructures();
00552   } else {
00553     cog.generateAndCompareOutputStructures(TIMES);
00554   }
00555 
00556   ros::shutdown();
00557   exit(0);
00558 }
00559   


planning_environment
Author(s): Ioan Sucan
autogenerated on Thu Dec 12 2013 11:09:24