diff --git a/orbbec_camera/include/orbbec_camera/ob_camera_node_factory.h b/orbbec_camera/include/orbbec_camera/ob_camera_node_factory.h index 72bf6416..935a5516 100644 --- a/orbbec_camera/include/orbbec_camera/ob_camera_node_factory.h +++ b/orbbec_camera/include/orbbec_camera/ob_camera_node_factory.h @@ -30,9 +30,13 @@ class OBCameraNodeFactory : public rclcpp::Node { private: void init(); + void startDevice(); + void getDevice(const std::shared_ptr& list); + void updateDeviceInfo(); + void deviceConnectCallback(const std::shared_ptr& device_list); void deviceDisconnectCallback(const std::shared_ptr& device_list); @@ -44,12 +48,13 @@ class OBCameraNodeFactory : public rclcpp::Node { rclcpp::Logger logger_; std::unique_ptr ob_camera_node_; std::shared_ptr device_; + std::shared_ptr device_info_; std::atomic_bool is_alive_{false}; std::thread query_thread_; std::string serial_number_; std::string usb_port_id_; - double reconnect_timeout_; - double wait_for_device_timeout_; + double reconnect_timeout_ = 0.0; + double wait_for_device_timeout_ = 0.0; std::shared_ptr parameters_; }; } // namespace orbbec_camera diff --git a/orbbec_camera/src/ob_camera_node_factory.cpp b/orbbec_camera/src/ob_camera_node_factory.cpp index f6005555..e1645d8a 100644 --- a/orbbec_camera/src/ob_camera_node_factory.cpp +++ b/orbbec_camera/src/ob_camera_node_factory.cpp @@ -37,6 +37,8 @@ void OBCameraNodeFactory::init() { is_alive_.store(true); parameters_ = std::make_shared(this); serial_number_ = declare_parameter("serial_number", ""); + wait_for_device_timeout_ = declare_parameter("wait_for_device_timeout", 2.0); + reconnect_timeout_ = declare_parameter("reconnect_timeout", 2.0); query_thread_ = std::thread([=]() { std::chrono::milliseconds timespan(static_cast(reconnect_timeout_ * 1e3)); rclcpp::Time first_try_time = this->now(); @@ -96,22 +98,18 @@ void OBCameraNodeFactory::deviceDisconnectCallback( } RCLCPP_ERROR_STREAM(logger_, "deviceDisconnectCallback"); CHECK_NOTNULL(device_list); - ob_camera_node_.reset(nullptr); - device_.reset(); - // try { - // for (size_t i = 0; i < device_list->deviceCount(); i++) { - // auto dev = device_list->getDevice(i); - // std::string sn1 = dev->getDeviceInfo()->serialNumber(); - // std::string sn2 = device_->getDeviceInfo()->serialNumber(); - // if (sn1 == sn2) { - // RCLCPP_ERROR(logger_, "The device with SN %s was disconnected!", sn1.c_str()); - // ob_camera_node_.reset(nullptr); - // device_.reset(); - // } - // } - // } catch (const ob::Error &e) { - // RCLCPP_ERROR_STREAM(logger_, e.getMessage()); - // } + try { + for (size_t i = 0; i < device_list->deviceCount(); i++) { + std::string serial_number = device_list->serialNumber(i); + std::string device_serial_no = device_info_->serialNumber(); + if (serial_number == device_serial_no) { + ob_camera_node_.reset(nullptr); + device_.reset(); + } + } + } catch (const ob::Error &e) { + RCLCPP_ERROR_STREAM(logger_, e.getMessage()); + } } void OBCameraNodeFactory::printDeviceInfo(const std::shared_ptr &device_info) { @@ -139,6 +137,7 @@ void OBCameraNodeFactory::getDevice(const std::shared_ptr &list) if (dev != nullptr) { device_ = dev; printDeviceInfo(device_->getDeviceInfo()); + updateDeviceInfo(); } } } else { @@ -147,10 +146,18 @@ void OBCameraNodeFactory::getDevice(const std::shared_ptr &list) RCLCPP_ERROR_STREAM(logger_, "can not found device with SN " << serial_number_); } else { printDeviceInfo(device_->getDeviceInfo()); + updateDeviceInfo(); } } } +void OBCameraNodeFactory::updateDeviceInfo() { + if (device_ == nullptr) { + return; + } + device_info_ = device_->getDeviceInfo(); +} + void OBCameraNodeFactory::startDevice() { if (ob_camera_node_) { ob_camera_node_.reset();