in simulation_ws/src/rover/message_to_tf/src/message_to_tf.cpp [207:296]
int main(int argc, char** argv) {
ros::init(argc, argv, "message_to_tf");
g_footprint_frame_id = "base_footprint";
g_stabilized_frame_id = "base_stabilized";
// g_position_frame_id = "base_position";
// g_child_frame_id = "base_link";
ros::NodeHandle priv_nh("~");
priv_nh.getParam("odometry_topic", g_odometry_topic);
priv_nh.getParam("pose_topic", g_pose_topic);
priv_nh.getParam("imu_topic", g_imu_topic);
priv_nh.getParam("topic", g_topic);
priv_nh.getParam("frame_id", g_frame_id);
priv_nh.getParam("footprint_frame_id", g_footprint_frame_id);
priv_nh.getParam("position_frame_id", g_position_frame_id);
priv_nh.getParam("stabilized_frame_id", g_stabilized_frame_id);
priv_nh.getParam("child_frame_id", g_child_frame_id);
// get topic from the commandline
if (argc > 1) {
g_topic = argv[1];
g_odometry_topic.clear();
g_pose_topic.clear();
g_imu_topic.clear();
}
g_publish_roll_pitch = true;
priv_nh.getParam("publish_roll_pitch", g_publish_roll_pitch);
g_tf_prefix = tf::getPrefixParam(priv_nh);
g_transform_broadcaster = new tf::TransformBroadcaster;
ros::NodeHandle node;
ros::Subscriber sub1, sub2, sub3, sub4;
int subscribers = 0;
if (!g_odometry_topic.empty()) {
sub1 = node.subscribe(g_odometry_topic, 10, &odomCallback);
subscribers++;
}
if (!g_pose_topic.empty()) {
sub2 = node.subscribe(g_pose_topic, 10, &poseCallback);
subscribers++;
}
if (!g_imu_topic.empty()) {
sub3 = node.subscribe(g_imu_topic, 10, &imuCallback);
subscribers++;
}
if (!g_topic.empty()) {
sub4 = node.subscribe(g_topic, 10, &multiCallback);
subscribers++;
}
if (subscribers == 0) {
ROS_FATAL("Usage: rosrun message_to_tf message_to_tf <topic>");
return 1;
} else if (subscribers > 1) {
ROS_FATAL("More than one of the parameters odometry_topic, pose_topic, imu_topic and topic are set.\n"
"Please specify exactly one of them or simply add the topic name to the command line.");
return 1;
}
bool publish_pose = true;
priv_nh.getParam("publish_pose", publish_pose);
if (publish_pose) {
std::string publish_pose_topic;
priv_nh.getParam("publish_pose_topic", publish_pose_topic);
if (!publish_pose_topic.empty())
g_pose_publisher = node.advertise<geometry_msgs::PoseStamped>(publish_pose_topic, 10);
else
g_pose_publisher = priv_nh.advertise<geometry_msgs::PoseStamped>("pose", 10);
}
bool publish_euler = true;
priv_nh.getParam("publish_euler", publish_euler);
if (publish_euler) {
std::string publish_euler_topic;
priv_nh.getParam("publish_euler_topic", publish_euler_topic);
if (!publish_euler_topic.empty())
g_euler_publisher = node.advertise<geometry_msgs::Vector3Stamped>(publish_euler_topic, 10);
else
g_euler_publisher = priv_nh.advertise<geometry_msgs::Vector3Stamped>("euler", 10);
}
ros::spin();
delete g_transform_broadcaster;
return 0;
}