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 #include <cstdio>
00034 #include <cstdlib>
00035 #include <unistd.h>
00036 #include <math.h>
00037 
00038 #include <ros/ros.h>
00039 #include <sensor_msgs/Joy.h>
00040 
00041 #include <sensor_msgs/JointState.h>
00042 #include <pr2_msgs/SetPeriodicCmd.h>
00043 #include <geometry_msgs/Pose.h>
00044 #include <urdf/model.h>
00045 #include <actionlib/client/simple_action_client.h>
00046 #include <pr2_controllers_msgs/PointHeadAction.h>
00047 #include <pr2_controllers_msgs/Pr2GripperCommandAction.h>
00048 #include <pr2_controllers_msgs/JointTrajectoryAction.h>
00049 #include <pr2_common_action_msgs/TuckArmsAction.h>
00050 #include <pr2_msgs/PowerBoardState.h>
00051 
00052 static const std::string default_arm_controller_name="arm_controller";
00053 
00054 class GeneralCommander {
00055 
00056 public:
00057 
00058   enum WhichArm {
00059     ARMS_LEFT,
00060     ARMS_RIGHT,
00061     ARMS_BOTH
00062   };
00063 
00064   enum ArmControlMode{
00065     ARM_NO_CONTROLLER,
00066     ARM_MANNEQUIN_MODE,
00067     ARM_POSITION_CONTROL
00068   };
00069 
00070   enum HeadControlMode {
00071     HEAD_JOYSTICK,
00072     HEAD_TRACK_LEFT_HAND,
00073     HEAD_TRACK_RIGHT_HAND,
00074     HEAD_MANNEQUIN
00075   };
00076 
00077   enum LaserControlMode {
00078     LASER_TILT_OFF,
00079     LASER_TILT_SLOW,
00080     LASER_TILT_FAST
00081   };
00082 
00083   enum HeadSequence {
00084     HEAD_NOD,
00085     HEAD_SHAKE
00086   };
00087 
00088 public:
00089 
00090   GeneralCommander(bool control_body,
00091                    bool control_head,
00092                    bool control_rarm,
00093                    bool control_larm,
00094                    bool control_prosilica,
00095                    std::string arm_controller_name=default_arm_controller_name); 
00096 
00097   ~GeneralCommander();
00098   
00099   void setLaserMode(LaserControlMode mode);
00100 
00101   void setHeadMode(HeadControlMode mode);
00102 
00103   void setArmMode(WhichArm which, ArmControlMode mode);
00104 
00105   LaserControlMode getLaserMode();
00106   
00107   HeadControlMode getHeadMode();
00108 
00109   
00110   ArmControlMode getArmMode(WhichArm which);
00111 
00112   void sendHeadCommand(double req_pan, double req_tilt);
00113 
00114   void sendProjectorStartStop(bool start);
00115 
00116   void sendGripperCommand(WhichArm which, bool close);
00117 
00118   void sendHeadTrackCommand();
00119 
00120   void sendTorsoCommand(double pos, double vel);
00121 
00122   void sendBaseCommand(double vx, double vy, double vw);
00123 
00124   void switchControllers(const std::vector<std::string>& start_controllers, const std::vector<std::string>& stop_controllers);
00125 
00126   void sendWristVelCommands(double right_wrist_vel, double left_wrist_vel, double hz);
00127 
00128   bool getJointPosition(const std::string& name, double& pos) const;
00129   bool getJointVelocity(const std::string& name, double& vel) const;
00130 
00131   void updateCurrentWristPositions();
00132 
00133   void sendArmVelCommands(double r_x_vel, double r_y_vel, double r_z_vel, double r_pitch_vel, double r_roll_vel,
00134                           double l_x_vel, double l_y_vel, double l_z_vel, double l_pitch_vel, double l_roll_vel,
00135                           double hz);
00136 
00137   bool moveToWalkAlongArmPose();
00138 
00139   void sendWalkAlongCommand(double thresh, 
00140                             double x_dist_max, double x_speed_scale,
00141                             double y_dist_max, double y_speed_scale,
00142                             double rot_scale);
00143 
00144   void sendHeadSequence(HeadSequence seq);
00145 
00146   void requestProsilicaImage(std::string ns);
00147 
00148   bool initWalkAlong();
00149 
00150   void tuckArms(WhichArm arm);
00151   void untuckArms(WhichArm arm);
00152 
00153   bool isWalkAlongOk() {
00154     return walk_along_ok_;
00155   }
00156 
00157   void turnOffWalkAlong() {
00158     walk_along_ok_ = false;
00159   }
00160 
00161 private:
00162 
00163   geometry_msgs::Pose getPositionFromJointsPose(ros::ServiceClient& service_client,                                             
00164                                                 std::string fk_link,
00165                                                 const std::vector<std::string>& joint_names, const std::vector<double>& joint_pos);
00166   
00167   void updateWalkAlongAverages();
00168 
00169   void jointStateCallback(const sensor_msgs::JointStateConstPtr &jointState);
00170 
00171   void powerBoardCallback(const pr2_msgs::PowerBoardStateConstPtr &powerBoardState);
00172 
00173   void composeWristRotGoal(const std::string pref, pr2_controllers_msgs::JointTrajectoryGoal& goal, 
00174                            std::vector<double>& des_joints, double des_vel, double hz) const;
00175 
00176   void clampDesiredArmPositionsToActual(double max_dist);
00177 
00178   double calcAverage(const std::list<double>& av_list) const; 
00179 
00180   void unnormalizeTrajectory(trajectory_msgs::JointTrajectory& traj) const;
00181 
00182   ros::NodeHandle n_;
00183 
00184   bool control_body_;
00185   bool control_head_;
00186   bool control_rarm_;
00187   bool control_larm_;
00188   bool control_prosilica_;
00189   
00190   double laser_slow_period_;
00191   double laser_slow_amplitude_;
00192   double laser_slow_offset_;
00193 
00194   double laser_fast_period_;
00195   double laser_fast_amplitude_;
00196   double laser_fast_offset_;
00197 
00198   std::string r_arm_controller_name_;
00199   std::string l_arm_controller_name_;
00200 
00201   std::map<std::string, double> joint_state_position_map_;
00202   std::map<std::string, double> joint_state_velocity_map_;
00203 
00204   geometry_msgs::Pose right_wrist_roll_pose_, left_wrist_roll_pose_;
00205   geometry_msgs::Pose des_r_wrist_roll_pose_, des_l_wrist_roll_pose_;
00206 
00207   geometry_msgs::Pose walk_along_left_des_pose_, walk_along_right_des_pose_;
00208   std::vector<double> right_walk_along_pose_, left_walk_along_pose_;
00209 
00210   std::vector<double> right_des_joint_states_, left_des_joint_states_;
00211 
00212   std::list<double> walk_rdx_vals_, walk_rdy_vals_, walk_ldx_vals_, walk_ldy_vals_;
00213   bool walk_along_ok_;
00214 
00215   trajectory_msgs::JointTrajectory head_nod_traj_, head_shake_traj_;
00216 
00217   ros::ServiceClient tilt_laser_service_;
00218   ros::ServiceClient switch_controllers_service_;
00219   ros::ServiceClient right_arm_kinematics_solver_client_;
00220   ros::ServiceClient right_arm_kinematics_forward_client_;
00221   ros::ServiceClient right_arm_kinematics_inverse_client_;
00222   ros::ServiceClient left_arm_kinematics_solver_client_;
00223   ros::ServiceClient left_arm_kinematics_forward_client_;
00224   ros::ServiceClient left_arm_kinematics_inverse_client_;
00225   ros::ServiceClient prosilica_polling_client_;
00226   ros::Publisher head_pub_;
00227   ros::Publisher torso_pub_;
00228   ros::Publisher base_pub_;
00229   ros::Publisher right_arm_traj_pub_;
00230   ros::Publisher left_arm_traj_pub_;
00231   ros::Subscriber joint_state_sub_;
00232   ros::Subscriber power_board_sub_;
00233 
00234   ros::Time last_right_wrist_goal_stamp_;  
00235   ros::Time last_left_wrist_goal_stamp_;
00236 
00237   double last_torso_vel_;
00238   
00240   urdf::Model robot_model_;
00242   bool robot_model_initialized_;
00243 
00244   bool status_projector_on;
00245   LaserControlMode laser_control_mode_;
00246   HeadControlMode head_control_mode_;
00247   ArmControlMode right_arm_control_mode_;
00248   ArmControlMode left_arm_control_mode_;
00249 
00250   actionlib::SimpleActionClient<pr2_controllers_msgs::PointHeadAction>* head_track_hand_client_;
00251   actionlib::SimpleActionClient<pr2_controllers_msgs::Pr2GripperCommandAction>* right_gripper_client_;
00252   actionlib::SimpleActionClient<pr2_controllers_msgs::Pr2GripperCommandAction>* left_gripper_client_;
00253   actionlib::SimpleActionClient<pr2_controllers_msgs::JointTrajectoryAction>* right_arm_trajectory_client_;
00254   actionlib::SimpleActionClient<pr2_controllers_msgs::JointTrajectoryAction>* left_arm_trajectory_client_;
00255   actionlib::SimpleActionClient<pr2_common_action_msgs::TuckArmsAction>* tuck_arms_client_;
00256 };