00001 #include <ros/ros.h>
00002 #include <tf/transform_listener.h>
00003 #include <tf/transform_broadcaster.h>
00004 #include <tf/time_cache.h>
00005 #include <tf/tf.h>
00006 #include <Eigen/Eigenvalues>
00007 #include <uncertain_tf/CovarianceStamped.h>
00008 #include <uncertain_tf/utfMessage.h>
00009
00010 #include <uncertain_tf/UncertainTransformListener.h>
00011 #include <uncertain_tf/UncertainTransformBroadcaster.h>
00012
00013 #include <std_msgs/Header.h>
00014 #include <geometry_msgs/PoseArray.h>
00015
00016
00017 using namespace uncertain_tf;
00018 using namespace std;
00019
00020 void spam_tfs()
00021 {
00022 tf::TransformBroadcaster tb;
00023
00024 ros::Rate rt(5);
00025 while (ros::ok())
00026 {
00027 tf::Transform trans;
00028 trans.setOrigin(tf::Vector3(0.7,0,0));
00029 trans.setRotation(tf::Quaternion(tf::Vector3(0,0,1), -M_PI / 5));
00030 tb.sendTransform(tf::StampedTransform(trans,ros::Time::now(),"/map","/base_link"));
00031 trans.setOrigin(tf::Vector3(0,0.2,0));
00032 trans.setRotation(tf::Quaternion(tf::Vector3(0,0,1), M_PI / 4));
00033 tb.sendTransform(tf::StampedTransform(trans,ros::Time::now(),"/base_link","/eye"));
00034 trans.setOrigin(tf::Vector3(0,0.5,0));
00035 trans.setRotation(tf::Quaternion(tf::Vector3(0,0,1), M_PI / 3));
00036 tb.sendTransform(tf::StampedTransform(trans,ros::Time::now(),"/eye","object"));
00037 trans.setOrigin(tf::Vector3(0.2,0,0));
00038 trans.setRotation(tf::Quaternion(tf::Vector3(0,0,1), M_PI / 2));
00039 tb.sendTransform(tf::StampedTransform(trans,ros::Time::now(),"/base_link","/gripper"));
00040
00041 rt.sleep();
00042 }
00043
00044 }
00045
00046
00047 void spam_turntable_tfs()
00048 {
00049 tf::TransformBroadcaster tb;
00050
00051 double angle = 0;
00052 ros::Time start_time = ros::Time::now();
00053
00054 ros::Rate rt(25);
00055 while (ros::ok())
00056 {
00057
00058 angle = (ros::Time::now() - start_time).toSec() * 10 / 180 * M_PI;
00059
00060 tf::Transform trans;
00061 trans.setOrigin(tf::Vector3(-0.7,0,0));
00062 trans.setRotation(tf::Quaternion(tf::Vector3(0,0,1), angle));
00063 tb.sendTransform(tf::StampedTransform(trans,ros::Time::now(),"/map","/turntable"));
00064
00065 trans.setOrigin(tf::Vector3(0.2,0.2,0.05));
00066 trans.setRotation(tf::Quaternion(tf::Vector3(0,0,1), 0));
00067 tb.sendTransform(tf::StampedTransform(trans,ros::Time::now(),"/turntable","/object_on_table"));
00068
00069 rt.sleep();
00070 }
00071
00072 }
00073
00074
00075
00076 int main(int argc, char** argv)
00077 {
00078 ros::init(argc, argv, "my_tf_listener");
00079
00080 std::cout << "USAGE bin/execname frame_name var_x var_y var_z var_rot_z var_rot_y var_rot_x" << std::endl;
00081
00082 if (argc < 2)
00083 exit(0);
00084
00085 ros::NodeHandle node;
00086
00087 tf::TransformListener listener;
00088
00089 UncertainTransformBroadcaster utfb;
00090 StampedCovariance stc;
00091 stc.resize(6,6);
00092 stc.setZero();
00093
00094 for (int i = 0; i < argc - 2; ++i)
00095 {
00096 stc(i,i) = atof(argv[i+2]);
00097 }
00098 stc.frame_id_ = argv[1];
00099 stc.stamp_ = ros::Time::now();
00100 utfb.sendCovariance(stc);
00101
00102 UncertainTransformListener ulistener;
00103
00104 ros::AsyncSpinner spinner(2);
00105 spinner.start();
00106
00107 ros::Publisher poseArrPub = node.advertise<geometry_msgs::PoseArray>("sampled_poses", 100);
00108 ros::Publisher poseArrPubResampled = node.advertise<geometry_msgs::PoseArray>("resampled_poses", 100);
00109 ros::Publisher poseArrPubTimeGaussian = node.advertise<geometry_msgs::PoseArray>("sampled_time_gaussian", 100);
00110
00111 boost::thread t1(spam_tfs);
00112 boost::thread t2(spam_turntable_tfs);
00113
00114 ros::Duration(0.3).sleep();
00115
00116 ros::Rate rate(30.0);
00117
00118 ros::Time start_time = ros::Time::now();
00119
00120 while (node.ok())
00121 {
00122
00123 stc.stamp_ = ros::Time::now();
00124
00125 StampedCovariance cov_to_send = stc;
00126 for (int i = 0; i < 6; ++i)
00127 {
00128
00129 cov_to_send(i,i) = stc(i,i);
00130 }
00131
00132
00133
00134 utfb.sendCovariance(cov_to_send);
00135
00136 rate.sleep();
00137
00138 ros::spinOnce();
00139
00140
00141 if (1)
00142 {
00143 std::vector<StampedTransform> transform_samples;
00144
00145 std::cout << endl << "***********************************************************************************" << endl << endl;
00146
00147 ulistener.sampleTransform("map", "object_on_table", ros::Time(0), transform_samples, 50);
00148
00149 geometry_msgs::PoseArray parr;
00150 parr.header.frame_id = transform_samples[0].frame_id_;
00151 parr.header.stamp = ros::Time(0);
00152 for (std::vector<StampedTransform>::iterator it = transform_samples.begin(); it != transform_samples.end(); ++it)
00153 {
00154 geometry_msgs::Pose ps;
00155 tf::poseTFToMsg(*it,ps);
00156 parr.poses.push_back(ps);
00157 }
00158 poseArrPub.publish(parr);
00159 }
00160
00161
00162
00163 if (1)
00164 {
00165 std::vector<StampedTransform> transform_samples;
00166
00167 ulistener.sampleTransform("map", "object_on_table", ros::Time(0), transform_samples, 50);
00168
00169 MatrixXd sample_covar;
00170 MatrixXd samples = ulistener.sampleSetTFtoMatrixXd(transform_samples);
00171
00172 ulistener.calculateSampleCovariance(samples, samples, sample_covar);
00173
00174 MatrixXd mean = ulistener.calculateSampleMean(samples);
00175
00176 std::vector<tf::Transform> resampled;
00177 ulistener.sampleFromMeanCov(ulistener.transformVectorXdToTF(mean), sample_covar, resampled, 50);
00178 geometry_msgs::PoseArray parr_resampled;
00179 parr_resampled.header.frame_id = transform_samples[0].frame_id_;
00180 parr_resampled.header.stamp = ros::Time(0);
00181 for (std::vector<tf::Transform>::iterator it = resampled.begin(); it != resampled.end(); ++it)
00182 {
00183 geometry_msgs::Pose ps;
00184 tf::poseTFToMsg(*it,ps);
00185 parr_resampled.poses.push_back(ps);
00186 }
00187 poseArrPubResampled.publish(parr_resampled);
00188
00189
00190 }
00191
00192
00193 if (1)
00194 {
00195 std::vector<StampedTransform> transform_samples;
00196
00197
00198 ulistener.sampleTransformGaussianTime("map", "object_on_table", ros::Time::now() - ros::Duration(4),ros::Duration(2), transform_samples, 50);
00199
00200
00201
00202 if (transform_samples.size() > 0)
00203 {
00204
00205 geometry_msgs::PoseArray parr;
00206 parr.header.frame_id = transform_samples[0].frame_id_;
00207 parr.header.stamp = ros::Time(0);
00208 std::cout << "NUM SAMPLES TIME " << transform_samples.size() << std::endl;
00209 for (std::vector<StampedTransform>::iterator it = transform_samples.begin(); it != transform_samples.end(); ++it)
00210 {
00211 geometry_msgs::Pose ps;
00212 tf::poseTFToMsg(*it,ps);
00213 parr.poses.push_back(ps);
00214 }
00215
00216 poseArrPubTimeGaussian.publish(parr);
00217 }
00218 }
00219
00220
00221 }
00222 return 0;
00223 };
00224