marker_val.cpp
Go to the documentation of this file.
00001 #include <ros/ros.h>
00002 #include <tf/transform_listener.h>
00003 #include <tf/transform_broadcaster.h>
00004 #include <geometry_msgs/PoseStamped.h>
00005 #include <std_msgs/String.h>
00006 #include <math.h>
00007 
00008 #define _USE_MATH_DEFINES
00009 #define WAITING_TIME 0.4f
00010 #define MAX_DIST 0.2f
00011 #define SEARCH_TIME_SEC 60
00012 #define RATE 20
00013 
00014 
00015 int main(int argc, char** argv){
00016   ros::init(argc, argv, "marker_validation");
00017   if(argc != 1){
00018     ROS_ERROR("Error in argument count");
00019   }
00020   
00021   std::string marker_tf_name, goal_tf_name, proj_tf_frame;
00022   double dist_z;
00023  
00024   ros::NodeHandle node;
00025   
00026   node.param<std::string>("marker_frame", marker_tf_name, "master_pattern");
00027   node.param<std::string>("goal_frame", goal_tf_name, "goal");
00028   node.param<std::string>("projection_frame", proj_tf_frame, "fixed_goal");
00029   node.param("x_offset", dist_z, 1.0);
00030   
00031   tf::TransformBroadcaster broadcast;
00032   tf::TransformListener listener;
00033   tf::StampedTransform last_o2m;
00034   ros::Publisher pos_msg_pub = node.advertise<geometry_msgs::PoseStamped>("move_base_simple/goal", 10);
00035   
00036   ros::Rate rate(RATE);
00037   
00038   bool searching = false , initialized = false, turn = false;
00039   ros::Time search_start;
00040   int turnCnt = 0;
00041   sleep(5);
00042   
00043   while (node.ok())
00044   {
00045     try
00046     {
00047       tf::StampedTransform odom2marker;
00048       
00049       ros::Time now = ros::Time::now();
00050       listener.waitForTransform("odom", marker_tf_name, now, ros::Duration(WAITING_TIME));
00051       listener.lookupTransform("odom", marker_tf_name, now, odom2marker);
00052       if(searching) ROS_INFO("Found again?!");
00053 
00054       tf::Transform marker2goal;     
00055       marker2goal.setOrigin( tf::Vector3(0.0, 0.0, dist_z) );
00056       marker2goal.setRotation( tf::Quaternion(tf::Vector3(0,0,1), 0) );
00057       
00058       tf::Transform odom2goal;
00059       odom2goal = odom2marker*marker2goal;
00060       
00061       last_o2m = odom2marker;
00062       broadcast.sendTransform(tf::StampedTransform(marker2goal, ros::Time::now(), marker_tf_name, goal_tf_name));
00063             
00064       searching = false;
00065       initialized = true;
00066       turn = false;
00067       turnCnt = 0;
00068     }
00069     catch (tf::TransformException ex)
00070     {
00071       if (initialized)
00072       {
00073         tf::StampedTransform odom2base;
00074         listener.lookupTransform("odom", "base_footprint", ros::Time(0), odom2base);
00075         double diff_origin = odom2base.getOrigin().x()-last_o2m.getOrigin().x();
00076         searching = true;
00077         ROS_INFO("Master pattern was not found! Recovery Behaviour started!");
00078 
00079         if(fabs(diff_origin) >= MAX_DIST && !turn)
00080         {
00081             ROS_INFO("Old marker position published");
00082         } 
00083         else
00084         {
00085             turn = true;            
00086             ROS_INFO("Turning robot to search master pattern!");
00087         } // else
00088       } // if(initialized)
00089     } // catch
00090     
00091     //geometry_msgs::PoseStamped msg;
00092     ros::spinOnce();
00093     
00094     try
00095     {
00096       tf::StampedTransform trans;
00097       if(!searching)
00098       {
00099         listener.waitForTransform("map", goal_tf_name, ros::Time(0), ros::Duration(WAITING_TIME));
00100         listener.lookupTransform("map", goal_tf_name, ros::Time(0), trans);
00101       }
00102       else 
00103       {
00104         trans = last_o2m;
00105       }
00106       
00107       tfScalar roll, pitch, yaw;
00108       tf::Matrix3x3(trans.getRotation()).getRPY(roll, pitch, yaw);
00109       tf::Quaternion quat(tf::Vector3(0,0,1), yaw - M_PI / 2.0);
00110       tf::StampedTransform fixedTrans;
00111       fixedTrans.setOrigin(tf::Vector3(trans.getOrigin().x(),trans.getOrigin().y(),0));
00112       fixedTrans.setRotation(quat);
00113       if(!searching)    broadcast.sendTransform(tf::StampedTransform(fixedTrans, ros::Time::now(), "map", proj_tf_frame));
00114       else if(!turn)    broadcast.sendTransform(tf::StampedTransform(fixedTrans, ros::Time::now(), "odom", proj_tf_frame));
00115       else
00116       {
00117         tf::Transform rot_z;     
00118         rot_z.setOrigin( tf::Vector3(0.0, 0.0, 0.0) );
00119         rot_z.setRotation( tf::Quaternion(tf::Vector3(0,0,1), M_PI/10 ) );
00120         broadcast.sendTransform(tf::StampedTransform(rot_z, ros::Time::now(), "base_footprint", proj_tf_frame));
00121       }
00122       
00123 
00124       /*
00125       msg.pose.position.x = trans.getOrigin().x();
00126       msg.pose.position.y = trans.getOrigin().y();
00127       msg.pose.position.z = 0;
00128       
00129       msg.pose.orientation.w = quat.w();
00130       msg.pose.orientation.x = quat.x();
00131       msg.pose.orientation.y = quat.y();
00132       msg.pose.orientation.z = quat.z();
00133       
00134       msg.header.frame_id = "map";
00135       msg.header.stamp = ros::Time::now();
00136       
00137       //pos_msg_pub.publish(msg);*/
00138     }
00139     catch (tf::TransformException ex)
00140     {
00141 
00142     }
00143 
00144     ros::spinOnce();
00145     rate.sleep();
00146 
00147   }
00148 
00149   
00150   return 0;
00151 };


wheeled_robin_formation_drive
Author(s): tba
autogenerated on Fri Aug 28 2015 13:40:54