diff --git a/launch/demo/demo_robot_mapping.launch b/launch/demo/demo_robot_mapping.launch index 0fbc8c64..1b862fef 100644 --- a/launch/demo/demo_robot_mapping.launch +++ b/launch/demo/demo_robot_mapping.launch @@ -53,6 +53,7 @@ + diff --git a/src/CoreWrapper.cpp b/src/CoreWrapper.cpp index b57bd1bd..732d84c5 100644 --- a/src/CoreWrapper.cpp +++ b/src/CoreWrapper.cpp @@ -2975,23 +2975,27 @@ bool CoreWrapper::getPlanCallback(nav_msgs::GetPlan::Request &req, nav_msgs::Get if(!pose.isNull()) { // transform goal in /map frame + Transform coordinateTransform = Transform::getIdentity(); if(mapFrameId_.compare(req.goal.header.frame_id) != 0) { - Transform t = rtabmap_ros::getTransform(mapFrameId_, req.goal.header.frame_id, req.goal.header.stamp, tfListener_, waitForTransform_?waitForTransformDuration_:0.0); - if(t.isNull()) + coordinateTransform = rtabmap_ros::getTransform(mapFrameId_, req.goal.header.frame_id, req.goal.header.stamp, tfListener_, waitForTransform_?waitForTransformDuration_:0.0); + if(coordinateTransform.isNull()) { NODELET_ERROR("Cannot transform goal pose from \"%s\" frame to \"%s\" frame!", req.goal.header.frame_id.c_str(), mapFrameId_.c_str()); return false; } - pose = t * pose; + pose = coordinateTransform * pose; } + // To convert back the poses in goal frame + coordinateTransform = coordinateTransform.inverse(); + if(rtabmap_.computePath(pose, req.tolerance)) { NODELET_INFO("Planning: Time computing path = %f s", timer.ticks()); const std::vector > & poses = rtabmap_.getPath(); - res.plan.header.frame_id = mapFrameId_; + res.plan.header.frame_id = req.goal.header.frame_id; res.plan.header.stamp = req.goal.header.stamp; if(poses.size() == 0) { @@ -2999,7 +3003,7 @@ bool CoreWrapper::getPlanCallback(nav_msgs::GetPlan::Request &req, nav_msgs::Get rtabmap_.getGoalReachedRadius()); // just set the goal directly res.plan.poses.resize(1); - rtabmap_ros::transformToPoseMsg(pose, res.plan.poses[0].pose); + rtabmap_ros::transformToPoseMsg(coordinateTransform*pose, res.plan.poses[0].pose); } else { @@ -3008,7 +3012,7 @@ bool CoreWrapper::getPlanCallback(nav_msgs::GetPlan::Request &req, nav_msgs::Get for(std::vector >::const_iterator iter=poses.begin(); iter!=poses.end(); ++iter) { res.plan.poses[oi].header = res.plan.header; - rtabmap_ros::transformToPoseMsg(iter->second, res.plan.poses[oi].pose); + rtabmap_ros::transformToPoseMsg(coordinateTransform*iter->second, res.plan.poses[oi].pose); ++oi; } if(!rtabmap_.getPathTransformToGoal().isIdentity()) @@ -3016,7 +3020,7 @@ bool CoreWrapper::getPlanCallback(nav_msgs::GetPlan::Request &req, nav_msgs::Get res.plan.poses.resize(res.plan.poses.size()+1); res.plan.poses[res.plan.poses.size()-1].header = res.plan.header; Transform p = rtabmap_.getPath().back().second*rtabmap_.getPathTransformToGoal(); - rtabmap_ros::transformToPoseMsg(p, res.plan.poses[res.plan.poses.size()-1].pose); + rtabmap_ros::transformToPoseMsg(coordinateTransform*p, res.plan.poses[res.plan.poses.size()-1].pose); } // Just output the path on screen @@ -3043,23 +3047,25 @@ bool CoreWrapper::getPlanNodesCallback(rtabmap_ros::GetPlan::Request &req, rtabm UTimer timer; if(req.goal_node > 0 || !pose.isNull()) { - if(req.goal_node <= 0) + Transform coordinateTransform = Transform::getIdentity(); + // transform goal in /map frame + if(mapFrameId_.compare(req.goal.header.frame_id) != 0) { - // transform goal in /map frame - if(mapFrameId_.compare(req.goal.header.frame_id) != 0) + coordinateTransform = rtabmap_ros::getTransform(mapFrameId_, req.goal.header.frame_id, req.goal.header.stamp, tfListener_, waitForTransform_?waitForTransformDuration_:0.0); + if(coordinateTransform.isNull()) { - Transform t = rtabmap_ros::getTransform(mapFrameId_, req.goal.header.frame_id, req.goal.header.stamp, tfListener_, waitForTransform_?waitForTransformDuration_:0.0); - if(t.isNull()) - { - NODELET_ERROR("Cannot transform goal pose from \"%s\" frame to \"%s\" frame!", - req.goal.header.frame_id.c_str(), mapFrameId_.c_str()); - return false; - } - pose = t * pose; + NODELET_ERROR("Cannot transform goal pose from \"%s\" frame to \"%s\" frame!", + req.goal.header.frame_id.c_str(), mapFrameId_.c_str()); + return false; + } + if(!pose.isNull()) + { + pose = coordinateTransform * pose; } } - + // To convert back the poses in goal frame + coordinateTransform = coordinateTransform.inverse(); if((req.goal_node > 0 && rtabmap_.computePath(req.goal_node, req.tolerance)) || (req.goal_node <= 0 && rtabmap_.computePath(pose, req.tolerance))) @@ -3077,7 +3083,7 @@ bool CoreWrapper::getPlanNodesCallback(rtabmap_ros::GetPlan::Request &req, rtabm // just set the goal directly res.plan.poses.resize(1); res.plan.nodeIds.resize(1); - rtabmap_ros::transformToPoseMsg(pose, res.plan.poses[0]); + rtabmap_ros::transformToPoseMsg(coordinateTransform*pose, res.plan.poses[0]); res.plan.nodeIds[0] = 0; } } @@ -3088,7 +3094,7 @@ bool CoreWrapper::getPlanNodesCallback(rtabmap_ros::GetPlan::Request &req, rtabm int oi = 0; for(std::vector >::const_iterator iter=poses.begin(); iter!=poses.end(); ++iter) { - rtabmap_ros::transformToPoseMsg(iter->second, res.plan.poses[oi]); + rtabmap_ros::transformToPoseMsg(coordinateTransform*iter->second, res.plan.poses[oi]); res.plan.nodeIds[oi] = iter->first; ++oi; } @@ -3097,7 +3103,7 @@ bool CoreWrapper::getPlanNodesCallback(rtabmap_ros::GetPlan::Request &req, rtabm res.plan.poses.resize(res.plan.poses.size()+1); res.plan.nodeIds.resize(res.plan.nodeIds.size()+1); Transform p = rtabmap_.getPath().back().second*rtabmap_.getPathTransformToGoal(); - rtabmap_ros::transformToPoseMsg(p, res.plan.poses[res.plan.poses.size()-1]); + rtabmap_ros::transformToPoseMsg(coordinateTransform*p, res.plan.poses[res.plan.poses.size()-1]); res.plan.nodeIds[res.plan.nodeIds.size()-1] = 0; }