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
00017 this->config_=new_cfg;
00018
00019 this->unlock();
00020 }
00021
00022 void TrajectoryToMarkersAlgorithm::initialize_markers()
00023 {
00024
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
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
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
00072 bool TrajectoryToMarkersAlgorithm::drawCovariances(const iri_nav_msgs::Trajectory& msg)
00073 {
00074
00075 bool new_trajectory = false;
00076 bool LoopClosure = (msg.loops.size() > nLoops_ * 2);
00077
00078
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
00083 if (msg.steps_2_states.back() != -1)
00084 {
00085
00086 new_trajectory = true;
00087 loop_state_.push_back(LoopClosure);
00088
00089
00090 if (LoopClosure)
00091 {
00092
00093
00094
00095
00096
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
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
00113 marker_array_.markers.clear();
00114 trajectory_marker_.points.clear();
00115
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
00128 else
00129 {
00130
00131
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
00144 else if(marker_array_.markers.size() == 0)
00145 {
00146 ROS_INFO("FIRST POSE MARKER");
00147
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
00156 trajectory_marker_.points.push_back(msg.poses.at(0).pose.pose.position);
00157 new_trajectory = true;
00158
00159
00160 loop_state_.push_back(false);
00161 }
00162
00163
00164
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
00213
00214
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
00227
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
00237
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
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
00272
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
00282
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
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
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
00326
00327 return msg.poses.at(i).pose.covariance.at(8);
00328 }