wam_dmp_tracker_driver_node.cpp
Go to the documentation of this file.
00001 #include "wam_dmp_tracker_driver_node.h"
00002 
00003 WamDmpTrackerDriverNode::WamDmpTrackerDriverNode(ros::NodeHandle &nh) : 
00004   iri_base_driver::IriBaseNodeDriver<WamDmpTrackerDriver>(nh),
00005   DMPTracker_client_("/estirabot/estirabot_controller/DMPTracker", true)
00006 {
00007   //init class attributes if necessary
00008   //this->loop_rate_ = 2;//in [Hz]
00009 
00010   // [init publishers]
00011   this->DMPTrackerNewGoal_publisher_ = this->public_node_handle_.advertise<trajectory_msgs::JointTrajectoryPoint>("DMPTracker_output", 1);
00012   
00013   // [init subscribers]
00014   this->pose_surface_subscriber_ = this->public_node_handle_.subscribe("pose_surface", 1, &WamDmpTrackerDriverNode::pose_surface_callback, this);
00015   
00016   // [init services]
00017   
00018   // [init clients]
00019   wamik_client_ = this->public_node_handle_.serviceClient<iri_wam_common_msgs::wamInverseKinematics>("DMP_ik");
00020   
00021   // [init action servers]
00022   
00023   // [init action clients]
00024 
00025 //Init the tracker and the robot  
00026     DMPTrackerMakeActionRequest();
00027 
00028   
00029 }
00030 
00031 void WamDmpTrackerDriverNode::mainNodeThread(void)
00032 {
00033   //lock access to driver if necessary
00034   this->driver_.lock();
00035 
00036   // [fill msg Header if necessary]
00037   //<publisher_name>.header.stamp = ros::Time::now();
00038   //<publisher_name>.header.frame_id = "<publisher_topic_name>";
00039 
00040   // [fill msg structures]
00041   //this->JointTrajectoryPoint_msg_.data = my_var;
00042   
00043   // [fill srv structure and make request to the server]
00044 
00045   
00046   // [fill action structure and make request to the action server]
00047  // DMPTrackerMakeActionRequest();
00048 
00049   // [publish messages]
00050 
00051   //unlock access to driver if previously blocked
00052   this->driver_.unlock();
00053 }
00054 
00055 /*  [subscriber callbacks] */
00056 void WamDmpTrackerDriverNode::pose_surface_callback(const geometry_msgs::PoseStamped::ConstPtr& msg) 
00057 { 
00058   /*
00059   tf::TransformListener listener; 
00060   tf::StampedTransform tcp_H_wam7;
00061   tf::StampedTransform tcp_H_wam7;
00062   
00063   ROS_INFO("WamDmpTrackerDriverNode::pose_surface_callback: New Message Received"); 
00064   
00065   try{
00066     ros::Time now = ros::Time::now();
00067     ros::Duration interval = ros::Duration(1.0);
00068     if(!listener.waitForTransform("camera_depth_optical_frame", "/estirabot_link_base", now, interval)){
00069         ROS_ERROR("Timeout while waiting for transform between frames camera_depth_optical_frame and /wam_tcp/ "); 
00070     }
00071     listener.lookupTransform("camera_depth_optical_frame", "/estirabot_link_base", now, tcp_H_wam7);
00072   }catch (tf::TransformException ex){
00073     ROS_ERROR("lookup transform error: %s", ex.what());
00074     return false;
00075   }
00076   
00077   
00078   tcp_H_wam7
00079   */
00080   //[fill srv structure and make request to the server]
00081   wamik_srv_.request.pose.header.frame_id = msg->header.frame_id;
00082   wamik_srv_.request.pose.pose = msg->pose;
00083   wamik_srv_.request.pose.pose.orientation.x =  0.635;
00084   wamik_srv_.request.pose.pose.orientation.y =  0.474;
00085   wamik_srv_.request.pose.pose.orientation.z =  0.415;
00086   wamik_srv_.request.pose.pose.orientation.w =  -0.445;
00087   ROS_INFO("WamDmpTrackerDriverNode:: Response: %f %f %f %f %f %f %f", 
00088                                                        wamik_srv_.request.pose.pose.position.x,
00089                                                        wamik_srv_.request.pose.pose.position.y,
00090                                                        wamik_srv_.request.pose.pose.position.z,
00091                                                        wamik_srv_.request.pose.pose.orientation.x,
00092                                                        wamik_srv_.request.pose.pose.orientation.y,
00093                                                        wamik_srv_.request.pose.pose.orientation.z,
00094                                                        wamik_srv_.request.pose.pose.orientation.w
00095           );
00096   ROS_INFO("WamDmpTrackerDriverNode:: Sending New Request!"); 
00097   if (wamik_client_.call(wamik_srv_)) 
00098   { 
00099     ROS_INFO("WamDmpTrackerDriverNode:: Response: %f %f %f %f %f %f %f", 
00100                                                        wamik_srv_.response.joints.position[0],
00101                                                        wamik_srv_.response.joints.position[1],
00102                                                        wamik_srv_.response.joints.position[2],
00103                                                        wamik_srv_.response.joints.position[3],
00104                                                        wamik_srv_.response.joints.position[4],
00105                                                        wamik_srv_.response.joints.position[5],
00106                                                        wamik_srv_.response.joints.position[6]
00107     ); 
00108     
00109     //JointTrajectoryPoint_msg_.positions[0]
00110 //    this->DMPTrackerNewGoal_publisher_.publish(this->JointTrajectoryPoint_msg_);
00111     trajectory_msgs::JointTrajectoryPoint new_joints;
00112     new_joints.positions.resize(7);
00113     for (size_t i=0;i<7;i++) 
00114       new_joints.positions[i] = wamik_srv_.response.joints.position[i];
00115     //this->DMPTrackerNewGoal_publisher_.publish(wamik_srv_.response.joints);
00116     this->DMPTrackerNewGoal_publisher_.publish(new_joints);
00117 
00118   } 
00119   else 
00120   { 
00121     ROS_INFO("WamDmpTrackerDriverNode:: Failed to Call Server on topic wamik "); 
00122   }
00123   
00124   
00125   
00126   //use appropiate mutex to shared variables if necessary 
00127   //this->driver_.lock(); 
00128   //this->pose_surface_mutex_.enter(); 
00129 
00130   
00131   
00132   //std::cout << msg->data << std::endl; 
00133 
00134   //unlock previously blocked shared variables 
00135   //this->driver_.unlock(); 
00136   //this->pose_surface_mutex_.exit(); 
00137 }
00138 
00139 /*  [service callbacks] */
00140 
00141 /*  [action callbacks] */
00142 void WamDmpTrackerDriverNode::DMPTrackerDone(const actionlib::SimpleClientGoalState& state,  const iri_wam_common_msgs::DMPTrackerResultConstPtr& result) 
00143 { 
00144   if( state.toString().compare("SUCCEEDED") == 0 ) 
00145     ROS_INFO("WamDmpTrackerDriverNode::DMPTrackerDone: Goal Achieved!"); 
00146   else 
00147     ROS_INFO("WamDmpTrackerDriverNode::DMPTrackerDone: %s", state.toString().c_str()); 
00148 
00149   //copy & work with requested result 
00150 } 
00151 
00152 void WamDmpTrackerDriverNode::DMPTrackerActive() 
00153 { 
00154   //ROS_INFO("WamDmpTrackerDriverNode::DMPTrackerActive: Goal just went active!"); 
00155 } 
00156 
00157 void WamDmpTrackerDriverNode::DMPTrackerFeedback(const iri_wam_common_msgs::DMPTrackerFeedbackConstPtr& feedback) 
00158 { 
00159   //ROS_INFO("WamDmpTrackerDriverNode::DMPTrackerFeedback: Got Feedback!"); 
00160 
00161   bool feedback_is_ok = true; 
00162 
00163   //analyze feedback 
00164   //my_var = feedback->var; 
00165 
00166   //if feedback is not what expected, cancel requested goal 
00167   if( !feedback_is_ok ) 
00168   { 
00169     DMPTracker_client_.cancelGoal(); 
00170     //ROS_INFO("WamDmpTrackerDriverNode::DMPTrackerFeedback: Cancelling Action!"); 
00171   } 
00172 }
00173 
00174 /*  [action requests] */
00175 void WamDmpTrackerDriverNode::DMPTrackerMakeActionRequest() 
00176 { 
00177   ROS_INFO("WamDmpTrackerDriverNode::DMPTrackerMakeActionRequest: Starting New Request!"); 
00178 
00179   //wait for the action server to start 
00180   //will wait for infinite time 
00181   DMPTracker_client_.waitForServer();  
00182   ROS_INFO("WamDmpTrackerDriverNode::DMPTrackerMakeActionRequest: Server is Available!"); 
00183 
00184   //send a goal to the action 
00185   //   rostopic pub /pose_surface geometry_msgs/PoseStamped "{header: {stamp:ow, frame_id: "camera_depth_optical_frame"},pose: {position: {x: 0, y: -0.35, z: 0.49}, orientation: {x: -0.374, y: -0.374, z: -0.54, w: 0.65}}}" 
00186   //DMPTracker_goal_.data = my_desired_goal;
00187     //DMPTracker_goal_.initial.positions.resize(7);   
00188     //DMPTracker_goal_.initial.positions[0] = -0.2; 
00189     //DMPTracker_goal_.initial.positions[1] = 0.0;
00190     //DMPTracker_goal_.initial.positions[2] = 0.0;
00191     //DMPTracker_goal_.initial.positions[3] = 2.2;
00192     //DMPTracker_goal_.initial.positions[4] = 0.0;
00193     //DMPTracker_goal_.initial.positions[5] = 0.0;
00194     //DMPTracker_goal_.initial.positions[6] = 0.0;
00195 
00196     //DMPTracker_goal_.goal.positions.resize(7); 
00197     //DMPTracker_goal_.goal.positions[0] = 0.2; 
00198     //DMPTracker_goal_.goal.positions[1] = 0.0;
00199     //DMPTracker_goal_.goal.positions[2] = 0.0;
00200     //DMPTracker_goal_.goal.positions[3] = 2.2;
00201     //DMPTracker_goal_.goal.positions[4] = 0.0;
00202     //DMPTracker_goal_.goal.positions[5] = 0.0;
00203     //DMPTracker_goal_.goal.positions[6] = 0.0;
00204     
00205     DMPTracker_goal_.initial.positions.resize(7);   
00206     DMPTracker_goal_.initial.positions[0] = 0.851;
00207     DMPTracker_goal_.initial.positions[1] = 1.33;
00208     DMPTracker_goal_.initial.positions[2] = -1.23;
00209     DMPTracker_goal_.initial.positions[3] = 2.18;
00210     DMPTracker_goal_.initial.positions[4] = 0.24;
00211     DMPTracker_goal_.initial.positions[5] = -1.37;
00212     DMPTracker_goal_.initial.positions[6] = 1.23;
00213 
00214     DMPTracker_goal_.goal.positions.resize(7); 
00215     DMPTracker_goal_.goal.positions[0] = 0.54;
00216     DMPTracker_goal_.goal.positions[1] = 1.56;
00217     DMPTracker_goal_.goal.positions[2] = -1.43;
00218     DMPTracker_goal_.goal.positions[3] = 1.63;
00219     DMPTracker_goal_.goal.positions[4] = 0.14;
00220     DMPTracker_goal_.goal.positions[5] = -1.16;
00221     DMPTracker_goal_.goal.positions[6] = 1.53;
00222     
00223   DMPTracker_client_.sendGoal(DMPTracker_goal_, 
00224               boost::bind(&WamDmpTrackerDriverNode::DMPTrackerDone,     this, _1, _2), 
00225               boost::bind(&WamDmpTrackerDriverNode::DMPTrackerActive,   this), 
00226               boost::bind(&WamDmpTrackerDriverNode::DMPTrackerFeedback, this, _1)); 
00227   ROS_INFO("WamDmpTrackerDriverNode::DMPTrackerMakeActionRequest: Goal Sent. Wait for Result!"); 
00228 }
00229 
00230 void WamDmpTrackerDriverNode::postNodeOpenHook(void)
00231 {
00232 }
00233 
00234 void WamDmpTrackerDriverNode::addNodeDiagnostics(void)
00235 {
00236 }
00237 
00238 void WamDmpTrackerDriverNode::addNodeOpenedTests(void)
00239 {
00240 }
00241 
00242 void WamDmpTrackerDriverNode::addNodeStoppedTests(void)
00243 {
00244 }
00245 
00246 void WamDmpTrackerDriverNode::addNodeRunningTests(void)
00247 {
00248 }
00249 
00250 void WamDmpTrackerDriverNode::reconfigureNodeHook(int level)
00251 {
00252 }
00253 
00254 WamDmpTrackerDriverNode::~WamDmpTrackerDriverNode(void)
00255 {
00256   // [free dynamic memory]
00257 }
00258 
00259 /* main function */
00260 int main(int argc,char *argv[])
00261 {
00262   return driver_base::main<WamDmpTrackerDriverNode>(argc, argv, "wam_dmp_tracker_driver_node");
00263 }


iri_wam_dmp_tracker
Author(s): galenya2
autogenerated on Fri Dec 6 2013 22:36:13