30 #include <OgreSceneNode.h> 31 #include <OgreSceneManager.h> 51 "Advanced: set the size of the incoming PointCloud2 message queue. " 52 " Increasing this is useful if your incoming TF data is delayed significantly " 53 "from your PointCloud2 data, but it can greatly increase memory usage if the messages are big.",
82 sensor_msgs::PointCloud2Ptr filtered(
new sensor_msgs::PointCloud2);
87 if (xi == -1 || yi == -1 || zi == -1)
92 const uint32_t xoff = cloud->fields[xi].offset;
93 const uint32_t yoff = cloud->fields[yi].offset;
94 const uint32_t zoff = cloud->fields[zi].offset;
95 const uint32_t point_step = cloud->point_step;
96 const size_t point_count = cloud->width * cloud->height;
98 if (point_count * point_step != cloud->data.size())
100 std::stringstream ss;
101 ss <<
"Data size (" << cloud->data.size() <<
" bytes) does not match width (" << cloud->width
102 <<
") times height (" << cloud->height <<
") times point_step (" << point_step
103 <<
"). Dropping message.";
108 filtered->data.resize(cloud->data.size());
109 uint32_t output_count;
110 if (point_count == 0)
116 uint8_t* output_ptr = &filtered->data.front();
117 const uint8_t *ptr = &cloud->data.front(), *ptr_end = &cloud->data.back(), *ptr_init;
118 size_t points_to_copy = 0;
119 for (; ptr < ptr_end; ptr += point_step)
121 float x = *
reinterpret_cast<const float*
>(ptr + xoff);
122 float y = *
reinterpret_cast<const float*
>(ptr + yoff);
123 float z = *
reinterpret_cast<const float*
>(ptr + zoff);
126 if (points_to_copy == 0)
142 memcpy(output_ptr, ptr_init, point_step * points_to_copy);
143 output_ptr += point_step * points_to_copy;
151 memcpy(output_ptr, ptr_init, point_step * points_to_copy);
152 output_ptr += point_step * points_to_copy;
154 output_count = (output_ptr - &filtered->data.front()) / point_step;
157 filtered->header = cloud->header;
158 filtered->fields = cloud->fields;
159 filtered->data.resize(output_count * point_step);
160 filtered->height = 1;
161 filtered->width = output_count;
162 filtered->is_bigendian = cloud->is_bigendian;
163 filtered->point_step = point_step;
164 filtered->row_step = output_count;
tf2_ros::MessageFilter< sensor_msgs::PointCloud2 > * tf_filter_
void setStatusStd(StatusProperty::Level level, const std::string &name, const std::string &text)
Show status level and text, using a std::string. Convenience function which converts std::string to Q...
DisplayContext * context_
This DisplayContext pointer is the main connection a Display has into the rest of rviz...
ros::NodeHandle update_nh_
A NodeHandle whose CallbackQueue is run from the main GUI thread (the "update" thread).
void onInitialize() override
Do initialization. Overridden from MessageFilterDisplay.
void initialize(DisplayContext *context, Ogre::SceneNode *scene_node)
void update(float wall_dt, float ros_dt) override
Called periodically by the visualization manager.
virtual void unsubscribe()
Property specialized to provide max/min enforcement for integers.
Ogre::SceneNode * scene_node_
The Ogre::SceneNode to hold all 3D scene elements shown by this Display.
Displays a point cloud of type sensor_msgs::PointCloud.
void processMessage(const sensor_msgs::PointCloud2ConstPtr &cloud) override
Process a single message. Overridden from MessageFilterDisplay.
IntProperty * queue_size_property_
bool validateFloats(const sensor_msgs::CameraInfo &msg)
void addMessage(const sensor_msgs::PointCloudConstPtr &cloud)
void setCallbackQueue(CallbackQueueInterface *queue)
~PointCloud2Display() override
virtual void setQueueSize(uint32_t new_queue_size)
virtual int getInt() const
Return the internal property value as an integer.
int32_t findChannelIndex(const sensor_msgs::PointCloud2ConstPtr &cloud, const std::string &channel)
void reset() override
Called to tell the display to clear its state.
void onInitialize() override
Displays a point cloud of type sensor_msgs::PointCloud2.
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
PointCloudCommon * point_cloud_common_
virtual ros::CallbackQueueInterface * getThreadedQueue()=0
Return a CallbackQueue using a different thread than the main GUI one.
void update(float wall_dt, float ros_dt)