From 7ce6008a3c352f8cccb0c58fa7bbc2ddb29c40f3 Mon Sep 17 00:00:00 2001 From: Victor Lamoine Date: Wed, 27 Aug 2014 12:07:24 +0200 Subject: [PATCH 1/4] Add Ensenso support in CMake files --- CMakeLists.txt | 12 +++++++++++ PCLConfig.cmake.in | 37 ++++++++++++++++++++++++++++++++- cmake/Modules/FindEnsenso.cmake | 35 +++++++++++++++++++++++++++++++ pcl_config.h.in | 2 ++ 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 cmake/Modules/FindEnsenso.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index a660f1ba376..00bc3e53ed2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -288,6 +288,17 @@ if(WITH_FZAPI) endif(FZAPI_FOUND) endif(WITH_FZAPI) +# IDS-Imaging - Ensenso +option(WITH_ENSENSO "Build IDS-Imaging Ensenso's camera support" TRUE) +if(WITH_ENSENSO) + set(ENSENSO_ABI_DIR "$ENV{PROGRAMW6432}/Ensenso/development/c" CACHE PATH "directory of Ensenso ABI") + find_package(Ensenso) # FindEnsenso.cmake + if (ENSENSO_FOUND) + set(HAVE_ENSENSO ON) + include_directories(SYSTEM "${ENSENSO_INCLUDE_DIRS}") + endif(ENSENSO_FOUND) +endif(WITH_ENSENSO) + # Intel Perceptional Computing Interface (PXCAPI) option(WITH_PXCAPI "Build PXC Device support" TRUE) if(WITH_PXCAPI) @@ -441,3 +452,4 @@ MAKE_DEP_GRAPH() ### ---[ Finish up PCL_WRITE_STATUS_REPORT() PCL_RESET_MAPS() + diff --git a/PCLConfig.cmake.in b/PCLConfig.cmake.in index 7779333d1a4..d17c44bed2a 100644 --- a/PCLConfig.cmake.in +++ b/PCLConfig.cmake.in @@ -247,6 +247,38 @@ macro(find_openni2) endif(OPENNI2_FOUND) endmacro(find_openni2) +#remove this as soon as the Ensenso SDK is shipped with FindEnsenso.cmake +macro(find_ensenso) + if(NOT ENSENSO_ROOT AND ("ON" STREQUAL "ON")) + get_filename_component(ENSENSO_ABI_HINT @ENSENSO_INCLUDE_DIR@ PATH) + endif(NOT ENSENSO_ROOT AND ("ON" STREQUAL "ON")) + + find_path(ENSENSO_INCLUDE_DIR nxLib.h + HINTS ${ENSENSO_ABI_HINT} + /opt/ensenso/development/c + "$ENV{PROGRAMFILES}/Ensenso/development/c" "$ENV{PROGRAMW6432}/Ensenso/development/c" + PATH_SUFFIXES include/) + + find_library(ENSENSO_LIBRARY QUIET NAMES NxLib64 NxLib32 nxLib64 nxLib32 + HINTS ${ENSENSO_ABI_HINT} + "$ENV{PROGRAMFILES}/Ensenso/development/c" "$ENV{PROGRAMW6432}/Ensenso/development/c" + PATH_SUFFIXES lib/) + + set(ENSENSO_LIBRARIES ${ENSENSO_LIBRARY}) + set(ENSENSO_INCLUDE_DIRS ${ENSENSO_INCLUDE_DIR}) + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(ensenso DEFAULT_MSG + ENSENSO_LIBRARY ENSENSO_INCLUDE_DIR) + + if(ENSENSO_FOUND) + get_filename_component(ENSENSO_LIBRARY_PATH ${ENSENSO_LIBRARY} PATH) + set(ENSENSO_LIBRARY_DIRS ${ENSENSO_LIBRARY_PATH}) + set(ENSENSO_LIBRARIES "${ENSENSO_LIBRARY}") + set(ENSENSO_REDIST_DIR $ENV{ENSENSO_REDIST${ENSENSO_SUFFIX}}) + endif(ENSENSO_FOUND) +endmacro(find_ensenso) + #remove this as soon as flann is shipped with FindFlann.cmake macro(find_flann) if(PCL_ALL_IN_ONE_INSTALLER) @@ -442,6 +474,8 @@ macro(find_external_library _component _lib _is_optional) find_openni() elseif("${_lib}" STREQUAL "openni2") find_openni2() + elseif("${_lib}" STREQUAL "ensenso") + find_ensenso() elseif("${_lib}" STREQUAL "vtk") find_VTK() elseif("${_lib}" STREQUAL "libusb-1.0") @@ -718,7 +752,8 @@ 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} ${FLANN_LIBRARIES} ${VTK_LIBRARIES}) +list(APPEND PCL_LIBRARIES ${BOOST_LIBRARIES} ${QHULL_LIBRARIES} ${OPENNI_LIBRARIES} ${OPENNI2_LIBRARIES} ${ENSENSO_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) + diff --git a/cmake/Modules/FindEnsenso.cmake b/cmake/Modules/FindEnsenso.cmake new file mode 100644 index 00000000000..c256328bc2c --- /dev/null +++ b/cmake/Modules/FindEnsenso.cmake @@ -0,0 +1,35 @@ +############################################################################### +# - Try to find Ensenso SDK (IDS-Imaging) +# Once done this will define +# ENSENSO_FOUND - System has Ensenso SDK +# ENSENSO_INCLUDE_DIRS - The Ensenso SDK include directories +# ENSENSO_LIBRARIES - The libraries needed to use Ensenso SDK +# ENSENSO_DEFINITIONS - Compiler switches required for using Ensenso SDK +# ----------------------- + +find_path(ENSENSO_INCLUDE_DIR nxLib.h + HINTS ${ENSENSO_ABI_HINT} + /opt/ensenso/development/c + "$ENV{PROGRAMFILES}/Ensenso/development/c" "$ENV{PROGRAMW6432}/Ensenso/development/c" + PATH_SUFFIXES include/) + +find_library(ENSENSO_LIBRARY QUIET NAMES NxLib64 NxLib32 nxLib64 nxLib32 + HINTS ${ENSENSO_ABI_HINT} + "$ENV{PROGRAMFILES}/Ensenso/development/c" "$ENV{PROGRAMW6432}/Ensenso/development/c" + PATH_SUFFIXES lib/) + +set(ENSENSO_LIBRARIES ${ENSENSO_LIBRARY}) +set(ENSENSO_INCLUDE_DIRS ${ENSENSO_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set ENSENSO_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args(ensenso DEFAULT_MSG + ENSENSO_LIBRARY ENSENSO_INCLUDE_DIR) + +mark_as_advanced(ENSENSO_INCLUDE_DIR ENSENSO_LIBRARY) + +if(ENSENSO_FOUND) + message(STATUS "Ensenso SDK found") +endif(ENSENSO_FOUND) + diff --git a/pcl_config.h.in b/pcl_config.h.in index f8b4cb37dbc..da86f52d229 100644 --- a/pcl_config.h.in +++ b/pcl_config.h.in @@ -26,6 +26,8 @@ #cmakedefine HAVE_FZAPI 1 +#cmakedefine HAVE_ENSENSO 1 + // SSE macros #cmakedefine HAVE_POSIX_MEMALIGN #cmakedefine HAVE_MM_MALLOC From da40d1f6181e88953f874c2b2fab9f6b34fc30b6 Mon Sep 17 00:00:00 2001 From: Victor Lamoine Date: Thu, 28 Aug 2014 14:28:00 +0200 Subject: [PATCH 2/4] Add EnsensoGrabber class --- io/CMakeLists.txt | 30 +- io/include/pcl/io/ensenso_grabber.h | 303 ++++++++++++++++ io/src/ensenso_grabber.cpp | 536 ++++++++++++++++++++++++++++ 3 files changed, 867 insertions(+), 2 deletions(-) create mode 100644 io/include/pcl/io/ensenso_grabber.h create mode 100644 io/src/ensenso_grabber.cpp diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt index e3059a52c4e..5444955c161 100644 --- a/io/CMakeLists.txt +++ b/io/CMakeLists.txt @@ -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 pcap png vtk) + PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso pcap png vtk) else(WIN32) - PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 pcap png vtk libusb-1.0) + PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso pcap png vtk libusb-1.0) endif(WIN32) PCL_ADD_DOC("${SUBSYS_NAME}") @@ -137,6 +137,23 @@ if(build) ) endif(FZAPI_FOUND) + ## Ensenso + OPTION(BUILD_ENSENSO "Build the Ensenso Grabber." ON) + MARK_AS_ADVANCED(BUILD_ENSENSO) + if(NOT BUILD_ENSENSO) + # Set ENSENSO_FOUND to false locally to avoid building anything Ensenso related + # Remember that other modules (libraries) need to check explicitly for BUILD_ENSENSO + set(ENSENSO_FOUND FALSE) + endif() + if(ENSENSO_FOUND) + set(ENSENSO_GRABBER_INCLUDES + include/pcl/io/ensenso_grabber.h + ) + set(ENSENSO_GRABBER_SOURCES + src/ensenso_grabber.cpp + ) + endif(ENSENSO_FOUND) + if(PXCAPI_FOUND) set(PXC_GRABBER_INCLUDES include/pcl/io/pxc_grabber.h @@ -207,6 +224,7 @@ if(build) ${IMAGE_SOURCES} ${DINAST_GRABBER_SOURCES} ${FZAPI_GRABBER_SOURCES} + ${ENSENSO_GRABBER_SOURCES} ${PXC_GRABBER_SOURCES} ) if(PNG_FOUND) @@ -250,6 +268,7 @@ if(build) ${IMAGE_INCLUDES} ${DINAST_GRABBER_INCLUDES} ${FZAPI_GRABBER_INCLUDES} + ${ENSENSO_GRABBER_INCLUDES} ${PXC_GRABBER_INCLUDES} ) @@ -317,6 +336,10 @@ if(build) endif(WIN32) endif(FZAPI_FOUND) + if(ENSENSO_FOUND) + target_link_libraries(${LIB_NAME} ${ENSENSO_LIBRARIES}) + endif(ENSENSO_FOUND) + if(PXCAPI_FOUND) link_directories(${PXCAPI_LIB_DIRS}) target_link_libraries("${LIB_NAME}" ${PXCAPI_LIBS}) @@ -334,6 +357,9 @@ if(build) if(OPENNI2_FOUND) list(APPEND EXT_DEPS libopenni2) endif(OPENNI2_FOUND) + if(ENSENSO_FOUND) + list(APPEND EXT_DEPS ensenso) + endif(ENSENSO_FOUND) PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "${EXT_DEPS}" "" "" "") diff --git a/io/include/pcl/io/ensenso_grabber.h b/io/include/pcl/io/ensenso_grabber.h new file mode 100644 index 00000000000..00a0079d667 --- /dev/null +++ b/io/include/pcl/io/ensenso_grabber.h @@ -0,0 +1,303 @@ +/* + * Software License Agreement (BSD License) + * + * Point Cloud Library (PCL) - www.pointclouds.org + * Copyright (c) 2014-, 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. + * + * Author: Victor Lamoine (victor.lamoine@gmail.com) + */ + +#include + +#ifndef __PCL_IO_ENSENSO_GRABBER__ +#define __PCL_IO_ENSENSO_GRABBER__ + +#include +#include +#include +#include + +#include +#include + +#include // Ensenso SDK + +namespace pcl +{ + struct PointXYZ; + template class PointCloud; + + /** @brief Grabber for IDS-Imaging Enenso's devices + * The Ensenso SDK allow to use multiple Ensenso devices to produce a single cloud.\n + * This feature is not implemented here, it is up to the user to configure multiple Ensenso cameras.\n + * @author Victor Lamoine (victor.lamoine@gmail.com)\n + * @ingroup io + */ + class PCL_EXPORTS EnsensoGrabber : public Grabber + { + public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + // Define callback signature typedefs + typedef void + (sig_cb_ensenso_point_cloud) (const boost::shared_ptr >&); + + /** @brief Constructor */ + EnsensoGrabber (); + + /** @brief Destructor inherited from the Grabber interface. It never throws. */ + virtual + ~EnsensoGrabber () throw (); + + /** @brief Searches for available devices + * @returns the number of Ensenso devices connected */ + int + enumDevices (); + + /** @brief Opens an Ensenso device + * @param[in] device the device ID to open + * @return true if successful, false otherwise */ + bool + openDevice (const int device = 0); + + /** @brief Closes the Ensenso device */ + bool + closeDevice (); + + /** @brief Start the data acquisition + * @note Opens device "0" if no device is open */ + void + start (); + + /** @brief Stop the data acquisition */ + void + stop (); + + /** @brief Check if the data acquisition is still running */ + bool + isRunning () const; + + /** @brief Get class name + * @returns a string containing the class name + */ + std::string + getName () const; + + /** @brief Configure Ensenso capture settings + * @param[in] auto_exposure If set to yes, the exposure parameter will be ignored + * @param[in] auto_gain if set yo yes, the gain parameter will be ignored + * @param[in] bining Pixel bining: 1, 2 or 4 + * @param[in] exposure In milliseconds, from 0.01 to 20 ms + * @param[in] front_light Infrared front light (usefull for calibration) + * @param[in] gain Float between 1 and 4 + * @param[in] gain_boost + * @param[in] hardware_gamma + * @param[in] hdr High Dynamic Range (check compatibility with other options in Ensenso manual) + * @param[in] pixel_clock in MegaHertz, from 5 to 85 + * @param[in] projector Use the central infrared projector or not + * @param[in] target_brightness Between 40 and 210 + * @param[in] trigger_mode + * @param[in] use_disparity_map_area_of_interest + * @return True if successful, false otherwise + * @note See Capture tree item for more + * details about the parameters. */ + bool + configureCapture (const bool auto_exposure = true, + const bool auto_gain = true, + const int bining = 1, + const float exposure = 0.32, + const bool front_light = false, + const int gain = 1, + const bool gain_boost = false, + const bool hardware_gamma = false, + const bool hdr = false, + const int pixel_clock = 10, + const bool projector = true, + const int target_brightness = 80, + const std::string trigger_mode = "Software", + const bool use_disparity_map_area_of_interest = false) const; + + /** @brief Update Link node in NxLib tree + * @param[in] target "Hand" or "Workspace" for example + * @param[in] euler_angle + * @param[in] rotation_axis + * @param[in] translation + * @return True if successful, false otherwise + * @warning Translation are in millimetres, rotation angles in radians! + * @note If a calibration has been stored in the EEPROM, it is copied in the Link node at nxLib tree start. + * This method overwrites the Link node but does not write to the EEPROM. + * + * More information on the parameters can be found in Link node section of the Ensenso manual. + * + * The point cloud you get from the Ensenso is already transformed using this calibration matrix. + * Make sure it is the identity transformation if you want the original point cloud!*/ + bool + setExtrinsicCalibration (const std::string target = "Hand", + const float euler_angle = 0.0, + const Eigen::Vector3f rotation_axis = Eigen::Vector3f (0.0, 0.0, 0.0), + const Eigen::Vector3f translation = Eigen::Vector3f (0.0, 0.0, 0.0)); + + /** @brief Obtain the number of frames per second (FPS) */ + float + getFramesPerSecond () const; + + /** @brief Open TCP port to enable access via the nxTreeEdit program. + * @param[in] port The port number + * @return True if successful, false otherwise */ + bool + openTcpPort (const int port = 24000) const; + + /** @brief Close TCP port program + * @return True if successful, false otherwise + * @warning If you do not close the TCP port the program might exit with the port still open, if it is the case + * use @code ps -ef@endcode and @code kill PID @endcode to kill the application and effectively close the port. */ + bool + closeTcpPort (void) const; + + /** @brief Returns the full NxLib tree as a JSON string + * @param[in] pretty_format JSON formatting style + * @return A string containing the NxLib tree in JSON format + */ + std::string + getTreeAsJson (const bool pretty_format = true) const; + + /** @brief Returns the Result node (of the last command) as a JSON string + * @param[in] pretty_format JSON formatting style + * @return A string containing the Result node in JSON format + */ + std::string + getResultAsJson (const bool pretty_format = true) const; + + /** @brief Get the Euler angles corresponding to a JSON string (an angle axis transformation) + * @param[in] json A string containing the angle axis transformation in JSON format + * @param[out] x The X translation + * @param[out] y The Y translation + * @param[out] z The Z translation + * @param[out] w The yaW angle + * @param[out] p The Pitch angle + * @param[out] r The Roll angle + * @return True if successful, false otherwise + * @warning The units are meters and radians! + * @note See: transformation page in the EnsensoSDK documentation + */ + bool + transformationJsonToEulerAngles (const std::string &json, + double &x, + double &y, + double &z, + double &w, + double &p, + double &r); + + /** @brief Get the JSON string corresponding to an angle axis transformation + * @param[in] x The X angle + * @param[in] y The Y angle + * @param[in] z The Z angle + * @param[in] rx The X component of the Euler axis + * @param[in] ry The Y component of the Euler axis + * @param[in] rz The Z componenet of the Euler axis + * @param[in] alpha The Euler rotation angle + * @param[in] pretty_format JSON formatting style + * @return A string containing the angle axis transformation in JSON format + * @warning The units are meters and radians! (the Euler axis doesn't need to be normalized) + * @note See: transformation page in the EnsensoSDK documentation + */ + std::string + angleAxisToTransformationJson (const double x, + const double y, + const double z, + const double rx, + const double ry, + const double rz, + const double alpha, + const bool pretty_format = true); + + /** @brief Get the JSON string corresponding to the Euler angles transformation + * @param[in] x The X translation + * @param[in] y The Y translation + * @param[in] z The Z translation + * @param[in] w The yaW angle + * @param[in] p The Pitch angle + * @param[in] r The Roll angle + * @param[in] pretty_format JSON formatting style + * @return A string containing the Euler angles transformation in JSON format + * @warning The units are meters and radians! + * @note See: transformation page in the EnsensoSDK documentation + */ + std::string + eulerAnglesToTransformationJson (const double x, + const double y, + const double z, + const double w, + const double p, + const double r, + const bool pretty_format = true); + + /** @brief Reference to the NxLib tree root + * @warning You must handle NxLib exceptions manually when playing with root! + * See void ensensoExceptionHandling in ensenso_grabber.cpp */ + boost::shared_ptr root_; + + protected: + /** @brief Grabber thread */ + boost::thread grabber_thread_; + + /** @brief Reference to the camera tree */ + NxLibItem camera_; + + /** @brief Boost point cloud signal */ + boost::signals2::signal* point_cloud_signal_; + + /** @brief Whether an Ensenso device is opened or not */ + bool device_open_; + + /** @brief Whether an Ensenso device is running or not */ + bool running_; + + /** @brief Point cloud capture/processing frequency */ + pcl::EventFrequency frequency_; + + /** @brief Mutual exclusion for FPS computation */ + mutable boost::mutex fps_mutex_; + + /** @brief Continously asks for data from the device and publishes it if available. */ + void + processGrabbing (); + + public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + }; +} // namespace pcl + +#endif // __PCL_IO_ENSENSO_GRABBER__ + diff --git a/io/src/ensenso_grabber.cpp b/io/src/ensenso_grabber.cpp new file mode 100644 index 00000000000..c1db888c567 --- /dev/null +++ b/io/src/ensenso_grabber.cpp @@ -0,0 +1,536 @@ +/* + * Software License Agreement (BSD License) + * + * Point Cloud Library (PCL) - www.pointclouds.org + * Copyright (c) 2014-, 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. + * + * Author: Victor Lamoine (victor.lamoine@gmail.com) + */ + +#include + +#include + +#include +#include +#include +#include + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Handle Ensenso SDK exceptions +// This function is called whenever an exception is raised to provide details about the error +void +ensensoExceptionHandling (const NxLibException &ex, + std::string func_nam) +{ + PCL_ERROR ("%s: NxLib error %s (%d) occurred while accessing item %s.\n", func_nam.c_str (), ex.getErrorText ().c_str (), ex.getErrorCode (), + ex.getItemPath ().c_str ()); + if (ex.getErrorCode () == NxLibExecutionFailed) + { + NxLibCommand cmd (""); + PCL_WARN ("\n%s\n", cmd.result ().asJson (true, 4, false).c_str ()); + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +pcl::EnsensoGrabber::EnsensoGrabber () : + device_open_ (false), + running_ (false) +{ + point_cloud_signal_ = createSignal (); + PCL_INFO ("Initialising nxLib\n"); + + try + { + nxLibInitialize (); + root_.reset (new NxLibItem); + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "EnsensoGrabber"); + PCL_THROW_EXCEPTION (pcl::IOException, "Could not initialise NxLib."); // If constructor fails; throw exception + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +pcl::EnsensoGrabber::~EnsensoGrabber () throw () +{ + try + { + stop (); + root_.reset (); + + disconnect_all_slots (); + nxLibFinalize (); + } + catch (...) + { + // destructor never throws + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int +pcl::EnsensoGrabber::enumDevices () +{ + int camera_count = 0; + + try + { + NxLibItem cams = NxLibItem ("/Cameras/BySerialNo"); + camera_count = cams.count (); + + // Print information for all cameras in the tree + PCL_INFO ("Number of connected cameras: %d\n", camera_count); + PCL_INFO ("Serial No Model Status\n"); + + for (int n = 0; n < cams.count (); ++n) + { + PCL_INFO ("%s %s %s\n", cams[n][itmSerialNumber].asString ().c_str (), + cams[n][itmModelName].asString ().c_str (), + cams[n][itmStatus].asString ().c_str ()); + } + PCL_INFO ("\n"); + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "enumDevices"); + } + + return (camera_count); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool +pcl::EnsensoGrabber::openDevice (const int device) +{ + if (device_open_) + PCL_THROW_EXCEPTION (pcl::IOException, "Cannot open multiple devices!"); + + PCL_INFO ("Opening Ensenso stereo camera id = %d\n", device); + + try + { + // Create a pointer referencing the camera's tree item, for easier access: + camera_ = (*root_)[itmCameras][itmBySerialNo][device]; + + if (!camera_.exists () || camera_[itmType] != valStereo) + { + PCL_THROW_EXCEPTION (pcl::IOException, "Please connect a single stereo camera to your computer!"); + } + + NxLibCommand open (cmdOpen); + open.parameters ()[itmCameras] = camera_[itmSerialNumber].asString (); + open.execute (); + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "openDevice"); + return (false); + } + + device_open_ = true; + return (true); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool +pcl::EnsensoGrabber::closeDevice () +{ + if (!device_open_) + return (false); + + stop (); + PCL_INFO ("Closing Ensenso stereo camera\n"); + + try + { + NxLibCommand (cmdClose).execute (); + device_open_ = false; + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "closeDevice"); + return (false); + } + return (true); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +pcl::EnsensoGrabber::start () +{ + if (isRunning ()) + return; + + if (!device_open_) + openDevice (0); + + frequency_.reset (); + running_ = true; + grabber_thread_ = boost::thread (&pcl::EnsensoGrabber::processGrabbing, this); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +pcl::EnsensoGrabber::stop () +{ + if (running_) + { + running_ = false; // Stop processGrabbing () callback + + grabber_thread_.join (); // join () waits for the thread to finish it's last iteration + // See: http://www.boost.org/doc/libs/1_54_0/doc/html/thread/thread_management.html#thread.thread_management.thread.join + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool +pcl::EnsensoGrabber::isRunning () const +{ + return (running_); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +std::string +pcl::EnsensoGrabber::getName () const +{ + return ("EnsensoGrabber"); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool +pcl::EnsensoGrabber::configureCapture (const bool auto_exposure, + const bool auto_gain, + const int bining, + const float exposure, + const bool front_light, + const int gain, + const bool gain_boost, + const bool hardware_gamma, + const bool hdr, + const int pixel_clock, + const bool projector, + const int target_brightness, + const std::string trigger_mode, + const bool use_disparity_map_area_of_interest) const +{ + if (!device_open_) + return (false); + + try + { + NxLibItem captureParams = camera_[itmParameters][itmCapture]; + captureParams[itmAutoExposure].set (auto_exposure); + captureParams[itmAutoGain].set (auto_gain); + captureParams[itmBinning].set (bining); + captureParams[itmExposure].set (exposure); + captureParams[itmFrontLight].set (front_light); + captureParams[itmGain].set (gain); + captureParams[itmGainBoost].set (gain_boost); + captureParams[itmHardwareGamma].set (hardware_gamma); + captureParams[itmHdr].set (hdr); + captureParams[itmPixelClock].set (pixel_clock); + captureParams[itmProjector].set (projector); + captureParams[itmTargetBrightness].set (target_brightness); + captureParams[itmTriggerMode].set (trigger_mode); + captureParams[itmUseDisparityMapAreaOfInterest].set (use_disparity_map_area_of_interest); + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "configureCapture"); + return (false); + } + return (true); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool +pcl::EnsensoGrabber::setExtrinsicCalibration (const std::string target, + const float euler_angle, + const Eigen::Vector3f rotation_axis, + const Eigen::Vector3f translation) +{ + if (!device_open_) + return (false); + + try + { + NxLibItem calibParams = camera_[itmLink]; + calibParams[itmTarget].set (target); + calibParams[itmRotation][itmAngle].set (euler_angle); + calibParams[itmRotation][itmAxis][0].set (rotation_axis[0]); + calibParams[itmRotation][itmAxis][1].set (rotation_axis[1]); + calibParams[itmRotation][itmAxis][2].set (rotation_axis[2]); + calibParams[itmTranslation][0].set (translation[0]); + calibParams[itmTranslation][1].set (translation[1]); + calibParams[itmTranslation][2].set (translation[2]); + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "setExtrinsicCalibration"); + return (false); + } + return (true); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float +pcl::EnsensoGrabber::getFramesPerSecond () const +{ + boost::mutex::scoped_lock lock (fps_mutex_); + return (frequency_.getFrequency ()); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool +pcl::EnsensoGrabber::openTcpPort (const int port) const +{ + try + { + nxLibOpenTcpPort (port); + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "openTcpPort"); + return (false); + } + return (true); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool +pcl::EnsensoGrabber::closeTcpPort () const +{ + try + { + nxLibCloseTcpPort (); + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "closeTcpPort"); + return (false); + } + return (true); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +std::string +pcl::EnsensoGrabber::getTreeAsJson (const bool pretty_format) const +{ + try + { + return (root_->asJson (pretty_format)); + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "getTreeAsJson"); + return (""); + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +std::string +pcl::EnsensoGrabber::getResultAsJson (const bool pretty_format) const +{ + try + { + NxLibCommand cmd (""); + return (cmd.result ().asJson (pretty_format)); + } + + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "getResultAsJson"); + return (""); + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool +pcl::EnsensoGrabber::transformationJsonToEulerAngles (const std::string &json, + double &x, + double &y, + double &z, + double &w, + double &p, + double &r) +{ + try + { + NxLibCommand convert (cmdConvertTransformation); + convert.parameters ()[itmTransformation].setJson (json, false); + convert.parameters ()[itmSplitRotation].set (valXYZ); + + convert.execute (); + + NxLibItem tf = convert.result ()[itmTransformations]; + x = tf[0][itmTranslation][0].asDouble (); + y = tf[0][itmTranslation][1].asDouble (); + z = tf[0][itmTranslation][2].asDouble (); + r = tf[0][itmRotation][itmAngle].asDouble (); // Roll + p = tf[1][itmRotation][itmAngle].asDouble (); // Pitch + w = tf[2][itmRotation][itmAngle].asDouble (); // yaW + return (true); + } + + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "transformationJsonToEulerAngles"); + return (false); + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +std::string +pcl::EnsensoGrabber::angleAxisToTransformationJson (const double x, + const double y, + const double z, + const double rx, + const double ry, + const double rz, + const double alpha, + const bool pretty_format) +{ + try + { + NxLibItem tf ("/tmpTF"); + tf[itmTranslation][0].set (x); + tf[itmTranslation][1].set (y); + tf[itmTranslation][2].set (z); + + tf[itmRotation][itmAngle].set (alpha); // Angle of rotation + tf[itmRotation][itmAxis][0].set (rx); // X component of Euler vector + tf[itmRotation][itmAxis][1].set (ry); // Y component of Euler vector + tf[itmRotation][itmAxis][2].set (rz); // Z component of Euler vector + + std::string json = tf.asJson (pretty_format); + tf.erase (); + return (json); + } + + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "angleAxisToTransformationJson"); + return (""); + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +std::string +pcl::EnsensoGrabber::eulerAnglesToTransformationJson (const double x, + const double y, + const double z, + const double w, + const double p, + const double r, + const bool pretty_format) +{ + try + { + NxLibCommand chain (cmdChainTransformations); + NxLibItem tf = chain.parameters ()[itmTransformations]; + + tf[0].setJson (angleAxisToTransformationJson (x, y, z, 0, 0, 1, r), false); // Roll + tf[1].setJson (angleAxisToTransformationJson (0, 0, 0, 0, 1, 0, p), false); // Pitch + tf[2].setJson (angleAxisToTransformationJson (0, 0, 0, 1, 0, 0, w), false); // yaW + + chain.execute (); + return (chain.result ()[itmTransformation].asJson (pretty_format)); + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "eulerAnglesToTransformationJson"); + return (""); + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +pcl::EnsensoGrabber::processGrabbing () +{ + bool continue_grabbing = running_; + while (continue_grabbing) + { + try + { + // Publish cloud + if (num_slots () > 0) + { + fps_mutex_.lock (); + frequency_.event (); + fps_mutex_.unlock (); + + pcl::PointCloud::Ptr cloud (new pcl::PointCloud ()); + + NxLibCommand (cmdCapture).execute (); + + // Stereo matching task + NxLibCommand (cmdComputeDisparityMap).execute (); + + // Convert disparity map into XYZ data for each pixel + NxLibCommand (cmdComputePointMap).execute (); + + // Get info about the computed point map and copy it into a std::vector + std::vector pointMap; + int width, height; + camera_[itmImages][itmPointMap].getBinaryDataInfo (&width, &height, 0, 0, 0, 0); + camera_[itmImages][itmPointMap].getBinaryData (pointMap, 0); + + // Copy point cloud and convert in meters + cloud->points.resize (height * width); + cloud->width = width; + cloud->height = height; + cloud->is_dense = false; + + // Copy data in point cloud (and convert milimeters in meters) + for (size_t i = 0; i < pointMap.size (); i += 3) + { + cloud->points[i / 3].x = pointMap[i] / 1000.0; + cloud->points[i / 3].y = pointMap[i + 1] / 1000.0; + cloud->points[i / 3].z = pointMap[i + 2] / 1000.0; + } + + pcl::PointCloud::Ptr cloud_tmp (new pcl::PointCloud ()); + pcl::copyPointCloud (*cloud, *cloud_tmp); + point_cloud_signal_->operator () (cloud_tmp); + } + + continue_grabbing = running_; + } + catch (NxLibException &ex) + { + ensensoExceptionHandling (ex, "processGrabbing"); + } + } +} + From 398dd73a133e355b7a1d2ec50ee1dc4ce6f61668 Mon Sep 17 00:00:00 2001 From: Victor Lamoine Date: Tue, 2 Sep 2014 10:13:13 +0200 Subject: [PATCH 3/4] Add Ensenso viewer --- visualization/CMakeLists.txt | 5 +- visualization/tools/CMakeLists.txt | 5 ++ visualization/tools/ensenso_viewer.cpp | 86 ++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 visualization/tools/ensenso_viewer.cpp diff --git a/visualization/CMakeLists.txt b/visualization/CMakeLists.txt index 746a693a12f..62018486d6e 100644 --- a/visualization/CMakeLists.txt +++ b/visualization/CMakeLists.txt @@ -14,7 +14,7 @@ else(NOT VTK_FOUND) endif(NOT VTK_FOUND) PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ${DEFAULT} "${REASON}") -PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} EXT_DEPS vtk OPT_DEPS openni openni2) +PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} EXT_DEPS vtk OPT_DEPS openni openni2 ensenso) if (ANDROID) set (build FALSE) @@ -159,6 +159,9 @@ if(build) if(OPENNI2_FOUND) list(APPEND EXT_DEPS libopenni2) endif(OPENNI2_FOUND) + if(ENSENSO_FOUND) + list(APPEND EXT_DEPS ensenso) + endif(ENSENSO_FOUND) PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "${EXT_DEPS}" "" "" "") diff --git a/visualization/tools/CMakeLists.txt b/visualization/tools/CMakeLists.txt index ec48ac71168..70010dce28b 100644 --- a/visualization/tools/CMakeLists.txt +++ b/visualization/tools/CMakeLists.txt @@ -38,3 +38,8 @@ if(OPENNI2_FOUND AND BUILD_OPENNI2) PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni2_viewer ${SUBSYS_NAME} openni2_viewer.cpp) target_link_libraries(pcl_openni2_viewer pcl_common pcl_io pcl_kdtree pcl_visualization) endif() + +if(ENSENSO_FOUND AND BUILD_ENSENSO) + PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_ensenso_viewer ${SUBSYS_NAME} ensenso_viewer.cpp) + target_link_libraries(pcl_ensenso_viewer pcl_common pcl_io pcl_visualization) +endif() diff --git a/visualization/tools/ensenso_viewer.cpp b/visualization/tools/ensenso_viewer.cpp new file mode 100644 index 00000000000..6039d11c13a --- /dev/null +++ b/visualization/tools/ensenso_viewer.cpp @@ -0,0 +1,86 @@ +/* + * Software License Agreement (BSD License) + * + * Point Cloud Library (PCL) - www.pointclouds.org + * Copyright (c) 2014-, 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. + * + * Author: Victor Lamoine (victor.lamoine@gmail.com) + */ + +#include +#include + +typedef pcl::PointXYZ PointT; +typedef pcl::PointCloud PointCloudT; +typedef pcl::visualization::CloudViewer CloudViewer; + +boost::shared_ptr viewer; +pcl::EnsensoGrabber::Ptr ensenso_grabber; + +void +grabberCallback (const PointCloudT::ConstPtr& cloud) +{ + if (!viewer->wasStopped ()) + viewer->showCloud (cloud); +} + +int +main (void) +{ + ensenso_grabber.reset (new pcl::EnsensoGrabber ()); + + if (ensenso_grabber == 0) + return (-1); + + ensenso_grabber->enumDevices (); + ensenso_grabber->openTcpPort (); // default port = 24000 + ensenso_grabber->openDevice (); + ensenso_grabber->configureCapture (); + ensenso_grabber->setExtrinsicCalibration (); // Temporary reset calibration if it has be written in EEPROM + + boost::function f = boost::bind (&grabberCallback, _1); + ensenso_grabber->registerCallback (f); + + viewer.reset (new CloudViewer ("3D Viewer")); + ensenso_grabber->start (); + std::cout << std::endl; + + while (!viewer->wasStopped ()) { + boost::this_thread::sleep (boost::posix_time::milliseconds (1000)); + std::cout << "FPS: " << ensenso_grabber->getFramesPerSecond () << std::endl; + } + + ensenso_grabber->stop (); + ensenso_grabber->closeDevice (); + return (0); +} + From f513f1577589cbb60ecffe15a5aed1ea2ddeed41 Mon Sep 17 00:00:00 2001 From: Victor Lamoine Date: Thu, 4 Sep 2014 15:54:17 +0200 Subject: [PATCH 4/4] Add Ensenso documentation & tutorial --- doc/doxygen/doxyfile.in | 1 + doc/tutorials/content/ensenso_cameras.rst | 80 ++++++++++++++++++ .../content/images/ensenso/ensenso_viewer.jpg | Bin 0 -> 116459 bytes doc/tutorials/content/images/ensenso/ids.png | Bin 0 -> 11990 bytes doc/tutorials/content/index.rst | 15 ++++ io/io.doxy | 2 + 6 files changed, 98 insertions(+) create mode 100644 doc/tutorials/content/ensenso_cameras.rst create mode 100644 doc/tutorials/content/images/ensenso/ensenso_viewer.jpg create mode 100644 doc/tutorials/content/images/ensenso/ids.png diff --git a/doc/doxygen/doxyfile.in b/doc/doxygen/doxyfile.in index 41ef0d99f90..6c2ed11c95d 100644 --- a/doc/doxygen/doxyfile.in +++ b/doc/doxygen/doxyfile.in @@ -278,6 +278,7 @@ INCLUDE_FILE_PATTERNS = *.h #PREDEFINED = protected=private \ PREDEFINED = = "HAVE_QHULL=1" \ "HAVE_OPENNI=1" \ + "HAVE_ENSENSO=1" \ "PCL_DEPRECATED(x)=" EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES diff --git a/doc/tutorials/content/ensenso_cameras.rst b/doc/tutorials/content/ensenso_cameras.rst new file mode 100644 index 00000000000..58c36398c7f --- /dev/null +++ b/doc/tutorials/content/ensenso_cameras.rst @@ -0,0 +1,80 @@ +.. _ensenso_cameras: + +========================================== +Grabbing point clouds from Ensenso cameras +========================================== + +In this tutorial we will learn how to use the `IDS-Imaging `_ Ensenso cameras within PCL. This tutorial will show you how to configure PCL +and how to use the examples to fetch point clouds from the `Ensenso `_. + +.. contents:: + +Install Ensenso drivers +======================= + +The Ensenso drivers are free (as in beer) and available for download, for each of them follow the instructions provided: + + * `uEye `_ + * `Ensenso SDK `_ + +Plug-in the camera and test if the Ensenso is working, launch ``nxView`` in your terminal to check if you can actually use the camera. + +Configuring PCL +=============== + +You need at least PCL 1.8.0 to be able to use the Ensenso cameras. You need to make sure ``WITH_ENSENSO`` is set to ``true`` in the CMake +configuration (it should be set to true by default if you have followed the instructions before). + +The default following values can be tweaked into cmake if you don't have a standard installation, for example: + +.. code-block:: + + ENSENSO_ABI_DIR /opt/ensenso_test/development/c + +You can deactivate building the Ensenso support by setting ``BUILD_ENSENSO`` to false. +Compile and install PCL. + +Using the example +================== + +The `pcl_ensenso_viewer `_ example shows how to +display a point cloud grabbed from an Ensenso device using the `EnsensoGrabber `_ class. + +Note that this program opens the TCP port of the nxLib tree, this allows you to open the nxLib tree with the nxTreeEdit program (port 24000). +The capture parameters (exposure, gain etc..) are set to default values. +If you have performed and stored an extrinsic calibration it will be temporary reset. + +.. code-block:: cpp + + ensenso_grabber->enumDevices (); + ensenso_grabber->openTcpPort (); + ensenso_grabber->openDevice (); + ensenso_grabber->configureCapture (); + ensenso_grabber->setExtrinsicCalibration (); + +The code is very similar to the ``pcl_openni_viewer``. +All the Ensenso devices connected are listed and then the point cloud are fetched as fast as possible. + +Here is an example of the terminal output :: + + $ pcl_ensenso_viewer + Initialising nxLib + Number of connected cameras: 1 + Serial No Model Status + 140242 N10-1210-18 Available + + Opening Ensenso stereo camera id = 0 + + FPS: 4.46927 + FPS: 5.01253 + FPS: 5.16351 + FPS: 5.27506 + FPS: 5.32569 + FPS: 5.51645 + FPS: 5.53013 + FPS: 5.56729 + Closing Ensenso stereo camera + +.. image:: images/ensenso/ensenso_viewer.jpg + :height: 550 + diff --git a/doc/tutorials/content/images/ensenso/ensenso_viewer.jpg b/doc/tutorials/content/images/ensenso/ensenso_viewer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7c05b23cf8dfa84d775c1a7c4115651acd667dc GIT binary patch literal 116459 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
    J5F|Az~ZU@K@_~m-)<>_A^ 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

    q!7IgLNarJQ!F^f-#fcO$1rXR-09xQi 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/content/images/ensenso/ids.png b/doc/tutorials/content/images/ensenso/ids.png new file mode 100644 index 0000000000000000000000000000000000000000..c55bf6e04644070f616a4e900f0e4549f3a461bd GIT binary patch literal 11990 zcmXYX1z1$y^ZwG(-RX*ybax|2N-y0ZsRB!fbeGa8N-Qk32-02B-KlhU$NzqQ-~Y4E zy=V8_J?GAxns;X2sQ2oMxL8zJAP@-moszs3P%Z&i;R|%&F68+&5-89uRTSkx&;Nb$ zTZ+E|HJBfj4BS8^ zIgr916szQ8`-^Vk0-?7=r=N!6klEP4e?usfGS(mI!gn)|Dm?d(%|;a3!B)q( zLkadX`l_#AA5pGqUe%tC1~6JZu9Wqr;yIpZ^&g>*9P>tzVwS1ih3KJOxvGTW?%_Wl zpiu4`7&LhHx9S7U;V-{J2-Ee4A9S*+I(t_pU8j#Q^#r963foHErSTcPspyW8q0xaE z%`F?uPGO~a2Xs0J;3-1W_wsa7Qj71HNCH+g17t~2$`H$C2R~70-w>O}9n!+r zfAbFLsG0U$@a-vdGPpHIa`$wiOJwC`a*tIZF!KwB?VUbU@4O(Q?@Kzg1gnl6k#Dqa z{ZkBJbN)WZkXCNCib17!Wh#$dc+f~?LbqcssIN|o+_EWO8Ni>%g1ab z-daT~l>~*h963P)k4d(|Ua}IcyN0vJx?XNJLkKAsj7pggCZ?$X><>Jo_5bY}6^2d868Tv7|IPoptdD%mtbZUoeG-V%jAIW26xDdta5l@}$m{b(w z;7>m-Y?^*5$7)%{geXjN2ldCm29j|8!E{JREZ>jn9FBhp*QLy3s3`hx8Jyq|r;s0d zj_D{bu%B2%)A>vTAk#G-ydF179q1gPR7QsI@0N~HBXzJj3Yj{KbQ+ez&e99de2d4G zu+=$7r`>AJ`2nu4mg9P`&z;g2*KDxm=rD;1IV3g_^?3P&gP<<-oFY5~v5s@2Y<))0 zuU(xA-G0i}FQF;kg1XH)R7N!LBIxDBqYrVJ(X(^r0_j@l*c4~n^i&0%r9iEUb`^gu zHa}1{0k_gpG+06ALLtnAYQKl7ba(J}t$sj-ym0z!7@hTQfq}s9Vn~Lz(gh9*CH2qp z5_VN!v9K@HnIw`|rXM+`e3aFwRxHSBBRELfN}{!gbS0RT7=C}N*ZztH={*EPRimm$ z)rUW^n$4=H`gQkR!x%Q}$DK5#IxcL&z2Ml!%ZPBr{lQ&afx5~n3ti9ucG>#xA7QU? zFua)+AW6(Rh5XtOcwQsrPf>h+IM%8Fj*y;JOoV_Bn=0>guLfj3{sfwuhf%>i$6Y(6 zqvD9G124@ftM2KeVyhTo_}$!p$!S%7gXVH8iqTxw#tbpokW#(7`Vy?mTGq`aOSLFA zN0&pk18XwebnUFaiwUFM5nLW8*`lzAtnP_q=2T?4^f_%`#Y-Zt$O48Ifb} zZ&zu4FUMtsudd#Tr1RHZ%-N@xYs&9yu@3C?{Y_hLB7vj?e=X(dd5Xs^{k)-AGdVY5 zAyB)|(iL7^ETH$_u$M(ZrmNz69USx%s(`^a3bfB$nAR}4|G$YK2)#U?LiNVdZH@tc zhfn`vQ#(vn$5K1o^Z)nSKG zEPBiiBUJfTtQ^P}e@i``CTwjD=goj+vtJ;Mdzf{Mj)d4&$&dUT3e3C3`wRhvDlsCT zdeMaAP$ExHPji3X=y&(0;jMur4J-`sdWPbex+$YCLLg;_l?U_~BKA!GZq|KgF4HBmE}(@lG_* z6lmn1)>damYyKp&?dMIGDc-a6B)8V9T1UYQ+w9Jt6WE{cxy)Lducr0Q41ywYD%aK1Sq)bqY& zfH9O1U`EI3(rQ;G&R6;0L*0fmr)#-dE-d|)8$E!EtLiBEzrG-DK{wV5LeuAJ4z$#E z7fPXufRWg;)<#yc7)^~{B*Ko716lJz?UR~o!I?UGb$01?bR0vAmU0^}Z@&>hLFdlc zpbfNm$4?-8Q2SeuEXa=chf4jDn5udyA!sOHSAU~b@8e=0QvR1nD%uZ&Wzh!(Yh1HgiRp(wiz33ffS1L?CS&yL47);};G^zf3dslAsdjvhd zdOmDezFTy=#m6)8p*}`{1nQ>}oH8Pk!gJpI=6c(}AgFif8V53lkYiPXY%l$Ix z`*@;`7xEM%k`XyY;U;39)5lBIgFcU!vtj{H=Y?F;vqEs;<7Su`XX8#mU2pHZ)DM}t z$ggCAwb-53x(ANzot?|KTm$d37B&Z;A#HY}NAr;od{7@z(w`-KTBMI$;M<-#XFEg; zy;$q(c5r^)p2-Wen7o4dI1IOioJov+&!FtK(LeG}olf)x1%HkYOud^T{58`T6|$pp z?`dDYKU^={?w8coOj`SG>WyHn zMX@m3NA5J`H!znUw0v(r)kbE2pO3{#jj_IZdPU@`KlD!e?a7xM&$ZM5lIxdj@yF(R ziD#wcj(nTC$|nclfH#p&J-e8-F}jq5(-+qdprjLVsxi%DQOjd-k?jAH2P4IhbMeyq9#q#5MRl8i z_+K{#nNuW7Q{cJ4sw@oG`$pcIs}5}Cs4!pg%Qc_ZAJTyBCanYC+72qFwS{|*4=ybt z0{@PM+}m9rcl#^K!q0Qg{T?iP1N2@9@)4xh3Y_{a7QLnx3aHwM7i$fCilx*SfE(Wi zXDGR2hCG+{x%xye|8_OA9?2FFkh-6rD3UMO=LBUUgEkHLWQD^IYPP3apF&bZS{}Ai zFMQX-{`|{vpE5dT`qz6ln=s&sx3bvRxS-&Gj+xfSP|IvDpmh#u&{dfUx1t4SjJB+( zT~~B*ilSNZ5Vz)|gG%JO?{KLF`B(kUhhvI0@>U+Wo_U)t>;J{qJa}4YT_H{(1~S7a z7*~n`H(m7cx953zO++AD@LyIC!6+B|ik(##>j>Y~8>b*j;?&^RdaP&y1WCq%OqQm{ z-$-da4nJm3cE9pFkka!(YEGsLZzxcnO|G=IY*IgHUiUPgSAN^mSzxt~)P4)oarkq# zIhbbbxm>Gl>b1^ws>4PpS~Z-Ir;IaF=e)DG7aWF7t|xK5lvnY~`F;`fG4qv^sao>t zd{m6Zl@Pnqw*E^JID-fOtL>dL3((7R$~*0*<}#R<(Z=tIW);aY)9_zS*6tkBf8$0T z73#9)48W%CH#uo7E*jM%W1^h4^5V}mqk^jygRy4n zoV~U(?1q?gZ{KP@MDAJT-On>)-x38Zfb*qtVtY*%CSnR}w-CuMNXhwDu&$XOY zy%EDYVx7pbDI<6mdcvnQE`3K9@@cW~35MM)+F&Ll`Mi%JTi0PFj<$f@^R8#-R2Dt>K;E+em zm&@YEsNUE>L2|wPAz}aZN2C$EZj0>aTgk{yWHQ2E45B<-lD$0$m7wBVe!Hh!vNVPbiCk6>$OwD=~s=?LzF8A6)Df1;sDMLTZ~lj~h{fiU=&c0~ANZ zI&PjCt>6_=E-x*`K#a}obXfk&4D4-_r`5u!PH*K0E5$R+?EAIVu|PpiReYY+FRIXJ z@xMpxSiC4P8L^wg0g(l+vaD7|M@QE!EG&ow#1iJ&;?nat#mLzZN_f4;<;duea+<5E z$H;yCl9p1+^~2412FTHV6nP>KTB*98_-5?ChaOZbf6+zl z+I)H`c9fpQJzS6I8+JW#S`4RuFh8ni&U;wy0-fB#Q52=EPcBi7qBWz#)h5JIaU&J~_A<>dBoPE`h%&=X&DvT6<`2*KWmr2n5 zuimiu94fdXy2tW*D9dwn&#@vSBGw9A!T9Va20h>g+Mk`*xw-~YfHY7Uti#@Q zGg{s&p^||sD0wWqoAVwvR&>p7I>Vv>EEcJRpeUm!*RdKmTT^D`wxB@k5#8eaOz`Ib zJWeSUVS;d7ZQZFEeX6#dM<_Da{{B6T6yyUgMUmDv$8HQAcD8G*!URDCK5y_`KkVtZ z8A^PZ*a$tq$)h(A3Dlt0tML1@q$ad{QRQ4LsUiP~&_j7<)ya{PzvSRCsV?r4q9P{mWsliozq3EZ zPXY5bldcNgMo8wQAVzB_Dm@p;g_OFyHuPXl(sR8tZ^i=(%^%>q>DgTgxG%4FF78DR z+HK+56mLy-Gz5+Lb>XfqOij7FbgpNVUddSXK;%5^*3kNo`4O?zrYyB(6p(RQO%~mO z+meb3&eOFJe3!=kil!&Kv3!|p(AZw=80lL|xo%>EIzqOQ+8vnHHxpaWSEP}zw{sbq zFhO>KXMdR8@&W@Ca{kq0PMU#&blA|MPDa*BT@PC%ZrE;yU9fch-& zzJ*arqlEsvg&AVHOseT?U0O|_YSL0L&U@1RFA;i^Xk`N+3F-kX{pMad0BE`j+h_h-rzRhhz|4UwqqqC2o^7x?!^Ike4C z9nD?qvR}&0@M4Hmr9)y+c!!>jPJ6b9o1tO?-6M#w1x0$#D__8ki@;$jSy%*!<0c23uykDHy>p zs27uKsjJ&#X`Uc<LCw57Y=f2eWjrmSPKGKh3 zMz`D^GRYvb4sa1pb>zqXv8W1onZO;RlIS^gD`eHHFXrIrIEySDq5s-$TKtTL$Fiym zSYZOr|9bJmWgn+L7~=NA=ig0wo|xlg%OKjp3BP`(XFb3=s!QL8Mgf5F$V9cZ_-j! znK}^cqskPW`j{c;xXBAH79}PJDoTuv=^>dcJLJmu%BT&o0|i#ng#~ARSMzpT+fso~ zx4Z5RnAUT5J93AX6+J$DyCE^0jW>HXgLKR06zH&vj@#ur=lbK;=gE^8vxf%@&X8-j5itSOtS1`Axex?{VObw zzBNewLHtDwN%E4|W+i%LGLcl-_(5rRtItnuL-$8*X(}Fg1>$VT-tvw&CrQqM0JMY; z3@9gTvqw&Y7dfI{wEFIIZ0%RJ>BaP44qhWSJi}wSGH0Nx{?`UcN{knn;j+S6BhUKA zpKe1vSG>2|2&$84C0zGFy9MVRH>dw9Ok`_$yHO zK-|q$*Q@qRkQOQ}40Xus3aw^Xd4}kHGswH6AUpflWOsz^Ade-LqV!vh+~Su{wX!gifVsWBOy|@32Asq?+p|ej z&8BAlD))u(t_XZzRMrwbIXYKq?a79yMb|ce4+8_ru1i!6b3t}oxI3hMNNS*vQngrH zWd?3gyV11zxT;OYarfb2?0ZNev&p@FC$3ya@_}!~P?>!DX8e#Ob%bsKRK&&6bCdG( zqg!&DFbX5zim&n^QKf0YwCX|U_R@huF%-?>-|5Xd0)fCsTC1X}ee)cPmm2vw*GktR z?fwEo8aP!l_}X&oZ@04a6~Rf_V^Mc>@#uPn?0iUW!JcdFU&PWlP3|;)ulVfOFE@E+ z1zfUqYE@Zhq}BL*b;KKxQ}Tur)ehz?WY?k_AXzzsk{iPS5t7jyACtX(5Ky!!8WyHn zmHZ+Ca1rma_7CVOKQ{S{(fi6h(1f)&E>IuM0nbDIpQQh|rm9RUe&JN*v* zvM=jrqx^frmxg3wt-k$u&nmH7)hv^&qKh?tzjLNo5bU zF5eJ(*Rc7Pg5^HIOn99X`#K0sOic8V+IiZuTer*#LKjke>+JbUCBaD8viwwGZz`L? zr~78lK9}CxIoB;pjJ)K8s~>e#1By2fIjUVd%EG=;#6)tx02RRjxOcSdxoR>yKK{ib zAuFuYQt}6RWcDzP9)%kT%)fbHYpNfrJMf3H{fJ$+AgAiRgZ_Ke#KXL-!j}V?2g2XF z>r8oIChSlE<)kbxFKb8UBR~%NWRCUm3#gYe3T51}FI02=9R4OL23(CddrLjJ$#va` zA)V-g??50)H>mhZh5PDP@dyWBdhAc2lEBj*@;+eCTG_ItXi;HM)~e{GMtruV^g)U0 z_MtX_|Hco0R?Z+dlMDzo-V_-h`1x1qwC221K|}s3-)BYT5@&3^ir%m4rR5?&3*U^B z6Si?3wl63pCPb5;>Kz^>Z)h+LW9j2?n|5evDVy)sP(}n@;KQlz`PQ=kekdk!s|!Uh zt^CC^!6y{3Ao2GeP8`2L0|9P*yMoy&5a@lHdhxa-Ae>#LS)1fYF-{U8n>8LaEGv8b z=JU%yW`;!Vn)V*+wMyzs{j3{sEF2|F{EJa*dP{#hzH;I08Sgvd9 ztu2eMfRv<&lbyHs?VUwexJPMxnDT3iIt4Hxg@lj$-@AR+xr>xa#^y2kTuCZHn?%xLp}Ybz;gr>XMw28v|3LR_D(OQTgGKrGz|SYUVtJDb%2v z>*H0i>+cbC&6jCy#&xVzaa!p(pV<4ldij6y-Tkn!)6St@`(`q-AIr$?oSv6e<1JxQ zQnK^9VfStPeO`I|9vQo!WBHH~)7`wQY=79QV{t>}8|W58V*ZxNZi$IJY6Ko_@T{qC zoZB~0iB=OL&$$u~e^3MB^MZDf3dJm)7qf~^Fa#nxGjl`)@Q+5Afpt>ldAy>QCFJVj z;^@eCeYA`cC6Ao^$A#r>>bYv%sUYOHi^+5%zZx<<%}_LMT5$X-QVhz^J(aWqkEa14I#GFMBeyW!tOwX zBo#;Y`(&Z;6lY~LM+M5EDGrur5J||w<=G%t76v{Y91T=M;Gln%x%}g8+=_vL!Mq9l ziA|Ka1P;dm&~^%ifWs6Mi{>Cn^b+|au(cXL>`oL`x~w$cu14(~u%{%HU2_x{h)|9K z5+5+Wo*$~hEyl*a3;d}JxZKN;dcNg)TA7>k!Uw^b3POES zc`S7Y?|`{F3s&FlHDwRac+?(<*Ta<5x*kc2B05%AOr~e-pfZq|wPLYOt zs2e;Vd1|D)wp{8-%)iH%F1jx)({2JCbpMR{y5Qj0XJ~ORmdI<=kWTRywe_O#jUfhp z1;m=-tz&#$zB-DWG_U0R1tCH(Kx%Yh)58tOm3Wv5n5sS6TJOR`f+d%}-;{{sLjj3&e zrg#d6G}*N#W{BcWW|mNf=gRGmnyaH_H*!KXBqp^mhZ#=W>;=VGirSrE?A9?hER4`N zje$G(-9gJ2k2}B`<`)#mRw$2R~1Tx10eZv^5^@Ev! z#!R)fYj!dnE9Qx!AZge9$6ktqgdMwiN*qZpc`#X?hp}aKm3O|&+i#-P*W!lCS?0&sz*^< zc3hn$6llw7R0pRc+>h$VkvSX?$s(xspZNJsFOVhzN&XPralBq);%-rvGi+{`VyvS2<(fo9=ti~}Q zrn$5t0KH5-{8;K>EUY^w@nMot>HZZ9=H z;QTSOOe&`t3>&2>LJ6!AW>d!)?rZ6=6k|OG;84$;rUHv@B5rshTu42Nqp7B8D!qycYwOtfw!{fQ+g2;zP@ZRRGD z_27p|Co|YuVl9gMM#_;7zj$JvePd_8Yw(@iQ}WD*J{-rg%Fc zoxI1$#t7{N$=ICyKNVCm5Wf&VKfjsZX-{gu6Cvrr#_|nRP|8eS6!ZD%ZegLWD+&$W z0_ELTCMBc62bkT^2MWVlOa$gnaZ}~gh1YJ$8_WqpSGti{lp8B#^Plk|wE4YE9mr)< zO{WR;JT{G+(vS1Ru2_7(AVIJ}lBhva8abku89;`pva+;P8C@hPxH&aDzc;GnOTUZz zqFgs2m6BFF;@8}RUAwg>Q^IUkVYf&ol2j{bj4q~!Y#Ep!BXsj{1nm&C>7k`j08>{vg;tHM>Ah6pn<8k#WOY-Vq`L1(+$)5b z$aBr_RR>5PHDz4yQOn=xH!Jt!2?4)~8ylG@nL-Jz1GnB}Sf5eZZM(UM-<*4&J*ATE zt1TGyd;F2@-ooZ;uD?xI;jEpzL$O%CZB`FU96gJBV7x99kiHGU1GoSI720|l(60(D zb;Q1YT^jv5f0e@k6#uA+$?A0|z5d}7k{(U``%WlQdzP-Q?s@BZPL}@i$FAQ*o12?I z&z4FBE1GD?*zB>{t~_B?9mnizjlfCp!QQ_9`5uVOq~t4g5S99Ot=B8=1p!%#(| zLb3W6NJ)KDymUufQnq!~K590}L$j5GL`#rk*=gFZ66md4M>2(++RJ=aq71F!DXb%r z)XZv`%^#1J8XSQTawE^IN(VR*gVQ^3kVQn=t2%{-pDx*83yf zf4y-ks3P0e&>TAjvSHC+RV+8nTYBa^YzBhp8t6-~e8}?g!HfxwLt1}4cFm7JlEik! zM3}X+%R|_(emZsnN1GPAVSuxNUDQ&r|^QYwTmNs~93YcAX9ed;u!Jpqe z;^7M25gJmD^s4|4`=UWjwMQ)TZ@1Wn6`easXo2^U2?+_s7_yEhl!$;vIW?F&=)deC zNU0_xtVNOTS6kS_D}!p_(9&64AIiXomrrn(!rAOx^Spj*+-U=O1Svps2<#AW%CqD+IBzVPXJ( zv7WuwMhW@c48Z)eBi=K1>1Z98WQT2_26DSPcu%^ULswUhTqEmhba>W8$Z-%bn%QeA z_~bFsOnR)Wd5qZ0xhhPjFe4_$V@3Hx1TUs>J4~H2d|^7f*5sT1M-K;bAdMpXtYRFY$N`+_6T%(KI+Xm`5Ywb76#wiyIY1%-p&0rx?PVE8ObQ9Z3jqF4U(D5{mVw zi`dZxHNwEyAS1*}M)zYD868+_mu+8wCp(!h;`@5{Z_ehE0+ck#^?9d5S)R*L5q{Mj`zB{XaM0N1aQ#0cE*3K0}1<(YO6k` z{k=UX4z1{~S9A%B4#!M zcz8Jaf6?4zyX;TB@x^&l+bA}f5xVKF{K8Jr z)$87L(i+PDOBOK_ecD^s9HS_Um7`#9l4YLwz`(Yo6sv#}O&RWMhdVfhkHvDO@APt1 z=>6jO1stWElDG1EUW96@rV#r~)@j2pNCqM81}=>~gjAz=HQnB6w@NeP3#XO#{p$zJ zn&mQEBfPH}4TS)JcaiECB8`ZihHGEHL3>uPxJ=%g?EVWMteUi@mRb(&9qQildxniC}R7 z?u=5T%t`_rWOY&(-`mVR_M5_GNG&=)gC7rsK0T3OWsCQ;??sguwGj(TjY879l4Rn) zYKh3|RI~YuCRh6tQcumnY3A$7{a&_3(YVK}6v`FmhAK{~%$5fVc8#X6#ti>ao?*F%X=uI>DP{3WnVEI%=;!gZS^mjR3T5*)OuRBhEIFb_Y zlhd8lT%u#?6#>rq`hO(Nm&z98)`5RQRcwlrH2ZXdj{tHhJDwsql`9Ee-4ZiB#VKP3 z@F}eXYRme8VUh)yeRU)dfT!0Zc|i_$@t+0wl|svR%4-kJ#+eHq8|DINWyk;V{a_}I zmzI-LoN9*?5P+Gve*J%SD70lT6U7gcB=FXb|1tak8fTPPIm|?&&jCws^*`?BnErol z0G2ARpndUwq)rYrfKcdDjsJ*NX0$2*JXHJLN+c}B1-M|eA`rEXJu#q@4-RQAEpz{) ze3AjhP0N3Ev(kMI4zrpI{Agva|C5Re5a6%6ql5lvb!PDNZ{R&d7rKB}z$>C-aTi#D zrdBFn03NC7fm~q6-i)W3c9Z*Lc_r$|=pdk!BA%Xh)g2zt380S=mmnYwAR!viOF-p+ zbpm76z%YCh1f-(=pHu(?GOd0R;6A#+i_9-MfcK#K1H<|sRTXR%0tGma6LVVT&r%%J X&c)77X|VtU9rR8?UA{urJox_sJ2!mL literal 0 HcmV?d00001 diff --git a/doc/tutorials/content/index.rst b/doc/tutorials/content/index.rst index 035757f38ff..43a8694b63c 100644 --- a/doc/tutorials/content/index.rst +++ b/doc/tutorials/content/index.rst @@ -601,6 +601,21 @@ I/O .. |i_o6| image:: images/dinast_cyclopes.png :height: 100px + * :ref:`ensenso_cameras` + + ====== ====== + |i_o7| Title: **Grabbing point clouds from Ensenso cameras** + + Author: *Victor Lamoine* + + Compatibility: >= PCL 1.8.0 + + In this tutorial, we will learn how to acquire point cloud data from an IDS-Imaging Ensenso camera. + ====== ====== + + .. |i_o7| image:: images/ensenso/ids.png + :height: 165px + .. _keypoints_tutorial: diff --git a/io/io.doxy b/io/io.doxy index 3cb9e775896..caa55d01928 100644 --- a/io/io.doxy +++ b/io/io.doxy @@ -12,6 +12,7 @@ - Reading PointCloud data from PCD files - Writing PointCloud data to PCD files - The OpenNI Grabber Framework in PCL + - Grabbing point clouds from Ensenso cameras PCL is agnostic with respect to the data sources that are used to generate 3D point clouds. While OpenNI-compatible cameras have recently been at the @@ -31,5 +32,6 @@ - \ref common "common" - \ref octree "octree" - OpenNi for kinect handling + - uEye and Ensenso SDK for Ensenso handling */