#!/bin/bash # 停止/启动 sportMode 服务 (从Mac SSH到狗执行) # 用法: # bash tools/onboard/stop_sportmode.sh stop # 停止sportMode,进入低层控制 # bash tools/onboard/stop_sportmode.sh start # 重新启动sportMode # bash tools/onboard/stop_sportmode.sh status # 检查状态 set -e PI_HOST="${PI_HOST:-192.168.123.161}" PI_USER="${PI_USER:-pi}" # 等待用户按键继续的 pause 函数 pause() { echo "" read -p "按 Enter 继续..." dummy } cmd="${1:-status}" case "$cmd" in stop) echo "============================================" echo "⚠️ 停止 sportMode — 进入低层控制" echo "============================================" echo "" echo "这将会:" echo " 1. 先发 damping 让电机失能" echo " 2. 停止 Legged_sport 进程" echo " 3. 停止后, :8007 将只接受你的 LowCmd" echo "" echo "⚠️ 停止后狗会软瘫, 确保:" echo " - 狗趴在地上或脚架上" echo " - 遥控器在手边 (L2+B 紧急停止)" echo " - 10分钟内必须重启 (安全看门狗)" echo "" read -p "确认停止? (yes/no): " confirm if [ "$confirm" != "yes" ]; then echo "取消" exit 0 fi echo "" echo "[1/3] 发送 damping ..." ssh ${PI_USER}@${PI_HOST} \ "mosquitto_pub -h localhost -t controller/action -m damping" 2>/dev/null || \ echo " (MQTT可能不可用, 继续...)" sleep 2 echo "[2/3] 停止 Legged_sport 看门狗 + Legged_sport + appTransit ..." # 必须按顺序: 先杀看门狗 keep_sport_alive.sh, 否则它每 0.2s 重拉 Legged_sport # 同时杀 appTransit, 它也跟 MCU:8007 通信抢占 ssh ${PI_USER}@${PI_HOST} \ "sudo pkill -9 -f keep_sport_alive 2>/dev/null && echo ' ✅ keep_sport_alive (看门狗)' || echo ' (无看门狗)'; sudo pkill -9 -f Legged_sport 2>/dev/null && echo ' ✅ Legged_sport' || echo ' (无)'; sudo pkill -9 -f appTransit 2>/dev/null && echo ' ✅ appTransit' || echo ' (无)'; sudo systemctl stop sportMode 2>/dev/null || true" sleep 1 echo "[3/3] 验证..." if ssh ${PI_USER}@${PI_HOST} "! pgrep Legged_sport > /dev/null 2>&1"; then echo " ✅ Legged_sport 已完全停止" elif ssh ${PI_USER}@${PI_HOST} "pgrep Legged_sport > /dev/null 2>&1"; then echo " ⚠️ Legged_sport 可能仍在运行(被STOP暂停)" fi echo "" echo "============================================" echo "✅ sportMode 已停止, 现在可以做低层控制测试" echo "" echo "恢复: bash tools/onboard/stop_sportmode.sh start" echo "============================================" ;; start) echo "============================================" echo "🔄 恢复 sportMode" echo "============================================" echo "" echo "[1/2] 恢复 Legged_sport ..." ssh ${PI_USER}@${PI_HOST} \ "sudo systemctl restart sportMode 2>/dev/null || sudo systemctl restart legged_sport 2>/dev/null || (sudo killall -CONT Legged_sport 2>/dev/null) || echo '尝试手动启动'" && \ echo " ✅ 重启命令已执行" || \ echo " ⚠️ 重启失败, 尝试: sudo systemctl start sportMode 或重启狗" sleep 3 echo "[2/2] 验证..." if ssh ${PI_USER}@${PI_HOST} "pgrep Legged_sport > /dev/null 2>&1"; then echo " ✅ Legged_sport 已恢复运行" else echo " ⚠️ Legged_sport 未运行, 可能需要重启狗" fi echo "" echo "✅ sportMode 已恢复" ;; status) echo "检查 sportMode 状态..." echo "" echo "--- Legged_sport 进程 ---" ssh ${PI_USER}@${PI_HOST} "ps aux | grep -v grep | grep Legged_sport || echo ' 未运行'" echo "" echo "--- systemd 服务 ---" ssh ${PI_USER}@${PI_HOST} \ "systemctl status sportMode 2>/dev/null || systemctl status Legged_sport 2>/dev/null || echo ' 服务名未知'" 2>/dev/null | head -10 echo "" echo "--- MQTT 状态 ---" ssh ${PI_USER}@${PI_HOST} \ "mosquitto_sub -h localhost -t programming/action -C 1 -W 2 2>/dev/null || echo ' (无消息/timeout)'" ;; *) echo "用法: bash stop_sportmode.sh [stop|start|status]" exit 1 ;; esac