Files
SRU-Odin/Deployment/scripts/launch_sru_nav.sh
T
2026-07-10 16:58:17 +08:00

122 lines
4.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# -----------------------------------------------------------------------------
# One-shot launcher for the SRU navigation node on Go2 NX.
#
# Combines a conda python env (onnxruntime, scipy, ...) with the system
# ROS Noetic installation (rospy, cv_bridge). The trick:
# 1) source /opt/ros/noetic/setup.bash -> ROS env
# 2) source <catkin_ws>/devel/setup.bash -> our package
# 3) conda activate sru_nav -> python with onnxruntime
# 4) export PYTHONPATH=<ros dist-packages>:$PYTHONPATH so conda python
# can still import rospy / cv_bridge / sensor_msgs / etc.
#
# Usage:
# bash launch_sru_nav.sh # full launch (joy + static TF + node)
# bash launch_sru_nav.sh --no-joy # if /joy is already provided elsewhere
# bash launch_sru_nav.sh --no-deadman # TESTING: skip joystick deadman entirely
# # (cmd_vel_ratio=1.0, no /joy needed).
# # Robot WILL move on /goal_pose alone.
# bash launch_sru_nav.sh --node-only # run just sru_nav_node (assume joy + TF already up)
# -----------------------------------------------------------------------------
set -eu
ENV_NAME="${ENV_NAME:-sru_nav}"
ROS_DISTRO="${ROS_DISTRO:-noetic}"
CATKIN_WS="${CATKIN_WS:-$HOME/code/odin_sru_nav}"
EXTRA_ARGS=""
NODE_ONLY=0
for arg in "$@"; do
case "$arg" in
--no-joy) EXTRA_ARGS="$EXTRA_ARGS launch_joy:=false" ;;
--no-tf) EXTRA_ARGS="$EXTRA_ARGS launch_static_tf:=false" ;;
--no-deadman) EXTRA_ARGS="$EXTRA_ARGS require_joystick:=false launch_joy:=false" ;;
--node-only) NODE_ONLY=1 ;;
*) EXTRA_ARGS="$EXTRA_ARGS $arg" ;;
esac
done
# ---- 1) ROS env -------------------------------------------------------------
if [ ! -f "/opt/ros/${ROS_DISTRO}/setup.bash" ]; then
echo "[ERROR] /opt/ros/${ROS_DISTRO}/setup.bash not found"; exit 1
fi
# shellcheck disable=SC1091
source "/opt/ros/${ROS_DISTRO}/setup.bash"
if [ -f "${CATKIN_WS}/devel/setup.bash" ]; then
# shellcheck disable=SC1091
source "${CATKIN_WS}/devel/setup.bash"
else
echo "[WARN] ${CATKIN_WS}/devel/setup.bash not found. Did you catkin_make?"
fi
# ---- 2) conda env -----------------------------------------------------------
if ! command -v conda >/dev/null 2>&1; then
echo "[ERROR] conda not found. Run setup_conda_env.sh first."; exit 1
fi
CONDA_BASE="$(conda info --base)"
# shellcheck disable=SC1091
source "${CONDA_BASE}/etc/profile.d/conda.sh"
conda activate "${ENV_NAME}"
# ---- 3) Make rospy / cv_bridge importable from the conda python -------------
ROS_PY_DIST="/opt/ros/${ROS_DISTRO}/lib/python3/dist-packages"
export PYTHONPATH="${ROS_PY_DIST}:${PYTHONPATH:-}"
# Fix conda<->system libffi ABI conflict that breaks cv_bridge:
# "libp11-kit.so.0: undefined symbol: ffi_type_pointer, version LIBFFI_BASE_7.0"
# Force the system libffi (used to build libp11-kit) to load first.
for _sys_libffi in \
/lib/aarch64-linux-gnu/libffi.so.7 \
/usr/lib/aarch64-linux-gnu/libffi.so.7 \
/lib/x86_64-linux-gnu/libffi.so.7 \
/usr/lib/x86_64-linux-gnu/libffi.so.7; do
if [ -f "${_sys_libffi}" ]; then
export LD_PRELOAD="${_sys_libffi}${LD_PRELOAD:+:${LD_PRELOAD}}"
echo "[INFO] LD_PRELOAD += ${_sys_libffi}"
break
fi
done
echo "[INFO] python = $(which python)"
echo "[INFO] PYTHONPATH = ${PYTHONPATH}"
echo "[INFO] ROS_DISTRO = ${ROS_DISTRO}"
echo "[INFO] CATKIN_WS = ${CATKIN_WS}"
# ---- Sanity: catkin wrapper must call conda's python (not system /usr/bin) ---
WRAPPER="${CATKIN_WS}/devel/lib/sru_nav_go2_ros1/sru_nav_node"
if [ -f "${WRAPPER}" ]; then
WRAPPER_SHEBANG="$(head -n1 "${WRAPPER}")"
CONDA_PY="$(which python)"
case "${WRAPPER_SHEBANG}" in
*"${CONDA_PY}"*|*"/usr/bin/env python"*)
: # OK
;;
*)
cat >&2 <<EOF
[WARN] Catkin-generated wrapper shebang is NOT the conda python:
wrapper : ${WRAPPER}
shebang : ${WRAPPER_SHEBANG}
conda py: ${CONDA_PY}
It will likely fail with 'No module named cv2 / onnxruntime'.
Fix:
conda activate ${ENV_NAME}
cd ${CATKIN_WS}
catkin_make clean
catkin_make -DPYTHON_EXECUTABLE=\$(which python3)
EOF
;;
esac
fi
# ---- 4) Launch --------------------------------------------------------------
if [ "$NODE_ONLY" -eq 1 ]; then
exec rosrun sru_nav_go2_ros1 sru_nav_node \
__ns:= \
_vae_model_path:="" _policy_model_path:=""
else
# shellcheck disable=SC2086
exec roslaunch sru_nav_go2_ros1 sru_nav_go2.launch $EXTRA_ARGS
fi