move_arm_warehouse_logger_reader.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/console.h>
00039 #include <boost/foreach.hpp>
00040 #include <sstream>
00041 
00042 //#include <move_arm_warehouse/move_arm_warehouse_logger_reader.h>
00043 #include "srs_assisted_arm_navigation/move_arm_utils/move_arm_warehouse_logger_reader.h"
00044 
00045 using namespace move_arm_warehouse;
00046 
00047 static const std::string DATABASE_NAME="arm_navigation";
00048 static const std::string PLANNING_SCENE_TIME_NAME="planning_scene_time";
00049 static const std::string PLANNING_SCENE_ID_NAME="planning_scene_id";
00050 static const std::string MOTION_PLAN_REQUEST_ID_NAME="motion_request_id";
00051 static const std::string TRAJECTORY_ID_NAME="trajectory_id";
00052 static const std::string TRAJECTORY_MOTION_REQUEST_ID_NAME="trajectory_motion_request_id";
00053 static const std::string PAUSED_COLLISION_MAP_TIME_NAME="paused_collision_map_time";
00054 
00055 typedef mongo_ros::MessageWithMetadata<arm_navigation_msgs::PlanningScene>::ConstPtr PlanningSceneWithMetadata;
00056 typedef mongo_ros::MessageWithMetadata<arm_navigation_msgs::MotionPlanRequest>::ConstPtr MotionPlanRequestWithMetadata;
00057 typedef mongo_ros::MessageWithMetadata<trajectory_msgs::JointTrajectory>::ConstPtr JointTrajectoryWithMetadata;
00058 typedef mongo_ros::MessageWithMetadata<arm_navigation_msgs::ArmNavigationErrorCodes>::ConstPtr ErrorCodesWithMetadata;
00059 typedef mongo_ros::MessageWithMetadata<head_monitor_msgs::HeadMonitorFeedback>::ConstPtr HeadMonitorFeedbackWithMetadata;
00060   
00061 MoveArmWarehouseLoggerReader::MoveArmWarehouseLoggerReader()
00062 {
00063   char hostname[256];
00064   
00065   gethostname(hostname, 256);
00066 
00067   hostname_ = hostname;
00068 
00069   ROS_DEBUG_STREAM("Hostname is " << hostname_);
00070 
00071 
00072   planning_scene_collection_ = new mongo_ros::MessageCollection<arm_navigation_msgs::PlanningScene>(DATABASE_NAME, "planning_scene");
00073   motion_plan_request_collection_ = new mongo_ros::MessageCollection<arm_navigation_msgs::MotionPlanRequest>(DATABASE_NAME, "motion_plan_request");
00074   trajectory_collection_ = new mongo_ros::MessageCollection<trajectory_msgs::JointTrajectory>(DATABASE_NAME, "trajectory");
00075   outcome_collection_ = new mongo_ros::MessageCollection<arm_navigation_msgs::ArmNavigationErrorCodes>(DATABASE_NAME, "outcome");
00076   paused_state_collection_ = new mongo_ros::MessageCollection<head_monitor_msgs::HeadMonitorFeedback>(DATABASE_NAME, "paused_state");
00077 }
00078 
00079 MoveArmWarehouseLoggerReader::~MoveArmWarehouseLoggerReader() {
00080   delete planning_scene_collection_;
00081   delete motion_plan_request_collection_;
00082   delete trajectory_collection_;
00083   delete outcome_collection_;
00084   delete paused_state_collection_;
00085 }
00086 
00090 
00091 mongo_ros::Metadata MoveArmWarehouseLoggerReader::initializeMetadataWithHostname()
00092 {
00093   return mongo_ros::Metadata("hostname", hostname_);
00094 }
00095 
00096 void MoveArmWarehouseLoggerReader::addPlanningSceneIdToMetadata(const unsigned int& id,
00097                                                                 mongo_ros::Metadata& metadata) {
00098   metadata.append(PLANNING_SCENE_ID_NAME, id);
00099 }
00100 
00101 void MoveArmWarehouseLoggerReader::addPlanningSceneTimeToMetadata(const arm_navigation_msgs::PlanningScene& planning_scene,
00102                                                                   mongo_ros::Metadata& metadata)
00103 {
00104   metadata.append(PLANNING_SCENE_TIME_NAME, planning_scene.robot_state.joint_state.header.stamp.toSec());
00105 }
00106 
00107 unsigned int MoveArmWarehouseLoggerReader::determineNextPlanningSceneId() {
00108   mongo_ros::Query q;
00109   std::vector<PlanningSceneWithMetadata> planning_scenes = planning_scene_collection_->pullAllResults(q, true, PLANNING_SCENE_ID_NAME, false);
00110   if(planning_scenes.size() == 0) {
00111     return 0;
00112   }
00113   //should be in reverse order
00114   return planning_scenes.front()->lookupInt(PLANNING_SCENE_ID_NAME)+1;
00115 }
00116 
00117 void MoveArmWarehouseLoggerReader::pushPlanningSceneToWarehouseWithoutId(const arm_navigation_msgs::PlanningScene& planning_scene,
00118                                                                          unsigned int& id) 
00119 {
00120   id = determineNextPlanningSceneId();
00121   pushPlanningSceneToWarehouse(planning_scene, id);
00122 }
00123 
00124 
00125 void MoveArmWarehouseLoggerReader::pushPlanningSceneToWarehouse(const arm_navigation_msgs::PlanningScene& planning_scene,
00126                                                                 const unsigned int id)
00127 {
00128   mongo_ros::Metadata metadata = initializeMetadataWithHostname();
00129   addPlanningSceneTimeToMetadata(planning_scene, metadata);
00130   //TODO - check for duplicates?
00131   addPlanningSceneIdToMetadata(id, metadata);
00132   planning_scene_collection_->insert(planning_scene, metadata);
00133 }
00134 
00135 void MoveArmWarehouseLoggerReader::pushMotionPlanRequestToWarehouse(const unsigned int planning_scene_id,
00136                                                                     const unsigned int mpr_id,
00137                                                                     const std::string& stage_name,
00138                                                                     const arm_navigation_msgs::MotionPlanRequest& motion_plan_request)
00139 {
00140   mongo_ros::Metadata metadata = initializeMetadataWithHostname();
00141   addPlanningSceneIdToMetadata(planning_scene_id, metadata);
00142   
00143   metadata.append("stage_name", stage_name);
00144   
00145   metadata.append(MOTION_PLAN_REQUEST_ID_NAME, mpr_id);
00146   //adding the presence of goal pose constraints to metadata
00147   metadata.append("has_goal_position_constraints", !motion_plan_request.goal_constraints.position_constraints.empty());
00148 
00149  
00150   metadata.append("has_path_constraints", 
00151                   (!motion_plan_request.path_constraints.orientation_constraints.empty() || motion_plan_request.path_constraints.position_constraints.empty()));
00152   
00153   motion_plan_request_collection_->insert(motion_plan_request, metadata);
00154 }
00155 
00156 void MoveArmWarehouseLoggerReader::pushJointTrajectoryToWarehouse(const unsigned int planning_scene_id,
00157                                                                   const std::string& trajectory_source,
00158                                                                   const ros::Duration& production_time,
00159                                                                   const trajectory_msgs::JointTrajectory& trajectory,
00160                                                                   const trajectory_msgs::JointTrajectory& trajectory_control_error,
00161                                                                   const unsigned int trajectory_id,
00162                                                                   const unsigned int motion_request_id,
00163                                                                   const arm_navigation_msgs::ArmNavigationErrorCodes& error_code)
00164 {
00165   mongo_ros::Metadata metadata = initializeMetadataWithHostname();
00166   addPlanningSceneIdToMetadata(planning_scene_id, metadata);
00167 
00168   metadata.append("trajectory_source", trajectory_source);
00169   metadata.append("production_time", production_time.toSec());
00170   metadata.append(TRAJECTORY_ID_NAME, trajectory_id);
00171   metadata.append(TRAJECTORY_MOTION_REQUEST_ID_NAME, motion_request_id);
00172   metadata.append("trajectory_error_code", error_code.val);
00173   metadata.append("controller_error", jointTrajectoryToString(trajectory_control_error));
00174   trajectory_collection_->insert(trajectory, metadata);
00175 }
00176 
00177 void MoveArmWarehouseLoggerReader::pushOutcomeToWarehouse(const unsigned int id, 
00178                                                           const std::string& pipeline_stage,
00179                                                           const arm_navigation_msgs::ArmNavigationErrorCodes& error_codes)
00180 {
00181   mongo_ros::Metadata metadata = initializeMetadataWithHostname();
00182   addPlanningSceneIdToMetadata(id, metadata);
00183 
00184   metadata.append("pipeline_stage", pipeline_stage);
00185   outcome_collection_->insert(error_codes, metadata);
00186 }
00187 
00188 void MoveArmWarehouseLoggerReader::pushPausedStateToWarehouse(const unsigned int id, 
00189                                                               const head_monitor_msgs::HeadMonitorFeedback& feedback)
00190 {
00191   mongo_ros::Metadata metadata = initializeMetadataWithHostname();
00192   addPlanningSceneIdToMetadata(id, metadata);
00193   metadata.append(PAUSED_COLLISION_MAP_TIME_NAME, feedback.paused_collision_map.header.stamp.toSec());
00194   paused_state_collection_->insert(feedback, metadata);
00195 }
00196 
00200 
00201 void MoveArmWarehouseLoggerReader::getAvailablePlanningSceneList(const std::string& hostname, 
00202                                                                  std::vector<unsigned int>& planning_scene_ids,
00203                                                                  std::vector<ros::Time>& creation_times)
00204 {
00205   creation_times.clear();
00206   planning_scene_ids.clear();
00207 
00208   // std::stringstream fin(planning_scenes[i]->metadata);
00209   // YAML::Parser parser(fin);
00210   // YAML::Node doc;
00211   // while(parser.GetNextDocument(doc)) {    }
00212 
00213   mongo_ros::Query q;
00214   std::vector<PlanningSceneWithMetadata> planning_scenes = planning_scene_collection_->pullAllResults(q, true, PLANNING_SCENE_TIME_NAME, true);
00215 
00216   planning_scene_ids.resize(planning_scenes.size());
00217   creation_times.resize(planning_scenes.size());
00218 
00219   bool no_ids = false;
00220   for(unsigned int i = 0; i < planning_scenes.size(); i++) {    
00221     if(!planning_scenes[i]->metadata.hasField(PLANNING_SCENE_ID_NAME.c_str())) {
00222       no_ids = true;
00223       break;
00224     }
00225     planning_scene_ids[i] = planning_scenes[i]->lookupInt(PLANNING_SCENE_ID_NAME);
00226     ROS_DEBUG_STREAM("Got planning scene id " << planning_scene_ids[i]);
00227     creation_times[i] = ros::Time(planning_scenes[i]->lookupDouble(PLANNING_SCENE_TIME_NAME));
00228   }
00229   if(no_ids) {
00230     ROS_WARN_STREAM("No planning scene ids, can't load");
00231   }
00232 }
00233 
00234 mongo_ros::Query MoveArmWarehouseLoggerReader::makeQueryForPlanningSceneTime(const ros::Time& time)
00235 {
00236   mongo_ros::Query retq;
00237   retq.append(PLANNING_SCENE_TIME_NAME, time.toSec()); 
00238   return retq;
00239 }
00240 
00241 mongo_ros::Query MoveArmWarehouseLoggerReader::makeQueryForPlanningSceneId(const unsigned int id)
00242 {
00243   mongo_ros::Query retq;
00244   retq.append(PLANNING_SCENE_ID_NAME, id); 
00245   return retq;
00246 }
00247 
00248 bool MoveArmWarehouseLoggerReader::getPlanningScene(const std::string& hostname, 
00249                                                     const unsigned int& id,
00250                                                     arm_navigation_msgs::PlanningScene& planning_scene, 
00251                                                     std::string& hostname_out)
00252 {
00253   mongo_ros::Query q = makeQueryForPlanningSceneId(id);  
00254   std::vector<PlanningSceneWithMetadata> planning_scenes = planning_scene_collection_->pullAllResults(q, false);
00255 
00256   if(planning_scenes.size() == 0) {
00257     ROS_WARN_STREAM("No scenes with id " << id);
00258     return false;
00259   } else if(planning_scenes.size() > 1) {
00260     ROS_WARN_STREAM("More than one scene with id " << id << " num " << planning_scenes.size());
00261   }
00262 
00263   PlanningSceneWithMetadata& scene = planning_scenes[0];
00264   planning_scene = *scene;
00265   hostname_out = scene->lookupString("hostname");
00266   return true;
00267 }
00268 
00269 bool MoveArmWarehouseLoggerReader::getAssociatedOutcomes(const std::string& hostname,
00270                                                          const unsigned int id, 
00271                                                          std::vector<std::string>& pipeline_names,
00272                                                          std::vector<arm_navigation_msgs::ArmNavigationErrorCodes>& error_codes)
00273 {
00274   mongo_ros::Query q = makeQueryForPlanningSceneId(id);  
00275   std::vector<ErrorCodesWithMetadata> meta_error_codes = outcome_collection_->pullAllResults(q, false);
00276   
00277   if(meta_error_codes.size() == 0) {
00278     ROS_DEBUG_STREAM("No outcomes associated with id " << id);
00279     return false;
00280   } 
00281   error_codes.resize(meta_error_codes.size());
00282   pipeline_names.resize(meta_error_codes.size());
00283   for(unsigned int i = 0; i < meta_error_codes.size(); i++) {
00284     pipeline_names[i] = meta_error_codes[i]->lookupString("pipeline_stage");
00285     error_codes[i] = *meta_error_codes[i];
00286   }
00287   return true;
00288 }
00289                                                  
00290 bool MoveArmWarehouseLoggerReader::getAssociatedMotionPlanRequestsStageNames(const std::string& hostname, 
00291                                                                              const unsigned int planning_scene_id,
00292                                                                              std::vector<std::string>& stage_names)
00293 {
00294   mongo_ros::Query q = makeQueryForPlanningSceneId(planning_scene_id);  
00295   std::vector<MotionPlanRequestWithMetadata> motion_plan_requests = motion_plan_request_collection_->pullAllResults(q, true, PLANNING_SCENE_ID_NAME, true);
00296 
00297   if(motion_plan_requests.size() == 0) {
00298     ROS_DEBUG_STREAM("No motion plan requests with id" << planning_scene_id);
00299     return false;
00300   } 
00301 
00302   stage_names.resize(motion_plan_requests.size());
00303   for(unsigned int i = 0; i < motion_plan_requests.size(); i++) {
00304     stage_names[i] = motion_plan_requests[i]->lookupString("stage_name");
00305   }
00306   return true; 
00307 }
00308 
00309 bool MoveArmWarehouseLoggerReader::getAssociatedMotionPlanRequest(const std::string& hostname, 
00310                                                                   const unsigned int planning_scene_id, 
00311                                                                   const unsigned int motion_request_id,
00312                                                                   arm_navigation_msgs::MotionPlanRequest& request)
00313 {  
00314   mongo_ros::Query q = makeQueryForPlanningSceneId(planning_scene_id);  
00315   q.append(MOTION_PLAN_REQUEST_ID_NAME, motion_request_id);
00316   std::vector<MotionPlanRequestWithMetadata> motion_plan_requests = motion_plan_request_collection_->pullAllResults(q, false);
00317 
00318   if(motion_plan_requests.size() == 0) {
00319     ROS_WARN_STREAM("No motion plan requests with planning scene id " << planning_scene_id
00320                     << " and motion plan id " << motion_request_id);
00321     return false;
00322   } else if(motion_plan_requests.size() > 1) {
00323     ROS_WARN_STREAM("More than one motion plan requests with planning scene id " << planning_scene_id
00324                     << " and motion plan id " << motion_request_id);
00325     return false;
00326   }
00327   request = *motion_plan_requests[0];
00328   return true;
00329 }
00330 
00331 bool MoveArmWarehouseLoggerReader::getAssociatedMotionPlanRequests(const std::string& hostname,
00332                                                                    const unsigned int planning_scene_id, 
00333                                                                    std::vector<unsigned int>& ids,
00334                                                                    std::vector<std::string>& stage_names,
00335                                                                    std::vector<arm_navigation_msgs::MotionPlanRequest>& requests)
00336 {
00337   stage_names.clear();
00338   ids.clear();
00339   requests.clear();
00340   mongo_ros::Query q = makeQueryForPlanningSceneId(planning_scene_id);
00341   std::vector<MotionPlanRequestWithMetadata> motion_plan_requests = motion_plan_request_collection_->pullAllResults(q, false);
00342 
00343   for(size_t i = 0; i < motion_plan_requests.size(); i++)
00344   {
00345     stage_names.push_back(motion_plan_requests[i]->lookupString("stage_name"));
00346     ids.push_back(motion_plan_requests[i]->lookupInt(MOTION_PLAN_REQUEST_ID_NAME));
00347     requests.push_back(*motion_plan_requests[i]);
00348     ROS_DEBUG_STREAM("Loading planning scene " << planning_scene_id << " motion plan request " << ids[i] << " from warehouse...");
00349   }
00350 
00351   return true;
00352 }
00353 
00354 bool MoveArmWarehouseLoggerReader::getAssociatedJointTrajectorySources(const std::string& hostname, 
00355                                                                        const unsigned int planning_scene_id,
00356                                                                        const unsigned int motion_request_id,
00357                                                                        std::vector<unsigned int>& ids, 
00358                                                                        std::vector<std::string>& trajectory_sources)
00359 {
00360   ids.clear();
00361   trajectory_sources.clear();
00362   mongo_ros::Query q = makeQueryForPlanningSceneId(planning_scene_id);
00363   q.append(TRAJECTORY_MOTION_REQUEST_ID_NAME, motion_request_id);
00364   
00365   std::vector<JointTrajectoryWithMetadata> joint_trajectories = trajectory_collection_->pullAllResults(q, true, TRAJECTORY_ID_NAME);
00366 
00367   if(joint_trajectories.size() == 0) {
00368     ROS_WARN_STREAM("No joint trajectories with planning scene id " << planning_scene_id
00369                     << " and motion plan id " << motion_request_id);
00370     return false;
00371   } 
00372   ids.resize(joint_trajectories.size());
00373   trajectory_sources.resize(joint_trajectories.size());
00374   for(unsigned int i = 0; i < joint_trajectories.size(); i++) {
00375     trajectory_sources[i] = joint_trajectories[i]->lookupString("trajectory_source");
00376   }
00377   return true; 
00378 }
00379 
00380 bool MoveArmWarehouseLoggerReader::getAssociatedJointTrajectory(const std::string& hostname, 
00381                                                                 const unsigned int planning_scene_id,
00382                                                                 const unsigned int motion_request_id,
00383                                                                 const unsigned int trajectory_id,
00384                                                                 ros::Duration& duration, 
00385                                                                 trajectory_msgs::JointTrajectory& joint_trajectory,
00386                                                                 trajectory_msgs::JointTrajectory& trajectory_control_error)
00387 {
00388   mongo_ros::Query q = makeQueryForPlanningSceneId(planning_scene_id);  
00389   q.append(TRAJECTORY_MOTION_REQUEST_ID_NAME, motion_request_id);
00390   q.append(TRAJECTORY_ID_NAME, trajectory_id);
00391   std::vector<JointTrajectoryWithMetadata> joint_trajectories = trajectory_collection_->pullAllResults(q, false);
00392 
00393   if(joint_trajectories.size() == 0) {
00394     ROS_WARN_STREAM("No joint trajectories with with planning scene id " << planning_scene_id
00395                     << " and motion plan id " << motion_request_id
00396                     << " and trajectory id " << trajectory_id);
00397     return false;
00398   } else if(joint_trajectories.size() > 1) {
00399     ROS_WARN_STREAM("Multiple trajectories in db with same ids");
00400     return false;
00401   }
00402   
00403   duration = ros::Duration(joint_trajectories[0]->lookupDouble("production_time"));
00404   joint_trajectory = *joint_trajectories[0];
00405   stringToJointTrajectory(joint_trajectories[0]->lookupString("controller_error"),trajectory_control_error);
00406   return true;
00407 }
00408 
00409 bool MoveArmWarehouseLoggerReader::getAssociatedJointTrajectories(const std::string& hostname,
00410                                                                   const unsigned int planning_scene_id,
00411                                                                   const unsigned int motion_request_id,
00412                                                                   std::vector<trajectory_msgs::JointTrajectory>& trajectories,
00413                                                                   std::vector<trajectory_msgs::JointTrajectory>& trajectory_control_errors,
00414                                                                   std::vector<std::string>& sources,
00415                                                                   std::vector<unsigned int>& ids,
00416                                                                   std::vector<ros::Duration>& durations,
00417                                                                   std::vector<int32_t>& error_codes)
00418 {
00419   trajectories.clear();
00420   trajectory_control_errors.clear();
00421   sources.clear();
00422   ids.clear();
00423   durations.clear();
00424   error_codes.clear();
00425   mongo_ros::Query q = makeQueryForPlanningSceneId(planning_scene_id);
00426   q.append(TRAJECTORY_MOTION_REQUEST_ID_NAME, motion_request_id);
00427   std::vector<JointTrajectoryWithMetadata> joint_trajectories = trajectory_collection_->pullAllResults(q, false);
00428  trajectory_msgs::JointTrajectory trajectory_control_error;
00429 
00430   for(size_t i = 0; i < joint_trajectories.size(); i++)
00431   {
00432     trajectories.push_back(*joint_trajectories[i]);
00433     stringToJointTrajectory(joint_trajectories[i]->lookupString("controller_error"),trajectory_control_error);
00434     trajectory_control_errors.push_back(trajectory_control_error);
00435     sources.push_back(joint_trajectories[i]->lookupString("trajectory_source"));
00436     ids.push_back(joint_trajectories[i]->lookupInt(TRAJECTORY_ID_NAME));
00437     ROS_DEBUG_STREAM("Loading mpr id " << motion_request_id << " trajectory " << ids[i] << " from warehouse...");
00438     durations.push_back(ros::Duration(joint_trajectories[i]->lookupDouble("production_time")));
00439     error_codes.push_back(joint_trajectories[i]->lookupInt("trajectory_error_code"));
00440   }
00441 
00442   return true;
00443 }
00444 
00445 bool MoveArmWarehouseLoggerReader::getAssociatedPausedStates(const std::string& hostname, 
00446                                                              const unsigned int id, 
00447                                                              std::vector<ros::Time>& paused_times)
00448 {
00449   paused_times.clear();
00450   mongo_ros::Query q = makeQueryForPlanningSceneId(id);  
00451   std::vector<HeadMonitorFeedbackWithMetadata> paused_states = paused_state_collection_->pullAllResults(q, true, PLANNING_SCENE_ID_NAME);
00452 
00453   if(paused_states.size() == 0) {
00454     return false;
00455   } 
00456   paused_times.resize(paused_states.size());
00457   for(unsigned int i = 0; i < paused_states.size(); i++) {
00458     paused_times[i] = ros::Time(paused_states[i]->lookupDouble("paused_collision_map_stamp"));
00459   }
00460   return true;   
00461 }
00462 
00463 bool MoveArmWarehouseLoggerReader::getAssociatedPausedState(const std::string& hostname, 
00464                                                             const unsigned int id, 
00465                                                             const ros::Time& paused_time,
00466                                                             head_monitor_msgs::HeadMonitorFeedback& paused_state)
00467 {
00468   mongo_ros::Query q = makeQueryForPlanningSceneId(id);  
00469   q.append(PAUSED_COLLISION_MAP_TIME_NAME, paused_time.toSec());
00470 
00471   std::vector<HeadMonitorFeedbackWithMetadata> paused_states = paused_state_collection_->pullAllResults(q, false);
00472 
00473   if(paused_states.size() == 0) {
00474     ROS_WARN_STREAM("No paused states with that time");
00475     return false;
00476   } else if(paused_states.size() > 1) {
00477     ROS_WARN_STREAM("Multiple paused states with time");
00478     return false;
00479   }
00480   paused_state = *paused_states[0];
00481   return true;
00482 }
00483 
00484 bool MoveArmWarehouseLoggerReader::hasPlanningScene(const std::string& hostname,
00485                                                     const unsigned int id) {
00486   mongo_ros::Query q = makeQueryForPlanningSceneId(id);  
00487   q.append("hostname", hostname);
00488   
00489   std::vector<PlanningSceneWithMetadata> planning_scenes = planning_scene_collection_->pullAllResults(q, true);
00490   if(planning_scenes.size() > 0) return true;
00491   return false;
00492 }
00493 
00494 bool MoveArmWarehouseLoggerReader::removePlanningSceneAndAssociatedDataFromWarehouse(const std::string& hostname,
00495                                                                                      const unsigned int id) {
00496   mongo_ros::Query q = makeQueryForPlanningSceneId(id);  
00497   q.append("hostname", hostname);
00498 
00499   unsigned int rem = planning_scene_collection_->removeMessages(q);
00500   ROS_DEBUG_STREAM("Removed " << rem << " planning scenes");
00501 
00502   bool has_planning_scene = (rem > 0);
00503   
00504   rem = motion_plan_request_collection_->removeMessages(q);
00505   ROS_DEBUG_STREAM("Removed " << rem << " motion plan requests");
00506 
00507   rem = trajectory_collection_->removeMessages(q);
00508   ROS_DEBUG_STREAM("Removed " << rem << " trajectories");
00509 
00510   rem = outcome_collection_->removeMessages(q);
00511   ROS_DEBUG_STREAM("Removed " << rem << " outcomes");
00512 
00513   rem = paused_state_collection_->removeMessages(q);
00514   ROS_DEBUG_STREAM("Removed " << rem << " paused states");
00515 
00516   return has_planning_scene;
00517 }
00518 
00519 std::string MoveArmWarehouseLoggerReader::jointTrajectoryToString(const trajectory_msgs::JointTrajectory& trajectory)
00520 {
00521   std::stringstream returnval;
00522   returnval << trajectory.points.size() << ",";
00523   for( unsigned int i=0; i<trajectory.points.size(); i++)
00524   {
00525     const trajectory_msgs::JointTrajectoryPoint& point = trajectory.points[i];
00526     returnval << point.positions.size() << ",";
00527     for( unsigned int j=0; j<point.positions.size(); j++ )
00528     {
00529       returnval << point.positions[j] << ",";
00530       returnval << point.velocities[j] << ",";
00531     }
00532   }
00533 
00534   return returnval.str();
00535 }
00536 
00537 void MoveArmWarehouseLoggerReader::stringToJointTrajectory(const std::string& trajectory, trajectory_msgs::JointTrajectory& joint_trajectory_error)
00538 {
00539   std::stringstream stream(trajectory);
00540   double position;
00541   double velocity;
00542   char c;
00543   int tsize;
00544   int psize;
00545   joint_trajectory_error.points.clear();
00546 
00547 
00548   stream >> tsize;
00549   stream >> c;
00550   for( int i=0; i<tsize; i++)
00551   {
00552     trajectory_msgs::JointTrajectoryPoint point;
00553     stream >> psize;
00554     stream >> c;
00555     for( int j=0; j<psize; j++)
00556     {
00557       stream >> position;
00558       stream >> c;
00559       stream >> velocity;
00560       stream >> c;
00561       point.positions.push_back(position);
00562       point.velocities.push_back(position);
00563     }
00564     joint_trajectory_error.points.push_back(point);
00565   }
00566 }
00567 
00568 // void MoveArmWarehouseLoggerReader::deleteMotionPlanRequestFromWarehouse(const arm_navigation_msgs::PlanningScene& planning_scene,
00569 //                                                                         const std::string& stage_name,
00570 //                                                                         const std::string& ID)
00571 // {
00572 //   mongo_ros::Query q = makeQueryForPlanningSceneTime(time);  
00573 //   q.append("stage_name", stage_name);
00574 //   q.append("motion_request_id", ID);
00575 //   std::vector<MotionPlanRequestWithMetadata> motion_plan_requests = motion_plan_request_collection_->pullAllResults(q, false);
00576 //   coll.removeMessages(q);
00577 //   std::vector<MotionPlanRequestWithMetadata> motion_plan_requests_after = motion_plan_request_collection_->pullAllResults(q, false);
00578 //   ROS_DEBUG_STREAM("Removing " << motion_plan_requests.size()-motion_plan_requests_after.size() << " motion plan requests");
00579 // }


srs_assisted_arm_navigation
Author(s): Zdenek Materna (imaterna@fit.vutbr.cz), Michal Spanel (spanel@fit.vutbr.cz)
autogenerated on Mon Oct 6 2014 08:12:09