#!/usr/bin/env bash # ============================================================================= # manage.sh — test & manage the Inspire RH56 hands + G1 arm gestures (on PC2) # # ./manage.sh [args] # # Service / status: # status show service, devices, adapters (default if no command) # devices list /dev/inspire_* + ttyUSB + CH340 adapters # build (re)build all binaries via build.sh # start start ONE inspire_g1 (detached); refuses if already running # stop stop inspire_g1 # restart stop + start # logs tail the inspire_g1 log # # Hand only (needs the service; auto-starts it): # example Unitree open/close test (hand_example) # menu interactive finger menu (hand_gestures) # open|close|box a finger pose (hand_gestures ) # pose <6 nums> one-shot right-hand pose (hand_pose), e.g. pose 1 1 1 1 1 1 # record sculpt & SAVE named hand shapes (hand_record; save/load live) # poses list saved shapes # play command a saved shape onto the hands # dashboard start the web slider dashboard (http://:8088) # dashboard-stop stop the dashboard # # Arm + hand fused (ARM MOVES — clear space, E-stop ready; needs the service): # like thumbs-up "like" held during the built-in handshake # handshake reach -> grip -> thumbs-up -> release # thumbup raise right hand -> thumbs-up -> release # # Arm only (built-in actions): # arm run a built-in action (e.g. arm "shake hand", arm 99) # armlist list built-in actions # # Env: IFACE (default eth0) # ============================================================================= set -uo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" BUILD="$HERE/build" IFACE="${IFACE:-eth0}" LOG="/tmp/inspire_g1.log" SVC="$BUILD/inspire_g1" c_red=$'\e[31m'; c_grn=$'\e[32m'; c_yel=$'\e[33m'; c_rst=$'\e[0m' ok(){ echo "${c_grn}$*${c_rst}"; } warn(){ echo "${c_yel}$*${c_rst}"; } err(){ echo "${c_red}$*${c_rst}" >&2; } svc_count(){ local n; n="$(pgrep -xc inspire_g1 2>/dev/null)"; echo "${n:-0}"; } svc_running(){ [ "$(svc_count)" -ge 1 ]; } have_devices(){ [ -e /dev/ttyUSB0 ] && [ -e /dev/ttyUSB1 ]; } writable(){ [ -w /dev/ttyUSB0 ] && [ -w /dev/ttyUSB1 ]; } need_build(){ [ -x "$SVC" ] || { err "binaries missing — run: ./manage.sh build"; exit 1; }; } show_devices(){ echo "Hand serial (ttyUSB0=right, ttyUSB1=left):" if have_devices; then ls -l /dev/ttyUSB0 /dev/ttyUSB1 2>&1 | sed 's/^/ /' writable || warn " NOT writable — run the udev rule (see SETUP_G1.md §2) or sudo chmod 666." else warn " /dev/ttyUSB0+1 MISSING — plug in the two CH340 hand adapters."; fi echo "CH340 adapters (lsusb):" lsusb | grep -i "1a86" | sed 's/^/ /' || warn " none detected" } cmd_status(){ local n; n="$(svc_count)" if [ "$n" -eq 0 ]; then warn "inspire_g1: NOT running" elif [ "$n" -eq 1 ]; then ok "inspire_g1: running ($(pgrep -x inspire_g1))" else err "inspire_g1: $n INSTANCES running — duplicates corrupt the serial bus! run: ./manage.sh restart"; fi show_devices } cmd_wait(){ echo "Waiting for hand adapters — plug in the two USB-RS485 dongles now (Ctrl+C to stop)..." while ! have_devices; do printf "\r CH340 on bus: %s ttyUSB0:%s ttyUSB1:%s " \ "$(lsusb | grep -ci 1a86)" \ "$([ -e /dev/ttyUSB0 ] && echo ✓ || echo ✗)" \ "$([ -e /dev/ttyUSB1 ] && echo ✓ || echo ✗)" sleep 1 done echo; ok "Adapters detected!"; show_devices } cmd_stop(){ pkill -x inspire_g1 2>/dev/null; sleep 1; pkill -9 -x inspire_g1 2>/dev/null; ok "stopped"; } cmd_start(){ need_build if svc_running; then warn "already running ($(svc_count) instance(s)); use restart to reset"; return 0; fi have_devices || warn "WARNING: /dev/inspire_* missing — fingers won't move until adapters are plugged in." ( cd "$BUILD" && setsid nohup "$SVC" >"$LOG" 2>&1 /dev/null; pkill -f "hand_web.py" 2>/dev/null; sleep 1 setsid "$BUILD/hand_bridge" "$IFACE" 7799 >/tmp/hand_bridge.log 2>&1 /tmp/hand_web.log 2>&1 /dev/null && echo " bridge: up" || { echo " bridge FAILED:"; sed "s/^/ /" /tmp/hand_bridge.log; } grep -q "Running on" /tmp/hand_web.log && ok ">> Dashboard: http://$ip:8088 (also the wifi IP:8088)" || { echo " web FAILED:"; sed "s/^/ /" /tmp/hand_web.log | tail -4; } exit 0 ;; dashboard-stop) pkill -x hand_bridge 2>/dev/null; pkill -f "hand_web.py" 2>/dev/null; ok "dashboard stopped" ;; like) fused like "$@" ;; handshake) fused handshake ;; thumbup) fused thumbup ;; arm) need_build; "$BUILD/arm_action" "$@" "$IFACE" ;; armlist) need_build; "$BUILD/arm_action" list "$IFACE" ;; help|-h|--help) sed -n '2,40p' "$0" | sed 's/^# \{0,1\}//' ;; *) err "unknown command: $cmd"; echo "run: ./manage.sh help"; exit 1 ;; esac