From ef99fa0f2ecce6f5ed2bbc915c77fb5a3780d069 Mon Sep 17 00:00:00 2001 From: iagogomes Date: Mon, 8 Jul 2024 17:21:09 -0300 Subject: [PATCH 1/2] fix multiple network interface refreshCameraList --- .../src/spinnaker_wrapper_impl.cpp | 50 +++++++++++++++++-- .../src/spinnaker_wrapper_impl.hpp | 3 ++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/spinnaker_camera_driver/src/spinnaker_wrapper_impl.cpp b/spinnaker_camera_driver/src/spinnaker_wrapper_impl.cpp index dd9f0603..6d569028 100644 --- a/spinnaker_camera_driver/src/spinnaker_wrapper_impl.cpp +++ b/spinnaker_camera_driver/src/spinnaker_wrapper_impl.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -104,10 +105,51 @@ SpinnakerWrapperImpl::SpinnakerWrapperImpl() void SpinnakerWrapperImpl::refreshCameraList() { - cameraList_ = system_->GetCameras(); - for (size_t cam_idx = 0; cam_idx < cameraList_.GetSize(); cam_idx++) { - const auto cam = cameraList_[cam_idx]; - } + cameraList_.Clear(); + + Spinnaker::InterfaceList interfaceList = system_->GetInterfaces(); + + for (size_t i = 0; i < interfaceList.GetSize(); i++) { + Spinnaker::InterfacePtr iface = interfaceList.GetByIndex(i); + + Spinnaker::GenApi::INodeMap & nodeMapInterface = iface->GetTLNodeMap(); + + Spinnaker::GenApi::CEnumerationPtr ptrInterfaceType = nodeMapInterface.GetNode("InterfaceType"); + + if (IsAvailable(ptrInterfaceType) && IsReadable(ptrInterfaceType)) { + Spinnaker::GenApi::CStringPtr ptrInterfaceDisplayName = + nodeMapInterface.GetNode("InterfaceDisplayName"); + + if (IsAvailable(ptrInterfaceDisplayName) && IsReadable(ptrInterfaceDisplayName)) { + Spinnaker::GenICam::gcstring interfaceDisplayName = ptrInterfaceDisplayName->GetValue(); + + Spinnaker::CameraList camList = iface->GetCameras(); + + for (size_t cam_idx = 0; cam_idx < camList.GetSize(); cam_idx++) { + // try open the cameras in a specific interface + Spinnaker::CameraPtr ptrCam = camList.GetByIndex(cam_idx); + try { + ptrCam->Init(); + ptrCam->DeInit(); + } catch (Spinnaker::Exception & e) { + // erro while open the cameras in this interface + continue; + } // end try-catch ptrCam + + // successfully open the camera in the interface + cameraList_.Add(ptrCam); + + LOG_INFO_FMT( + "Found camera [serial: %s] from: [%s]", get_serial(ptrCam).c_str(), + interfaceDisplayName.c_str()); + } // end for camList + } else { + LOG_ERROR("Unknown Interface (Display name not readable)"); + } // end if-else ptrInterfaceDisplayName + } // end if ptrInterfaceType + } // end for interfaceList + + interfaceList.Clear(); } SpinnakerWrapperImpl::~SpinnakerWrapperImpl() diff --git a/spinnaker_camera_driver/src/spinnaker_wrapper_impl.hpp b/spinnaker_camera_driver/src/spinnaker_wrapper_impl.hpp index 3421ee88..4fccd464 100644 --- a/spinnaker_camera_driver/src/spinnaker_wrapper_impl.hpp +++ b/spinnaker_camera_driver/src/spinnaker_wrapper_impl.hpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -67,6 +68,8 @@ class SpinnakerWrapperImpl : public Spinnaker::ImageEventHandler bool setInINodeMap(double f, const std::string & field, double * fret); void monitorStatus(); + rclcpp::Logger get_logger() { return rclcpp::get_logger("Spinnaker Wrapper"); } + // ----- variables -- Spinnaker::SystemPtr system_; Spinnaker::CameraList cameraList_; From 6bb3f2630681dceac52bf30f69234b91854d0727 Mon Sep 17 00:00:00 2001 From: Bernd Pfrommer Date: Wed, 10 Jul 2024 18:03:55 -0400 Subject: [PATCH 2/2] work around compile error on Iron --- spinnaker_camera_driver/CMakeLists.txt | 11 ++++++++++- spinnaker_camera_driver/package.xml | 1 + .../src/spinnaker_wrapper_impl.cpp | 7 +++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/spinnaker_camera_driver/CMakeLists.txt b/spinnaker_camera_driver/CMakeLists.txt index 73c3f04f..f82e857e 100644 --- a/spinnaker_camera_driver/CMakeLists.txt +++ b/spinnaker_camera_driver/CMakeLists.txt @@ -65,6 +65,16 @@ message(STATUS "libSpinnaker include location: ${SPINNAKER_INCLUDE_DIRS}") find_package(SPINNAKER REQUIRED) +# special case the older Spinnaker API +if(DEFINED ENV{ROS_DISTRO}) + if($ENV{ROS_DISTRO} STREQUAL "foxy" OR + $ENV{ROS_DISTRO} STREQUAL "galactic") + add_definitions(-DUSE_OLD_SPINNAKER_API) + endif() +else() + message(FATAL_ERROR "ROS_DISTRO environment variable is not set!") +endif() + include_directories(SYSTEM ${SPINNAKER_INCLUDE_DIRS}) @@ -79,7 +89,6 @@ set(ROS_DEPENDENCIES "image_transport" "flir_camera_msgs") - # find dependencies find_package(ament_cmake REQUIRED) find_package(ament_cmake_ros REQUIRED) diff --git a/spinnaker_camera_driver/package.xml b/spinnaker_camera_driver/package.xml index f893b1d4..1c479eed 100644 --- a/spinnaker_camera_driver/package.xml +++ b/spinnaker_camera_driver/package.xml @@ -16,6 +16,7 @@ ament_cmake ament_cmake_ros + ros_environment python3-distro curl diff --git a/spinnaker_camera_driver/src/spinnaker_wrapper_impl.cpp b/spinnaker_camera_driver/src/spinnaker_wrapper_impl.cpp index 6d569028..e918a342 100644 --- a/spinnaker_camera_driver/src/spinnaker_wrapper_impl.cpp +++ b/spinnaker_camera_driver/src/spinnaker_wrapper_impl.cpp @@ -105,6 +105,12 @@ SpinnakerWrapperImpl::SpinnakerWrapperImpl() void SpinnakerWrapperImpl::refreshCameraList() { +#ifdef USE_OLD_SPINNAKER_API + cameraList_ = system_->GetCameras(); + for (size_t cam_idx = 0; cam_idx < cameraList_.GetSize(); cam_idx++) { + const auto cam = cameraList_[cam_idx]; + } +#else cameraList_.Clear(); Spinnaker::InterfaceList interfaceList = system_->GetInterfaces(); @@ -150,6 +156,7 @@ void SpinnakerWrapperImpl::refreshCameraList() } // end for interfaceList interfaceList.Clear(); +#endif } SpinnakerWrapperImpl::~SpinnakerWrapperImpl()