Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add RSSDK 2.0 (librealsense2) grabber #2214

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
22ef192
Implement RealSense2Grabber and related cmake config (initial commit)
daniel-packard Feb 12, 2018
3c4ac27
modify config for in_hand_scanner to use realsense2grabber
daniel-packard Feb 13, 2018
f3b47cf
realsense grabber with namespace, makelist fix
patrickabadi Feb 13, 2018
f5ced03
exports for realsense grabber
patrickabadi Feb 13, 2018
dfa2b7c
Update RS2_FORMAT_RGB8 for realsense color stream
daniel-packard Feb 13, 2018
b8513c4
Improve FindLibRealSense.cmake with better NAMES/PATHS/HINTS for find…
daniel-packard Feb 14, 2018
85974ad
merging grabber into branch
patrickabadi Feb 14, 2018
3c4c73c
Patch out crs-develop changes to in_hand_scanner
daniel-packard Feb 14, 2018
7df5e65
RealSense2Grabber updates
patrickabadi Feb 14, 2018
56754ee
realsense2grabber fixes
patrickabadi Feb 14, 2018
2d3bdc6
remove .gitignore
daniel-packard Feb 15, 2018
0179fba
realsense grabber code updates
patrickabadi Feb 15, 2018
2f7b7a2
Add LIBREALSENSE_ROOT env var to cmake config to match other 3rdParty…
daniel-packard Feb 15, 2018
bc7e82e
Separating constructors
patrickabadi Feb 16, 2018
2c42a0c
Improvement on getting rgb from texture
patrickabadi Feb 16, 2018
7be6219
Use existing librealsense cmake config files instead of rolling our own.
daniel-packard Feb 16, 2018
4cf198d
aFix references to realsense2 cmake variables
daniel-packard Feb 18, 2018
8575522
Remove duplicated #include
daniel-packard Feb 18, 2018
f147759
Use PCL style include guard
daniel-packard Feb 18, 2018
4709f1f
Update docstring to be more accurate
daniel-packard Feb 18, 2018
9e09119
allow for setDeviceOptions while running
patrickabadi Feb 19, 2018
3f25e56
Remove unnecessary call to add realsense2 include directories
daniel-packard Feb 19, 2018
313e5f5
Include pcl headers, remove unnecessary forward declarations of cloud…
daniel-packard Feb 19, 2018
792ff4d
Add cmake all-in-one installer support for realsense2
daniel-packard Feb 19, 2018
5e780b2
Better handling of profile types and factory method constructors
patrickabadi Feb 22, 2018
d294aff
updating constructors
patrickabadi Feb 22, 2018
5bc175b
Update prefix from realsense2_ to RSSDK2_ for RSSDK 2.0 (librealsense…
daniel-packard Mar 1, 2018
8cf1d7e
Fix cmake references for rssdk2 module
daniel-packard Mar 2, 2018
6b88599
code optimizations. More to come.
patrickabadi Mar 13, 2018
1bd2270
fix unsigned int
patrickabadi Mar 13, 2018
9c6d641
Code refactoring
patrickabadi Mar 14, 2018
1831099
Experimental templated function for converting point clouds
daniel-packard Mar 15, 2018
3f7a587
- templated function working
patrickabadi Mar 15, 2018
ebc9067
lambda function start
patrickabadi Mar 15, 2018
b8ffae8
new convert functions using template
patrickabadi Mar 15, 2018
75cf960
cleanup
patrickabadi Mar 15, 2018
1a5db1f
Implemented signalschanged and code refactoring
patrickabadi Mar 26, 2018
bddc3bb
repeat playback when reading from file
patrickabadi May 14, 2018
43756c3
spacing fixes
patrickabadi May 16, 2018
d8a8923
Minor fixes post rebase
daniel-packard Apr 13, 2019
c42a013
- Remove virtual keyword from Realsense2Grabber methods, and replace
daniel-packard Jun 10, 2019
4be44f1
Update io/include/pcl/io/real_sense_2_grabber.h
patrickabadi Jun 11, 2019
1528a3d
Update io/include/pcl/io/real_sense_2_grabber.h
patrickabadi Jun 11, 2019
ed9e09f
Updated stop to handle multiple calls. Added thread and pipe to stop…
patrickabadi Jun 11, 2019
312bc25
Add static qualifier to getTextureColor and getTextureIntensity
daniel-packard Jun 11, 2019
69ba109
Add RSSDK2_FOUND message, replace ifndef include guard with pragma once
daniel-packard Jun 12, 2019
65fc64d
Remove mutex lock. Not needed
patrickabadi Jun 13, 2019
131775c
exception to ensure proper stream format
patrickabadi Jun 13, 2019
b5a5e9c
Remove redundant closing if(XYZ) conditional text
daniel-packard Jun 13, 2019
36d3653
Remove forward declarations of rgb, ir, only create on needed
daniel-packard Jun 17, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ PCL_ADD_GRABBER_DEPENDENCY("Ensenso" "IDS-Imaging Ensenso camera support")
PCL_ADD_GRABBER_DEPENDENCY("davidSDK" "David Vision Systems SDK support")
PCL_ADD_GRABBER_DEPENDENCY("DSSDK" "DepthSense SDK support")
PCL_ADD_GRABBER_DEPENDENCY("RSSDK" "RealSense SDK support")
PCL_ADD_GRABBER_DEPENDENCY("RSSDK2" "RealSense SDK 2.0 (librealsense) support")

# metslib
if(PKG_CONFIG_FOUND)
Expand Down
14 changes: 13 additions & 1 deletion PCLConfig.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,16 @@ macro(find_rssdk)
find_package(RSSDK)
endmacro()

macro(find_rssdk2)
if(PCL_ALL_IN_ONE_INSTALLER)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@UnaNancyOwen -- I feel like lines 216-221 are no longer necessary for the all-in-one installer, but can you please verify?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's necessary yet.
In case of PCL All-in-one Installer, realsense2_DIR needs to refer to PCL_ROOT/3rdParty/librealsense2.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved to librealsense2 in both places

set(realsense2_DIR "${PCL_ROOT}/3rdParty/librealsense2/lib/cmake/realsense2" CACHE PATH "The directory containing realsense2Config.cmake")
elseif(NOT realsense2_DIR)
get_filename_component(realsense2_DIR "@REALSENSE2_INCLUDE_DIRS@" PATH)
set(realsense2_DIR "${realsense2_DIR}/lib/cmake/realsense2" CACHE PATH "The directory containing realsense2Config.cmake")
endif()
find_package(RSSDK2)
endmacro()

Copy link
Member

@UnaNancyOwen UnaNancyOwen Feb 19, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change for PCL All-in-one Installer.

+ macro(find_realsense2)
+   if(PCL_ALL_IN_ONE_INSTALLER)
+     set(realsense2_DIR "${PCL_ROOT}/3rdParty/librealsense2/lib/cmake/realsense2" CACHE PATH "The directory containing realsense2Config.cmake")
+   elseif(NOT realsense2_DIR)
+     get_filename_component(realsense2_DIR "@REALSENSE2_INCLUDE_DIRS@" PATH)
+     set(realsense2_DIR "${realsense2_DIR}/lib/cmake/realsense2" CACHE PATH "The directory containing realsense2Config.cmake")
+   endif(PCL_ALL_IN_ONE_INSTALLER)
+ 
+   find_package(realsense2)
+ 
+   if(realsense2_FOUND)
+     set(REALSENSE2_FOUND ${realsense2_FOUND})
+     set(REALSENSE2_INCLUDE_DIRS ${realsense_INCLUDE_DIR})
+     set(REALSENSE2_LIBRARIES ${realsense2_LIBRARY})
+   endif()
+ endmacro(find_realsense2)

#remove this as soon as flann is shipped with FindFlann.cmake
macro(find_flann)
if(PCL_ALL_IN_ONE_INSTALLER)
Expand Down Expand Up @@ -295,6 +305,8 @@ macro(find_external_library _component _lib _is_optional)
find_dssdk()
elseif("${_lib}" STREQUAL "rssdk")
find_rssdk()
elseif("${_lib}" STREQUAL "rssdk2")
find_rssdk2()
elseif("${_lib}" STREQUAL "vtk")
find_VTK()
elseif("${_lib}" STREQUAL "libusb-1.0")
Expand Down Expand Up @@ -645,7 +657,7 @@ endif()
pcl_remove_duplicate_libraries(PCL_COMPONENTS PCL_LIBRARIES)

# Add 3rd party libraries, as user code might include our .HPP implementations
list(APPEND PCL_LIBRARIES ${BOOST_LIBRARIES} ${QHULL_LIBRARIES} ${OPENNI_LIBRARIES} ${OPENNI2_LIBRARIES} ${ENSENSO_LIBRARIES} ${davidSDK_LIBRARIES} ${DSSDK_LIBRARIES} ${RSSDK_LIBRARIES} ${VTK_LIBRARIES})
list(APPEND PCL_LIBRARIES ${BOOST_LIBRARIES} ${QHULL_LIBRARIES} ${OPENNI_LIBRARIES} ${OPENNI2_LIBRARIES} ${ENSENSO_LIBRARIES} ${davidSDK_LIBRARIES} ${DSSDK_LIBRARIES} ${RSSDK_LIBRARIES} ${RSSDK2_LIBRARIES} ${VTK_LIBRARIES})
if (TARGET FLANN::FLANN)
list(APPEND PCL_LIBRARIES FLANN::FLANN)
endif()
Expand Down
20 changes: 20 additions & 0 deletions cmake/Modules/FindRSSDK2.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
###############################################################################
# Find Intel RealSense SDK 2.0 (librealsense)
#
# find_package(RSSDK2)
#
# Variables defined by this module:
#
# RSSDK2_FOUND True if RealSense SDK 2.0 was found
# RSSDK2_INCLUDE_DIRS The location(s) of RealSense SDK 2.0 headers
# RSSDK2_LIBRARIES Libraries needed to use RealSense SDK 2.0

find_package(realsense2)

set(RSSDK2_FOUND ${realsense2_FOUND})
set(RSSDK2_INCLUDE_DIRS ${realsense2_INCLUDE_DIR})
set(RSSDK2_LIBRARIES ${realsense2_LIBRARY})

if(RSSDK2_FOUND)
message(STATUS "RealSense SDK 2 found (include: ${RSSDK2_INCLUDE_DIRS}, lib: ${RSSDK2_LIBRARIES}, version: ${realsense2_VERSION})")
endif()
11 changes: 11 additions & 0 deletions cmake/pcl_all_in_one_installer.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,17 @@ foreach(dep Eigen Boost Qhull FLANN VTK)
list(APPEND PCL_3RDPARTY_COMPONENTS ${dep})
endforeach()

if(WITH_RSSDK2)
get_filename_component(RSSDK2_ROOT "${RSSDK2_INCLUDE_DIRS}" PATH)
install(
DIRECTORY "${RSSDK2_ROOT}/"
DESTINATION 3rdParty/librealsense2
COMPONENT rssdk2
PATTERN "*/Uninstall.exe" EXCLUDE
)
list(APPEND PCL_3RDPARTY_COMPONENTS rssdk2)
endif()

if(WITH_OPENNI)
if(CMAKE_CL_64)
set(OPENNI_PACKAGE "OpenNI-Win64-1.5.4-Dev.msi")
Expand Down
19 changes: 17 additions & 2 deletions io/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ set(SUBSYS_DEPS common octree)
set(build TRUE)
PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
if(WIN32)
PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso davidSDK dssdk rssdk pcap png vtk)
PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso davidSDK dssdk rssdk rssdk2 pcap png vtk)
else()
PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso davidSDK dssdk pcap png vtk libusb-1.0)
PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso davidSDK dssdk rssdk2 pcap png vtk libusb-1.0)
endif()

PCL_ADD_DOC("${SUBSYS_NAME}")
Expand Down Expand Up @@ -160,6 +160,15 @@ if(WITH_RSSDK)
)
endif()

if(WITH_RSSDK2)
set(RSSDK2_GRABBER_INCLUDES
include/pcl/io/real_sense_2_grabber.h
)
set(RSSDK2_GRABBER_SOURCES
src/real_sense_2_grabber.cpp
)
endif()

if(LIBUSB_1_FOUND)
set(DINAST_GRABBER_INCLUDES
include/pcl/io/dinast_grabber.h
Expand Down Expand Up @@ -228,6 +237,7 @@ set(srcs
${DAVIDSDK_GRABBER_SOURCES}
${DSSDK_GRABBER_SOURCES}
${RSSDK_GRABBER_SOURCES}
${RSSDK2_GRABBER_SOURCES}
)

if(PNG_FOUND)
Expand Down Expand Up @@ -278,6 +288,7 @@ set(incs
${DAVIDSDK_GRABBER_INCLUDES}
${DSSDK_GRABBER_INCLUDES}
${RSSDK_GRABBER_INCLUDES}
${RSSDK2_GRABBER_INCLUDES}
"include/pcl/${SUBSYS_NAME}/pxc_grabber.h" # contains only depreciation note
)

Expand Down Expand Up @@ -365,6 +376,10 @@ if(WITH_RSSDK)
target_link_libraries(${LIB_NAME} ${RSSDK_LIBRARIES})
endif()

if(WITH_RSSDK2)
target_link_libraries(${LIB_NAME} ${RSSDK2_LIBRARIES})
endif()

if(PCAP_FOUND)
target_link_libraries("${LIB_NAME}" ${PCAP_LIBRARIES})
endif()
Expand Down
218 changes: 218 additions & 0 deletions io/include/pcl/io/real_sense_2_grabber.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
/*
* Software License Agreement (BSD License)
*
* Point Cloud Library (PCL) - www.pointclouds.org
* Copyright (c) 2018-, Open Perception, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of the copyright holder(s) nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/

#pragma once

#include <thread>
#include <mutex>

#include <pcl/io/boost.h>
#include <pcl/io/grabber.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>

#include <librealsense2/rs.hpp>

namespace pcl
{

/** \brief Grabber for Intel Realsense 2 SDK devices (D400 series)
* \note Device width/height defaults to 424/240, the lowest resolutions for D400 devices.
* \note Testing on the in_hand_scanner example we found the lower default resolution allowed the app to perform adequately.
* \note Developers should use this resolution as a starting point and gradually increase to get the best results
* \author Patrick Abadi <patrickabadi@gmail.com>, Daniel Packard <pack3754@gmail.com>
* \ingroup io
*/
class PCL_EXPORTS RealSense2Grabber : public pcl::Grabber
{
public:
/** \brief Constructor
* \param[in] file_name_or_serial_number used for either loading bag file or specific device by serial number
*/
RealSense2Grabber ( const std::string& file_name_or_serial_number = "", const bool repeat_playback = true );

/** \brief virtual Destructor inherited from the Grabber interface. It never throws. */
virtual ~RealSense2Grabber () noexcept;

/** \brief Set the device options
* \param[in] width resolution
* \param[in] height resolution
* \param[in] fps target frames per second for the device
*/
inline void
setDeviceOptions ( uint32_t width, uint32_t height, uint32_t fps = 30 )
{
device_width_ = width;
device_height_ = height;
target_fps_ = fps;

reInitialize ();
}
Copy link
Member

@UnaNancyOwen UnaNancyOwen Feb 18, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a consultation about the specification.
Currently, This feature is only valid before RealSense2Grabber::start().
Do you think that this feature should be enabled even after RealSense2Grabber::start()?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that this should be handled. Do you want to

  • A. Print an error informing the user that these settings can't be updated while the sensor is running, and return early before updating the member variables
  • or B. Print a warning informing the user that changes will not be applied until the sensor is stopped/started, and set the member variables so they will be picked up after the next stop/start
  • or C. ... other?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated setDeviceOptions so it would restart if it was currently running.


/** \brief Start the data acquisition. */
void
start () override;

/** \brief Stop the data acquisition. */
void
stop () override;

/** \brief Check if the data acquisition is still running. */
bool
isRunning () const override;

/** \brief Obtain the number of frames per second (FPS). */
float
getFramesPerSecond () const override;

/** \brief defined grabber name*/
std::string
getName () const override { return std::string ( "RealSense2Grabber" ); }

//define callback signature typedefs
typedef void (signal_librealsense_PointXYZ) ( const pcl::PointCloud<pcl::PointXYZ>::ConstPtr& );
typedef void (signal_librealsense_PointXYZI) ( const pcl::PointCloud<pcl::PointXYZI>::ConstPtr& );
typedef void (signal_librealsense_PointXYZRGB) ( const pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr& );
typedef void (signal_librealsense_PointXYZRGBA) ( const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr& );

protected:

boost::signals2::signal<signal_librealsense_PointXYZ>* signal_PointXYZ;
boost::signals2::signal<signal_librealsense_PointXYZI>* signal_PointXYZI;
boost::signals2::signal<signal_librealsense_PointXYZRGB>* signal_PointXYZRGB;
boost::signals2::signal<signal_librealsense_PointXYZRGBA>* signal_PointXYZRGBA;

/** \brief Handle when a signal callback has been changed
*/
void
signalsChanged () override;

/** \brief the thread function
*/
void
threadFunction ();

/** \brief Dynamic reinitialization.
*/
void
reInitialize ();

/** \brief Convert a Depth image to a pcl::PointCloud<pcl::PointXYZ>
* \param[in] points the depth points
*/
pcl::PointCloud<pcl::PointXYZ>::Ptr
convertDepthToPointXYZ ( const rs2::points& points );

/** \brief Convert an Infrared Depth image to a pcl::PointCloud<pcl::PointXYZI>
* \param[in] points the depth points
* \param[in] ir Infrared video frame
*/
pcl::PointCloud<pcl::PointXYZI>::Ptr
convertIntensityDepthToPointXYZRGBI ( const rs2::points& points, const rs2::video_frame& ir );

/** \brief Convert an rgb Depth image to a pcl::PointCloud<pcl::PointXYZRGB>
* \param[in] points the depth points
* \param[in] rgb rgb video frame
*/
pcl::PointCloud<pcl::PointXYZRGB>::Ptr
convertRGBDepthToPointXYZRGB ( const rs2::points& points, const rs2::video_frame& rgb );

/** \brief Convert an rgb Depth image to a pcl::PointCloud<pcl::PointXYZRGBA>
* \param[in] points the depth points
* \param[in] rgb rgb video frame
*/
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr
convertRGBADepthToPointXYZRGBA ( const rs2::points& points, const rs2::video_frame& rgb );

/** \brief template function to convert realsense point cloud to PCL point cloud
* \param[in] points - realsense point cloud array
* \param[in] dynamic function to convert individual point color or intensity values
*/
template <typename PointT, typename Functor>
typename pcl::PointCloud<PointT>::Ptr
convertRealsensePointsToPointCloud ( const rs2::points& points, Functor mapColorFunc );

/** \brief Retrieve pixel index for UV texture coordinate
* \param[in] texture the texture
* \param[in] u 2D coordinate
* \param[in] v 2D coordinate
*/
static size_t
getTextureIdx (const rs2::video_frame & texture, float u, float v);

/** \brief Retrieve RGB color from texture video frame
* \param[in] texture the texture
* \param[in] u 2D coordinate
* \param[in] v 2D coordinate
*/
static pcl::RGB
getTextureColor ( const rs2::video_frame& texture, float u, float v );

/** \brief Retrieve color intensity from texture video frame
* \param[in] texture the texture
* \param[in] u 2D coordinate
* \param[in] v 2D coordinate
*/
static uint8_t
getTextureIntensity ( const rs2::video_frame& texture, float u, float v );


/** \brief handle to the thread */
std::thread thread_;
/** \brief Defines either a file path to a bag file or a realsense device serial number. */
std::string file_name_or_serial_number_;
/** \brief Repeat playback when reading from file */
bool repeat_playback_;
/** \brief controlling the state of the thread. */
bool quit_;
/** \brief Is the grabber running. */
bool running_;
/** \brief Calculated FPS for the grabber. */
float fps_;
/** \brief Width for the depth and color sensor. Default 424*/
uint32_t device_width_;
/** \brief Height for the depth and color sensor. Default 240 */
uint32_t device_height_;
/** \brief Target FPS for the device. Default 30. */
uint32_t target_fps_;
/** \brief Declare pointcloud object, for calculating pointclouds and texture mappings */
rs2::pointcloud pc_;
/** \brief Declare RealSense pipeline, encapsulating the actual device and sensors */
rs2::pipeline pipe_;
};

}
Loading