97 lines
3.2 KiB
Bash
97 lines
3.2 KiB
Bash
|
|
#!/usr/bin/env bash
|
|||
|
|
set -euo pipefail
|
|||
|
|
# 外部必须导出:
|
|||
|
|
# INPUT_ROOT WORKFLOW_ID SUB_DIR OUTPUT_ROOT
|
|||
|
|
|
|||
|
|
INPUT_ROOT="${INPUT_ROOT}/${WORKFLOW_ID}"
|
|||
|
|
INPUT_DIR="${INPUT_ROOT}/${SUB_DIR}" # 实际指向 bagdir_splits 上一级
|
|||
|
|
OUTPUT_DIR="${OUTPUT_ROOT}" # 通常就是 /nas_perception/.../output/wfxxx
|
|||
|
|
|
|||
|
|
log(){
|
|||
|
|
echo "[$(date '+%F %T')] [$$] $*"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#----------------------------------------------------------
|
|||
|
|
# 统一封装:目录同步 / 文件拷贝
|
|||
|
|
#----------------------------------------------------------
|
|||
|
|
sync_dir(){
|
|||
|
|
local srcDir="$1" dstDir="$2"
|
|||
|
|
if [[ -d ${srcDir} ]]; then
|
|||
|
|
log " + $(basename "${srcDir}")/"
|
|||
|
|
mkdir -p "${dstDir}"
|
|||
|
|
rsync -a --delete "${srcDir}/" "${dstDir}/"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sync_file(){
|
|||
|
|
local srcFile="$1" dstDir="$2"
|
|||
|
|
if [[ -f ${srcFile} ]]; then
|
|||
|
|
log " + $(basename "${srcFile}")"
|
|||
|
|
mkdir -p "${dstDir}"
|
|||
|
|
cp -p "${srcFile}" "${dstDir}/"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#----------------------------------------------------------
|
|||
|
|
# 主逻辑
|
|||
|
|
#----------------------------------------------------------
|
|||
|
|
log "Script started"
|
|||
|
|
log "INPUT_DIR = ${INPUT_DIR}"
|
|||
|
|
log "OUTPUT_DIR = ${OUTPUT_DIR}"
|
|||
|
|
|
|||
|
|
[[ -d ${INPUT_DIR} ]] || { log "ERROR: INPUT_DIR not found: ${INPUT_DIR}"; exit 1; }
|
|||
|
|
|
|||
|
|
while IFS= read -r -d '' src; do
|
|||
|
|
# 去掉 split_N 层级,得到纯 bag.dir 名
|
|||
|
|
rel="${src#${INPUT_DIR}/*/}"
|
|||
|
|
dest="${OUTPUT_DIR}/${rel}/derived/${SUB_DIR}"
|
|||
|
|
mkdir -p "${dest}"
|
|||
|
|
|
|||
|
|
basename_bag=$(basename "$src") # xxx.bag.dir
|
|||
|
|
pkgname="${basename_bag%.bag.dir}" # xxx
|
|||
|
|
split_name=$(basename "$(dirname "$src")") # split_0 / split_1 / ...
|
|||
|
|
truth_root="${INPUT_DIR}/${split_name}"
|
|||
|
|
|
|||
|
|
log "==================== Processing ${pkgname} ==================="
|
|||
|
|
|
|||
|
|
# 1. 老 object 重命名同步
|
|||
|
|
sync_dir "${src}/object_det_ep20" "${dest}/object_det_al"
|
|||
|
|
sync_dir "${src}/object_tracking" "${dest}/object_tracking_al"
|
|||
|
|
|
|||
|
|
# 2. 目录类:slam + lidar_gt + 新增 6 目录
|
|||
|
|
for item in slam_lidar_ground slam_lidar_none_ground \
|
|||
|
|
lidar_gt_pandar128_5f_front lidar_gt_pandar128_5f_rear \
|
|||
|
|
object_det_ep20_lrgt_front object_det_ep20_lrgt_rear \
|
|||
|
|
object_lrgt_filter object_postprocess; do
|
|||
|
|
sync_dir "${src}/${item}" "${dest}/${item}"
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
# 3. 文件类
|
|||
|
|
for item in bev_image_ground.png ego_motion_slam_lidar.csv; do
|
|||
|
|
sync_file "${src}/${item}" "${dest}"
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
# 4. osm & split_json(源在 OUTPUT_ROOT/SUB_DIR/split_N/)
|
|||
|
|
osm_src="${truth_root}/osm_out/${pkgname}.osm"
|
|||
|
|
if [[ -f ${osm_src} ]]; then
|
|||
|
|
log " + ${pkgname}.osm -> input bag.dir"
|
|||
|
|
cp -p "${osm_src}" "${src}/"
|
|||
|
|
log " + ${pkgname}.osm -> output"
|
|||
|
|
cp -p "${src}/${pkgname}.osm" "${dest}/"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
split_src="${truth_root}/split_json/${pkgname}"
|
|||
|
|
if [[ -d ${split_src} ]]; then
|
|||
|
|
log " + split_json/ -> input bag.dir"
|
|||
|
|
rsync -a --delete "${split_src}/" "${src}/split_json/"
|
|||
|
|
log " + split_json/ -> output"
|
|||
|
|
sync_dir "${src}/split_json" "${dest}/split_json"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 5. 2dseg and occ
|
|||
|
|
sync_dir "${src}/${SUB_DIR}" "${dest}"
|
|||
|
|
|
|||
|
|
done < <(find "${INPUT_DIR}" -mindepth 2 -maxdepth 2 -type d -name '*.bag.dir' -print0)
|
|||
|
|
|
|||
|
|
log "============================================================"
|
|||
|
|
log "All done, success!"
|