Skip to content

Commit 0a77730

Browse files
authored
feat: convert single-file groups in merge mode and add --delete-unmatched (#88)
Previously, --merge mode skipped groups with only one bag file (no merge partner). Now single-file groups are processed through the same merge+convert pipeline, so their LiDAR packets are decoded to PointCloud2 even without a merge partner. Add --delete-unmatched option to delete source files for single-file groups after successful conversion. --delete continues to apply to multi-file groups only, and both flags can be combined.
1 parent 5ea2a37 commit 0a77730

4 files changed

Lines changed: 18 additions & 12 deletions

File tree

‎src/bag_converter/include/bag_converter.hpp‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ struct BagConverterConfig
123123
// Delete source files after successful conversion
124124
bool delete_sources = false;
125125

126+
// Delete source files for single-file groups (no merge partner) after successful conversion
127+
bool delete_unmatched = false;
128+
126129
// Batch mode
127130
bool batch_mode = false;
128131

‎src/bag_converter/include/merge.hpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct MergeConfig
3434
std::string output_dir;
3535
bool overwrite = false;
3636
bool delete_sources = false;
37+
bool delete_unmatched = false;
3738
std::string comp_algo = "zstd";
3839
std::string comp_level = "default";
3940
};

‎src/bag_converter/src/bag_converter.cpp‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ void print_usage()
177177
<< " --delete Delete source bag files after successful processing.\n"
178178
<< " In merge mode, deletes the original input bag files\n"
179179
<< " after each group is successfully merged and converted.\n"
180+
<< " --delete-unmatched In merge mode, delete source bag files for groups\n"
181+
<< " with only a single file (no merge partner) after\n"
182+
<< " successful conversion.\n"
180183
<< " -h, --help Show this help message\n"
181184
<< " -v, --version Show version information\n";
182185
}
@@ -216,6 +219,9 @@ std::optional<int> parse_arguments(int argc, char ** argv, BagConverterConfig &
216219
if (arg == "--delete") {
217220
config.delete_sources = true;
218221
}
222+
if (arg == "--delete-unmatched") {
223+
config.delete_unmatched = true;
224+
}
219225
}
220226

221227
// Collect positional arguments (non-option args)
@@ -339,7 +345,7 @@ std::optional<int> parse_arguments(int argc, char ** argv, BagConverterConfig &
339345
config.passthrough = true;
340346
} else if (arg == "--overwrite") {
341347
config.overwrite = true;
342-
} else if (arg == "--merge" || arg == "--delete") {
348+
} else if (arg == "--merge" || arg == "--delete" || arg == "--delete-unmatched") {
343349
// Already processed in pre-scan
344350
} else if (arg == "--help" || arg == "-h" || arg == "--version" || arg == "-v") {
345351
// Already handled
@@ -1204,6 +1210,7 @@ int run_merge_and_convert(const BagConverterConfig & config)
12041210
merge_config.output_dir = config.dst_bag_path;
12051211
merge_config.overwrite = config.overwrite;
12061212
merge_config.delete_sources = config.delete_sources;
1213+
merge_config.delete_unmatched = config.delete_unmatched;
12071214
merge_config.comp_algo = config.comp_algo;
12081215
merge_config.comp_level = config.comp_level;
12091216

‎src/bag_converter/src/merge.cpp‎

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ struct MergeGroupKey
6666
struct MergeResult
6767
{
6868
size_t merged_count = 0;
69-
size_t skipped_single_count = 0;
69+
size_t skipped_exists_count = 0;
7070
size_t skipped_pattern_count = 0;
7171
size_t failed_count = 0;
7272
size_t total_messages = 0;
@@ -252,7 +252,7 @@ static void print_merge_summary(const MergeResult & result)
252252
{
253253
RCLCPP_INFO(g_logger, "========== Merge Summary ==========");
254254
RCLCPP_INFO(g_logger, " Groups merged: %zu", result.merged_count);
255-
RCLCPP_INFO(g_logger, " Groups skipped (single file): %zu", result.skipped_single_count);
255+
RCLCPP_INFO(g_logger, " Groups skipped (output exists): %zu", result.skipped_exists_count);
256256
RCLCPP_INFO(g_logger, " Files skipped (pattern mismatch): %zu", result.skipped_pattern_count);
257257
RCLCPP_INFO(g_logger, " Groups failed: %zu", result.failed_count);
258258
RCLCPP_INFO(g_logger, " Total messages merged: %zu", result.total_messages);
@@ -345,13 +345,6 @@ int run_merge(const MergeConfig & config, MergeGroupProcessor processor)
345345

346346
std::string group_name = key.sensing_system_id + "_" + key.rest;
347347

348-
if (files.size() < 2) {
349-
RCLCPP_WARN(
350-
g_logger, "Skipping group '%s' (single file, nothing to merge)", group_name.c_str());
351-
++result.skipped_single_count;
352-
continue;
353-
}
354-
355348
// Determine output path
356349
std::string output_filename = group_name + group_extensions[key];
357350
fs::path output_path = output_dir / output_filename;
@@ -362,7 +355,7 @@ int run_merge(const MergeConfig & config, MergeGroupProcessor processor)
362355
g_logger,
363356
"Output file already exists, skipping group '%s': %s (use --overwrite to replace)",
364357
group_name.c_str(), output_path.string().c_str());
365-
++result.skipped_single_count;
358+
++result.skipped_exists_count;
366359
continue;
367360
}
368361
RCLCPP_INFO(g_logger, "Removing existing output file: %s", output_path.string().c_str());
@@ -403,7 +396,9 @@ int run_merge(const MergeConfig & config, MergeGroupProcessor processor)
403396
result.total_messages += static_cast<size_t>(msg_count);
404397

405398
// Delete source files if requested
406-
if (config.delete_sources) {
399+
const bool should_delete =
400+
config.delete_sources || (config.delete_unmatched && files.size() == 1);
401+
if (should_delete) {
407402
for (const auto & f : files) {
408403
std::error_code del_ec;
409404
fs::remove(f, del_ec);

0 commit comments

Comments
 (0)