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 #ifndef MOVE_ARM_UTILS_H
00039 #define MOVE_ARM_UTILS_H
00040 #include <planning_environment/models/collision_models.h>
00041 #include <arm_navigation_msgs/PlanningScene.h>
00042 #include <arm_navigation_msgs/SetPlanningSceneDiff.h>
00043 #include <planning_environment/models/model_utils.h>
00044 #include <rosgraph_msgs/Clock.h>
00045 #include <std_msgs/ColorRGBA.h>
00046 #include <tf/transform_broadcaster.h>
00047 #include <kinematics_msgs/GetConstraintAwarePositionIK.h>
00048 #include <kinematics_msgs/GetPositionIK.h>
00049 #include <actionlib/server/simple_action_server.h>
00050 #include <actionlib/client/simple_action_client.h>
00051 #include <actionlib/client/simple_client_goal_state.h>
00052 #include <arm_navigation_msgs/GetMotionPlan.h>
00053 #include <arm_navigation_msgs/GetStateValidity.h>
00054 #include <trajectory_msgs/JointTrajectory.h>
00055 #include <arm_navigation_msgs/FilterJointTrajectoryWithConstraints.h>
00056 #include <arm_navigation_msgs/convert_messages.h>
00057 #include <move_arm_warehouse/move_arm_warehouse_logger_reader.h>
00058 #include <arm_navigation_msgs/convert_messages.h>
00059 #include <visualization_msgs/InteractiveMarker.h>
00060 #include <interactive_markers/interactive_marker_server.h>
00061 #include <interactive_markers/menu_handler.h>
00062 #include <interactive_markers/tools.h>
00063 #include <arm_navigation_msgs/CollisionObject.h>
00064 #include <planning_environment/monitors/kinematic_model_state_monitor.h>
00065 #include <control_msgs/FollowJointTrajectoryAction.h>
00066
00067 #include <std_srvs/Empty.h>
00068 #include <pr2_mechanism_msgs/ListControllers.h>
00069 #include <pr2_mechanism_msgs/LoadController.h>
00070 #include <pr2_mechanism_msgs/UnloadController.h>
00071 #include <pr2_mechanism_msgs/SwitchController.h>
00072 #include <pr2_controllers_msgs/JointTrajectoryControllerState.h>
00073
00074
00075
00076 typedef std::map<std::string, interactive_markers::MenuHandler::EntryHandle> MenuEntryMap;
00077 typedef std::map<std::string, MenuEntryMap> MenuMap;
00078 typedef std::map<std::string, interactive_markers::MenuHandler> MenuHandlerMap;
00079
00084 namespace planning_scene_utils
00085 {
00086
00087 inline static geometry_msgs::Pose toGeometryPose(tf::Transform transform)
00088 {
00089 geometry_msgs::Pose toReturn;
00090 toReturn.position.x = transform.getOrigin().x();
00091 toReturn.position.y = transform.getOrigin().y();
00092 toReturn.position.z = transform.getOrigin().z();
00093 toReturn.orientation.x = transform.getRotation().x();
00094 toReturn.orientation.y = transform.getRotation().y();
00095 toReturn.orientation.z = transform.getRotation().z();
00096 toReturn.orientation.w = transform.getRotation().w();
00097 return toReturn;
00098 }
00099
00100 inline static tf::Transform toBulletTransform(geometry_msgs::Pose pose)
00101 {
00102 tf::Quaternion quat =
00103 tf::Quaternion(pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w);
00104 tf::Vector3 vec = tf::Vector3(pose.position.x, pose.position.y, pose.position.z);
00105 return tf::Transform(quat, vec);
00106 }
00107
00108 inline static std::string getPlanningSceneNameFromId(const unsigned int id) {
00109 std::stringstream ss;
00110 ss << "Planning Scene " << id;
00111 return ss.str();
00112 }
00113
00114 inline static unsigned int getPlanningSceneIdFromName(const std::string& name) {
00115 std::stringstream ss(name);
00116 std::string temp;
00117 ss >> temp;
00118 ss >> temp;
00119 unsigned int ret;
00120 ss >> ret;
00121 return ret;
00122 }
00123
00124 inline static std::string getMotionPlanRequestNameFromId(const unsigned int id) {
00125 std::stringstream ss;
00126 ss << "MPR " << id;
00127 return ss.str();
00128 }
00129
00130 inline static std::string getTrajectoryNameFromId(const unsigned int id) {
00131 std::stringstream ss;
00132 ss << "Trajectory " << id;
00133 return ss.str();
00134 }
00135
00141 inline static std::string getResultErrorFromCode(int error_code)
00142 {
00143 std::string result;
00144 if(error_code == control_msgs::FollowJointTrajectoryResult::SUCCESSFUL)
00145 result = "Success";
00146 else if(error_code == control_msgs::FollowJointTrajectoryResult::INVALID_GOAL)
00147 result = "Invalid Goal";
00148 else if(error_code == control_msgs::FollowJointTrajectoryResult::INVALID_JOINTS)
00149 result = "Invalid Joints";
00150 else if(error_code == control_msgs::FollowJointTrajectoryResult::OLD_HEADER_TIMESTAMP)
00151 result = "Old header timestamp";
00152 else if(error_code == control_msgs::FollowJointTrajectoryResult::PATH_TOLERANCE_VIOLATED)
00153 result = "Path tolerance violated";
00154 else if(error_code == control_msgs::FollowJointTrajectoryResult::GOAL_TOLERANCE_VIOLATED)
00155 result = "Goal tolerance violated";
00156 return result;
00157 }
00158
00164 enum PositionType
00165 {
00166 StartPosition, GoalPosition
00167 };
00168
00176 enum RenderType
00177 {
00178 CollisionMesh, VisualMesh, PaddingMesh
00179 };
00180
00187 enum TrajectoryRenderType
00188 {
00189 Kinematic,
00190 Temporal,
00191 };
00192
00193
00194
00195 class PlanningSceneEditor;
00196
00202 class PlanningSceneData
00203 {
00204 protected:
00205 std::string name_;
00206 unsigned int id_;
00207 std::string host_;
00208 ros::Time timestamp_;
00209 arm_navigation_msgs::PlanningScene planning_scene_;
00210 std::vector<std::string> pipeline_stages_;
00211 std::vector<arm_navigation_msgs::ArmNavigationErrorCodes> error_codes_;
00212 std::set<unsigned int> motion_plan_requests_;
00213
00214 public:
00215 PlanningSceneData();
00216 PlanningSceneData(unsigned int id, const ros::Time& timestamp, const arm_navigation_msgs::PlanningScene& scene);
00217
00219 inline std::string getHostName() const
00220 {
00221 return host_;
00222 }
00223
00225 inline void setHostName(std::string host)
00226 {
00227 host_ = host;
00228 }
00229
00231 inline std::string getName() const
00232 {
00233 return name_;
00234 }
00235
00236 inline unsigned int getId() const
00237 {
00238 return id_;
00239 }
00240
00242 inline const ros::Time& getTimeStamp() const
00243 {
00244 return timestamp_;
00245 }
00246
00248 inline arm_navigation_msgs::PlanningScene& getPlanningScene()
00249 {
00250 return planning_scene_;
00251 }
00252
00254 inline void setTimeStamp(const ros::Time& time)
00255 {
00256 timestamp_ = time;
00257 planning_scene_.robot_state.joint_state.header.stamp = time;
00258 }
00259
00260 inline void setId(unsigned int id) {
00261 id_ = id;
00262 name_ = getPlanningSceneNameFromId(id);
00263 }
00264
00266 inline void setPlanningScene(const arm_navigation_msgs::PlanningScene& scene)
00267 {
00268 planning_scene_ = scene;
00269 timestamp_ = scene.robot_state.joint_state.header.stamp;
00270 }
00271
00275 inline std::vector<std::string>& getPipelineStages()
00276 {
00277 return pipeline_stages_;
00278 }
00279
00281 inline void setPipelineStages(std::vector<std::string>& stages)
00282 {
00283 pipeline_stages_ = stages;
00284 }
00285
00287 inline std::vector<arm_navigation_msgs::ArmNavigationErrorCodes>& getErrorCodes()
00288 {
00289 return error_codes_;
00290 }
00291
00293 inline void setErrorCodes(std::vector<arm_navigation_msgs::ArmNavigationErrorCodes>& error_codes)
00294 {
00295 error_codes_ = error_codes;
00296 }
00297
00299 inline std::set<unsigned int>& getRequests()
00300 {
00301 return motion_plan_requests_;
00302 }
00303
00306 void getRobotState(planning_models::KinematicState* state);
00307
00308 bool hasMotionPlanRequestId(unsigned int id) const {
00309 return(motion_plan_requests_.find(id) != motion_plan_requests_.end());
00310 }
00311
00312 void addMotionPlanRequestId(unsigned int id) {
00313 motion_plan_requests_.insert(id);
00314 }
00315
00316 void removeMotionPlanRequestId(unsigned int id) {
00317 motion_plan_requests_.erase(id);
00318 }
00319
00320 unsigned int getNextMotionPlanRequestId() const {
00321 if(motion_plan_requests_.empty()) {
00322 return 0;
00323 }
00324 return (*motion_plan_requests_.rbegin())+1;
00325 }
00326 };
00327
00333 class MotionPlanRequestData
00334 {
00335 protected:
00336 std::string name_;
00337 unsigned int id_;
00338 std::string source_;
00339 unsigned int planning_scene_id_;
00340 std::string end_effector_link_;
00341 std::string group_name_;
00342 arm_navigation_msgs::MotionPlanRequest motion_plan_request_;
00343 bool is_start_editable_;
00344 bool is_goal_editable_;
00345 bool is_start_visible_;
00346 bool is_goal_visible_;
00347 bool should_refresh_colors_;
00348 bool has_refreshed_colors_;
00349 bool has_path_constraints_;
00350 bool has_good_goal_ik_solution_;
00351 bool has_good_start_ik_solution_;
00352 bool are_collisions_visible_;
00353 bool has_state_changed_;
00354 bool are_joint_controls_visible_;
00355
00356 double roll_tolerance_;
00357 double pitch_tolerance_;
00358 double yaw_tolerance_;
00359
00360 bool constrain_roll_;
00361 bool constrain_pitch_;
00362 bool constrain_yaw_;
00363
00364 std_msgs::ColorRGBA start_color_;
00365 std_msgs::ColorRGBA goal_color_;
00366 std::set<unsigned int> trajectories_;
00367 planning_models::KinematicState* start_state_;
00368 planning_models::KinematicState* goal_state_;
00369 tf::Transform last_good_start_pose_;
00370 tf::Transform last_good_goal_pose_;
00371 visualization_msgs::MarkerArray collision_markers_;
00372 RenderType render_type_;
00373 unsigned int next_trajectory_id_;
00374
00375 public:
00376 MotionPlanRequestData()
00377 {
00378 start_state_ = NULL;
00379 goal_state_ = NULL;
00380 }
00381
00382 MotionPlanRequestData(const planning_models::KinematicState* robot_state);
00383 MotionPlanRequestData(const unsigned int& id,
00384 const std::string& source,
00385 const arm_navigation_msgs::MotionPlanRequest& request,
00386 const planning_models::KinematicState* robot_state,
00387 const std::string& end_effector_link);
00388
00392 ros::Duration refresh_timer_;
00393
00394
00397 void setStartStateValues(std::map<std::string, double>& joint_values);
00398
00401 void setGoalStateValues(std::map<std::string, double>& joint_values);
00402
00405 void updateStartState();
00406
00409 void updateGoalState();
00410
00413 std::vector<std::string> getJointNamesInGoal();
00414
00419 bool isJointNameInGoal(std::string joint);
00420
00422 inline RenderType getRenderType() const
00423 {
00424 return render_type_;
00425 }
00426
00428 inline void setRenderType(RenderType renderType)
00429 {
00430 render_type_ = renderType;
00431 }
00432
00434 inline bool areJointControlsVisible() const
00435 {
00436 return are_joint_controls_visible_;
00437 }
00438
00442 void setJointControlsVisible(bool visible, PlanningSceneEditor* editor);
00443
00445 inline bool hasStateChanged() const
00446 {
00447 return has_state_changed_;
00448 }
00449
00451 inline void setStateChanged(bool changed)
00452 {
00453 has_state_changed_ = changed;
00454 }
00455
00457 inline visualization_msgs::MarkerArray& getCollisionMarkers()
00458 {
00459 return collision_markers_;
00460 }
00461
00463 inline bool areCollisionsVisible() const
00464 {
00465 return are_collisions_visible_;
00466 }
00467
00469 inline void setCollisionsVisible(bool visible)
00470 {
00471 are_collisions_visible_ = visible;
00472 }
00473
00475 inline void showCollisions()
00476 {
00477 setCollisionsVisible(true);
00478 }
00479
00481 inline void hideCollisions()
00482 {
00483 setCollisionsVisible(false);
00484 }
00485
00487 inline tf::Transform getLastGoodStartPose() const
00488 {
00489 return last_good_start_pose_;
00490 }
00491
00493 inline tf::Transform getLastGoodGoalPose() const
00494 {
00495 return last_good_goal_pose_;
00496 }
00497
00499 inline void setLastGoodStartPose(tf::Transform pose)
00500 {
00501 last_good_start_pose_ = pose;
00502 }
00503
00505 inline void setLastGoodGoalPose(tf::Transform pose)
00506 {
00507 last_good_goal_pose_ = pose;
00508 }
00509
00511 inline void setStartState(planning_models::KinematicState* state)
00512 {
00513 start_state_ = state;
00514 setStateChanged(true);
00515 }
00516
00518 inline void setGoalState(planning_models::KinematicState* state)
00519 {
00520 goal_state_ = state;
00521 setStateChanged(true);
00522 }
00523
00525 inline void reset()
00526 {
00527 if(start_state_ != NULL)
00528 {
00529 delete start_state_;
00530 start_state_ = NULL;
00531 }
00532
00533 if(goal_state_ != NULL)
00534 {
00535 delete goal_state_;
00536 goal_state_ = NULL;
00537 }
00538 }
00539
00541 inline bool hasGoodIKSolution(const PositionType& type) const
00542 {
00543 if(type == StartPosition) {
00544 return has_good_start_ik_solution_;
00545 } else {
00546 return has_good_goal_ik_solution_;
00547 }
00548 }
00549
00551 inline void setHasGoodIKSolution(const bool& solution, const PositionType& type)
00552 {
00553 if(type == StartPosition) {
00554 has_good_start_ik_solution_ = solution;
00555 } else {
00556 has_good_goal_ik_solution_ = solution;
00557 }
00558 }
00559
00561 inline planning_models::KinematicState* getStartState()
00562 {
00563 return start_state_;
00564 }
00565
00567 inline planning_models::KinematicState* getGoalState()
00568 {
00569 return goal_state_;
00570 }
00571
00574 inline std::string getGroupName() const
00575 {
00576 return group_name_;
00577 }
00578
00580 inline std::string getEndEffectorLink() const
00581 {
00582 return end_effector_link_;
00583 }
00584
00587 inline void setGroupName(const std::string& name)
00588 {
00589 group_name_ = name;
00590 }
00591
00593 inline void setEndEffectorLink(const std::string& name)
00594 {
00595 end_effector_link_ = name;
00596 }
00597
00599 inline const std::string& getName() const
00600 {
00601 return name_;
00602 }
00603
00604 unsigned int getId() const {
00605 return id_;
00606 }
00607
00609 inline void setId(const unsigned int id)
00610 {
00611 id_ = id;
00612 name_ = getMotionPlanRequestNameFromId(id_);
00613 }
00614
00616 inline bool shouldRefreshColors() const
00617 {
00618 return should_refresh_colors_;
00619 }
00620
00622 inline bool hasRefreshedColors() const
00623 {
00624 return has_refreshed_colors_;
00625 }
00626
00628 inline void setHasRefreshedColors(bool refresh)
00629 {
00630 has_refreshed_colors_ = refresh;
00631
00632 if(refresh)
00633 {
00634 should_refresh_colors_ = false;
00635 }
00636 }
00637
00640 inline void refreshColors()
00641 {
00642 should_refresh_colors_ = true;
00643 has_refreshed_colors_ = false;
00644 refresh_timer_ = ros::Duration(0.0);
00645 }
00646
00649 inline bool isStartVisible() const
00650 {
00651 return is_start_visible_;
00652 }
00653
00656 inline bool isEndVisible() const
00657 {
00658 return is_goal_visible_;
00659 }
00660
00662 inline void setStartVisible(bool visible)
00663 {
00664 is_start_visible_ = visible;
00665 }
00666
00668 inline void setEndVisible(bool visible)
00669 {
00670 is_goal_visible_ = visible;
00671 }
00672
00674 inline void show()
00675 {
00676 setStartVisible(true);
00677 setEndVisible(true);
00678 }
00679
00681 inline void hide()
00682 {
00683 setStartVisible(false);
00684 setEndVisible(false);
00685 }
00686
00688 inline void showStart()
00689 {
00690 setStartVisible(true);
00691 }
00692
00694 inline void showGoal()
00695 {
00696 setEndVisible(true);
00697 }
00698
00700 inline void hideStart()
00701 {
00702 setStartVisible(false);
00703 }
00704
00706 inline void hideGoal()
00707 {
00708 setEndVisible(false);
00709 }
00710
00712 inline const std_msgs::ColorRGBA& getStartColor() const
00713 {
00714 return start_color_;
00715 }
00716
00718 inline const std_msgs::ColorRGBA& getGoalColor() const
00719 {
00720 return goal_color_;
00721 }
00722
00724 inline void setStartColor(std_msgs::ColorRGBA color)
00725 {
00726 start_color_ = color;
00727 }
00728
00730 inline void setGoalColor(std_msgs::ColorRGBA color)
00731 {
00732 goal_color_ = color;
00733 }
00734
00737 inline void setStartEditable(bool editable)
00738 {
00739 is_start_editable_ = editable;
00740 }
00741
00744 inline void setGoalEditable(bool editable)
00745 {
00746 is_goal_editable_ = editable;
00747 }
00748
00751 inline bool isStartEditable() const
00752 {
00753 return is_start_editable_;
00754 }
00755
00758 inline bool isGoalEditable() const
00759 {
00760 return is_goal_editable_;
00761 }
00762
00764 inline void setSource(const std::string& source)
00765 {
00766 source_ = source;
00767 }
00768
00770 inline const std::string& getSource() const
00771 {
00772 return source_;
00773 }
00774
00776 inline arm_navigation_msgs::MotionPlanRequest& getMotionPlanRequest()
00777 {
00778 return motion_plan_request_;
00779 }
00780
00782 inline void setMotionPlanRequest(const arm_navigation_msgs::MotionPlanRequest& request)
00783 {
00784 motion_plan_request_ = request;
00785 setGroupName(request.group_name);
00786 updateStartState();
00787 updateGoalState();
00788 }
00789
00791 inline void setPlanningSceneId(const unsigned int id)
00792 {
00793 planning_scene_id_ = id;
00794 }
00795 inline unsigned int getPlanningSceneId() const
00796 {
00797 return planning_scene_id_;
00798 }
00799
00801 inline std::string getPlanningSceneName() const
00802 {
00803 return getPlanningSceneNameFromId(planning_scene_id_);
00804 }
00805
00807 inline std::set<unsigned int>& getTrajectories()
00808 {
00809 return trajectories_;
00810 }
00811
00812 unsigned int getNextTrajectoryId() const {
00813 if(trajectories_.empty()) return 0;
00814 return (*trajectories_.rbegin())+1;
00815 }
00816
00817 void addTrajectoryId(unsigned int id) {
00818 trajectories_.insert(id);
00819 }
00820
00821 void removeTrajectoryId(unsigned int id) {
00822 trajectories_.erase(id);
00823 }
00824
00825 bool hasTrajectoryId(unsigned int id) const {
00826 return (trajectories_.find(id) != trajectories_.end());
00827 }
00828
00829 bool hasPathConstraints() const {
00830 return has_path_constraints_;
00831 }
00832
00833 void setPathConstraints(bool has) {
00834 has_path_constraints_ = has;
00835 }
00836
00837 bool getConstrainRoll() const {
00838 return constrain_roll_;
00839 }
00840
00841 void setConstrainRoll(bool s) {
00842 constrain_roll_ = s;
00843 }
00844
00845 bool getConstrainPitch() const {
00846 return constrain_pitch_;
00847 }
00848
00849 void setConstrainPitch(bool s) {
00850 constrain_pitch_ = s;
00851 }
00852
00853 bool getConstrainYaw() const {
00854 return constrain_yaw_;
00855 }
00856
00857 void setConstrainYaw(bool s) {
00858 constrain_yaw_ = s;
00859 }
00860
00861 double getRollTolerance() const {
00862 return roll_tolerance_;
00863 }
00864
00865 void setRollTolerance(double s) {
00866 roll_tolerance_ = s;
00867 }
00868
00869 double getPitchTolerance() const {
00870 return pitch_tolerance_;
00871 }
00872
00873 void setPitchTolerance(double s) {
00874 pitch_tolerance_ = s;
00875 }
00876
00877 double getYawTolerance() const {
00878 return yaw_tolerance_;
00879 }
00880
00881 void setYawTolerance(double s) {
00882 yaw_tolerance_ = s;
00883 }
00884
00885 void setGoalAndPathPositionOrientationConstraints(arm_navigation_msgs::MotionPlanRequest& mpr,
00886 planning_scene_utils::PositionType type) const;
00887
00889 void updateCollisionMarkers(planning_environment::CollisionModels* cm_,
00890 ros::ServiceClient* distance_state_validity_service_client_);
00891 };
00892
00893
00899 class TrajectoryData
00900 {
00901 public:
00902
00903 enum MarkerType {
00904 VISUAL,
00905 COLLISION,
00906 PADDED
00907 };
00908
00909 protected:
00910 std::string name_;
00911 unsigned int id_;
00912 std::string source_;
00913 std::string group_name_;
00914 unsigned int planning_scene_id_;
00915 unsigned int motion_plan_request_Id_;
00916 trajectory_msgs::JointTrajectory trajectory_;
00917 trajectory_msgs::JointTrajectory trajectory_error_;
00918 bool is_visible_;
00919 MarkerType marker_type_;
00920 bool is_playing_;
00921 ros::Time playback_start_time_;
00922 bool collisions_visible_;
00923 bool state_changed_;
00924 std_msgs::ColorRGBA color_;
00925 unsigned int current_trajectory_point_;
00926 unsigned int trajectory_bad_point_;
00927 planning_models::KinematicState* current_state_;
00928 ros::Duration duration_;
00929 bool should_refresh_colors_;
00930 bool has_refreshed_colors_;
00931 visualization_msgs::MarkerArray collision_markers_;
00932 RenderType render_type_;
00933 TrajectoryRenderType trajectory_render_type_;
00934 ros::Duration time_to_stop_;
00935 public:
00936
00938 ros::Duration refresh_timer_;
00939
00941 arm_navigation_msgs::ArmNavigationErrorCodes trajectory_error_code_;
00942
00943 TrajectoryData();
00944 TrajectoryData(const unsigned int& id, const std::string& source, const std::string& group_name,
00945 const trajectory_msgs::JointTrajectory& trajectory);
00946 TrajectoryData(const unsigned int& id, const std::string& source, const std::string& group_name,
00947 const trajectory_msgs::JointTrajectory& trajectory, const trajectory_msgs::JointTrajectory& trajectory_error);
00948
00951 void advanceThroughTrajectory(int amount);
00952
00955 void advanceToNextClosestPoint(ros::Time time);
00956
00958 void updateCurrentState();
00959
00961 inline bool hasStateChanged() const
00962 {
00963 return state_changed_;
00964 }
00965
00967 inline void setStateChanged(bool changed)
00968 {
00969 state_changed_ = changed;
00970 }
00971
00973 inline visualization_msgs::MarkerArray& getCollisionMarkers()
00974 {
00975 return collision_markers_;
00976 }
00977
00979 inline bool areCollisionsVisible() const
00980 {
00981 return collisions_visible_;
00982 }
00983
00985 inline void setCollisionsVisible(bool shown)
00986 {
00987 collisions_visible_ = shown;
00988 }
00989
00991 inline void showCollisions()
00992 {
00993 setCollisionsVisible(true);
00994 }
00995
00997 inline void hideCollisions()
00998 {
00999 setCollisionsVisible(false);
01000 }
01001
01003 inline size_t getTrajectorySize() const
01004 {
01005 return trajectory_.points.size();
01006 }
01007
01009 inline bool shouldRefreshColors() const
01010 {
01011 return should_refresh_colors_;
01012 }
01013
01015 inline bool hasRefreshedColors() const
01016 {
01017 return has_refreshed_colors_;
01018 }
01019
01021 inline void setHasRefreshedColors(bool refresh)
01022 {
01023 has_refreshed_colors_ = refresh;
01024
01025 if(refresh)
01026 {
01027 should_refresh_colors_ = false;
01028 }
01029 }
01030
01033 inline void refreshColors()
01034 {
01035 should_refresh_colors_ = true;
01036 has_refreshed_colors_ = false;
01037 refresh_timer_ = ros::Duration(0.0);
01038 }
01039
01041 inline RenderType getRenderType() const
01042 {
01043 return render_type_;
01044 }
01045
01047 inline void setRenderType(RenderType renderType)
01048 {
01049 render_type_ = renderType;
01050 }
01051
01053 inline TrajectoryRenderType getTrajectoryRenderType() const
01054 {
01055 return trajectory_render_type_;
01056 }
01057
01059 inline void setTrajectoryRenderType(TrajectoryRenderType renderType)
01060 {
01061 trajectory_render_type_ = renderType;
01062 }
01063
01065 inline void reset()
01066 {
01067
01068 if(current_state_ != NULL)
01069 {
01070 delete current_state_;
01071 current_state_ = NULL;
01072 }
01073
01074 is_playing_ = false;
01075 is_visible_ = false;
01076 current_trajectory_point_ = 0;
01077 state_changed_ = false;
01078 }
01079
01082 inline planning_models::KinematicState* getCurrentState()
01083 {
01084 return current_state_;
01085 }
01086
01088 inline void setCurrentState(planning_models::KinematicState* state)
01089 {
01090 current_state_ = state;
01091 state_changed_ = true;
01092 }
01093
01095 inline void setMotionPlanRequestId(const unsigned int& Id)
01096 {
01097 motion_plan_request_Id_ = Id;
01098 }
01099
01101 inline const unsigned int& getMotionPlanRequestId() const
01102 {
01103 return motion_plan_request_Id_;
01104 }
01105
01106 inline void setPlanningSceneId(const unsigned int id) {
01107 planning_scene_id_ = id;
01108 }
01109
01110 unsigned int getPlanningScendId() const {
01111 return planning_scene_id_;
01112 }
01113
01115 inline void setCurrentPoint(unsigned int point)
01116 {
01117 current_trajectory_point_ = point;
01118 state_changed_ = true;
01119 }
01120
01122 inline unsigned int getCurrentPoint() const
01123 {
01124 return current_trajectory_point_;
01125 }
01126
01128 inline unsigned int getBadPoint() const
01129 {
01130 return trajectory_bad_point_;
01131 }
01132
01134 inline void setGroupname(const std::string& group_name)
01135 {
01136 group_name_ = group_name;
01137 }
01138
01140 inline bool isPlaying() const
01141 {
01142 return is_playing_;
01143 }
01144
01146 inline void play()
01147 {
01148 is_playing_ = true;
01149 playback_start_time_ = ros::Time::now();
01150 }
01151
01153 inline void stop()
01154 {
01155 is_playing_ = false;
01156 }
01157
01159 inline bool isVisible() const
01160 {
01161 return is_visible_;
01162 }
01163
01165 inline void setVisible(bool visible)
01166 {
01167 is_visible_ = visible;
01168 }
01169
01170 inline MarkerType getMarkerType() const
01171 {
01172 return marker_type_;
01173 }
01174
01176 inline void setMarkerType(MarkerType mt)
01177 {
01178 marker_type_ = mt;
01179 }
01180
01182 inline void show()
01183 {
01184 setVisible(true);
01185 }
01186
01188 inline void hide()
01189 {
01190 setVisible(false);
01191 }
01192
01195 inline const ros::Duration& getDuration() const
01196 {
01197 return duration_;
01198 }
01199
01201 inline void setDuration(const ros::Duration& duration)
01202 {
01203 duration_ = duration;
01204 }
01205
01207 inline const std_msgs::ColorRGBA& getColor() const
01208 {
01209 return color_;
01210 }
01211
01213 inline void setColor(const std_msgs::ColorRGBA& color)
01214 {
01215 color_ = color;
01216 }
01217
01219 inline std::string getSource()
01220 {
01221 return source_;
01222 }
01223
01225 inline trajectory_msgs::JointTrajectory& getTrajectory()
01226 {
01227 return trajectory_;
01228 }
01229
01231 inline void setSource(const std::string& source)
01232 {
01233 source_ = source;
01234 }
01235
01237 inline void setTrajectory(const trajectory_msgs::JointTrajectory& trajectory)
01238 {
01239 trajectory_ = trajectory;
01240 }
01241
01243 inline trajectory_msgs::JointTrajectory& getTrajectoryError()
01244 {
01245 return trajectory_error_;
01246 }
01247
01249 inline void setTrajectoryError(const trajectory_msgs::JointTrajectory& trajectory_error)
01250 {
01251 trajectory_error_ = trajectory_error;
01252 }
01253
01255 inline unsigned int getId() const
01256 {
01257 return id_;
01258 }
01259
01261 inline void setId(const unsigned int& id)
01262 {
01263 id_ = id;
01264 name_ = getTrajectoryNameFromId(id_);
01265 }
01266
01267 const std::string& getName() const {
01268 return name_;
01269 }
01270
01272 inline const std::string& getGroupName() const
01273 {
01274 return group_name_;
01275 }
01276
01278 inline void setBadPoint(unsigned int point)
01279 {
01280 trajectory_bad_point_ = point;
01281 }
01282
01284 inline void setGroupName(std::string name)
01285 {
01286 group_name_ = name;
01287 }
01288
01291 void updateCollisionMarkers(planning_environment::CollisionModels* cm_, MotionPlanRequestData& motionPlanRequest,
01292 ros::ServiceClient* distance_state_validity_service_client_);
01293 };
01294
01300 struct PlanningSceneParameters
01301 {
01302 std::string left_ik_name_;
01303 std::string right_ik_name_;
01304 std::string non_coll_left_ik_name_;
01305 std::string non_coll_right_ik_name_;
01306 std::string left_interpolate_service_name_;
01307 std::string right_interpolate_service_name_;
01308 std::string planner_1_service_name_;
01309 std::string planner_2_service_name_;
01310 std::string proximity_space_service_name_;
01311 std::string proximity_space_validity_name_;
01312 std::string set_planning_scene_diff_name_;
01313 std::string trajectory_filter_1_service_name_;
01314 std::string trajectory_filter_2_service_name_;
01315 std::string proximity_space_planner_name_;
01316 std::string vis_topic_name_;
01317 std::string right_ik_link_;
01318 std::string left_ik_link_;
01319 std::string left_redundancy_;
01320 std::string right_redundancy_;
01321 std::string right_arm_group_;
01322 std::string left_arm_group_;
01323 std::string execute_left_trajectory_;
01324 std::string execute_right_trajectory_;
01325 std::string list_controllers_service_;
01326 std::string unload_controllers_service_;
01327 std::string load_controllers_service_;
01328 std::string switch_controllers_service_;
01329 std::string gazebo_model_name_;
01330 std::string robot_description_param_;
01331 bool use_robot_data_;
01332 bool sync_robot_state_with_gazebo_;
01333 };
01334
01339 class PlanningSceneEditor
01340 {
01341 public:
01346 enum GeneratedShape
01347 {
01348 Box, Cylinder, Sphere
01349 };
01350 protected:
01351
01360 enum MonitorStatus
01361 {
01362 idle, Executing, WaitingForStop, Done
01363 };
01364
01373 struct StateRegistry
01374 {
01375 planning_models::KinematicState* state;
01376 std::string source;
01377 };
01378
01384 struct SelectableObject
01385 {
01386 SelectableObject() {
01387 attach_ = false;
01388 detach_ = false;
01389 attached_collision_object_.object.operation.operation = arm_navigation_msgs::CollisionObjectOperation::REMOVE;
01390 collision_object_.operation.operation = arm_navigation_msgs::CollisionObjectOperation::REMOVE;
01391 }
01392
01393 bool attach_;
01394 bool detach_;
01395 arm_navigation_msgs::AttachedCollisionObject attached_collision_object_;
01396 arm_navigation_msgs::CollisionObject collision_object_;
01397 visualization_msgs::InteractiveMarker selection_marker_;
01398 visualization_msgs::InteractiveMarker control_marker_;
01399 std_msgs::ColorRGBA color_;
01400
01401 std::string id_;
01402 };
01403
01409 struct IKController
01410 {
01411 unsigned int motion_plan_id_;
01412 visualization_msgs::InteractiveMarker start_controller_;
01413 visualization_msgs::InteractiveMarker end_controller_;
01414 };
01415
01420 virtual void updateState()
01421 {
01422 }
01423
01428 virtual void planCallback(arm_navigation_msgs::ArmNavigationErrorCodes& errorCode) = 0;
01429
01434 virtual void filterCallback(arm_navigation_msgs::ArmNavigationErrorCodes& errorCode) = 0;
01435
01436 virtual void attachObjectCallback(const std::string& name) = 0;
01437
01438
01439 void changeToAttached(const std::string& name);
01440
01446 virtual void selectedTrajectoryCurrentPointChanged( unsigned int new_current_point ) {}
01447
01448 boost::recursive_mutex lock_scene_;
01449 arm_navigation_msgs::ArmNavigationErrorCodes last_collision_set_error_code_;
01450 move_arm_warehouse::MoveArmWarehouseLoggerReader* move_arm_warehouse_logger_reader_;
01451 planning_environment::CollisionModels* cm_;
01452 planning_models::KinematicState* robot_state_;
01453 PlanningSceneParameters params_;
01454 ros::NodeHandle nh_;
01455 ros::Publisher clock_publisher_;
01456 ros::Publisher joint_state_publisher_;
01457 ros::Publisher vis_marker_array_publisher_;
01458 ros::Publisher vis_marker_publisher_;
01459 ros::Subscriber joint_state_subscriber_;
01460 ros::Subscriber r_arm_controller_state_subscriber_;
01461 ros::Subscriber l_arm_controller_state_subscriber_;
01462 ros::ServiceClient collision_proximity_planner_client_;
01463 ros::ServiceClient distance_aware_service_client_;
01464 ros::ServiceClient distance_state_validity_service_client_;
01465 ros::ServiceClient set_planning_scene_diff_client_;
01466 ros::ServiceClient left_ik_service_client_;
01467 ros::ServiceClient left_interpolate_service_client_;
01468 ros::ServiceClient non_coll_left_ik_service_client_;
01469 ros::ServiceClient non_coll_right_ik_service_client_;
01470 ros::ServiceClient planning_1_service_client_;
01471 ros::ServiceClient planning_2_service_client_;
01472 ros::ServiceClient right_ik_service_client_;
01473 ros::ServiceClient right_interpolate_service_client_;
01474 ros::ServiceClient trajectory_filter_1_service_client_;
01475 ros::ServiceClient trajectory_filter_2_service_client_;
01476 ros::ServiceClient gazebo_joint_state_client_;
01477 ros::ServiceClient list_controllers_client_;
01478 ros::ServiceClient load_controllers_client_;
01479 ros::ServiceClient unload_controllers_client_;
01480 ros::ServiceClient switch_controllers_client_;
01481 ros::ServiceClient pause_gazebo_client_;
01482 ros::ServiceClient unpause_gazebo_client_;
01483 ros::ServiceClient set_link_properties_client_;
01484 ros::ServiceClient get_link_properties_client_;
01485
01486 std::map<std::string, double> robot_state_joint_values_;
01487 std::vector<ros::Time> last_creation_time_query_;
01488 tf::TransformBroadcaster transform_broadcaster_;
01489 tf::TransformListener transform_listener_;
01490 std::map<std::string, actionlib::SimpleActionClient<control_msgs::FollowJointTrajectoryAction>*> arm_controller_map_;
01491 unsigned int max_trajectory_id_;
01492 unsigned int max_collision_object_id_;
01493
01494 bool warehouse_data_loaded_once_;
01495 int active_planner_index_;
01496 bool use_primary_filter_;
01497
01498 trajectory_msgs::JointTrajectory logged_trajectory_;
01499 trajectory_msgs::JointTrajectory logged_trajectory_controller_error_;
01500 ros::Time logged_trajectory_start_time_;
01501 int logged_trajectory_controller_error_code_;
01502
01503 bool send_collision_markers_;
01504 std::string collision_marker_state_;
01505 visualization_msgs::MarkerArray collision_markers_;
01506 planning_models::KinematicState* paused_collision_state_;
01507 std_msgs::ColorRGBA point_color_;
01508 std::vector<geometry_msgs::TransformStamped> robot_transforms_;
01509
01510 interactive_markers::MenuHandler::FeedbackCallback attached_collision_object_feedback_ptr_;
01511 interactive_markers::MenuHandler::FeedbackCallback collision_object_selection_feedback_ptr_;
01512 interactive_markers::MenuHandler::FeedbackCallback collision_object_movement_feedback_ptr_;
01513 interactive_markers::MenuHandler::FeedbackCallback ik_control_feedback_ptr_;
01514 interactive_markers::MenuHandler::FeedbackCallback joint_control_feedback_ptr_;
01515
01516 interactive_markers::InteractiveMarkerServer* interactive_marker_server_;
01517
01518 std::map<std::string, SelectableObject>* selectable_objects_;
01519 std::map<std::string, IKController>* ik_controllers_;
01520
01521 std::string current_planning_scene_name_;
01522 std::string selected_motion_plan_name_;
01523 std::string selected_trajectory_name_;
01524 std::string logged_group_name_;
01525 std::string logged_motion_plan_request_;
01526 std::map<std::string, MenuEntryMap> menu_entry_maps_;
01527 MenuHandlerMap menu_handler_map_;
01528
01529 std::map<std::string, ros::ServiceClient*>* collision_aware_ik_services_;
01530 std::map<std::string, ros::ServiceClient*>* non_collision_aware_ik_services_;
01531 std::map<std::string, ros::ServiceClient*>* interpolated_ik_services_;
01532 std::map<std::string, arm_navigation_msgs::ArmNavigationErrorCodes> error_map_;
01533 std::vector<StateRegistry> states_;
01534
01535 interactive_markers::MenuHandler::EntryHandle last_resize_handle_;
01536
01537 std_msgs::ColorRGBA last_collision_object_color_;
01538 std_msgs::ColorRGBA last_mesh_object_color_;
01539
01540 MonitorStatus monitor_status_;
01541 ros::Time time_of_controller_done_callback_;
01542 ros::Time time_of_last_moving_notification_;
01543
01544 ros::Time last_marker_start_time_;
01545 ros::Duration marker_dt_;
01546
01547 void attachCollisionObject(const std::string& name,
01548 const std::string& link_name,
01549 const std::vector<std::string>& touch_links);
01550
01554 void createSelectableMarkerFromCollisionObject(arm_navigation_msgs::CollisionObject& object, std::string name,
01555 std::string description, std_msgs::ColorRGBA color, bool insert_selectable=true);
01556
01557
01558
01559 public:
01560
01562 std::map<std::string, PlanningSceneData> planning_scene_map_;
01563
01565 std::map<std::string, std::map<std::string, TrajectoryData> > trajectory_map_;
01566
01568 std::map<std::string, MotionPlanRequestData> motion_plan_map_;
01569
01571 std::map<std::string, bool> joint_clicked_map_;
01572
01574 std::map<std::string, tf::Transform> joint_prev_transform_map_;
01575
01576 PlanningSceneEditor();
01577 PlanningSceneEditor(PlanningSceneParameters& params);
01578 ~PlanningSceneEditor();
01579
01587 bool filterTrajectory(MotionPlanRequestData& requestData, TrajectoryData& trajectory, unsigned int& filter_id);
01588
01597 bool getAllAssociatedMotionPlanRequests(const unsigned int id,
01598 std::vector<unsigned int>& ids,
01599 std::vector<std::string>& stages,
01600 std::vector<arm_navigation_msgs::MotionPlanRequest>& requests);
01601
01608 bool getAllAssociatedPausedStates(const unsigned int id,
01609 std::vector<ros::Time>& paused_times);
01610
01617 bool getAllAssociatedTrajectorySources(const unsigned int planning_id,
01618 const unsigned int mpr_id,
01619 std::vector<unsigned int>& trajectory_ids,
01620 std::vector<std::string>& trajectory_sources);
01621
01627 bool getAllPlanningSceneTimes(std::vector<ros::Time>& planning_scene_times,
01628 std::vector<unsigned int>& planning_scene_ids);
01629
01630
01640 bool getMotionPlanRequest(const ros::Time& time, const std::string& stage,
01641 arm_navigation_msgs::MotionPlanRequest& mpr, std::string& id,
01642 std::string& planning_scene_id);
01643
01651 bool getPausedState(const unsigned int id,
01652 const ros::Time& paused_time,
01653 head_monitor_msgs::HeadMonitorFeedback& paused_state);
01654
01663 bool getPlanningSceneOutcomes(const unsigned int id,
01664 std::vector<std::string>& pipeline_stages,
01665 std::vector<arm_navigation_msgs::ArmNavigationErrorCodes>& error_codes,
01666 std::map<std::string, arm_navigation_msgs::ArmNavigationErrorCodes>& error_map);
01667
01668
01675 bool loadPlanningScene(const ros::Time& time,
01676 const unsigned int id);
01677
01688 bool planToKinematicState(const planning_models::KinematicState& state, const std::string& group_name,
01689 const std::string& end_effector_name, unsigned int& trajectoryid_Out,
01690 unsigned int& planning_scene_id);
01691
01698 bool planToRequest(MotionPlanRequestData& data, unsigned int& trajectoryid_Out);
01699
01706 bool planToRequest(const std::string& requestid, unsigned int& trajectoryid_Out);
01707
01714 bool playTrajectory(MotionPlanRequestData& requestData, TrajectoryData& data);
01715
01721 bool sendPlanningScene(PlanningSceneData& data);
01722
01733 bool solveIKForEndEffectorPose(MotionPlanRequestData& mpr, PositionType type, bool coll_aware = true,
01734 double change_redundancy = 0.0);
01735
01736
01744 interactive_markers::MenuHandler::EntryHandle registerMenuEntry(std::string menu, std::string entryName,
01745 interactive_markers::MenuHandler::FeedbackCallback& callback);
01746
01747
01748
01757 interactive_markers::MenuHandler::EntryHandle registerSubMenuEntry(std::string menu, std::string name,
01758 std::string subMenu,
01759 interactive_markers::MenuHandler::FeedbackCallback& callback);
01760
01765 std::string createNewPlanningScene();
01766
01773 virtual void onPlanningSceneLoaded(int scene, int numScenes)
01774 {
01775 }
01776
01781 void collisionObjectMovementCallback(const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback);
01782
01787 void collisionObjectSelectionCallback(const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback);
01788
01789 void attachedCollisionObjectInteractiveCallback(const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback);
01790
01801 std::string createCollisionObject(const std::string& name, geometry_msgs::Pose pose, GeneratedShape shape, float scaleX, float scaleY,
01802 float scaleZ, std_msgs::ColorRGBA color);
01803
01804 std::string createMeshObject(const std::string& name,
01805 geometry_msgs::Pose pose,
01806 const std::string& filename,
01807 const tf::Vector3& scale,
01808 std_msgs::ColorRGBA color);
01815 void createIKController(MotionPlanRequestData& data, PositionType type, bool rePose = true);
01816
01823 void createIkControllersFromMotionPlanRequest(MotionPlanRequestData& data, bool rePose = true);
01824
01830 void createJointMarkers(MotionPlanRequestData& data, planning_scene_utils::PositionType position);
01831
01832
01844 void createMotionPlanRequest(const planning_models::KinematicState& start_state,
01845 const planning_models::KinematicState& end_state,
01846 const std::string& group_name,
01847 const std::string& end_effector_name,
01848 const unsigned int& planning_scene_name,
01849 const bool fromRobotState,
01850 unsigned int& motionPlan_id_Out);
01851
01852
01860 void initMotionPlanRequestData(const unsigned int& planning_scene_id,
01861 const std::vector<unsigned int>& ids,
01862 const std::vector<std::string>& stages,
01863 const std::vector<arm_navigation_msgs::MotionPlanRequest>& requests);
01864
01865
01871 void deleteJointMarkers(MotionPlanRequestData& data, PositionType type);
01872
01877 void deleteKinematicStates();
01878
01883 void deleteMotionPlanRequest(const unsigned int& id,
01884 std::vector<unsigned int>& erased_trajectories);
01885
01890 void deleteTrajectory(unsigned int mpr_id, unsigned int traj_id);
01891
01892
01900
01901
01902
01903
01904
01909 void executeTrajectory(const std::string& mpr_name, const std::string& traj_name);
01910
01915 void executeTrajectory(TrajectoryData& data);
01916
01923 void getAllRobotStampedTransforms(const planning_models::KinematicState& state,
01924 std::vector<geometry_msgs::TransformStamped>& trans_vector, const ros::Time& stamp);
01925
01930 void getMotionPlanningMarkers(visualization_msgs::MarkerArray& arr);
01931
01936 void getTrajectoryMarkers(visualization_msgs::MarkerArray& arr);
01937
01942 void IKControllerCallback(const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback);
01943
01948 void JointControllerCallback(const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback);
01949
01955 void controllerDoneCallback(const actionlib::SimpleClientGoalState& state,
01956 const control_msgs::FollowJointTrajectoryResultConstPtr& result);
01957
01961 void armHasStoppedMoving();
01962
01967 void jointStateCallback(const sensor_msgs::JointStateConstPtr& joint_state);
01968
01973 void jointTrajectoryControllerStateCallback(const pr2_controllers_msgs::JointTrajectoryControllerStateConstPtr& joint_state);
01974
01975
01979 void loadAllWarehouseData();
01980
01990 void makeInteractive1DOFRotationMarker(tf::Transform transform, tf::Vector3 axis, std::string name, std::string description,
01991 float scale = 1.0f, float angle = 0.0f);
01992
02002 void makeInteractive1DOFTranslationMarker(tf::Transform transform, tf::Vector3 axis, std::string name, std::string description,
02003 float scale = 1.0f, float value = 0.0f);
02004
02008 void printTrajectoryPoint(const std::vector<std::string>& joint_names, const std::vector<double>& joint_values);
02009
02015 void randomlyPerturb(MotionPlanRequestData& mpr, PositionType type);
02016
02021 void savePlanningScene(PlanningSceneData& data, bool copy = false);
02022
02026 void sendMarkers();
02027
02031 void sendTransformsAndClock();
02032
02033 void makeSelectableAttachedObjectFromPlanningScene(const arm_navigation_msgs::PlanningScene& scene,
02034 arm_navigation_msgs::AttachedCollisionObject& att);
02035
02042 void setCurrentPlanningScene(std::string id, bool loadRequests = true, bool loadTrajectories = true);
02043
02050 void setIKControlsVisible(std::string id, PositionType type, bool visible);
02051
02060 void setJointState(MotionPlanRequestData& data, PositionType position, std::string& jointName, tf::Transform value);
02061
02066 void updateJointStates();
02067
02068 bool hasTrajectory(const std::string& mpr_name,
02069 const std::string& traj_name) const;
02070
02075 inline std::string generateNewCollisionObjectId()
02076 {
02077 std::stringstream stream;
02078 stream << "collision_object_";
02079 max_collision_object_id_++;
02080 stream << max_collision_object_id_;
02081 return stream.str();
02082 }
02083
02088 inline unsigned int generateNewPlanningSceneId()
02089 {
02090 return move_arm_warehouse_logger_reader_->determineNextPlanningSceneId();
02091 }
02092
02093
02098 void deleteCollisionObject(std::string& name);
02099
02100
02101 inline void lockScene()
02102 {
02103 lock_scene_.lock();
02104 }
02105
02106 inline void unlockScene()
02107 {
02108 lock_scene_.unlock();
02109 }
02110
02111 inline planning_environment::CollisionModels* getCollisionModel()
02112 {
02113 return cm_;
02114 }
02115
02116 inline void setCollisionModel(planning_environment::CollisionModels* model, bool shouldDelete = false)
02117 {
02118 if(shouldDelete && cm_ != NULL)
02119 {
02120 delete cm_;
02121 cm_ = model;
02122 }
02123 cm_ = model;
02124 }
02125
02126 inline planning_models::KinematicState* getRobotState()
02127 {
02128 return robot_state_;
02129 }
02130
02131 inline void setRobotState(planning_models::KinematicState* robot_state, bool shouldDelete = true)
02132 {
02133 if(shouldDelete && robot_state_ != NULL)
02134 {
02135 delete robot_state_;
02136 robot_state_ = NULL;
02137 }
02138
02139 robot_state_ = robot_state;
02140 }
02141
02142 inline move_arm_warehouse::MoveArmWarehouseLoggerReader* getLoggerReader()
02143 {
02144 return move_arm_warehouse_logger_reader_;
02145 }
02146
02147 inline void setLoggerReader(move_arm_warehouse::MoveArmWarehouseLoggerReader* loggerReader,
02148 bool shouldDelete = true)
02149 {
02150 if(move_arm_warehouse_logger_reader_ != NULL)
02151 {
02152 delete move_arm_warehouse_logger_reader_;
02153 move_arm_warehouse_logger_reader_ = NULL;
02154 }
02155
02156 move_arm_warehouse_logger_reader_ = loggerReader;
02157 }
02158 };
02159
02160 }
02161 #endif