100 lines
2.7 KiB
Bash
Executable File
100 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# One-command runner for:
|
|
# Terminal A: Gazebo Sim + bridge (+ optional SLAM + RViz)
|
|
# Terminal B: Nav2 stack
|
|
#
|
|
# Modes:
|
|
# mapping -> online SLAM mapping (Localization in RViz is expected to stay inactive)
|
|
# localization -> map-based localization/navigation (Localization becomes active)
|
|
#
|
|
# Examples:
|
|
# ./run_ab.sh mapping
|
|
# NAV2_MAP_PATH=/abs/path/office_map.yaml ./run_ab.sh localization
|
|
|
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
MODE="${1:-mapping}"
|
|
ROBOT_MODEL="${ROBOT_MODEL:-waffle}"
|
|
GZ_PARTITION="${GZ_PARTITION:-tb3_office_gz}"
|
|
USE_SIM_TIME="${USE_SIM_TIME:-true}"
|
|
SLEEP_NAV2="${SLEEP_NAV2:-18}"
|
|
WORLD_PATH="${WORLD_PATH:-${ROOT}/turtlebot3_simulations/turtlebot3_gazebo/worlds/office_gz_dartsim.sdf}"
|
|
NAV2_MAP_PATH="${NAV2_MAP_PATH:-${ROOT}/turtlebot3_simulations/turtlebot3_gazebo/map/office_map.yaml}"
|
|
|
|
set +u
|
|
source /opt/ros/humble/setup.bash
|
|
source "${ROOT}/install/setup.bash"
|
|
set -u
|
|
export TURTLEBOT3_MODEL="${ROBOT_MODEL}"
|
|
|
|
declare -a CMD_A
|
|
declare -a CMD_B
|
|
|
|
if [[ "${MODE}" == "mapping" ]]; then
|
|
CMD_A=(
|
|
ros2 launch turtlebot3_gazebo turtlebot3_office_gz.launch.py
|
|
"robot_model:=${ROBOT_MODEL}"
|
|
"use_sim_time:=${USE_SIM_TIME}"
|
|
start_slam:=true
|
|
show_rviz:=true
|
|
"gz_partition:=${GZ_PARTITION}"
|
|
gz_world_name:=default
|
|
"world:=${WORLD_PATH}"
|
|
)
|
|
CMD_B=(
|
|
ros2 launch nav2_bringup navigation_launch.py
|
|
"use_sim_time:=${USE_SIM_TIME}"
|
|
)
|
|
elif [[ "${MODE}" == "localization" ]]; then
|
|
if [[ ! -f "${NAV2_MAP_PATH}" ]]; then
|
|
echo "[run_ab] ERROR: map yaml not found: ${NAV2_MAP_PATH}" >&2
|
|
echo "[run_ab] Hint: save map first with map_saver_cli." >&2
|
|
exit 1
|
|
fi
|
|
CMD_A=(
|
|
ros2 launch turtlebot3_gazebo turtlebot3_office_gz.launch.py
|
|
"robot_model:=${ROBOT_MODEL}"
|
|
"use_sim_time:=${USE_SIM_TIME}"
|
|
start_slam:=false
|
|
show_rviz:=true
|
|
"gz_partition:=${GZ_PARTITION}"
|
|
gz_world_name:=default
|
|
"world:=${WORLD_PATH}"
|
|
)
|
|
CMD_B=(
|
|
ros2 launch nav2_bringup bringup_launch.py
|
|
"use_sim_time:=${USE_SIM_TIME}"
|
|
"map:=${NAV2_MAP_PATH}"
|
|
slam:=false
|
|
)
|
|
else
|
|
echo "[run_ab] ERROR: unknown mode '${MODE}' (use: mapping | localization)" >&2
|
|
exit 1
|
|
fi
|
|
|
|
LOG_DIR="${ROOT}/logs/run_ab_$(date +%Y%m%d_%H%M%S)"
|
|
mkdir -p "${LOG_DIR}"
|
|
|
|
echo "[run_ab] mode=${MODE}"
|
|
echo "[run_ab] logs at: ${LOG_DIR}"
|
|
echo "[run_ab] starting Terminal A..."
|
|
"${CMD_A[@]}" >"${LOG_DIR}/A_sim.log" 2>&1 &
|
|
PID_A=$!
|
|
|
|
sleep "${SLEEP_NAV2}"
|
|
|
|
echo "[run_ab] starting Terminal B..."
|
|
"${CMD_B[@]}" >"${LOG_DIR}/B_nav2.log" 2>&1 &
|
|
PID_B=$!
|
|
|
|
cleanup() {
|
|
echo "[run_ab] stopping..."
|
|
kill "${PID_B}" 2>/dev/null || true
|
|
kill "${PID_A}" 2>/dev/null || true
|
|
}
|
|
trap cleanup EXIT INT TERM
|
|
|
|
echo "[run_ab] running. Press Ctrl+C to stop both."
|
|
wait "${PID_A}" "${PID_B}"
|