Files
go1_pro_sdk/tools/stop_sportmode.sh
2026-06-20 20:02:36 +08:00

122 lines
4.5 KiB
Bash
Executable File

#!/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