00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <ros/ros.h>
00010 #include <angles/angles.h>
00011 #include <tf/transform_broadcaster.h>
00012
00013 #include <art/frames.h>
00014 #include <art_msgs/ArtHertz.h>
00015 #include <art_msgs/ArtVehicle.h>
00016
00017 #include <dynamic_reconfigure/server.h>
00018 #include <art_common/CameraTransformConfig.h>
00019
00039 #define NODE "vehicle_configurable_tf"
00040
00041 namespace
00042 {
00044
00045
00046 ros::Duration transform_post_date_(1.0/art_msgs::ArtHertz::VEHICLE_TF);
00047
00048
00049 ArtFrames::VehicleRelative vr_;
00050
00051 art_common::CameraTransformConfig config_;
00052 }
00053
00055 void broadcastTF(tf::TransformBroadcaster *tf_broadcaster,
00056 std::string device_frame,
00057 double x, double y, double z,
00058 double roll, double pitch, double yaw)
00059 {
00060
00061 tf::Quaternion q;
00062 q.setRPY(roll, pitch, yaw);
00063 geometry_msgs::Quaternion tf_quat;
00064 tf::quaternionTFToMsg(q, tf_quat);
00065
00066
00067 geometry_msgs::TransformStamped static_tf;
00068 static_tf.header.stamp = ros::Time::now() + transform_post_date_;
00069 static_tf.header.frame_id = vr_.getFrame(ArtFrames::vehicle);
00070 static_tf.child_frame_id = vr_.getFrame(device_frame);
00071 static_tf.transform.translation.x = x;
00072 static_tf.transform.translation.y = y;
00073 static_tf.transform.translation.z = z;
00074 static_tf.transform.rotation = tf_quat;
00075
00076 tf_broadcaster->sendTransform(static_tf);
00077 }
00078
00081 void opticalTF(tf::TransformBroadcaster *tf_broadcaster,
00082 std::string device_frame,
00083 double x, double y, double z,
00084 double roll, double pitch, double yaw)
00085 {
00086
00087 broadcastTF(tf_broadcaster, device_frame, x, y, z, roll, pitch, yaw);
00088
00089
00090 geometry_msgs::TransformStamped optical_tf;
00091 optical_tf.header.stamp = ros::Time::now() + transform_post_date_;
00092 optical_tf.header.frame_id = vr_.getFrame(device_frame);
00093 optical_tf.child_frame_id = vr_.getFrame(device_frame + "_optical");
00094
00095
00096 optical_tf.transform.rotation.w = 0.5;
00097 optical_tf.transform.rotation.x = -0.5;
00098 optical_tf.transform.rotation.y = 0.5;
00099 optical_tf.transform.rotation.z = -0.5;
00100
00101 tf_broadcaster->sendTransform(optical_tf);
00102 }
00103
00104 void callback(art_common::CameraTransformConfig &config, uint32_t level) {
00105 config_ = config;
00106 }
00107
00109 int main(int argc, char** argv)
00110 {
00111 ros::init(argc, argv, NODE);
00112 ros::NodeHandle node;
00113
00114 tf::TransformBroadcaster tf_broadcaster;
00115 vr_.getPrefixParam();
00116
00117 ros::Rate cycle(art_msgs::ArtHertz::VEHICLE_TF);
00118
00119
00120 dynamic_reconfigure::Server<art_common::CameraTransformConfig> srv;
00121 dynamic_reconfigure::Server<art_common::CameraTransformConfig>::CallbackType f = boost::bind(&callback, _1, _2);
00122 srv.setCallback(f);
00123
00124 ROS_INFO(NODE ": starting main loop");
00125
00126
00127 while(ros::ok())
00128 {
00129 using art_msgs::ArtVehicle;
00130
00131
00132 broadcastTF(&tf_broadcaster, ArtFrames::velodyne,
00133 config_.velodyne_px,
00134 config_.velodyne_py,
00135 config_.velodyne_pz,
00136 config_.velodyne_roll,
00137 config_.velodyne_pitch,
00138 config_.velodyne_yaw);
00139
00140
00141 broadcastTF(&tf_broadcaster, ArtFrames::front_sick,
00142 ArtVehicle::front_SICK_px,
00143 ArtVehicle::front_SICK_py,
00144 ArtVehicle::front_SICK_pz,
00145 ArtVehicle::front_SICK_roll,
00146 ArtVehicle::front_SICK_pitch,
00147 ArtVehicle::front_SICK_yaw);
00148
00149
00150 broadcastTF(&tf_broadcaster, ArtFrames::rear_sick,
00151 ArtVehicle::rear_SICK_px,
00152 ArtVehicle::rear_SICK_py,
00153 ArtVehicle::rear_SICK_pz,
00154 ArtVehicle::rear_SICK_roll,
00155 ArtVehicle::rear_SICK_pitch,
00156 ArtVehicle::rear_SICK_yaw);
00157
00158
00159 opticalTF(&tf_broadcaster, ArtFrames::left_front_camera,
00160 config_.left_front_camera_px,
00161 config_.left_front_camera_py,
00162 config_.left_front_camera_pz,
00163 config_.left_front_camera_roll,
00164 config_.left_front_camera_pitch,
00165 config_.left_front_camera_yaw);
00166
00167
00168 opticalTF(&tf_broadcaster, ArtFrames::center_front_camera,
00169 config_.center_front_camera_px,
00170 config_.center_front_camera_py,
00171 config_.center_front_camera_pz,
00172 config_.center_front_camera_roll,
00173 config_.center_front_camera_pitch,
00174 config_.center_front_camera_yaw);
00175
00176
00177 opticalTF(&tf_broadcaster, ArtFrames::right_front_camera,
00178 config_.right_front_camera_px,
00179 config_.right_front_camera_py,
00180 config_.right_front_camera_pz,
00181 config_.right_front_camera_roll,
00182 config_.right_front_camera_pitch,
00183 config_.right_front_camera_yaw);
00184
00185 ros::spinOnce();
00186 cycle.sleep();
00187 }
00188
00189 ROS_INFO(NODE ": exiting main loop");
00190
00191 return 0;
00192 }