mirror of
https://github.com/orbbec/OrbbecSDK_ROS2.git
synced 2026-09-13 03:30:18 +08:00
Fixed hot-plug crash caused by diagnostic updater
This commit is contained in:
@@ -546,10 +546,10 @@ class OBCameraNode {
|
||||
int ir_gain_ = -1;
|
||||
int ir_ae_max_exposure_ = -1;
|
||||
int ir_brightness_ = -1;
|
||||
bool enable_right_ir_sequence_id_filter_=false;
|
||||
int right_ir_sequence_id_filter_id_=-1;
|
||||
bool enable_left_ir_sequence_id_filter_=false;
|
||||
int left_ir_sequence_id_filter_id_=-1;
|
||||
bool enable_right_ir_sequence_id_filter_ = false;
|
||||
int right_ir_sequence_id_filter_id_ = -1;
|
||||
bool enable_left_ir_sequence_id_filter_ = false;
|
||||
int left_ir_sequence_id_filter_id_ = -1;
|
||||
int soft_filter_max_diff_ = -1;
|
||||
int soft_filter_speckle_size_ = -1;
|
||||
bool enable_frame_sync_ = false;
|
||||
@@ -655,6 +655,7 @@ class OBCameraNode {
|
||||
std::string time_domain_ = "global"; // device, system, global
|
||||
// soft ware trigger
|
||||
rclcpp::TimerBase::SharedPtr software_trigger_timer_;
|
||||
rclcpp::TimerBase::SharedPtr diagnostic_timer_;
|
||||
std::chrono::milliseconds software_trigger_period_{33};
|
||||
bool enable_heartbeat_ = false;
|
||||
bool enable_color_undistortion_ = false;
|
||||
|
||||
@@ -108,6 +108,11 @@ void OBCameraNode::rebootDevice() {
|
||||
void OBCameraNode::clean() noexcept {
|
||||
std::lock_guard<decltype(device_lock_)> lock(device_lock_);
|
||||
RCLCPP_WARN_STREAM(logger_, "Do destroy ~OBCameraNode");
|
||||
if (diagnostic_updater_) {
|
||||
RCLCPP_WARN_STREAM(logger_, "diagnostic_updater_ is alive");
|
||||
} else {
|
||||
RCLCPP_WARN_STREAM(logger_, "diagnostic_updater_ is clean");
|
||||
}
|
||||
is_running_.store(false);
|
||||
RCLCPP_WARN_STREAM(logger_, "Stop tf thread");
|
||||
if (tf_thread_ && tf_thread_->joinable()) {
|
||||
@@ -1718,7 +1723,17 @@ void OBCameraNode::onTemperatureUpdate(diagnostic_updater::DiagnosticStatusWrapp
|
||||
status.add("Chip Bottom Temperature", temperature.chipBottomTemp);
|
||||
status.summary(diagnostic_msgs::msg::DiagnosticStatus::OK, "Temperature is normal");
|
||||
} catch (const ob::Error &e) {
|
||||
if (is_running_.load()) {
|
||||
diagnostic_timer_->cancel();
|
||||
diagnostic_timer_.reset();
|
||||
}
|
||||
RCLCPP_ERROR_STREAM(logger_, "Failed to TemperatureUpdate: " << e.getMessage());
|
||||
status.summary(diagnostic_msgs::msg::DiagnosticStatus::ERROR, e.getMessage());
|
||||
} catch (const std::exception &e) {
|
||||
RCLCPP_ERROR_STREAM(logger_, "Failed to TemperatureUpdate: " << e.what());
|
||||
status.summary(diagnostic_msgs::msg::DiagnosticStatus::ERROR, e.what());
|
||||
} catch (...) {
|
||||
RCLCPP_ERROR(logger_, "Failed to TemperatureUpdate");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1730,11 +1745,17 @@ void OBCameraNode::setupDiagnosticUpdater() {
|
||||
RCLCPP_INFO_STREAM(logger_, "Publish diagnostics every " << diagnostic_period_ << " seconds");
|
||||
auto info = device_->getDeviceInfo();
|
||||
std::string serial_number = info->getSerialNumber();
|
||||
diagnostic_updater_ = std::make_unique<diagnostic_updater::Updater>(node_, diagnostic_period_);
|
||||
diagnostic_updater_ = std::make_unique<diagnostic_updater::Updater>(node_, 10000.0);
|
||||
diagnostic_updater_->setHardwareID(serial_number);
|
||||
diagnostic_updater_->add("Temperatures", this, &OBCameraNode::onTemperatureUpdate);
|
||||
diagnostic_timer_ = node_->create_wall_timer(std::chrono::seconds(int(diagnostic_period_)),
|
||||
[this]() { diagnostic_updater_->force_update(); });
|
||||
} catch (const ob::Error &e) {
|
||||
RCLCPP_ERROR_STREAM(logger_, "Failed to setup diagnostic updater: " << e.getMessage());
|
||||
} catch (const std::exception &e) {
|
||||
RCLCPP_ERROR_STREAM(logger_, "Failed to setup diagnostic updater: " << e.what());
|
||||
} catch (...) {
|
||||
RCLCPP_ERROR(logger_, "Failed to TemperatureUpdate");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user