#!/usr/bin/env bash # Every pane derives all three components from one run-local deployment version. h2_upstream_defaults() { H2_UPSTREAM_ROOT=${H2_UPSTREAM_ROOT:-$H2_ROOT/../upstream_lab} H2_UPSTREAM_V1_ROOT=${H2_UPSTREAM_V1_ROOT:-$H2_ROOT/../upstream_curriculum_20260909/ICRA_v1} H2_UPSTREAM_V2_ROOT=${H2_UPSTREAM_V2_ROOT:-$H2_ROOT/../upstream_curriculum_20260909/ICRA_v2} H2_DEPLOYMENT_VERSION=${H2_DEPLOYMENT_VERSION:-original} H2_ZMQ_PORT=${H2_ZMQ_PORT:-5556} if [[ ${1:-real} == simulation ]]; then H2_ADAPTER_NAMESPACE=${H2_ADAPTER_NAMESPACE:-/h2_live_sim} else H2_ADAPTER_NAMESPACE=${H2_ADAPTER_NAMESPACE:-/h2_deploy} fi } h2_upstream_preset() { local selection selection=$("${H2_PY:-python3}" "$H2_ROOT/runtime/deployment_versions.py" "$1") || return eval "$selection" } h2_upstream_validate() { h2_upstream_preset "$H2_DEPLOYMENT_VERSION" || return [[ $H2_ZMQ_PORT =~ ^[0-9]+$ && $H2_ZMQ_PORT -ge 1024 && $H2_ZMQ_PORT -le 65535 ]] \ || { echo "invalid H2_ZMQ_PORT" >&2; return 2; } H2_ZMQ_ENDPOINT="tcp://127.0.0.1:$H2_ZMQ_PORT" } h2_upstream_write_selection() { h2_upstream_validate || return printf 'H2_UPSTREAM_ROOT=%q\nH2_UPSTREAM_V2_ROOT=%q\nH2_DEPLOYMENT_VERSION=%q\n' \ "$H2_UPSTREAM_ROOT" "$H2_UPSTREAM_V2_ROOT" "$H2_DEPLOYMENT_VERSION" > "$1/upstream.env" printf 'H2_UPSTREAM_V1_ROOT=%q\n' "$H2_UPSTREAM_V1_ROOT" >> "$1/upstream.env" printf 'H2_ZMQ_PORT=%q\nH2_ADAPTER_NAMESPACE=%q\n' \ "$H2_ZMQ_PORT" "$H2_ADAPTER_NAMESPACE" >> "$1/upstream.env" } h2_upstream_read_selection() { h2_upstream_defaults H2_DEPLOYMENT_VERSION= source "$1/upstream.env" h2_upstream_validate } h2_upstream_describe() { echo "[DEPLOYMENT] deployment=$H2_DEPLOYMENT_VERSION policy=$H2_POLICY_PATH" echo "[TRANSPORT] zmq=$H2_ZMQ_ENDPOINT adapter_namespace=$H2_ADAPTER_NAMESPACE" echo "[UPSTREAM] velocity=$H2_VELOCITY_VERSION predictor=$H2_PREDICTOR_VERSION root=$H2_UPSTREAM_ROOT v1_root=$H2_UPSTREAM_V1_ROOT v2_root=$H2_UPSTREAM_V2_ROOT" if [[ $H2_NOTICE_POLICY == curriculum ]]; then echo "[TIMING] notice_tth=0.90s generation_tth=0.55s; pending reference follows robot" fi if [[ $H2_PREDICTOR_VERSION == rk4-v2 ]]; then echo "[UPSTREAM] v2 model=h2-v1 plane=dynamic strike_window=[0.35,0.45]m (current H2 deployment band)" fi } # Only our loopback endpoint or a conflicting wildcard bind belongs in this # check. A3/G1 may keep listening on a different address and/or port. h2_adapter_listeners() { ss -H -ltnp "sport = :$H2_ZMQ_PORT" | awk -v port="$H2_ZMQ_PORT" \ '$4 == "127.0.0.1:" port || $4 == "0.0.0.0:" port || $4 == "[::]:" port || $4 == "*:" port' } h2_adapter_ros_remaps() { H2_ADAPTER_ROS_ARGS=(-r "__ns:=$H2_ADAPTER_NAMESPACE" -r __node:=mocap_adapter) local name for name in /mocap_adapter/set_side /mocap_adapter/side \ /ego/ball/point /ego/our_base/pose /ego/opponent_base/pose; do H2_ADAPTER_ROS_ARGS+=(-r "$name:=$H2_ADAPTER_NAMESPACE$name") done } h2_upstream_check_files() { [[ -f "$H2_POLICY_PATH" ]] || { echo "missing bundle policy: $H2_POLICY_PATH" >&2; return 1; } if [[ $H2_DEPLOYMENT_VERSION == v1 ]]; then [[ -f "$H2_UPSTREAM_V1_ROOT/run_adapter.py" && -f "$H2_UPSTREAM_V1_ROOT/predictor.py" ]] \ || { echo "missing curriculum v1 upstream at $H2_UPSTREAM_V1_ROOT" >&2; return 1; } fi if [[ ${1:-} == simulation && $H2_PREDICTOR_VERSION == original ]]; then [[ -f "$H2_UPSTREAM_ROOT/run_adapter.py" && -f "$H2_UPSTREAM_ROOT/predictor.py" ]] \ || { echo "missing isolated upstream at $H2_UPSTREAM_ROOT" >&2; return 1; } fi if [[ $H2_VELOCITY_VERSION == physics-ls-v2 || $H2_PREDICTOR_VERSION == rk4-v2 ]]; then [[ -f "$H2_UPSTREAM_V2_ROOT/run_adapter.py" && -f "$H2_UPSTREAM_V2_ROOT/predictor.py" ]] \ || { echo "missing isolated v2 upstream at $H2_UPSTREAM_V2_ROOT" >&2; return 1; } fi }