fix: 自启动
This commit is contained in:
162
Plan.md
Normal file
162
Plan.md
Normal file
@@ -0,0 +1,162 @@
|
||||
自启方案:monitor_sender.py 通过手机热点自动启动
|
||||
|
||||
Context
|
||||
|
||||
monitor_sender.py 是一个 ROS2 节点,运行在机器人控制器上(Ubuntu, 用户名
|
||||
ubuntu),订阅机器人状态话题并通过 WebSocket 发送到 PC
|
||||
端监控服务器。设备在真实世界运行,需要开机后:
|
||||
1. 自动连接手机热点 WiFi
|
||||
2. 等待网络就绪后启动 monitor_sender.py(通过热点向 PC 的固定 IP 发送数据)
|
||||
3. 崩溃后自动重启并记录崩溃原因
|
||||
|
||||
方案:systemd 服务 + 启动脚本(两个文件搞定)
|
||||
|
||||
文件 1:启动脚本 ~/xMonitor/start_monitor.sh
|
||||
|
||||
#!/bin/bash
|
||||
# ========== 配置区(按实际修改) ==========
|
||||
HOTSPOT_SSID="你的热点名称" # ← 稍后填
|
||||
HOTSPOT_PASS="你的热点密码" # ← 稍后填
|
||||
SERVER_IP="192.168.43.xxx" # ← 电脑在热点中的固定 IP
|
||||
SERVER_PORT=9000
|
||||
# ==========================================
|
||||
|
||||
LOG_DIR="$HOME/xMonitor/logs"
|
||||
mkdir -p "$LOG_DIR"
|
||||
LOG_FILE="$LOG_DIR/monitor_$(date +%Y%m%d_%H%M%S).log"
|
||||
|
||||
exec > >(tee -a "$LOG_FILE") 2>&1
|
||||
echo "===== $(date) 启动 monitor_sender ====="
|
||||
|
||||
# --- 1) 连接手机热点 ---
|
||||
echo "[NET] 正在连接热点: $HOTSPOT_SSID"
|
||||
MAX_WIFI_RETRY=30
|
||||
for i in $(seq 1 $MAX_WIFI_RETRY); do
|
||||
# 尝试连接(如果已保存过连接配置则直接 up,否则新建)
|
||||
nmcli dev wifi connect "$HOTSPOT_SSID" password "$HOTSPOT_PASS" 2>/dev/null \
|
||||
|| nmcli con up "$HOTSPOT_SSID" 2>/dev/null
|
||||
|
||||
# 检查是否拿到 IP
|
||||
if nmcli -t -f GENERAL.STATE dev show wlan0 2>/dev/null | grep -q "100"; then
|
||||
echo "[NET] WiFi 已连接 ($i/$MAX_WIFI_RETRY)"
|
||||
break
|
||||
fi
|
||||
echo "[NET] WiFi 未就绪,重试 ($i/$MAX_WIFI_RETRY)..."
|
||||
sleep 3
|
||||
done
|
||||
|
||||
# --- 2) 等待能 ping 通服务器 ---
|
||||
echo "[NET] 等待服务器 $SERVER_IP 可达..."
|
||||
MAX_PING_RETRY=20
|
||||
for i in $(seq 1 $MAX_PING_RETRY); do
|
||||
if ping -c 1 -W 2 "$SERVER_IP" >/dev/null 2>&1; then
|
||||
echo "[NET] 服务器可达 ✓"
|
||||
break
|
||||
fi
|
||||
echo "[NET] ping 失败,重试 ($i/$MAX_PING_RETRY)..."
|
||||
sleep 3
|
||||
done
|
||||
|
||||
# --- 3) Source 环境并启动 ---
|
||||
echo "[ENV] source ROS2 workspace..."
|
||||
source /home/ubuntu/ros2ws/install/setup.bash
|
||||
|
||||
echo "[ENV] source Python venv..."
|
||||
source "$HOME/xMonitor/.venv/bin/activate"
|
||||
|
||||
echo "[RUN] 启动 monitor_sender.py --ip $SERVER_IP --port $SERVER_PORT"
|
||||
cd "$HOME/xMonitor"
|
||||
python3 monitor_sender.py --ip "$SERVER_IP" --port "$SERVER_PORT"
|
||||
|
||||
EXIT_CODE=$?
|
||||
echo "===== $(date) 进程退出, code=$EXIT_CODE ====="
|
||||
exit $EXIT_CODE
|
||||
|
||||
文件 2:systemd 服务 /etc/systemd/system/xmonitor.service
|
||||
|
||||
[Unit]
|
||||
Description=xMonitor Robot Status Sender
|
||||
After=network-manager.service
|
||||
Wants=network-manager.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=ubuntu
|
||||
WorkingDirectory=/home/ubuntu/xMonitor
|
||||
ExecStart=/bin/bash /home/ubuntu/xMonitor/start_monitor.sh
|
||||
|
||||
# --- 崩溃自动重启 ---
|
||||
Restart=on-failure
|
||||
RestartSec=10
|
||||
|
||||
# --- 崩溃日志 ---
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=xmonitor
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
部署步骤(在机器人设备上执行)
|
||||
|
||||
# 1. 将 start_monitor.sh 放到 ~/xMonitor/ 并加执行权限
|
||||
chmod +x ~/xMonitor/start_monitor.sh
|
||||
|
||||
# 2. 编辑 start_monitor.sh 顶部配置区,填入热点名称、密码、电脑IP
|
||||
|
||||
# 3. 复制 service 文件并启用
|
||||
sudo cp xmonitor.service /etc/systemd/system/
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable xmonitor.service
|
||||
|
||||
# 4. 立即测试启动(可选)
|
||||
sudo systemctl start xmonitor.service
|
||||
|
||||
# 5. 查看状态 / 日志
|
||||
systemctl status xmonitor.service
|
||||
journalctl -u xmonitor -f # 实时查看日志
|
||||
ls ~/xMonitor/logs/ # 查看历史日志文件
|
||||
|
||||
关键设计说明
|
||||
|
||||
┌────────────┬───────────────────────────────────────────────────────────────┐
|
||||
│ 需求 │ 实现方式 │
|
||||
├────────────┼───────────────────────────────────────────────────────────────┤
|
||||
│ 连热点 │ nmcli dev wifi connect 循环重试,最多 30 次 × 3 秒 │
|
||||
├────────────┼───────────────────────────────────────────────────────────────┤
|
||||
│ 等待网络 │ ping 服务器 IP 直到可达 │
|
||||
├────────────┼───────────────────────────────────────────────────────────────┤
|
||||
│ source │ 脚本内 source .venv/bin/activate │
|
||||
│ 虚拟环境 │ │
|
||||
├────────────┼───────────────────────────────────────────────────────────────┤
|
||||
│ source │ 脚本内 source /home/ubuntu/ros2ws/install/setup.bash(来自 │
|
||||
│ ROS2 │ README) │
|
||||
├────────────┼───────────────────────────────────────────────────────────────┤
|
||||
│ 崩溃重启 │ systemd Restart=on-failure + RestartSec=10(10 秒后重启) │
|
||||
├────────────┼───────────────────────────────────────────────────────────────┤
|
||||
│ 崩溃日志 │ 双保险:① journalctl -u xmonitor 系统日志 ② ~/xMonitor/logs/ │
|
||||
│ │ 下按时间戳命名的文本日志 │
|
||||
├────────────┼───────────────────────────────────────────────────────────────┤
|
||||
│ 开机自启 │ systemctl enable xmonitor.service │
|
||||
└────────────┴───────────────────────────────────────────────────────────────┘
|
||||
|
||||
待用户提供
|
||||
|
||||
- 手机热点 SSID
|
||||
- 手机热点密码
|
||||
- 电脑在热点中的固定 IP(192.168.43.???)
|
||||
|
||||
需要创建/修改的文件
|
||||
|
||||
1. 新建 ~/xMonitor/start_monitor.sh — 启动脚本
|
||||
2. 新建 ~/xMonitor/xmonitor.service — systemd 服务文件(用户手动 sudo cp 到
|
||||
/etc/systemd/system/)
|
||||
|
||||
验证方法
|
||||
|
||||
1. 手动运行 bash ~/xMonitor/start_monitor.sh 确认 WiFi 连接和程序启动正常
|
||||
2. sudo systemctl start xmonitor.service 启动服务
|
||||
3. systemctl status xmonitor.service 确认 active (running)
|
||||
4. journalctl -u xmonitor -f 实时查看日志
|
||||
5. 杀掉 python 进程 kill $(pgrep -f monitor_sender) 验证自动重启
|
||||
6. 重启设备验证开机自启
|
||||
Reference in New Issue
Block a user