trajectory_to_markers_alg.cpp
Go to the documentation of this file.
00001 #include "trajectory_to_markers_alg.h"
00002 
00003 TrajectoryToMarkersAlgorithm::TrajectoryToMarkersAlgorithm(void)
00004 {
00005   nLoops_ = 0;
00006 }
00007 
00008 TrajectoryToMarkersAlgorithm::~TrajectoryToMarkersAlgorithm(void)
00009 {
00010 }
00011 
00012 void TrajectoryToMarkersAlgorithm::config_update(Config& new_cfg, uint32_t level)
00013 {
00014   this->lock();
00015 
00016   // save the current configuration
00017   this->config_=new_cfg;
00018   
00019   this->unlock();
00020 }
00021 
00022 void TrajectoryToMarkersAlgorithm::initialize_markers()
00023 {
00024   // trajectory line initialization
00025   trajectory_marker_.header.stamp = ros::Time::now();
00026   trajectory_marker_.header.frame_id = "/world";
00027   trajectory_marker_.type = visualization_msgs::Marker::LINE_STRIP;
00028   trajectory_marker_.action = visualization_msgs::Marker::ADD;
00029   
00030   trajectory_marker_.color.a = config_.line_color_a;
00031   trajectory_marker_.color.r = config_.line_color_r;
00032   trajectory_marker_.color.g = config_.line_color_g;
00033   trajectory_marker_.color.b = config_.line_color_b;
00034   
00035   trajectory_marker_.ns = "/trajectory";
00036   trajectory_marker_.id = 1;
00037   
00038   trajectory_marker_.scale.x = config_.line_width;
00039   
00040   // loop line initialization
00041   loops_marker_.header.stamp = ros::Time::now();
00042   loops_marker_.header.frame_id = "/world";
00043   loops_marker_.type = visualization_msgs::Marker::LINE_LIST;
00044   loops_marker_.action = visualization_msgs::Marker::ADD;
00045   
00046   loops_marker_.color.a = config_.line_loop_color_a;
00047   loops_marker_.color.r = config_.line_loop_color_r;
00048   loops_marker_.color.g = config_.line_loop_color_g;
00049   loops_marker_.color.b = config_.line_loop_color_b;
00050   
00051   loops_marker_.ns = "/loops";
00052   loops_marker_.id = 1;
00053   
00054   loops_marker_.scale.x = config_.line_loop_width;
00055   
00056   // actual marker initialization
00057   actual_marker_.header.stamp = ros::Time::now();
00058   actual_marker_.header.frame_id = "/world";
00059   actual_marker_.type = visualization_msgs::Marker::SPHERE;
00060   actual_marker_.action = visualization_msgs::Marker::ADD;
00061   
00062   actual_marker_.color.a = config_.actual_marker_color_a;
00063   actual_marker_.color.r = config_.actual_marker_color_r;
00064   actual_marker_.color.g = config_.actual_marker_color_g;
00065   actual_marker_.color.b = config_.actual_marker_color_b;
00066   
00067   actual_marker_.ns = "/actual";
00068   actual_marker_.id = 1;
00069 }
00070 
00071 // TrajectoryToMarkersAlgorithm Public API
00072 bool TrajectoryToMarkersAlgorithm::drawCovariances(const iri_nav_msgs::Trajectory& msg)
00073 {
00074   //ROS_INFO("TRAJECTORY TO MARKERS: draw Covariances");
00075   bool new_trajectory = false;
00076   bool LoopClosure = (msg.loops.size() > nLoops_ * 2);
00077   
00078   // Space reserve
00079   if (marker_array_.markers.capacity() == marker_array_.markers.size()) marker_array_.markers.reserve(marker_array_.markers.size() + 100);
00080   if (loop_state_.capacity() == loop_state_.size()) loop_state_.reserve(loop_state_.size() + 100);
00081   
00082   // NEW NOT REDUNDANT POSE --> update trajectory
00083   if (msg.steps_2_states.back() != -1)
00084   {
00085     //ROS_INFO("TRAJECTORY TO MARKERS: NOT REDUNDANT");
00086     new_trajectory = true;
00087     loop_state_.push_back(LoopClosure);
00088     
00089     // LOOP CLOSURE --> Recompute all markers
00090     if (LoopClosure)
00091     {
00092       //ROS_INFO("TRAJECTORY TO MARKERS: Loop closed");
00093       //ROS_INFO("TRAJECTORY TO MARKERS: nLoops_ = %i | msg.loops.size() / 2 = %i", nLoops_, msg.loops.size() / 2);
00094       
00095       // loops_marker_ (position of old loops and adding new(s) loop(s))
00096       //ROS_INFO("All loops:");
00097       nLoops_ = uint(msg.loops.size()) / 2;
00098       loops_marker_.points.clear();
00099       for (uint i = 0; i < nLoops_; i++)
00100       {
00101         uint from = msg.steps_2_states.at(msg.loops.at(2 * i));
00102         uint with = msg.steps_2_states.at(msg.loops.at(2 * i + 1));
00103         
00104         //ROS_INFO("states %i with %i", from, with);
00105         
00106         loops_marker_.points.push_back(msg.poses.at(from).pose.pose.position);
00107         loops_marker_.points.push_back(msg.poses.at(with).pose.pose.position);
00108         loop_state_.at(from) = true;
00109         loop_state_.at(with) = true;
00110       }
00111       
00112       // marker_array_ & trajectory_marker_array_ (covariances and poses)
00113       marker_array_.markers.clear();
00114       trajectory_marker_.points.clear();
00115       //ROS_INFO("msg.poses.size() = %i - loop_state_.size() = %i", msg.poses.size(), loop_state_.size());
00116       for (uint i = 0; i < msg.poses.size(); i++)
00117       {
00118         Eigen::Matrix2f covs = get_ith_cov(msg, i);
00119         float theta_cov = get_ith_theta_cov(msg, i);
00120         
00121         visualization_msgs::Marker aux_marker = create_marker(i, msg.header, covs, theta_cov, msg.poses.at(i).pose.pose.position, loop_state_.at(i));
00122         marker_array_.markers.push_back(aux_marker);
00123         
00124         trajectory_marker_.points.push_back(msg.poses.at(i).pose.pose.position);
00125       }
00126     }
00127     // NOT LOOP CLOSURE - NOT REDUNDANT POSE --> Add to trajectory
00128     else
00129     {
00130       //ROS_INFO("TRAJECTORY TO MARKERS: msg.poses.size() = %i", msg.poses.size());
00131       //marker_array_
00132       Eigen::Matrix2f covs = get_ith_cov(msg, msg.steps_2_states.back());
00133       float theta_cov = get_ith_theta_cov(msg, msg.steps_2_states.back());
00134       uint id = marker_array_.markers.size() + 1;
00135       
00136       visualization_msgs::Marker aux_marker = create_marker(id, msg.header, covs, theta_cov, msg.poses.back().pose.pose.position, false);
00137       marker_array_.markers.push_back(aux_marker);
00138       
00139      
00140       trajectory_marker_.points.push_back(msg.poses.back().pose.pose.position);     
00141     }
00142   }
00143   // FIRST POSE
00144   else if(marker_array_.markers.size() == 0)
00145   {
00146     ROS_INFO("FIRST POSE MARKER");
00147     //marker_array_
00148     Eigen::Matrix2f covs = get_ith_cov(msg, 0);
00149     float theta_cov = get_ith_theta_cov(msg, 0);
00150     uint id = 1;
00151     
00152     visualization_msgs::Marker aux_marker = create_marker(id, msg.header, covs, theta_cov, msg.poses.back().pose.pose.position, false);
00153     marker_array_.markers.push_back(aux_marker);
00154     
00155     //trajectory_marker_
00156     trajectory_marker_.points.push_back(msg.poses.at(0).pose.pose.position);
00157     new_trajectory = true;
00158     
00159     //boolean vector of loopclosure
00160     loop_state_.push_back(false);
00161   }
00162   
00163   
00164   // UPDATE ACTUAL MARKER
00165   uint StateIdx = msg.poses.size() - 1;
00166   Eigen::Matrix2f covs = get_ith_cov(msg, StateIdx);
00167   float theta_cov = get_ith_theta_cov(msg, StateIdx);
00168     
00169   change_actual_marker(covs, theta_cov, msg.poses.back().pose.pose.position, LoopClosure);
00170 
00171   return new_trajectory;
00172 }
00173 
00174 visualization_msgs::MarkerArray TrajectoryToMarkersAlgorithm::get_marker_array() const
00175 {
00176   visualization_msgs::MarkerArray all_markers_array_(marker_array_);
00177   all_markers_array_.markers.reserve(all_markers_array_.markers.size() + 2);
00178   all_markers_array_.markers.push_back(loops_marker_);
00179   all_markers_array_.markers.push_back(trajectory_marker_);
00180   
00181   return all_markers_array_;
00182 }
00183 
00184 visualization_msgs::Marker TrajectoryToMarkersAlgorithm::get_actual_marker() const
00185 {
00186   return actual_marker_;
00187 }
00188 
00189 visualization_msgs::Marker TrajectoryToMarkersAlgorithm::create_marker(const uint& id, const std_msgs::Header& header, const Eigen::Matrix2f& covs, const float& theta_cov, const geometry_msgs::Point& position, const bool& loopClosure) const
00190 {
00191   visualization_msgs::Marker current_marker_;
00192   current_marker_.header = header;
00193   current_marker_.type = visualization_msgs::Marker::SPHERE;
00194   current_marker_.action = visualization_msgs::Marker::ADD;
00195   
00196   if (loopClosure)
00197   {
00198     current_marker_.color.a = config_.marker_loop_color_a;
00199     current_marker_.color.r = config_.marker_loop_color_r;
00200     current_marker_.color.g = config_.marker_loop_color_g;
00201     current_marker_.color.b = config_.marker_loop_color_b;
00202   }
00203   else
00204   {
00205     current_marker_.color.a = config_.marker_color_a;
00206     current_marker_.color.r = config_.marker_color_r;
00207     current_marker_.color.g = config_.marker_color_g;
00208     current_marker_.color.b = config_.marker_color_b;
00209   }
00210   current_marker_.ns = "/positions";
00211   current_marker_.id = id;
00212   //ROS_INFO("step %u", id);
00213   
00214   //ROS_INFO("cov:\n%f\t%f \n%f\t%f",covs(0,0),covs(0,1),covs(1,0),covs(1,1));
00215   
00216   Eigen::SelfAdjointEigenSolver<Eigen::Matrix2f> eig(covs);
00217 
00218   const Eigen::Vector2f& eigValues (eig.eigenvalues());
00219   const Eigen::Matrix2f& eigVectors (eig.eigenvectors());
00220 
00221   float angle = (atan2(eigVectors(1, 0), eigVectors(0, 0)));
00222 
00223   double lengthMajor = sqrt(eigValues[0]);
00224   double lengthMinor = sqrt(eigValues[1]);
00225 
00226   //ROS_INFO("eigValues: %f %f",eigValues[0],eigValues[1]);
00227   //ROS_INFO("lengthMajor/Minor: %f %f",lengthMajor,lengthMinor);
00228 
00229   current_marker_.scale.x = lengthMajor + 0.001;
00230   current_marker_.scale.y = lengthMinor + 0.001;
00231   current_marker_.scale.z = 2 * sqrt(theta_cov) + 0.001;
00232   
00233   current_marker_.pose.position.x = position.x;
00234   current_marker_.pose.position.y = position.y;
00235   current_marker_.pose.orientation = tf::createQuaternionMsgFromYaw(angle);
00236   //current_marker_.pose.orientation.w = cos(angle*0.5);
00237   //current_marker_.pose.orientation.z = sin(angle*0.5);
00238   
00239   return current_marker_;
00240 }
00241 
00242 void TrajectoryToMarkersAlgorithm::change_actual_marker(const Eigen::Matrix2f& covs, const float& theta_cov, const geometry_msgs::Point& position, const bool& loopClosure)
00243 {  
00244   if (loopClosure)
00245   {
00246     actual_marker_.color.a = config_.marker_loop_color_a;
00247     actual_marker_.color.r = config_.marker_loop_color_r;
00248     actual_marker_.color.g = config_.marker_loop_color_g;
00249     actual_marker_.color.b = config_.marker_loop_color_b;
00250   }
00251   else
00252   {
00253     actual_marker_.color.a = config_.actual_marker_color_a;
00254     actual_marker_.color.r = config_.actual_marker_color_r;
00255     actual_marker_.color.g = config_.actual_marker_color_g;
00256     actual_marker_.color.b = config_.actual_marker_color_b;
00257   }
00258     
00259   //ROS_INFO("cov:\n%f\t%f \n%f\t%f",covs(0,0),covs(0,1),covs(1,0),covs(1,1));
00260   
00261   Eigen::SelfAdjointEigenSolver<Eigen::Matrix2f> eig(covs);
00262 
00263   const Eigen::Vector2f& eigValues (eig.eigenvalues());
00264   const Eigen::Matrix2f& eigVectors (eig.eigenvectors());
00265 
00266   float angle = (atan2(eigVectors(1, 0), eigVectors(0, 0)));
00267 
00268   double lengthMajor = sqrt(eigValues[0]);
00269   double lengthMinor = sqrt(eigValues[1]);
00270 
00271   //ROS_INFO("eigValues: %f %f",eigValues[0],eigValues[1]);
00272   //ROS_INFO("lengthMajor/Minor: %f %f",lengthMajor,lengthMinor);
00273 
00274   actual_marker_.scale.x = lengthMajor + 0.001;
00275   actual_marker_.scale.y = lengthMinor + 0.001;
00276   actual_marker_.scale.z = 2 * sqrt(theta_cov) + 0.001;
00277   
00278   actual_marker_.pose.position.x = position.x;
00279   actual_marker_.pose.position.y = position.y;
00280   actual_marker_.pose.orientation = tf::createQuaternionMsgFromYaw(angle);
00281   //current_marker_.pose.orientation.w = cos(angle*0.5);
00282   //current_marker_.pose.orientation.z = sin(angle*0.5);
00283 }
00284 
00285 visualization_msgs::Marker TrajectoryToMarkersAlgorithm::create_loop_marker(const uint& id, const std_msgs::Header& header, const geometry_msgs::Point& position1, const geometry_msgs::Point& position2) const
00286 {
00287   
00288   visualization_msgs::Marker current_marker_;
00289   current_marker_.header = header;
00290   current_marker_.type = visualization_msgs::Marker::LINE_STRIP;
00291   current_marker_.action = visualization_msgs::Marker::ADD;
00292   
00293   
00294   current_marker_.color.a = config_.line_loop_color_a;
00295   current_marker_.color.r = config_.line_loop_color_r;
00296   current_marker_.color.g = config_.line_loop_color_g;
00297   current_marker_.color.b = config_.line_loop_color_b;
00298   
00299   current_marker_.ns = "/loops";
00300   current_marker_.id = id;
00301   //ROS_INFO("step %i", id);
00302   
00303   current_marker_.points.push_back(position1);
00304   current_marker_.points.push_back(position2);
00305   
00306   current_marker_.scale.x = config_.line_loop_width;
00307   
00308   return current_marker_;
00309 }
00310 
00311 Eigen::Matrix2f TrajectoryToMarkersAlgorithm::get_ith_cov(const iri_nav_msgs::Trajectory& msg, const uint i) const
00312 {
00313   //ROS_INFO("get cov: msg.covariances.size() = %i - idx = %i", msg.covariances.size(), 9 * i +4);
00314   Eigen::Matrix2f covs;
00315   covs(0, 0) = msg.poses.at(i).pose.covariance.at(0);
00316   covs(0, 1) = msg.poses.at(i).pose.covariance.at(1);
00317   covs(1, 0) = msg.poses.at(i).pose.covariance.at(3);
00318   covs(1, 1) = msg.poses.at(i).pose.covariance.at(4);
00319 
00320   return covs;
00321 }
00322 
00323 float TrajectoryToMarkersAlgorithm::get_ith_theta_cov(const iri_nav_msgs::Trajectory& msg, const uint i) const
00324 {
00325   //ROS_INFO("get theta cov: msg.covariances.size() = %i - idx = %i", msg.covariances.size(), 9 * i +8);
00326   
00327   return msg.poses.at(i).pose.covariance.at(8);
00328 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Properties Friends


iri_trajectory_to_markers
Author(s): joan vallvé
autogenerated on Wed Oct 9 2013 11:47:41