#!/bin/bash # 部署+执行测试 (在树莓派上, 源IP=192.168.123.161) # # 用法: # bash tools/onboard/run_on_pi.sh sin # 单腿正弦 # bash tools/onboard/run_on_pi.sh damping # 零力矩连通性 # bash tools/onboard/run_on_pi.sh deploy # 仅部署不执行 set -e PI_HOST="${PI_HOST:-192.168.123.161}" PI_USER="${PI_USER:-pi}" TEST="${1:-sin}" REMOTE_DIR=/tmp/dog_test echo "=== 部署到 ${PI_USER}@${PI_HOST}:${REMOTE_DIR} ===" # 1. 创建远程目录结构 ssh ${PI_USER}@${PI_HOST} "rm -rf ${REMOTE_DIR} && mkdir -p ${REMOTE_DIR}/ucl" # 2. 拷贝文件 (所有.py平铺在REMOTE_DIR, ucl/子目录放SDK文件) echo "[1/2] 拷贝文件..." scp tools/onboard/blowfish_codec.py \ tools/onboard/build_pro_lowcmd.py \ tools/onboard/test_sin_leg.py \ tools/onboard/test_lowcmd.py \ tools/onboard/example_position_pro.py \ data/lowlevel_captures/blowfish_state.bin \ ${PI_USER}@${PI_HOST}:${REMOTE_DIR}/ # 空 __init__.py 让 ucl 成为 package ssh ${PI_USER}@${PI_HOST} "touch ${REMOTE_DIR}/ucl/__init__.py" scp ucl/lowCmd.py ucl/lowState.py ucl/common.py ucl/complex.py ucl/enums.py \ ${PI_USER}@${PI_HOST}:${REMOTE_DIR}/ucl/ # 提前杀掉 MCU:8007 的所有抢占者: # 1. keep_sport_alive.sh - Legged_sport 看门狗 (每0.2秒重启Legged_sport, 必须先杀) # 2. Legged_sport - 主控制循环 # 3. appTransit - 也跟 MCU:8007 通信 echo "" echo "=== 停止 MCU:8007 抢占源 (顺序: 看门狗 → Legged_sport → appTransit) ===" ssh ${PI_USER}@${PI_HOST} bash <<'EOF' || true set +e if sudo pkill -9 -f keep_sport_alive 2>/dev/null; then echo ' ✅ keep_sport_alive.sh (看门狗)' else echo ' (无看门狗)' fi sleep 0.3 if sudo pkill -9 -f Legged_sport 2>/dev/null; then echo ' ✅ Legged_sport' else echo ' (无)' fi if sudo pkill -9 -f appTransit 2>/dev/null; then echo ' ✅ appTransit' else echo ' (无)' fi sleep 0.5 echo '--- 验证残留: ---' if pgrep -fl 'Legged_sport|appTransit|keep_sport_alive' 2>/dev/null; then echo ' ⚠️ 仍有残留, 可能看门狗在别处' else echo ' ✅ 全部清除' fi EOF sleep 1 echo "" echo "[2/2] 执行测试..." case "$TEST" in sin) echo "=== 单腿正弦测试 (Pi端) ===" ssh -t ${PI_USER}@${PI_HOST} \ "cd ${REMOTE_DIR} && python3 test_sin_leg.py --amplitude 0.3 --freq 0.5 --duration 10" ;; damping) echo "=== 零力矩连通性测试 (Pi端) ===" ssh -t ${PI_USER}@${PI_HOST} \ "cd ${REMOTE_DIR} && python3 test_lowcmd.py --skip-stop --skip-mqtt" ;; example) echo "=== example_position(lowlevel) PRO 版本 (Pi端) ===" ssh -t ${PI_USER}@${PI_HOST} \ "cd ${REMOTE_DIR} && python3 example_position_pro.py --max-steps 5000" ;; deploy) echo "✅ 已部署到 ${PI_USER}@${PI_HOST}:${REMOTE_DIR}" echo " ssh ${PI_USER}@${PI_HOST}" echo " cd ${REMOTE_DIR} && python3 test_sin_leg.py ..." ;; *) echo "用法: bash run_on_pi.sh [sin|damping|example|deploy]" exit 1 ;; esac echo "" echo "============================================" echo "恢复 sportMode:" echo " bash tools/onboard/stop_sportmode.sh start" echo " 或 ssh ${PI_USER}@${PI_HOST} sudo systemctl start sportMode" echo "============================================"