Point Cloud Library (PCL) 1.13.0
Loading...
Searching...
No Matches
real_sense_2_grabber.h
1/*
2 * Software License Agreement (BSD License)
3 *
4 * Point Cloud Library (PCL) - www.pointclouds.org
5 * Copyright (c) 2018-, Open Perception, Inc.
6 *
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * * Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * * Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials provided
18 * with the distribution.
19 * * Neither the name of the copyright holder(s) nor the names of its
20 * contributors may be used to endorse or promote products derived
21 * from this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 *
36 */
37
38#pragma once
39
40#include <thread>
41#include <mutex>
42
43#include <pcl/io/grabber.h>
44#include <pcl/point_cloud.h>
45#include <pcl/point_types.h>
46
47#include <librealsense2/rs.hpp>
48
49namespace pcl
50{
51
52 /** \brief Grabber for Intel Realsense 2 SDK devices (D400 series)
53 * \note Device width/height defaults to 424/240, the lowest resolutions for D400 devices.
54 * \note Testing on the in_hand_scanner example we found the lower default resolution allowed the app to perform adequately.
55 * \note Developers should use this resolution as a starting point and gradually increase to get the best results
56 * \author Patrick Abadi <patrickabadi@gmail.com>, Daniel Packard <pack3754@gmail.com>
57 * \ingroup io
58 */
59 class PCL_EXPORTS RealSense2Grabber : public pcl::Grabber
60 {
61 public:
62 /** \brief Constructor
63 * \param[in] file_name_or_serial_number used for either loading bag file or specific device by serial number
64 * \param[in] repeat_playback whether to repeat playback when reading from file
65 */
66 RealSense2Grabber ( const std::string& file_name_or_serial_number = "", const bool repeat_playback = true );
67
68 /** \brief virtual Destructor inherited from the Grabber interface. It never throws. */
69 ~RealSense2Grabber () override;
70
71 /** \brief Set the device options
72 * \param[in] width resolution
73 * \param[in] height resolution
74 * \param[in] fps target frames per second for the device
75 */
76 inline void
77 setDeviceOptions ( std::uint32_t width, std::uint32_t height, std::uint32_t fps = 30 )
78 {
79 device_width_ = width;
80 device_height_ = height;
81 target_fps_ = fps;
82
83 reInitialize ();
84 }
85
86 /** \brief Start the data acquisition. */
87 void
88 start () override;
89
90 /** \brief Stop the data acquisition. */
91 void
92 stop () override;
93
94 /** \brief Check if the data acquisition is still running. */
95 bool
96 isRunning () const override;
97
98 /** \brief Obtain the number of frames per second (FPS). */
99 float
100 getFramesPerSecond () const override;
101
102 /** \brief defined grabber name*/
103 std::string
104 getName () const override { return std::string ( "RealSense2Grabber" ); }
105
106 //define callback signature typedefs
111
112 protected:
113
114 boost::signals2::signal<signal_librealsense_PointXYZ>* signal_PointXYZ;
115 boost::signals2::signal<signal_librealsense_PointXYZI>* signal_PointXYZI;
116 boost::signals2::signal<signal_librealsense_PointXYZRGB>* signal_PointXYZRGB;
117 boost::signals2::signal<signal_librealsense_PointXYZRGBA>* signal_PointXYZRGBA;
118
119 /** \brief Handle when a signal callback has been changed
120 */
121 void
122 signalsChanged () override;
123
124 /** \brief the thread function
125 */
126 void
128
129 /** \brief Dynamic reinitialization.
130 */
131 void
133
134 /** \brief Convert a Depth image to a pcl::PointCloud<pcl::PointXYZ>
135 * \param[in] points the depth points
136 */
138 convertDepthToPointXYZ ( const rs2::points& points );
139
140 /** \brief Convert an Infrared Depth image to a pcl::PointCloud<pcl::PointXYZI>
141 * \param[in] points the depth points
142 * \param[in] ir Infrared video frame
143 */
145 convertIntensityDepthToPointXYZRGBI ( const rs2::points& points, const rs2::video_frame& ir );
146
147 /** \brief Convert an rgb Depth image to a pcl::PointCloud<pcl::PointXYZRGB>
148 * \param[in] points the depth points
149 * \param[in] rgb rgb video frame
150 */
152 convertRGBDepthToPointXYZRGB ( const rs2::points& points, const rs2::video_frame& rgb );
153
154 /** \brief Convert an rgb Depth image to a pcl::PointCloud<pcl::PointXYZRGBA>
155 * \param[in] points the depth points
156 * \param[in] rgb rgb video frame
157 */
159 convertRGBADepthToPointXYZRGBA ( const rs2::points& points, const rs2::video_frame& rgb );
160
161 /** \brief template function to convert realsense point cloud to PCL point cloud
162 * \param[in] points - realsense point cloud array
163 * \param[in] mapColorFunc dynamic function to convert individual point color or intensity values
164 */
165 template <typename PointT, typename Functor>
167 convertRealsensePointsToPointCloud ( const rs2::points& points, Functor mapColorFunc );
168
169 /** \brief Retrieve pixel index for UV texture coordinate
170 * \param[in] texture the texture
171 * \param[in] u 2D coordinate
172 * \param[in] v 2D coordinate
173 */
174 static size_t
175 getTextureIdx (const rs2::video_frame & texture, float u, float v);
176
177 /** \brief Retrieve RGB color from texture video frame
178 * \param[in] texture the texture
179 * \param[in] u 2D coordinate
180 * \param[in] v 2D coordinate
181 */
182 static pcl::RGB
183 getTextureColor ( const rs2::video_frame& texture, float u, float v );
184
185 /** \brief Retrieve color intensity from texture video frame
186 * \param[in] texture the texture
187 * \param[in] u 2D coordinate
188 * \param[in] v 2D coordinate
189 */
190 static std::uint8_t
191 getTextureIntensity ( const rs2::video_frame& texture, float u, float v );
192
193
194 /** \brief handle to the thread */
195 std::thread thread_;
196 /** \brief Defines either a file path to a bag file or a realsense device serial number. */
198 /** \brief Repeat playback when reading from file */
200 /** \brief controlling the state of the thread. */
201 bool quit_;
202 /** \brief Is the grabber running. */
204 /** \brief Calculated FPS for the grabber. */
205 float fps_;
206 /** \brief Width for the depth and color sensor. Default 424*/
207 std::uint32_t device_width_;
208 /** \brief Height for the depth and color sensor. Default 240 */
209 std::uint32_t device_height_;
210 /** \brief Target FPS for the device. Default 30. */
211 std::uint32_t target_fps_;
212 /** \brief Declare pointcloud object, for calculating pointclouds and texture mappings */
213 rs2::pointcloud pc_;
214 /** \brief Declare RealSense pipeline, encapsulating the actual device and sensors */
215 rs2::pipeline pipe_;
216 };
217
218}
Grabber interface for PCL 1.x device drivers.
Definition grabber.h:60
shared_ptr< PointCloud< PointT > > Ptr
shared_ptr< const PointCloud< PointT > > ConstPtr
Grabber for Intel Realsense 2 SDK devices (D400 series)
pcl::PointCloud< pcl::PointXYZI >::Ptr convertIntensityDepthToPointXYZRGBI(const rs2::points &points, const rs2::video_frame &ir)
Convert an Infrared Depth image to a pcl::PointCloud<pcl::PointXYZI>
std::uint32_t device_height_
Height for the depth and color sensor.
std::thread thread_
handle to the thread
std::uint32_t device_width_
Width for the depth and color sensor.
float fps_
Calculated FPS for the grabber.
boost::signals2::signal< signal_librealsense_PointXYZ > * signal_PointXYZ
float getFramesPerSecond() const override
Obtain the number of frames per second (FPS).
void threadFunction()
the thread function
static std::uint8_t getTextureIntensity(const rs2::video_frame &texture, float u, float v)
Retrieve color intensity from texture video frame.
RealSense2Grabber(const std::string &file_name_or_serial_number="", const bool repeat_playback=true)
Constructor.
void(const pcl::PointCloud< pcl::PointXYZI >::ConstPtr &) signal_librealsense_PointXYZI
~RealSense2Grabber() override
virtual Destructor inherited from the Grabber interface.
boost::signals2::signal< signal_librealsense_PointXYZRGBA > * signal_PointXYZRGBA
bool running_
Is the grabber running.
void(const pcl::PointCloud< pcl::PointXYZ >::ConstPtr &) signal_librealsense_PointXYZ
void stop() override
Stop the data acquisition.
pcl::PointCloud< pcl::PointXYZRGBA >::Ptr convertRGBADepthToPointXYZRGBA(const rs2::points &points, const rs2::video_frame &rgb)
Convert an rgb Depth image to a pcl::PointCloud<pcl::PointXYZRGBA>
boost::signals2::signal< signal_librealsense_PointXYZI > * signal_PointXYZI
void(const pcl::PointCloud< pcl::PointXYZRGBA >::ConstPtr &) signal_librealsense_PointXYZRGBA
std::uint32_t target_fps_
Target FPS for the device.
pcl::PointCloud< pcl::PointXYZRGB >::Ptr convertRGBDepthToPointXYZRGB(const rs2::points &points, const rs2::video_frame &rgb)
Convert an rgb Depth image to a pcl::PointCloud<pcl::PointXYZRGB>
bool quit_
controlling the state of the thread.
pcl::PointCloud< pcl::PointXYZ >::Ptr convertDepthToPointXYZ(const rs2::points &points)
Convert a Depth image to a pcl::PointCloud<pcl::PointXYZ>
std::string file_name_or_serial_number_
Defines either a file path to a bag file or a realsense device serial number.
void(const pcl::PointCloud< pcl::PointXYZRGB >::ConstPtr &) signal_librealsense_PointXYZRGB
rs2::pointcloud pc_
Declare pointcloud object, for calculating pointclouds and texture mappings.
void reInitialize()
Dynamic reinitialization.
void setDeviceOptions(std::uint32_t width, std::uint32_t height, std::uint32_t fps=30)
Set the device options.
void signalsChanged() override
Handle when a signal callback has been changed.
pcl::PointCloud< PointT >::Ptr convertRealsensePointsToPointCloud(const rs2::points &points, Functor mapColorFunc)
template function to convert realsense point cloud to PCL point cloud
static size_t getTextureIdx(const rs2::video_frame &texture, float u, float v)
Retrieve pixel index for UV texture coordinate.
bool repeat_playback_
Repeat playback when reading from file.
static pcl::RGB getTextureColor(const rs2::video_frame &texture, float u, float v)
Retrieve RGB color from texture video frame.
bool isRunning() const override
Check if the data acquisition is still running.
rs2::pipeline pipe_
Declare RealSense pipeline, encapsulating the actual device and sensors.
void start() override
Start the data acquisition.
boost::signals2::signal< signal_librealsense_PointXYZRGB > * signal_PointXYZRGB
std::string getName() const override
defined grabber name
Defines all the PCL implemented PointT point type structures.
Base functor all the models that need non linear optimization must define their own one and implement...
Definition sac_model.h:679
A structure representing RGB color information.