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 }
00088 }
00089 }
00090
00091
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
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 }
00139 catch (tf::TransformException ex)
00140 {
00141
00142 }
00143
00144 ros::spinOnce();
00145 rate.sleep();
00146
00147 }
00148
00149
00150 return 0;
00151 };