fix: synchronize depth filter list access

This commit is contained in:
ob-yalian
2026-04-13 14:12:28 +08:00
parent c5c5787e56
commit f1ee63028e
2 changed files with 129 additions and 20 deletions
@@ -880,6 +880,7 @@ class OBCameraNode {
bool has_first_color_frame_ = false; bool has_first_color_frame_ = false;
bool use_intra_process_ = false; bool use_intra_process_ = false;
std::string cloud_frame_id_; std::string cloud_frame_id_;
std::mutex depth_filter_mutex_;
std::vector<std::shared_ptr<ob::Filter>> depth_filter_list_; std::vector<std::shared_ptr<ob::Filter>> depth_filter_list_;
std::vector<std::shared_ptr<ob::Filter>> color_filter_list_; std::vector<std::shared_ptr<ob::Filter>> color_filter_list_;
std::vector<std::shared_ptr<ob::Filter>> left_color_filter_list_; std::vector<std::shared_ptr<ob::Filter>> left_color_filter_list_;
+128 -20
View File
@@ -112,16 +112,23 @@ void OBCameraNode::publishDepthFiltersStatus() {
return; return;
} }
auto find_depth_filter = [this](const std::string &filter_name) -> std::shared_ptr<ob::Filter> { std::vector<std::shared_ptr<ob::Filter>> depth_filters_snapshot;
{
std::lock_guard<std::mutex> depth_filter_lock(depth_filter_mutex_);
depth_filters_snapshot = depth_filter_list_;
}
auto find_depth_filter =
[&depth_filters_snapshot, this](const std::string &filter_name) -> std::shared_ptr<ob::Filter> {
const auto normalized_name = normalizeDepthFilterName(filter_name); const auto normalized_name = normalizeDepthFilterName(filter_name);
auto it = std::find_if(depth_filter_list_.begin(), depth_filter_list_.end(), auto it = std::find_if(depth_filters_snapshot.begin(), depth_filters_snapshot.end(),
[&normalized_name](const auto &filter) { [&normalized_name](const auto &filter) {
return normalizeDepthFilterName(filter->type()) == return normalizeDepthFilterName(filter->type()) ==
normalized_name || normalized_name ||
normalizeDepthFilterName(filter->getName()) == normalizeDepthFilterName(filter->getName()) ==
normalized_name; normalized_name;
}); });
if (it == depth_filter_list_.end()) { if (it == depth_filters_snapshot.end()) {
return nullptr; return nullptr;
} }
return *it; return *it;
@@ -268,14 +275,14 @@ void OBCameraNode::publishDepthFiltersStatus() {
OB_PERMISSION_READ_WRITE); OB_PERMISSION_READ_WRITE);
std::vector<std::string> ordered_filter_names; std::vector<std::string> ordered_filter_names;
ordered_filter_names.reserve(depth_filter_list_.size() + 2); ordered_filter_names.reserve(depth_filters_snapshot.size() + 2);
auto append_unique_filter_name = [&ordered_filter_names](const std::string &filter_name) { auto append_unique_filter_name = [&ordered_filter_names](const std::string &filter_name) {
if (std::find(ordered_filter_names.begin(), ordered_filter_names.end(), filter_name) == if (std::find(ordered_filter_names.begin(), ordered_filter_names.end(), filter_name) ==
ordered_filter_names.end()) { ordered_filter_names.end()) {
ordered_filter_names.push_back(filter_name); ordered_filter_names.push_back(filter_name);
} }
}; };
for (const auto &filter : depth_filter_list_) { for (const auto &filter : depth_filters_snapshot) {
if (!filter) { if (!filter) {
continue; continue;
} }
@@ -3381,6 +3388,7 @@ std::shared_ptr<ob::Frame> OBCameraNode::processDepthFrameFilter(
if (frame == nullptr || frame->getType() != OB_FRAME_DEPTH) { if (frame == nullptr || frame->getType() != OB_FRAME_DEPTH) {
return nullptr; return nullptr;
} }
std::lock_guard<std::mutex> depth_filter_lock(depth_filter_mutex_);
for (size_t i = 0; i < depth_filter_list_.size(); i++) { for (size_t i = 0; i < depth_filter_list_.size(); i++) {
auto filter = depth_filter_list_[i]; auto filter = depth_filter_list_[i];
CHECK_NOTNULL(filter.get()); CHECK_NOTNULL(filter.get());
@@ -4771,12 +4779,16 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
std::shared_ptr<SetFilter ::Response> &response) { std::shared_ptr<SetFilter ::Response> &response) {
try { try {
const auto normalized_request_filter_name = normalizeDepthFilterName(request->filter_name); const auto normalized_request_filter_name = normalizeDepthFilterName(request->filter_name);
const bool in_recommended_filter_list = bool in_recommended_filter_list = false;
std::find_if(depth_filter_list_.begin(), depth_filter_list_.end(), {
[&normalized_request_filter_name](const auto &filter) { std::lock_guard<std::mutex> depth_filter_lock(depth_filter_mutex_);
return normalizeDepthFilterName(filter->type()) == in_recommended_filter_list =
normalized_request_filter_name; std::find_if(depth_filter_list_.begin(), depth_filter_list_.end(),
}) != depth_filter_list_.end(); [&normalized_request_filter_name](const auto &filter) {
return normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
}) != depth_filter_list_.end();
}
const bool is_noise_removal_filter = normalized_request_filter_name == "NoiseRemovalFilter"; const bool is_noise_removal_filter = normalized_request_filter_name == "NoiseRemovalFilter";
const bool is_hardware_noise_removal = const bool is_hardware_noise_removal =
normalized_request_filter_name == "HardwareNoiseRemovalFilter"; normalized_request_filter_name == "HardwareNoiseRemovalFilter";
@@ -4801,15 +4813,16 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
RCLCPP_INFO_STREAM(logger_, "filter_name: " << request->filter_name << " filter_enable: " RCLCPP_INFO_STREAM(logger_, "filter_name: " << request->filter_name << " filter_enable: "
<< (request->filter_enable ? "true" : "false")); << (request->filter_enable ? "true" : "false"));
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
if (normalized_request_filter_name == "DecimationFilter") { if (normalized_request_filter_name == "DecimationFilter") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto decimation_filter = std::make_shared<ob::DecimationFilter>(); auto decimation_filter = std::make_shared<ob::DecimationFilter>();
decimation_filter->enable(request->filter_enable); decimation_filter->enable(request->filter_enable);
depth_filter_list_.push_back(decimation_filter); depth_filter_list_.push_back(decimation_filter);
@@ -4837,6 +4850,15 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
enable_decimation_filter_ = request->filter_enable; enable_decimation_filter_ = request->filter_enable;
} else if (normalized_request_filter_name == "HDRMerge") { } else if (normalized_request_filter_name == "HDRMerge") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto hdr_merge_filter = std::make_shared<ob::HdrMerge>(); auto hdr_merge_filter = std::make_shared<ob::HdrMerge>();
hdr_merge_filter->enable(request->filter_enable); hdr_merge_filter->enable(request->filter_enable);
depth_filter_list_.push_back(hdr_merge_filter); depth_filter_list_.push_back(hdr_merge_filter);
@@ -4866,6 +4888,15 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
enable_hdr_merge_ = request->filter_enable; enable_hdr_merge_ = request->filter_enable;
} else if (normalized_request_filter_name == "SequenceIdFilter") { } else if (normalized_request_filter_name == "SequenceIdFilter") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto sequenced_filter = std::make_shared<ob::SequenceIdFilter>(); auto sequenced_filter = std::make_shared<ob::SequenceIdFilter>();
sequenced_filter->enable(request->filter_enable); sequenced_filter->enable(request->filter_enable);
depth_filter_list_.push_back(sequenced_filter); depth_filter_list_.push_back(sequenced_filter);
@@ -4882,6 +4913,15 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
enable_sequence_id_filter_ = request->filter_enable; enable_sequence_id_filter_ = request->filter_enable;
} else if (normalized_request_filter_name == "ThresholdFilter") { } else if (normalized_request_filter_name == "ThresholdFilter") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto threshold_filter = std::make_shared<ob::ThresholdFilter>(); auto threshold_filter = std::make_shared<ob::ThresholdFilter>();
threshold_filter->enable(request->filter_enable); threshold_filter->enable(request->filter_enable);
depth_filter_list_.push_back(threshold_filter); depth_filter_list_.push_back(threshold_filter);
@@ -4958,6 +4998,15 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
} }
enable_hardware_noise_removal_filter_ = request->filter_enable; enable_hardware_noise_removal_filter_ = request->filter_enable;
} else if (normalized_request_filter_name == "SpatialAdvancedFilter") { } else if (normalized_request_filter_name == "SpatialAdvancedFilter") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto spatial_filter = std::make_shared<ob::SpatialAdvancedFilter>(); auto spatial_filter = std::make_shared<ob::SpatialAdvancedFilter>();
spatial_filter->enable(request->filter_enable); spatial_filter->enable(request->filter_enable);
depth_filter_list_.push_back(spatial_filter); depth_filter_list_.push_back(spatial_filter);
@@ -4984,6 +5033,15 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
} }
enable_spatial_filter_ = request->filter_enable; enable_spatial_filter_ = request->filter_enable;
} else if (normalized_request_filter_name == "TemporalFilter") { } else if (normalized_request_filter_name == "TemporalFilter") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto temporal_filter = std::make_shared<ob::TemporalFilter>(); auto temporal_filter = std::make_shared<ob::TemporalFilter>();
temporal_filter->enable(request->filter_enable); temporal_filter->enable(request->filter_enable);
depth_filter_list_.push_back(temporal_filter); depth_filter_list_.push_back(temporal_filter);
@@ -5002,6 +5060,15 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
} }
enable_temporal_filter_ = request->filter_enable; enable_temporal_filter_ = request->filter_enable;
} else if (normalized_request_filter_name == "SpatialFastFilter") { } else if (normalized_request_filter_name == "SpatialFastFilter") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto spatial_fast_filter = std::make_shared<ob::SpatialFastFilter>(); auto spatial_fast_filter = std::make_shared<ob::SpatialFastFilter>();
spatial_fast_filter->enable(request->filter_enable); spatial_fast_filter->enable(request->filter_enable);
depth_filter_list_.push_back(spatial_fast_filter); depth_filter_list_.push_back(spatial_fast_filter);
@@ -5020,6 +5087,15 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
enable_spatial_fast_filter_ = request->filter_enable; enable_spatial_fast_filter_ = request->filter_enable;
} else if (normalized_request_filter_name == "SpatialModerateFilter") { } else if (normalized_request_filter_name == "SpatialModerateFilter") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto spatial_moderate_filter = std::make_shared<ob::SpatialModerateFilter>(); auto spatial_moderate_filter = std::make_shared<ob::SpatialModerateFilter>();
spatial_moderate_filter->enable(request->filter_enable); spatial_moderate_filter->enable(request->filter_enable);
depth_filter_list_.push_back(spatial_moderate_filter); depth_filter_list_.push_back(spatial_moderate_filter);
@@ -5043,16 +5119,43 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
} }
enable_spatial_moderate_filter_ = request->filter_enable; enable_spatial_moderate_filter_ = request->filter_enable;
} else if (normalized_request_filter_name == "FalsePositiveFilter") { } else if (normalized_request_filter_name == "FalsePositiveFilter") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto false_positive_filter = std::make_shared<ob::FalsePositiveFilter>(); auto false_positive_filter = std::make_shared<ob::FalsePositiveFilter>();
false_positive_filter->enable(request->filter_enable); false_positive_filter->enable(request->filter_enable);
depth_filter_list_.push_back(false_positive_filter); depth_filter_list_.push_back(false_positive_filter);
enable_false_positive_filter_ = request->filter_enable; enable_false_positive_filter_ = request->filter_enable;
} else if (normalized_request_filter_name == "MgcNoiseRemovalFilter") { } else if (normalized_request_filter_name == "MgcNoiseRemovalFilter") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto mgc_filter = std::make_shared<ob::MgcNoiseRemovalFilter>(); auto mgc_filter = std::make_shared<ob::MgcNoiseRemovalFilter>();
mgc_filter->enable(request->filter_enable); mgc_filter->enable(request->filter_enable);
depth_filter_list_.push_back(mgc_filter); depth_filter_list_.push_back(mgc_filter);
enable_mgc_noise_removal_filter_ = request->filter_enable; enable_mgc_noise_removal_filter_ = request->filter_enable;
} else if (normalized_request_filter_name == "LutNoiseRemovalFilter") { } else if (normalized_request_filter_name == "LutNoiseRemovalFilter") {
std::unique_lock<std::mutex> depth_filter_lock(depth_filter_mutex_);
auto it = std::remove_if(depth_filter_list_.begin(), depth_filter_list_.end(),
[&normalized_request_filter_name](const std::shared_ptr<ob::Filter> &filter) {
return normalizeDepthFilterName(filter->getName()) ==
normalized_request_filter_name ||
normalizeDepthFilterName(filter->type()) ==
normalized_request_filter_name;
});
depth_filter_list_.erase(it, depth_filter_list_.end());
auto lut_filter = std::make_shared<ob::LutNoiseRemovalFilter>(); auto lut_filter = std::make_shared<ob::LutNoiseRemovalFilter>();
lut_filter->enable(request->filter_enable); lut_filter->enable(request->filter_enable);
depth_filter_list_.push_back(lut_filter); depth_filter_list_.push_back(lut_filter);
@@ -5069,7 +5172,12 @@ void OBCameraNode::setFilterCallback(const std::shared_ptr<SetFilter ::Request>
"LutNoiseRemovalFilter"); "LutNoiseRemovalFilter");
return; return;
} }
for (auto &filter : depth_filter_list_) { std::vector<std::shared_ptr<ob::Filter>> depth_filters_snapshot;
{
std::lock_guard<std::mutex> depth_filter_lock(depth_filter_mutex_);
depth_filters_snapshot = depth_filter_list_;
}
for (auto &filter : depth_filters_snapshot) {
std::cout << " - " << filter->getName() << ": " std::cout << " - " << filter->getName() << ": "
<< (filter->isEnabled() ? "enabled" : "disabled") << std::endl; << (filter->isEnabled() ? "enabled" : "disabled") << std::endl;
auto configSchemaVec = filter->getConfigSchemaVec(); auto configSchemaVec = filter->getConfigSchemaVec();