#!/usr/bin/env bash set -e # ----------- CONFIGURABLES ----------- REMOTE_USER="niklas" REMOTE_HOST="192.168.162.249" REMOTE_PATH="/home/niklas/dataflow-analysis/traces" TRACING_BASE="analysis/tracing" LOCAL_PROJECT_DIR="/home/niklas/ROS-Dynamic-Executor-Experiments" # -------------------------------------- usage() { echo "Usage: $0 [time_in_seconds] [no_rebuild]" echo "Example: $0 ros multi timed 10" echo "This script builds the full_topology package, runs a trace, and copies the results to a remote server." echo "Parameters:" echo " : Scheduler type (ros, edf, sem)" echo " : Threading type (single, multi)" echo " : Fusion type (timed, direct)" echo " : Length of the trace (default: 10)" echo " [no_rebuild] : Optional flag to skip rebuilding the package (true/false, default: false)" exit 1 } if [[ $# -lt 4 ]]; then usage fi SCHEDULER_TYPE="$1" THREADING_TYPE="$2" FUSION_TYPE="$3" TRACE_LENGTH="${4:-10}" NO_REBUILD="${5:-false}" # Determine defines based on parameters CMAKE_ARGS=() [[ "$SCHEDULER_TYPE" == "ros" ]] && CMAKE_ARGS+=("-DROS_DEFAULT_EXECUTOR=ON") [[ "$SCHEDULER_TYPE" == "edf" ]] && CMAKE_ARGS+=("-DEDF_PRIORITY_EXECUTOR=ON") [[ "$SCHEDULER_TYPE" == "sem" ]] && CMAKE_ARGS+=("-DSEMANTIC_EXECUTOR=ON") [[ "$THREADING_TYPE" == "multi" ]] && CMAKE_ARGS+=("-DMULTI_THREADED=ON") [[ "$FUSION_TYPE" == "timed" ]] && CMAKE_ARGS+=("-DUSE_TIMER_IN_FUSION_NODES=ON") TRACE_NAME="${SCHEDULER_TYPE}_${THREADING_TYPE}_${FUSION_TYPE}_${TRACE_LENGTH}" cd "$LOCAL_PROJECT_DIR" if [[ "$NO_REBUILD" != "true" ]]; then echo "[INFO] Rebuilding full_topology package with CMake arguments: ${CMAKE_ARGS[*]}" colcon build --packages-select full_topology --cmake-clean-cache --cmake-clean-first --cmake-args "${CMAKE_ARGS[@]}" else echo "[INFO] Skipping rebuild of full_topology package." fi source install/setup.bash echo "[INFO] Launching full_topology with trace length: ${TRACE_LENGTH} seconds" OUTPUT=$(taskset -c 2,3 ros2 launch full_topology trace_full_topology.launch.py "length:=${TRACE_LENGTH}") echo "[INFO] Done running full_topology." TRACE_ID=$(echo ${OUTPUT} | \ grep -oP '(?<=Writing tracing session to: /home/niklas/ROS-Dynamic-Executor-Experiments/analysis/tracing/)[^\s]+') if [[ -z "$TRACE_ID" ]]; then echo "[ERROR] Failed to get tracing session directory. Aborting." exit 2 fi TIMESTAMP_SUFFIX="${TRACE_ID#trace_full_topology}" NEW_TRACE_ID="${TRACE_NAME}${TIMESTAMP_SUFFIX}" TRACE_ORIG_PATH="${TRACING_BASE}/${TRACE_ID}" TRACE_NEW_PATH="${TRACING_BASE}/${NEW_TRACE_ID}" echo "[INFO] Converting trace" ros2 trace-analysis convert "${TRACE_ORIG_PATH}/ust" 2>&1 \ | grep -v "UserWarning: " \ | grep -v "return extension.main" \ | grep -v "converting trace directory" \ | grep -v "output written to" if [[ -e "$TRACE_NEW_PATH" ]]; then rm -rf "$TRACE_NEW_PATH" fi echo "[INFO] Renaming trace from '$TRACE_ORIG_PATH' to '$TRACE_NEW_PATH'" mv "$TRACE_ORIG_PATH" "$TRACE_NEW_PATH" scp -qr "$TRACE_NEW_PATH/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/" echo "$NEW_TRACE_ID" >> ./trace_ids.txt echo "[SUCCESS] Trace analysis '$NEW_TRACE_ID' complete and copied to remote server." echo ""