00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef POINT_CLOUD_TRANSFORMERS_H
00031 #define POINT_CLOUD_TRANSFORMERS_H
00032
00033 #include "point_cloud_transformer.h"
00034 #include <rviz/helpers/color.h>
00035 #include <sensor_msgs/PointCloud2.h>
00036
00037 namespace rviz
00038 {
00039
00040 typedef std::vector<std::string> V_string;
00041
00042 inline int32_t findChannelIndex(const sensor_msgs::PointCloud2ConstPtr& cloud, const std::string& channel)
00043 {
00044 for (size_t i = 0; i < cloud->fields.size(); ++i)
00045 {
00046 if (cloud->fields[i].name == channel)
00047 {
00048 return i;
00049 }
00050 }
00051
00052 return -1;
00053 }
00054
00055 template<typename T>
00056 inline T valueFromCloud(const sensor_msgs::PointCloud2ConstPtr& cloud, uint32_t offset, uint8_t type, uint32_t point_step, uint32_t index)
00057 {
00058 const uint8_t* data = &cloud->data[(point_step * index) + offset];
00059 T ret = 0;
00060
00061 switch (type)
00062 {
00063 case sensor_msgs::PointField::INT8:
00064 case sensor_msgs::PointField::UINT8:
00065 {
00066 uint8_t val = *reinterpret_cast<const uint8_t*>(data);
00067 ret = static_cast<T>(val);
00068 break;
00069 }
00070
00071 case sensor_msgs::PointField::INT16:
00072 case sensor_msgs::PointField::UINT16:
00073 {
00074 uint16_t val = *reinterpret_cast<const uint16_t*>(data);
00075 ret = static_cast<T>(val);
00076 break;
00077 }
00078
00079 case sensor_msgs::PointField::INT32:
00080 case sensor_msgs::PointField::UINT32:
00081 {
00082 uint32_t val = *reinterpret_cast<const uint32_t*>(data);
00083 ret = static_cast<T>(val);
00084 break;
00085 }
00086
00087 case sensor_msgs::PointField::FLOAT32:
00088 {
00089 float val = *reinterpret_cast<const float*>(data);
00090 ret = static_cast<T>(val);
00091 break;
00092 }
00093
00094 case sensor_msgs::PointField::FLOAT64:
00095 {
00096 double val = *reinterpret_cast<const double*>(data);
00097 ret = static_cast<T>(val);
00098 break;
00099 }
00100 default:
00101 break;
00102 }
00103
00104 return ret;
00105 }
00106
00107 class IntensityPCTransformer : public PointCloudTransformer
00108 {
00109 public:
00110 IntensityPCTransformer()
00111 : min_color_( 0.0f, 0.0f, 0.0f )
00112 , max_color_( 1.0f, 1.0f, 1.0f )
00113 , min_intensity_(0.0f)
00114 , max_intensity_(4096.0f)
00115 , use_full_rgb_colors_(false)
00116 , selected_channel_("intensity")
00117 {
00118 setAutoComputeIntensityBounds(true);
00119 }
00120
00121 virtual uint8_t supports(const sensor_msgs::PointCloud2ConstPtr& cloud);
00122 virtual bool transform(const sensor_msgs::PointCloud2ConstPtr& cloud, uint32_t mask, const Ogre::Matrix4& transform, PointCloud& out);
00123 virtual uint8_t score(const sensor_msgs::PointCloud2ConstPtr& cloud);
00124 virtual void reset();
00125 virtual void createProperties(PropertyManager* property_man, const CategoryPropertyWPtr& parent, const std::string& prefix, uint32_t mask, V_PropertyBaseWPtr& out_props);
00126
00127 void setMinColor( const Color& color );
00128 void setMaxColor( const Color& color );
00129 const Color& getMaxColor() { return max_color_; }
00130 const Color& getMinColor() { return min_color_; }
00131 void setMinIntensity(float val);
00132 void setMaxIntensity(float val);
00133 float getMinIntensity() { return min_intensity_; }
00134 float getMaxIntensity() { return max_intensity_; }
00135 void setAutoComputeIntensityBounds(bool compute);
00136 bool getAutoComputeIntensityBounds() { return auto_compute_intensity_bounds_; }
00137 void setUseFullRGBColors(bool full_rgb);
00138 bool getUseFullRGBColors() { return use_full_rgb_colors_; }
00139 const std::string& getChannelName() { return selected_channel_; }
00140 void setChannelName(const std::string& channel);
00141 void updateChannels(const sensor_msgs::PointCloud2ConstPtr& cloud);
00142
00143 private:
00144 Color min_color_;
00145 Color max_color_;
00146 float min_intensity_;
00147 float max_intensity_;
00148 bool auto_compute_intensity_bounds_;
00149 bool use_full_rgb_colors_;
00150 bool intensity_bounds_changed_;
00151 std::string selected_channel_;
00152 V_string available_channels_;
00153
00154 ColorPropertyWPtr min_color_property_;
00155 ColorPropertyWPtr max_color_property_;
00156 BoolPropertyWPtr auto_compute_intensity_bounds_property_;
00157 BoolPropertyWPtr use_full_rgb_colors_property_;
00158 FloatPropertyWPtr min_intensity_property_;
00159 FloatPropertyWPtr max_intensity_property_;
00160 EditEnumPropertyWPtr channel_name_property_;
00161
00162 RetransformFunc retransform_func_;
00163 };
00164
00165 class XYZPCTransformer : public PointCloudTransformer
00166 {
00167 public:
00168 XYZPCTransformer()
00169 {}
00170
00171 virtual uint8_t supports(const sensor_msgs::PointCloud2ConstPtr& cloud);
00172 virtual bool transform(const sensor_msgs::PointCloud2ConstPtr& cloud, uint32_t mask, const Ogre::Matrix4& transform, PointCloud& out);
00173 };
00174
00175
00176
00177 class RGB8PCTransformer : public PointCloudTransformer
00178 {
00179 public:
00180 virtual uint8_t supports(const sensor_msgs::PointCloud2ConstPtr& cloud);
00181 virtual bool transform(const sensor_msgs::PointCloud2ConstPtr& cloud, uint32_t mask, const Ogre::Matrix4& transform, PointCloud& out);
00182 };
00183
00184
00185
00186 class RGBF32PCTransformer : public PointCloudTransformer
00187 {
00188 public:
00189 virtual uint8_t supports(const sensor_msgs::PointCloud2ConstPtr& cloud);
00190 virtual bool transform(const sensor_msgs::PointCloud2ConstPtr& cloud, uint32_t mask, const Ogre::Matrix4& transform, PointCloud& out);
00191 };
00192
00193
00194
00195 class FlatColorPCTransformer : public PointCloudTransformer
00196 {
00197 public:
00198 FlatColorPCTransformer()
00199 : color_(1.0, 1.0, 1.0)
00200 {}
00201
00202 virtual uint8_t supports(const sensor_msgs::PointCloud2ConstPtr& cloud);
00203 virtual bool transform(const sensor_msgs::PointCloud2ConstPtr& cloud, uint32_t mask, const Ogre::Matrix4& transform, PointCloud& out);
00204 virtual void createProperties(PropertyManager* property_man, const CategoryPropertyWPtr& parent, const std::string& prefix, uint32_t mask, V_PropertyBaseWPtr& out_props);
00205 virtual uint8_t score(const sensor_msgs::PointCloud2ConstPtr& cloud);
00206
00207 void setColor(const Color& color);
00208 const Color& getColor() { return color_; }
00209
00210 private:
00211 Color color_;
00212 ColorPropertyWPtr color_property_;
00213 };
00214
00215 class AxisColorPCTransformer : public PointCloudTransformer
00216 {
00217 public:
00218 AxisColorPCTransformer()
00219 : min_value_(-10.0f)
00220 , max_value_(10.0f)
00221 , use_fixed_frame_(true)
00222 , axis_(AXIS_Z)
00223 {
00224 setAutoComputeBounds(true);
00225 }
00226
00227 virtual uint8_t supports(const sensor_msgs::PointCloud2ConstPtr& cloud);
00228 virtual bool transform(const sensor_msgs::PointCloud2ConstPtr& cloud, uint32_t mask, const Ogre::Matrix4& transform, PointCloud& out);
00229 virtual void createProperties(PropertyManager* property_man, const CategoryPropertyWPtr& parent, const std::string& prefix, uint32_t mask, V_PropertyBaseWPtr& out_props);
00230 virtual uint8_t score(const sensor_msgs::PointCloud2ConstPtr& cloud);
00231
00232 void setMinValue(float val);
00233 void setMaxValue(float val);
00234 float getMinValue() { return min_value_; }
00235 float getMaxValue() { return max_value_; }
00236 void setAutoComputeBounds(bool compute);
00237 bool getAutoComputeBounds() { return auto_compute_bounds_; }
00238
00239 void setUseFixedFrame(bool use);
00240 bool getUseFixedFrame() { return use_fixed_frame_; }
00241
00242 enum Axis
00243 {
00244 AXIS_X,
00245 AXIS_Y,
00246 AXIS_Z
00247 };
00248
00249 void setAxis(int axis);
00250 int getAxis() { return axis_; }
00251
00252 private:
00253
00254 float min_value_;
00255 float max_value_;
00256
00257 bool auto_compute_bounds_;
00258 bool use_fixed_frame_;
00259
00260 int axis_;
00261
00262 BoolPropertyWPtr auto_compute_bounds_property_;
00263 FloatPropertyWPtr min_value_property_;
00264 FloatPropertyWPtr max_value_property_;
00265 EnumPropertyWPtr axis_property_;
00266 BoolPropertyWPtr use_fixed_frame_property_;
00267 };
00268
00269
00270 }
00271
00272 #endif // POINT_CLOUD_TRANSFORMERS_H