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 dd9f0603..e918a342 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,58 @@ 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();
+
+ 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();
+#endif
}
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_;