Go to the documentation of this file.00001 #ifndef LASER_TRANSFORM_CORE_H
00002 #define LASER_TRANSFORM_CORE_H
00003
00004
00005 #include <fstream>
00006 #include "ros/ros.h"
00007 #include "ros/time.h"
00008 #include "pcl_ros/transforms.h"
00009 #include "sensor_msgs/PointCloud2.h"
00010 #include "nav_msgs/Odometry.h"
00011 #include "ip_connection.h"
00012 #include "brick_imu.h"
00013 #include "brick_imu_v2.h"
00014 #include "bricklet_gps.h"
00015 #include "bricklet_industrial_digital_in_4.h"
00016 #include "bricklet_dual_button.h"
00017 #include "octomap_msgs/BoundingBoxQuery.h"
00018
00019 #define M_PI 3.14159265358979323846
00020
00021 class LaserTransform
00022 {
00023 public:
00025 LaserTransform();
00026
00028 ~LaserTransform();
00029
00031 int init();
00032
00034 void publishPclMessage(ros::Publisher *pub_message);
00035
00037 void publishImuMessage(ros::Publisher *pub_message);
00038
00040 void publishNavSatFixMessage(ros::Publisher *pub_message);
00041
00043 void publishMagneticFieldMessage(ros::Publisher *pub_message);
00044
00046 void publishOdometryMessage(ros::Publisher *pub_message);
00047
00049 void callbackPcl(const sensor_msgs::PointCloud2::ConstPtr& msg);
00050
00052 void callbackOdometryFiltered(const nav_msgs::Odometry::ConstPtr& msg);
00053
00055 void setLaserPose(double x, double y, double z, double yaw, double pitch, double roll);
00056
00058 void checkConvergenceSpeed();
00059
00061 void clearOctomap(ros::ServiceClient *client);
00062
00064 void setPclPublisher(ros::Publisher *pub)
00065 {
00066 pcl_pub = pub;
00067 }
00068 public:
00070 int setImuConvergenceSpeed(uint16_t imu_convergence_speed)
00071 {
00072 this->imu_convergence_speed = imu_convergence_speed;
00073 return 0;
00074 }
00075 private:
00077 static void callbackConnected(uint8_t connect_reason, void *user_data);
00078
00080 static void callbackEnumerate(const char *uid, const char *connected_uid,
00081 char position, uint8_t hardware_version[3],
00082 uint8_t firmware_version[3], uint16_t device_identifier,
00083 uint8_t enumeration_type, void *user_data);
00084
00086 static void callbackIdi4(uint8_t interrupt_mask, uint8_t value_mask, void *user_data);
00087
00089 static void callbackDb(uint8_t button_l, uint8_t button_r,
00090 uint8_t led_l, uint8_t led_r,
00091 void *user_data);
00092
00094 tf::Quaternion getQuaternion();
00095
00097 int getPosition(float *x_pos, float *y_pos, float *z_pos);
00098
00100 float rad2deg(float x)
00101 {
00102 return x*180.0/M_PI;
00103 }
00104
00106 float deg2rad(float x)
00107 {
00108 return x*M_PI/180.0;
00109 }
00110 private:
00112 ros::Publisher *pcl_pub;
00114 IPConnection ipcon;
00116 IMU imu;
00118 bool is_imu_connected;
00120 int imu_convergence_speed;
00122 ros::Time imu_init_time;
00124 IMUV2 imu_v2;
00126 bool is_imu_v2_connected;
00128 GPS gps;
00130 bool is_gps_connected;
00132 IndustrialDigitalIn4 idi4;
00134 uint16_t rpm_cnt;
00136 bool is_idi4_connected;
00138 DualButton db;
00140 bool isMeasure;
00142 float rev;
00144 ros::Time last_rev;
00146 sensor_msgs::PointCloud2 pcl_out;
00148 bool publish_new_pcl;
00150 bool new_pcl_filtered;
00152 double start_latitude;
00154 double start_longitude;
00156 tf::Transform laser_pose;
00158
00160 bool isPlc;
00162 float xpos;
00164 float ypos;
00166 float velocity;
00168 float velocity_gps;
00170 float course_gps;
00171 float yy;
00173 std::fstream gps_log;
00175 std::fstream velo_log;
00177 std::fstream full_log;
00178 };
00179
00180 #endif