From 08845a129975b8b83eb4a48309a3e05f9c4d8683 Mon Sep 17 00:00:00 2001 From: Florian Polster <fpolster@uni-koblenz.de> Date: Sun, 19 Mar 2017 15:02:49 +0100 Subject: [PATCH] when map was loaded transform wasn't fetched -> fixed --- homer_map_manager/src/map_manager_node.cpp | 1 + .../homer_mapping/OccupancyMap/OccupancyMap.h | 5 +- .../src/OccupancyMap/OccupancyMap.cpp | 59 +++++++++++-------- .../src/ParticleFilter/SlamFilter.cpp | 2 +- homer_mapping/src/slam_node.cpp | 2 +- 5 files changed, 43 insertions(+), 26 deletions(-) diff --git a/homer_map_manager/src/map_manager_node.cpp b/homer_map_manager/src/map_manager_node.cpp index d8989a67..2c21a8aa 100644 --- a/homer_map_manager/src/map_manager_node.cpp +++ b/homer_map_manager/src/map_manager_node.cpp @@ -400,6 +400,7 @@ bool MapManagerNode::saveMapService(homer_mapnav_msgs::SaveMap::Request& req, m_MapManager->getMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER); map_saver.save(SLAMMap, maskingMap, m_POIManager->getList(), m_ROIManager->getList()); + return true; } bool MapManagerNode::loadMapService(homer_mapnav_msgs::LoadMap::Request& req, diff --git a/homer_mapping/include/homer_mapping/OccupancyMap/OccupancyMap.h b/homer_mapping/include/homer_mapping/OccupancyMap/OccupancyMap.h index dc87774a..9660e7ce 100644 --- a/homer_mapping/include/homer_mapping/OccupancyMap/OccupancyMap.h +++ b/homer_mapping/include/homer_mapping/OccupancyMap/OccupancyMap.h @@ -280,6 +280,8 @@ public: void changeMapSize(int x_add_left, int y_add_up, int x_add_right, int y_add_down); + tf::StampedTransform getLaserTransform(std::string frame_id); + protected: /** * This method increments m_MeasurementCount for pixel p. @@ -449,7 +451,8 @@ protected: /** * ros transformation laser to base_link */ - tf::StampedTransform m_laserTransform; + std::map<std::string, tf::StampedTransform> m_savedTransforms; + tf::Transform m_latestMapTransform; }; #endif diff --git a/homer_mapping/src/OccupancyMap/OccupancyMap.cpp b/homer_mapping/src/OccupancyMap/OccupancyMap.cpp index a1e009fe..a02330a8 100644 --- a/homer_mapping/src/OccupancyMap/OccupancyMap.cpp +++ b/homer_mapping/src/OccupancyMap/OccupancyMap.cpp @@ -29,7 +29,7 @@ OccupancyMap::OccupancyMap() OccupancyMap::OccupancyMap(const nav_msgs::OccupancyGrid::ConstPtr& msg) { m_metaData = msg->info; - m_ByteSize = m_metaData.width * m_metaData.height; + m_ByteSize = msg->data.size(); initMembers(); for (unsigned i = 0; i < msg->data.size(); i++) @@ -64,10 +64,10 @@ void OccupancyMap::initMembers() m_MapPoints.resize(m_ByteSize); - m_ExploredRegion = - Box2D<int>(m_metaData.width / 2.1, m_metaData.height / 2.1, - m_metaData.width / 1.9, m_metaData.height / 1.9); - maximizeChangedRegion(); + m_ChangedRegion.enclose( + Box2D<int>(0, 0, m_metaData.width - 1, m_metaData.height - 1)); + m_ExploredRegion.enclose( + Box2D<int>(0, 0, m_metaData.width - 1, m_metaData.height - 1)); } OccupancyMap& OccupancyMap::operator=(const OccupancyMap& occupancyMap) @@ -194,19 +194,6 @@ void OccupancyMap::insertLaserData(sensor_msgs::LaserScan::ConstPtr laserData, tf::Transform transform) { m_latestMapTransform = transform; - try - { - m_tfListener.waitForTransform("/base_link", laserData->header.frame_id, - ros::Time(0), ros::Duration(0.2)); - m_tfListener.lookupTransform("/base_link", laserData->header.frame_id, - ros::Time(0), m_laserTransform); - } - catch (tf::TransformException ex) - { - ROS_ERROR_STREAM(ex.what()); - ROS_ERROR_STREAM("need transformation from base_link to laser!"); - return; - } markRobotPositionFree(); std::vector<RangeMeasurement> ranges; @@ -216,8 +203,8 @@ void OccupancyMap::insertLaserData(sensor_msgs::LaserScan::ConstPtr laserData, float lastValidRange = m_FreeReadingDistance; RangeMeasurement rangeMeasurement; - rangeMeasurement.sensorPos.x = m_laserTransform.getOrigin().getX(); - rangeMeasurement.sensorPos.y = m_laserTransform.getOrigin().getY(); + rangeMeasurement.sensorPos.x = getLaserTransform(laserData->header.frame_id).getOrigin().getX(); + rangeMeasurement.sensorPos.y = getLaserTransform(laserData->header.frame_id).getOrigin().getY(); for (unsigned int i = 0; i < laserData->ranges.size(); i++) { @@ -248,7 +235,7 @@ void OccupancyMap::insertLaserData(sensor_msgs::LaserScan::ConstPtr laserData, pin.setX(cos(alpha) * range); pin.setY(sin(alpha) * range); pin.setZ(0); - pout = m_laserTransform * pin; + pout = getLaserTransform(laserData->header.frame_id) * pin; rangeMeasurement.endPos.x = pout.x(); rangeMeasurement.endPos.y = pout.y(); rangeMeasurement.range = range; @@ -262,7 +249,7 @@ void OccupancyMap::insertLaserData(sensor_msgs::LaserScan::ConstPtr laserData, pin.setX(cos(alpha) * laserData->ranges[i]); pin.setY(sin(alpha) * laserData->ranges[i]); pin.setZ(0); - pout = m_laserTransform * pin; + pout = getLaserTransform(laserData->header.frame_id) * pin; rangeMeasurement.endPos.x = pout.x(); rangeMeasurement.endPos.y = pout.y(); rangeMeasurement.range = laserData->ranges[i]; @@ -484,6 +471,32 @@ double OccupancyMap::evaluateByContrast() return (0); } +tf::StampedTransform OccupancyMap::getLaserTransform(std::string frame_id) +{ +if(m_savedTransforms.find(frame_id) != m_savedTransforms.end()) +{ + return m_savedTransforms[frame_id]; +} +else +{ + try + { + m_tfListener.waitForTransform("/base_link", frame_id, + ros::Time(0), ros::Duration(0.2)); + m_tfListener.lookupTransform("/base_link", frame_id, + ros::Time(0), m_savedTransforms[frame_id]); + return m_savedTransforms[frame_id]; + } + catch (tf::TransformException ex) + { + ROS_ERROR_STREAM(ex.what()); + ROS_ERROR_STREAM("need transformation from base_link to laser!"); + } +} + +return tf::StampedTransform(); +} + vector<MeasurePoint> OccupancyMap::getMeasurePoints(sensor_msgs::LaserScanConstPtr laserData) { @@ -508,7 +521,7 @@ OccupancyMap::getMeasurePoints(sensor_msgs::LaserScanConstPtr laserData) pin.setY(sin(alpha) * laserData->ranges[i]); pin.setZ(0); - pout = m_laserTransform * pin; + pout = getLaserTransform(laserData->header.frame_id) * pin; Point2D hitPos(pout.x(), pout.y()); diff --git a/homer_mapping/src/ParticleFilter/SlamFilter.cpp b/homer_mapping/src/ParticleFilter/SlamFilter.cpp index 5bc9c1c9..6e1dab2e 100644 --- a/homer_mapping/src/ParticleFilter/SlamFilter.cpp +++ b/homer_mapping/src/ParticleFilter/SlamFilter.cpp @@ -280,7 +280,7 @@ void SlamFilter::filter(Transformation2D trans, { ROS_INFO_STREAM("first run!"); m_FirstRun = false; - // only do mapping, save first pose as reference + // only do mapping if (m_DoMapping) { tf::Transform transform(tf::createQuaternionFromYaw(0.0), diff --git a/homer_mapping/src/slam_node.cpp b/homer_mapping/src/slam_node.cpp index c3b3e9c7..3e079014 100644 --- a/homer_mapping/src/slam_node.cpp +++ b/homer_mapping/src/slam_node.cpp @@ -299,7 +299,7 @@ void SlamNode::callbackLoadedMap(const nav_msgs::OccupancyGrid::ConstPtr& msg) m_HyperSlamFilter->setMapping(false); m_DoMapping = false; ROS_INFO_STREAM("Replacing occupancy map"); - sendMapDataMessage(ros::Time::now()); + sendMapDataMessage(msg->info.map_load_time); } void SlamNode::callbackMasking(const nav_msgs::OccupancyGrid::ConstPtr& msg) -- GitLab