mirror of
https://github.com/orbbec/OrbbecSDK_ROS2.git
synced 2026-09-12 19:20:20 +08:00
[tool]Improve multi_save_rgbir_node
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
rclcpp::init(argc, argv);
|
||||
auto node = std::make_shared<MultiCameraSubscriber>();
|
||||
auto node = std::make_shared<orbbec_camera::tools::MultiCameraSubscriber>();
|
||||
rclcpp::executors::MultiThreadedExecutor executor(rclcpp::ExecutorOptions(), 20);
|
||||
executor.add_node(node);
|
||||
executor.spin();
|
||||
|
||||
@@ -3,11 +3,18 @@
|
||||
|
||||
#include <orbbec_camera/ob_camera_node_driver.h>
|
||||
#include <orbbec_camera/utils.h>
|
||||
#include "orbbec_camera_msgs/msg/metadata.hpp"
|
||||
#include <message_filters/subscriber.h>
|
||||
#include <message_filters/sync_policies/approximate_time.h>
|
||||
#include <message_filters/synchronizer.h>
|
||||
#include <std_msgs/msg/bool.hpp>
|
||||
#include <filesystem>
|
||||
namespace orbbec_camera {
|
||||
namespace tools {
|
||||
struct ImageMetadata {
|
||||
std::vector<std::vector<std::string>> exposure_buffs;
|
||||
std::vector<std::vector<std::string>> gain_buffs;
|
||||
};
|
||||
|
||||
class MultiCameraSubscriber : public rclcpp::Node {
|
||||
public:
|
||||
@@ -61,7 +68,8 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
}
|
||||
|
||||
private:
|
||||
std::mutex buffer_mutex_;
|
||||
std::mutex image_mutex_;
|
||||
std::mutex meta_mutex_;
|
||||
void params_init() {
|
||||
std::ifstream file(
|
||||
"install/orbbec_camera/share/orbbec_camera/config/tools/multisavergbir/"
|
||||
@@ -72,10 +80,16 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
}
|
||||
nlohmann::json json_data;
|
||||
file >> json_data;
|
||||
time_domain_= json_data["save_rgbir_params"]["time_domain"].get<std::string>();
|
||||
time_domain_ =(time_domain_ == "device") ? "_d" : (time_domain_ == "global" ? "_g" : "_unknown");
|
||||
image_number_ = json_data["save_rgbir_params"]["image_number"].get<std::string>();
|
||||
usb_params_ = json_data["save_rgbir_params"]["usb_ports"].get<std::vector<std::string>>();
|
||||
left_ir_metadata_topic_ =
|
||||
json_data["save_rgbir_params"]["left_ir_metadata_topic"].get<std::vector<std::string>>();
|
||||
ir_topics_ = json_data["save_rgbir_params"]["ir_topics"].get<std::vector<std::string>>();
|
||||
color_topics_ = json_data["save_rgbir_params"]["color_topics"].get<std::vector<std::string>>();
|
||||
color_metadata_topic_ =
|
||||
json_data["save_rgbir_params"]["color_metadata_topic"].get<std::vector<std::string>>();
|
||||
}
|
||||
void topic_init() {
|
||||
auto custom_qos = rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(rmw_qos_profile_default));
|
||||
@@ -84,8 +98,12 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
for (size_t i = 0; i < ir_topics_.size(); ++i) {
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"),
|
||||
"ir_topic: " << ir_topics_[i]);
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"),
|
||||
"left_ir_metadata_topic_: " << left_ir_metadata_topic_[i]);
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"),
|
||||
"color_topic: " << color_topics_[i]);
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"),
|
||||
"color_metadata_topic_: " << color_metadata_topic_[i]);
|
||||
|
||||
rclcpp::SubscriptionOptions ir_sub_options;
|
||||
ir_sub_options.callback_group = reentrant_callback_group_;
|
||||
@@ -100,6 +118,12 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
},
|
||||
ir_sub_options);
|
||||
|
||||
auto ir_metadata_sub = this->create_subscription<orbbec_camera_msgs::msg::Metadata>(
|
||||
left_ir_metadata_topic_[i], custom_qos,
|
||||
[this, i](std::shared_ptr<const orbbec_camera_msgs::msg::Metadata> msg) {
|
||||
this->ir_meta_Callback(msg, i);
|
||||
});
|
||||
|
||||
auto color_sub = this->create_subscription<sensor_msgs::msg::Image>(
|
||||
color_topics_[i], custom_qos,
|
||||
[this, i](std::shared_ptr<const sensor_msgs::msg::Image> msg) {
|
||||
@@ -107,8 +131,16 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
},
|
||||
color_sub_options);
|
||||
|
||||
auto color_metadata_sub = this->create_subscription<orbbec_camera_msgs::msg::Metadata>(
|
||||
color_metadata_topic_[i], custom_qos,
|
||||
[this, i](std::shared_ptr<const orbbec_camera_msgs::msg::Metadata> msg) {
|
||||
this->color_meta_Callback(msg, i);
|
||||
});
|
||||
|
||||
ir_subscribers_.push_back(ir_sub);
|
||||
ir_meta_subscribers_.push_back(ir_metadata_sub);
|
||||
color_subscribers_.push_back(color_sub);
|
||||
color_meta_subscribers_.push_back(color_metadata_sub);
|
||||
|
||||
ir_image_buffers_.resize(ir_topics_.size());
|
||||
color_image_buffers_.resize(ir_topics_.size());
|
||||
@@ -116,6 +148,10 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
color_current_timestamp_buffers_.resize(ir_topics_.size());
|
||||
ir_timestamp_buffers_.resize(ir_topics_.size());
|
||||
color_timestamp_buffers_.resize(ir_topics_.size());
|
||||
left_ir_metadata_.exposure_buffs.resize(ir_topics_.size());
|
||||
left_ir_metadata_.gain_buffs.resize(ir_topics_.size());
|
||||
color_metadata_.exposure_buffs.resize(ir_topics_.size());
|
||||
color_metadata_.gain_buffs.resize(ir_topics_.size());
|
||||
callback_called_ = std::vector<bool>(ir_topics_.size(), false);
|
||||
}
|
||||
}
|
||||
@@ -163,17 +199,21 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
auto &color_images = color_image_buffers_[index];
|
||||
auto &color_current_timestamps = color_current_timestamp_buffers_[index];
|
||||
auto &color_timestamps = color_timestamp_buffers_[index];
|
||||
auto &left_ir_meta_exposure = left_ir_metadata_.exposure_buffs[index];
|
||||
auto &left_ir_meta_gain = left_ir_metadata_.gain_buffs[index];
|
||||
auto &color_meta_exposure = color_metadata_.exposure_buffs[index];
|
||||
auto &color_meta_gain = color_metadata_.gain_buffs[index];
|
||||
callback_called_[index] = true;
|
||||
if (ir_images.size() < static_cast<size_t>(std::stoi(image_number_)) ||
|
||||
color_images.size() < static_cast<size_t>(std::stoi(image_number_))) {
|
||||
return;
|
||||
}
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("list_device_node"), "jjjjj1");
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"), "index:"<<index);
|
||||
auto usb_iter = usb_index_map_.find(usb_numbers_[index]);
|
||||
auto serial_iter = serial_numbers_.find(usb_numbers_[index]);
|
||||
int usb_index = usb_iter->second;
|
||||
if (serial_iter == serial_numbers_.end()) {
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("list_device_node"), "jjjjj2");
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"), "serial_iter is empty");
|
||||
return;
|
||||
}
|
||||
std::string serial_index = serial_iter->second;
|
||||
@@ -181,46 +221,42 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
for (size_t i = 0; i < static_cast<size_t>(std::stoi(image_number_)); i++) {
|
||||
std::string folder = generateFolderName(serial_index, usb_index);
|
||||
std::string ir_filename = folder + "/ir#left_SN" + serial_index + "_Index" +
|
||||
std::to_string(usb_index) + "_d" + ir_current_timestamps[i] + "_f" +
|
||||
std::to_string(i) + "_s" + ir_timestamps[i] + "_.jpg";
|
||||
std::to_string(usb_index) + time_domain_ + ir_current_timestamps[i] + "_f" +
|
||||
std::to_string(i) + "_s" + ir_timestamps[i] + "_e" +
|
||||
left_ir_meta_exposure[i] + "_g" + left_ir_meta_gain[i] + "_.jpg";
|
||||
if (ir_images[i].empty()) {
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("list_device_node"), "over ");
|
||||
// rclcpp::shutdown();
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"), "over ");
|
||||
continue;
|
||||
}
|
||||
|
||||
cv::imwrite(ir_filename, ir_images[i]);
|
||||
// RCLCPP_INFO(this->get_logger(), "Saved IR image to: %s", ir_filename.c_str());
|
||||
|
||||
std::string color_filename = folder + "/color_SN" + serial_index + "_Index" +
|
||||
std::to_string(usb_index) + "_d" + color_current_timestamps[i] +
|
||||
"_f" + std::to_string(i) + "_s" + color_timestamps[i] + "_.jpg";
|
||||
if (ir_images[i].empty()) {
|
||||
// rclcpp::shutdown();
|
||||
std::to_string(usb_index) + time_domain_ + color_current_timestamps[i] +
|
||||
"_f" + std::to_string(i) + "_s" + color_timestamps[i] + "_e" +
|
||||
color_meta_exposure[i] + "_g" + color_meta_gain[i] +"_.jpg";
|
||||
if (color_images[i].empty()) {
|
||||
continue;
|
||||
}
|
||||
cv::imwrite(color_filename, color_images[i]);
|
||||
// RCLCPP_INFO(this->get_logger(), "Saved Color image to: %s", color_filename.c_str());
|
||||
}
|
||||
|
||||
ir_images.clear();
|
||||
color_images.clear();
|
||||
ir_current_timestamps.clear();
|
||||
color_current_timestamps.clear();
|
||||
ir_timestamps.clear();
|
||||
color_timestamps.clear();
|
||||
ir_image_buffers_[index].clear();
|
||||
ir_current_timestamp_buffers_[index].clear();
|
||||
ir_timestamp_buffers_[index].clear();
|
||||
color_image_buffers_[index].clear();
|
||||
color_current_timestamp_buffers_[index].clear();
|
||||
color_timestamp_buffers_[index].clear();
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("list_device_node"),
|
||||
left_ir_metadata_.exposure_buffs[index].clear();
|
||||
left_ir_metadata_.gain_buffs[index].clear();
|
||||
color_metadata_.exposure_buffs[index].clear();
|
||||
color_metadata_.gain_buffs[index].clear();
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"),
|
||||
"callback_called_ " << index << ":" << callback_called_[index]);
|
||||
bool all_true =
|
||||
std::all_of(callback_called_.begin(), callback_called_.end(), [](bool v) { return v; });
|
||||
if (all_true) {
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("list_device_node"), "over ");
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"), "over ");
|
||||
ir_image_buffers_.clear();
|
||||
ir_current_timestamp_buffers_.clear();
|
||||
ir_timestamp_buffers_.clear();
|
||||
@@ -234,10 +270,10 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
void controlCaptureCallback(const std_msgs::msg::Bool::SharedPtr msg) {
|
||||
is_saving_images_ = msg->data;
|
||||
topic_init();
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("list_device_node"), "jjjj " << is_saving_images_);
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"), "jjjj " << is_saving_images_);
|
||||
}
|
||||
void irCallback(std::shared_ptr<const sensor_msgs::msg::Image> image, size_t index) {
|
||||
std::lock_guard<std::mutex> lock(buffer_mutex_);
|
||||
std::lock_guard<std::mutex> lock(image_mutex_);
|
||||
if (!callback_called_[index] && is_saving_images_) {
|
||||
cv::Mat ir_mat = cv_bridge::toCvCopy(image, image->encoding)->image;
|
||||
std::string current_timestamp_ir = getCurrentTimestamp(image);
|
||||
@@ -246,7 +282,7 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
ir_current_timestamp_buffers_[index].push_back(current_timestamp_ir);
|
||||
ir_timestamp_buffers_[index].push_back(timestamp_ir);
|
||||
ir_resolution_ = std::to_string(image->width) + "x" + std::to_string(image->height);
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("list_device_node"),
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"),
|
||||
":ir: " << index << ":" << ir_image_buffers_[index].size());
|
||||
if (ir_image_buffers_[index].size() >= static_cast<size_t>(std::stoi(image_number_)) &&
|
||||
color_image_buffers_[index].size() >= static_cast<size_t>(std::stoi(image_number_))) {
|
||||
@@ -254,9 +290,8 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void colorCallback(std::shared_ptr<const sensor_msgs::msg::Image> image, size_t index) {
|
||||
std::lock_guard<std::mutex> lock(buffer_mutex_);
|
||||
std::lock_guard<std::mutex> lock(image_mutex_);
|
||||
if (!callback_called_[index] && is_saving_images_) {
|
||||
cv::Mat color_mat = cv_bridge::toCvCopy(image, image->encoding)->image;
|
||||
cv::Mat corrected_image;
|
||||
@@ -267,7 +302,7 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
color_current_timestamp_buffers_[index].push_back(current_timestamp_color);
|
||||
color_timestamp_buffers_[index].push_back(timestamp_color);
|
||||
color_resolution_ = std::to_string(image->width) + "x" + std::to_string(image->height);
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("list_device_node"),
|
||||
RCLCPP_INFO_STREAM(rclcpp::get_logger("multi_camera_subscriber"),
|
||||
":color: " << index << ":" << color_image_buffers_[index].size());
|
||||
if (ir_image_buffers_[index].size() >= static_cast<size_t>(std::stoi(image_number_)) &&
|
||||
color_image_buffers_[index].size() >= static_cast<size_t>(std::stoi(image_number_))) {
|
||||
@@ -276,7 +311,26 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
}
|
||||
}
|
||||
|
||||
void ir_meta_Callback(std::shared_ptr<const orbbec_camera_msgs::msg::Metadata> msg,
|
||||
size_t index) {
|
||||
std::lock_guard<std::mutex> lock(meta_mutex_);
|
||||
nlohmann::json json_data = nlohmann::json::parse(msg->json_data);
|
||||
left_ir_metadata_.exposure_buffs[index].push_back(json_data["exposure"].dump());
|
||||
left_ir_metadata_.gain_buffs[index].push_back(json_data["gain"].dump());
|
||||
}
|
||||
void color_meta_Callback(std::shared_ptr<const orbbec_camera_msgs::msg::Metadata> msg,
|
||||
size_t index) {
|
||||
std::lock_guard<std::mutex> lock(meta_mutex_);
|
||||
nlohmann::json json_data = nlohmann::json::parse(msg->json_data);
|
||||
color_metadata_.exposure_buffs[index].push_back(json_data["exposure"].dump());
|
||||
color_metadata_.gain_buffs[index].push_back(json_data["gain"].dump());
|
||||
}
|
||||
|
||||
rclcpp::CallbackGroup::SharedPtr reentrant_callback_group_;
|
||||
std::vector<rclcpp::Subscription<orbbec_camera_msgs::msg::Metadata>::SharedPtr>
|
||||
ir_meta_subscribers_;
|
||||
std::vector<rclcpp::Subscription<orbbec_camera_msgs::msg::Metadata>::SharedPtr>
|
||||
color_meta_subscribers_;
|
||||
std::vector<rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr> ir_subscribers_;
|
||||
std::vector<rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr> color_subscribers_;
|
||||
rclcpp::Subscription<std_msgs::msg::Bool>::SharedPtr capture_control_sub_;
|
||||
@@ -289,9 +343,12 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
size_t count = 0;
|
||||
|
||||
std::vector<std::string> usb_params_;
|
||||
std::vector<std::string> left_ir_metadata_topic_;
|
||||
std::vector<std::string> color_metadata_topic_;
|
||||
std::vector<std::string> ir_topics_;
|
||||
std::vector<std::string> color_topics_;
|
||||
std::string image_number_;
|
||||
std::string time_domain_;
|
||||
|
||||
std::vector<std::vector<cv::Mat>> ir_image_buffers_;
|
||||
std::vector<std::vector<cv::Mat>> color_image_buffers_;
|
||||
@@ -307,4 +364,9 @@ class MultiCameraSubscriber : public rclcpp::Node {
|
||||
std::string currenttimes_;
|
||||
|
||||
bool is_saving_images_ = false;
|
||||
|
||||
ImageMetadata left_ir_metadata_ = ImageMetadata();
|
||||
ImageMetadata color_metadata_ = ImageMetadata();
|
||||
};
|
||||
} // namespace tools
|
||||
} // namespace orbbec_camera
|
||||
|
||||
Reference in New Issue
Block a user