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
00038 #include <ros/console.h>
00039 #include <boost/foreach.hpp>
00040 #include <sstream>
00041
00042
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
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
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
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
00209
00210
00211
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
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579