in simulation_ws/src/rover/message_to_tf/src/message_to_tf.cpp [42:122]
void sendTransform(geometry_msgs::Pose const &pose, const std_msgs::Header& header, std::string child_frame_id = "")
{
std::vector<geometry_msgs::TransformStamped> transforms;
tf::StampedTransform tf;
tf.stamp_ = header.stamp;
tf.frame_id_ = header.frame_id;
if (!g_frame_id.empty()) tf.frame_id_ = g_frame_id;
tf.frame_id_ = tf::resolve(g_tf_prefix, tf.frame_id_);
if (!g_child_frame_id.empty()) child_frame_id = g_child_frame_id;
if (child_frame_id.empty()) child_frame_id = "body";
tf::Quaternion orientation;
tf::quaternionMsgToTF(pose.orientation, orientation);
tfScalar yaw, pitch, roll;
tf::Matrix3x3(orientation).getEulerYPR(yaw, pitch, roll);
tf::Point position;
tf::pointMsgToTF(pose.position, position);
// position intermediate transform (x,y,z)
if( !g_position_frame_id.empty() && child_frame_id != g_position_frame_id) {
tf.child_frame_id_ = tf::resolve(g_tf_prefix, g_position_frame_id);
tf.setOrigin(tf::Vector3(position.x(), position.y(), position.z() ));
tf.setRotation(tf::Quaternion(0.0, 0.0, 0.0, 1.0));
addTransform(transforms, tf);
}
// footprint intermediate transform (x,y,yaw)
if (!g_footprint_frame_id.empty() && child_frame_id != g_footprint_frame_id) {
tf.child_frame_id_ = tf::resolve(g_tf_prefix, g_footprint_frame_id);
tf.setOrigin(tf::Vector3(position.x(), position.y(), 0.0));
tf.setRotation(tf::createQuaternionFromRPY(0.0, 0.0, yaw));
addTransform(transforms, tf);
yaw = 0.0;
position.setX(0.0);
position.setY(0.0);
tf.frame_id_ = tf::resolve(g_tf_prefix, g_footprint_frame_id);
}
// stabilized intermediate transform (z)
if (!g_footprint_frame_id.empty() && child_frame_id != g_stabilized_frame_id) {
tf.child_frame_id_ = tf::resolve(g_tf_prefix, g_stabilized_frame_id);
tf.setOrigin(tf::Vector3(0.0, 0.0, position.z()));
tf.setBasis(tf::Matrix3x3::getIdentity());
addTransform(transforms, tf);
position.setZ(0.0);
tf.frame_id_ = tf::resolve(g_tf_prefix, g_stabilized_frame_id);
}
// base_link transform (roll, pitch)
if (g_publish_roll_pitch) {
tf.child_frame_id_ = tf::resolve(g_tf_prefix, child_frame_id);
tf.setOrigin(position);
tf.setRotation(tf::createQuaternionFromRPY(roll, pitch, yaw));
addTransform(transforms, tf);
}
g_transform_broadcaster->sendTransform(transforms);
// publish pose message
if (g_pose_publisher) {
geometry_msgs::PoseStamped pose_stamped;
pose_stamped.pose = pose;
pose_stamped.header = header;
g_pose_publisher.publish(pose_stamped);
}
// publish pose message
if (g_euler_publisher) {
geometry_msgs::Vector3Stamped euler_stamped;
euler_stamped.vector.x = roll;
euler_stamped.vector.y = pitch;
euler_stamped.vector.z = yaw;
euler_stamped.header = header;
g_euler_publisher.publish(euler_stamped);
}
}