publish tf from root of robot
This commit is contained in:
parent
f641312f0a
commit
3117f697bc
|
@ -60,12 +60,9 @@ RobotStatePublisher::RobotStatePublisher(const Tree& tree)
|
||||||
NodeHandle n;
|
NodeHandle n;
|
||||||
tf_publisher_ = n.advertise<tf::tfMessage>("/tf", 5);
|
tf_publisher_ = n.advertise<tf::tfMessage>("/tf", 5);
|
||||||
|
|
||||||
// get the 'real' root segment of the tree, which is the first child of "root"
|
// get the root segment of the tree
|
||||||
SegmentMap::const_iterator root = tree.getRootSegment();
|
SegmentMap::const_iterator root = tree.getRootSegment();
|
||||||
if (root->second.children.empty())
|
root_ = root->first;
|
||||||
throw empty_tree_ex;
|
|
||||||
|
|
||||||
root_ = (*root->second.children.begin())->first;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -79,31 +76,19 @@ bool RobotStatePublisher::publishTransforms(const map<string, double>& joint_pos
|
||||||
ROS_ERROR("Could not compute link poses. The tree or the state is invalid.");
|
ROS_ERROR("Could not compute link poses. The tree or the state is invalid.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
tf_msg_.transforms.resize(link_poses.size()-1);
|
tf_msg_.transforms.resize(link_poses.size());
|
||||||
|
|
||||||
// publish the transforms to tf, converting the transforms from "root" to the 'real' root
|
|
||||||
geometry_msgs::TransformStamped trans;
|
|
||||||
map<string, Frame>::const_iterator root = link_poses.find(root_);
|
|
||||||
if (root == link_poses.end()){
|
|
||||||
ROS_ERROR("Did not find root of tree");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove root from published poses
|
|
||||||
Frame offset = root->second.Inverse();
|
|
||||||
unsigned int i = 0;
|
|
||||||
// send transforms to tf
|
// send transforms to tf
|
||||||
|
geometry_msgs::TransformStamped trans;
|
||||||
|
tf::Transform tf_frame;
|
||||||
|
unsigned int i = 0;
|
||||||
for (map<string, Frame>::const_iterator f=link_poses.begin(); f!=link_poses.end(); f++){
|
for (map<string, Frame>::const_iterator f=link_poses.begin(); f!=link_poses.end(); f++){
|
||||||
if (f != root){
|
tf::TransformKDLToTF(f->second, tf_frame);
|
||||||
Frame frame = offset * f->second;
|
trans.header.stamp = time;
|
||||||
tf::Transform tf_frame;
|
trans.header.frame_id = tf::remap(tf_prefix_, root_);
|
||||||
tf::TransformKDLToTF(frame, tf_frame);
|
trans.child_frame_id = tf::remap(tf_prefix_, f->first);
|
||||||
trans.header.stamp = time;
|
tf::transformTFToMsg(tf_frame, trans.transform);
|
||||||
trans.header.frame_id = tf::remap(tf_prefix_, root->first);
|
tf_msg_.transforms[i++] = trans;
|
||||||
trans.child_frame_id = tf::remap(tf_prefix_, f->first);
|
|
||||||
tf::transformTFToMsg(tf_frame, trans.transform);
|
|
||||||
tf_msg_.transforms[i++] = trans;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
tf_publisher_.publish(tf_msg_);
|
tf_publisher_.publish(tf_msg_);
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,12 @@ int main(int argc, char** argv)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
JointStateListener state_publisher(tree);
|
if (tree.getNrOfSegments() == 0)
|
||||||
|
ROS_WARN("Robot state publisher got an empty tree and cannot publish any state to tf");
|
||||||
|
else if (tree.getNrOfSegments() == 1)
|
||||||
|
ROS_WARN("Robot state publisher got a tree with only one segment and cannot publish any state to tf");
|
||||||
|
else
|
||||||
|
JointStateListener state_publisher(tree);
|
||||||
|
|
||||||
ros::spin();
|
ros::spin();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue