Skip to content

Commit

Permalink
Merge pull request #1401 from taketwo/add-real-sense
Browse files Browse the repository at this point in the history
Add RealSense SDK grabber and viewer
  • Loading branch information
jspricke committed Oct 25, 2015
2 parents e95b37a + 9950402 commit 2cfecb0
Show file tree
Hide file tree
Showing 12 changed files with 1,713 additions and 3 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ PCL_ADD_GRABBER_DEPENDENCY("FZAPI" "Fotonic camera support")
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")

# metslib
if (PKG_CONFIG_FOUND)
Expand Down
41 changes: 40 additions & 1 deletion PCLConfig.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,43 @@ macro(find_dssdk)
endif()
endmacro(find_dssdk)

macro(find_rssdk)
if(NOT RSSDK_DIR AND ("@HAVE_RSSDK@" STREQUAL "TRUE"))
get_filename_component(RSSDK_DIR_HINT "@RSSDK_INCLUDE_DIRS@" PATH)
endif()
find_path(RSSDK_DIR include/pxcversion.h
HINTS ${RSSDK_DIR_HINT}
PATHS "$ENV{RSSDK_DIR}"
"$ENV{PROGRAMFILES}/Intel/RSSDK"
"$ENV{PROGRAMW6432}/Intel/RSSDK"
"C:/Program Files (x86)/Intel/RSSDK"
"C:/Program Files/Intel/RSSDK"
DOC "RealSense SDK directory")
set(_RSSDK_INCLUDE_DIRS ${RSSDK_DIR}/include)
set(RSSDK_RELEASE_NAME libpxc.lib)
set(RSSDK_DEBUG_NAME libpxc_d.lib)
find_library(RSSDK_LIBRARY
NAMES ${RSSDK_RELEASE_NAME}
PATHS "${RSSDK_DIR}/lib/" NO_DEFAULT_PATH
PATH_SUFFIXES x64 Win32)
find_library(RSSDK_LIBRARY_DEBUG
NAMES ${RSSDK_DEBUG_NAME} ${RSSDK_RELEASE_NAME}
PATHS "${RSSDK_DIR}/lib/" NO_DEFAULT_PATH
PATH_SUFFIXES x64 Win32)
if(NOT RSSDK_LIBRARY_DEBUG)
set(RSSDK_LIBRARY_DEBUG ${RSSDK_LIBRARY})
endif()
set(_RSSDK_LIBRARIES optimized ${RSSDK_LIBRARY} debug ${RSSDK_LIBRARY_DEBUG})
mark_as_advanced(RSSDK_LIBRARY RSSDK_LIBRARY_DEBUG)
find_package_handle_standard_args(RSSDK DEFAULT_MSG _RSSDK_LIBRARIES _RSSDK_INCLUDE_DIRS)
if(RSSDK_FOUND)
set(RSSDK_LIBRARIES ${_RSSDK_LIBRARIES})
mark_as_advanced(RSSDK_LIBRARIES)
set(RSSDK_INCLUDE_DIRS ${_RSSDK_INCLUDE_DIRS})
mark_as_advanced(RSSDK_INCLUDE_DIRS)
endif()
endmacro(find_rssdk)

#remove this as soon as flann is shipped with FindFlann.cmake
macro(find_flann)
if(PCL_ALL_IN_ONE_INSTALLER)
Expand Down Expand Up @@ -549,6 +586,8 @@ macro(find_external_library _component _lib _is_optional)
find_davidSDK()
elseif("${_lib}" STREQUAL "dssdk")
find_dssdk()
elseif("${_lib}" STREQUAL "rssdk")
find_rssdk()
elseif("${_lib}" STREQUAL "vtk")
find_VTK()
elseif("${_lib}" STREQUAL "libusb-1.0")
Expand Down Expand Up @@ -825,7 +864,7 @@ endif(NOT "${PCL_DEFINITIONS}" STREQUAL "")
pcl_remove_duplicate_libraries(PCL_LIBRARIES PCL_DEDUP_LIBRARIES)
set(PCL_LIBRARIES ${PCL_DEDUP_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} ${FLANN_LIBRARIES} ${VTK_LIBRARIES})
list(APPEND PCL_LIBRARIES ${BOOST_LIBRARIES} ${QHULL_LIBRARIES} ${OPENNI_LIBRARIES} ${OPENNI2_LIBRARIES} ${ENSENSO_LIBRARIES} ${davidSDK_LIBRARIES} ${DSSDK_LIBRARIES} ${RSSDK_LIBRARIES} ${FLANN_LIBRARIES} ${VTK_LIBRARIES})

find_package_handle_standard_args(PCL DEFAULT_MSG PCL_LIBRARIES PCL_INCLUDE_DIRS)
mark_as_advanced(PCL_LIBRARIES PCL_INCLUDE_DIRS PCL_LIBRARY_DIRS)
Expand Down
67 changes: 67 additions & 0 deletions cmake/Modules/FindRSSDK.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
###############################################################################
# Find Intel RealSense SDK
#
# find_package(RSSDK)
#
# Variables defined by this module:
#
# RSSDK_FOUND True if RealSense SDK was found
# RSSDK_VERSION The version of RealSense SDK
# RSSDK_INCLUDE_DIRS The location(s) of RealSense SDK headers
# RSSDK_LIBRARIES Libraries needed to use RealSense SDK

find_path(RSSDK_DIR include/pxcversion.h
PATHS "$ENV{RSSDK_DIR}"
"$ENV{PROGRAMFILES}/Intel/RSSDK"
"$ENV{PROGRAMW6432}/Intel/RSSDK"
"C:/Program Files (x86)/Intel/RSSDK"
"C:/Program Files/Intel/RSSDK"
DOC "RealSense SDK directory")

if(RSSDK_DIR)

# Include directories
set(RSSDK_INCLUDE_DIRS ${RSSDK_DIR}/include)
mark_as_advanced(RSSDK_INCLUDE_DIRS)

# Libraries
set(RSSDK_RELEASE_NAME libpxc.lib)
set(RSSDK_DEBUG_NAME libpxc_d.lib)
find_library(RSSDK_LIBRARY
NAMES ${RSSDK_RELEASE_NAME}
PATHS "${RSSDK_DIR}/lib/" NO_DEFAULT_PATH
PATH_SUFFIXES x64 Win32)
find_library(RSSDK_LIBRARY_DEBUG
NAMES ${RSSDK_DEBUG_NAME} ${RSSDK_RELEASE_NAME}
PATHS "${RSSDK_DIR}/lib/" NO_DEFAULT_PATH
PATH_SUFFIXES x64 Win32)
if(NOT RSSDK_LIBRARY_DEBUG)
set(RSSDK_LIBRARY_DEBUG ${RSSDK_LIBRARY})
endif()
set(RSSDK_LIBRARIES optimized ${RSSDK_LIBRARY} debug ${RSSDK_LIBRARY_DEBUG})
mark_as_advanced(RSSDK_LIBRARY RSSDK_LIBRARY_DEBUG)

# Version
set(RSSDK_VERSION 0)
file(STRINGS "${RSSDK_INCLUDE_DIRS}/pxcversion.h" _pxcversion_H_CONTENTS REGEX "#define PXC_VERSION_.*")
set(_RSSDK_VERSION_REGEX "([0-9]+)")
foreach(v MAJOR MINOR BUILD REVISION)
if("${_pxcversion_H_CONTENTS}" MATCHES ".*#define PXC_VERSION_${v} *${_RSSDK_VERSION_REGEX}.*")
set(RSSDK_VERSION_${v} "${CMAKE_MATCH_1}")
endif()
endforeach()
unset(_pxcversion_H_CONTENTS)
set(RSSDK_VERSION "${RSSDK_VERSION_MAJOR}.${RSSDK_VERSION_MINOR}.${RSSDK_VERSION_BUILD}.${RSSDK_VERSION_REVISION}")

endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(RSSDK
FOUND_VAR RSSDK_FOUND
REQUIRED_VARS RSSDK_LIBRARIES RSSDK_INCLUDE_DIRS
VERSION_VAR RSSDK_VERSION
)

if(MSVC)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NODEFAULTLIB:LIBCMTD")
endif()
1 change: 1 addition & 0 deletions doc/doxygen/doxyfile.in
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ PREDEFINED = = "HAVE_QHULL=1" \
"HAVE_ENSENSO=1" \
"HAVE_DAVIDSDK=1" \
"HAVE_DSSDK=1" \
"HAVE_RSSDK=1" \
"PCL_DEPRECATED(x)="
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
Expand Down
18 changes: 17 additions & 1 deletion io/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ 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 pcap png vtk)
PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso davidSDK dssdk rssdk pcap png vtk)
else(WIN32)
PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso davidSDK dssdk pcap png vtk libusb-1.0)
endif(WIN32)
Expand Down Expand Up @@ -150,6 +150,16 @@ if(build)
)
endif()

if(WITH_RSSDK)
set(RSSDK_GRABBER_INCLUDES
include/pcl/io/real_sense_grabber.h
)
set(RSSDK_GRABBER_SOURCES
src/real_sense_grabber.cpp
src/real_sense/real_sense_device_manager.cpp
)
endif()

if(LIBUSB_1_FOUND)
set(DINAST_GRABBER_INCLUDES
include/pcl/io/dinast_grabber.h
Expand Down Expand Up @@ -215,6 +225,7 @@ if(build)
${ENSENSO_GRABBER_SOURCES}
${DAVIDSDK_GRABBER_SOURCES}
${DSSDK_GRABBER_SOURCES}
${RSSDK_GRABBER_SOURCES}
)
if(PNG_FOUND)
list(APPEND srcs
Expand Down Expand Up @@ -261,6 +272,7 @@ if(build)
${ENSENSO_GRABBER_INCLUDES}
${DAVIDSDK_GRABBER_INCLUDES}
${DSSDK_GRABBER_INCLUDES}
${RSSDK_GRABBER_INCLUDES}
"include/pcl/${SUBSYS_NAME}/pxc_grabber.h" # contains only depreciation note
)

Expand Down Expand Up @@ -341,6 +353,10 @@ if(build)
target_link_libraries(${LIB_NAME} ${DSSDK_LIBRARIES})
endif()

if(WITH_RSSDK)
target_link_libraries(${LIB_NAME} ${RSSDK_LIBRARIES})
endif()

if (PCAP_FOUND)
target_link_libraries("${LIB_NAME}" ${PCAP_LIBRARIES})
endif(PCAP_FOUND)
Expand Down
175 changes: 175 additions & 0 deletions io/include/pcl/io/real_sense/real_sense_device_manager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
/*
* Software License Agreement (BSD License)
*
* Point Cloud Library (PCL) - www.pointclouds.org
* Copyright (c) 2015-, 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.
*
*/

#ifndef PCL_IO_REAL_SENSE_DEVICE_MANAGER_H
#define PCL_IO_REAL_SENSE_DEVICE_MANAGER_H

#include <boost/thread.hpp>
#include <boost/utility.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread/mutex.hpp>

#include <pcl/pcl_exports.h>

#include <pxcsession.h>
#include <pxccapture.h>
#include <pxccapturemanager.h>

namespace pcl
{

class RealSenseGrabber;

namespace io
{

namespace real_sense
{

class RealSenseDevice;

class PCL_EXPORTS RealSenseDeviceManager : boost::noncopyable
{

public:

typedef boost::shared_ptr<RealSenseDeviceManager> Ptr;

static Ptr&
getInstance ()
{
static Ptr instance;
if (!instance)
{
boost::mutex::scoped_lock lock (mutex_);
if (!instance)
instance.reset (new RealSenseDeviceManager);
}
return (instance);
}

inline size_t
getNumDevices ()
{
return (device_list_.size ());
}

boost::shared_ptr<RealSenseDevice>
captureDevice ();

boost::shared_ptr<RealSenseDevice>
captureDevice (size_t index);

boost::shared_ptr<RealSenseDevice>
captureDevice (const std::string& sn);

~RealSenseDeviceManager ();

private:

struct DeviceInfo
{
pxcUID iuid;
pxcI32 didx;
std::string serial;
boost::weak_ptr<RealSenseDevice> device_ptr;
inline bool isCaptured () { return (!device_ptr.expired ()); }
};

/** If the device is already captured returns a pointer. */
boost::shared_ptr<RealSenseDevice>
capture (DeviceInfo& device_info);

RealSenseDeviceManager ();

/** This function discovers devices that are capable of streaming
* depth data. */
void
populateDeviceList ();

boost::shared_ptr<PXCSession> session_;
boost::shared_ptr<PXCCaptureManager> capture_manager_;

std::vector<DeviceInfo> device_list_;

static boost::mutex mutex_;

};

class PCL_EXPORTS RealSenseDevice : boost::noncopyable
{

public:

typedef boost::shared_ptr<RealSenseDevice> Ptr;

inline const std::string&
getSerialNumber () { return (device_id_); }

inline PXCCapture::Device&
getPXCDevice () { return (*device_); }

/** Reset the state of given device by releasing and capturing again. */
static void
reset (RealSenseDevice::Ptr& device)
{
std::string id = device->getSerialNumber ();
device.reset ();
device = RealSenseDeviceManager::getInstance ()->captureDevice (id);
}

private:

friend class RealSenseDeviceManager;

std::string device_id_;
boost::shared_ptr<PXCCapture> capture_;
boost::shared_ptr<PXCCapture::Device> device_;

RealSenseDevice (const std::string& id) : device_id_ (id) { };

};

} // namespace real_sense

} // namespace io

} // namespace pcl

#endif /* PCL_IO_REAL_SENSE_DEVICE_MANAGER_H */

Loading

0 comments on commit 2cfecb0

Please sign in to comment.