#!/usr/bin/env bash # scripts/launch.sh —— 跑 demo launch(可限时自动关停) # # 用法: # # 一直跑(前台,Ctrl+C 停) # docker exec -it ros2_dev bash /root/ros2_ws/scripts/launch.sh pubsub_launch # # # 跑 N 秒后自动停(脚本、CI、截图用) # docker exec ros2_dev bash /root/ros2_ws/scripts/launch.sh pubsub_launch 10 # # 第一个参数:launch 文件名(不带 .py),默认 pubsub_launch # 第二个参数:运行时长(秒),默认 0 = 不限时 set -eo pipefail WORKSPACE="${WORKSPACE:-/root/ros2_ws}" NAME="${1:-pubsub_launch}" RUNTIME="${2:-0}" source /opt/ros/humble/setup.bash source "${WORKSPACE}/install/setup.bash" cd "${WORKSPACE}" # RUNTIME 合法化:非整数 / 空 / "forever" → -1(一直跑) if ! [[ "${RUNTIME}" =~ ^-?[0-9]+$ ]]; then RUNTIME="-1" fi echo "[launch.sh] starting: ros2 launch bringup ${NAME}.py (runtime=${RUNTIME}s; -1 = forever)" if [ "${RUNTIME}" -ge 0 ]; then # 后台跑 + 给定时炸弹 ros2 launch bringup "${NAME}.py" & LAUNCH_PID=$! if [ "${RUNTIME}" -gt 0 ]; then sleep "${RUNTIME}" echo "[launch.sh] reaching runtime limit, killing..." kill -INT "${LAUNCH_PID}" 2>/dev/null || true pkill -f "ros2 launch bringup ${NAME}" 2>/dev/null || true wait "${LAUNCH_PID}" 2>/dev/null || true else # 0 = 等用户 Ctrl+C wait "${LAUNCH_PID}" 2>/dev/null || true fi else # -1 = forever(后台跑,主进程立刻返回) nohup ros2 launch bringup "${NAME}.py" >/dev/null 2>&1 & disown echo "[launch.sh] ✅ launched in background (forever mode, pid=$!)" fi echo "[launch.sh] ✅ exit"