diff --git a/include/publisher_gnss_tf.h b/include/publisher_gnss_tf.h index 6d49cbe48b16e8df87390ab2004cfd5c659c8570..c46d9774f61463e3b905ed361b189b9140ee3f02 100644 --- a/include/publisher_gnss_tf.h +++ b/include/publisher_gnss_tf.h @@ -37,6 +37,7 @@ namespace wolf class PublisherGnssTf: public Publisher { + bool publish_ecef_; std::string map_frame_id_, enu_frame_id_, ecef_frame_id_; tf::StampedTransform T_enu_map_, T_ecef_enu_; tf::TransformBroadcaster tfb_; diff --git a/src/publisher_gnss_tf.cpp b/src/publisher_gnss_tf.cpp index b90dd8f89443e19a2edfbbe774a083a9c8950ada..98085f5ce5b74353c7fb0def324d5205ad73eb4e 100644 --- a/src/publisher_gnss_tf.cpp +++ b/src/publisher_gnss_tf.cpp @@ -36,18 +36,23 @@ PublisherGnssTf::PublisherGnssTf(const std::string& _unique_name, ProblemConstPtr _problem) : Publisher(_unique_name, _server, _problem) { - sensor_gnss_ = std::static_pointer_cast<const SensorGnss>(_problem->findSensor(_server.getParam<std::string>(prefix_ + "/sensor_gnss_name"))); + auto sensor = std::dynamic_pointer_cast<const SensorGnss>(_problem->findSensor(_server.getParam<std::string>(prefix_ + "/sensor_gnss_name"))); + if (not sensor_gnss_) + throw std::runtime_error("PublisherGnssTf: 'sensor_gnss_name' not found or wrong sensor type."); T_enu_map_.setIdentity(); T_enu_map_.frame_id_ = "ENU"; T_enu_map_.stamp_ = ros::Time::now(); - - T_ecef_enu_.setIdentity(); - T_ecef_enu_.frame_id_ = "ECEF"; - T_ecef_enu_.child_frame_id_ = "ENU"; - T_ecef_enu_.stamp_ = ros::Time::now(); - T_enu_map_.child_frame_id_ = _server.getParam<std::string>(prefix_ + "/map_frame_id"); + publish_ecef_ = _server.getParam<bool>(prefix_ + "/publish_ecef"); + + if (publish_ecef_) + { + T_ecef_enu_.setIdentity(); + T_ecef_enu_.frame_id_ = "ECEF"; + T_ecef_enu_.child_frame_id_ = "ENU"; + T_ecef_enu_.stamp_ = ros::Time::now(); + } } void PublisherGnssTf::initialize(ros::NodeHandle& nh, const std::string& topic) @@ -56,36 +61,32 @@ void PublisherGnssTf::initialize(ros::NodeHandle& nh, const std::string& topic) void PublisherGnssTf::publishDerived() { - tf::Matrix3x3 tf_R_enu_map, tf_R_enu_ecef; - tf::Vector3 tf_t_enu_map, tf_t_enu_ecef; - if (not sensor_gnss_->isEnuDefined()) return; - //Eigen::Matrix3d ei_R_enu_ecef = sensor_gnss_->getREnuEcef(); - //Eigen::Vector3d ei_t_enu_ecef = sensor_gnss_->gettEnuEcef(); - - //Eigen::Matrix3d ei_R_enu_map = sensor_gnss_->getREnuMap(); - //Eigen::Vector3d ei_t_enu_map = sensor_gnss_->gettEnuMap(); - - //tf::matrixEigenToTF(ei_R_enu_ecef, tf_R_enu_ecef); - //tf::vectorEigenToTF(ei_t_enu_ecef, tf_t_enu_ecef); - tf::matrixEigenToTF(sensor_gnss_->getREnuEcef(), tf_R_enu_ecef); - tf::vectorEigenToTF(sensor_gnss_->gettEnuEcef(), tf_t_enu_ecef); + // ENU-MAP + tf::Vector3 tf_t_enu_map; + tf::Matrix3x3 tf_R_enu_map; - //tf::matrixEigenToTF(ei_R_enu_map, tf_R_enu_map); - //tf::vectorEigenToTF(ei_t_enu_map, tf_t_enu_map); tf::matrixEigenToTF(sensor_gnss_->getREnuMap(), tf_R_enu_map); tf::vectorEigenToTF(sensor_gnss_->gettEnuMap(), tf_t_enu_map); - - T_ecef_enu_.setData(tf::Transform(tf_R_enu_ecef, tf_t_enu_ecef).inverse()); T_enu_map_ .setData(tf::Transform(tf_R_enu_map, tf_t_enu_map)); - - T_ecef_enu_.stamp_ = ros::Time::now(); T_enu_map_ .stamp_ = ros::Time::now(); - - tfb_.sendTransform(T_ecef_enu_); + tfb_.sendTransform(T_enu_map_); + + // ECEF-ENU + if (publish_ecef_) + { + tf::Vector3 tf_t_enu_ecef; + tf::Matrix3x3 tf_R_enu_ecef; + T_ecef_enu_.setData(tf::Transform(tf_R_enu_ecef, tf_t_enu_ecef).inverse()); + T_ecef_enu_.stamp_ = ros::Time::now(); + tf::matrixEigenToTF(sensor_gnss_->getREnuEcef(), tf_R_enu_ecef); + tf::vectorEigenToTF(sensor_gnss_->gettEnuEcef(), tf_t_enu_ecef); + + tfb_.sendTransform(T_ecef_enu_); + } } }