Files
xMonitor/Plan.md
2026-04-14 22:06:16 +08:00

7.5 KiB
Raw Permalink Blame History

自启方案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

文件 2systemd 服务 /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=1010 秒后重启) │ ├────────────┼───────────────────────────────────────────────────────────────┤ │ 崩溃日志 │ 双保险:① journalctl -u xmonitor 系统日志 ② ~/xMonitor/logs/ │ │ │ 下按时间戳命名的文本日志 │ ├────────────┼───────────────────────────────────────────────────────────────┤ │ 开机自启 │ systemctl enable xmonitor.service │ └────────────┴───────────────────────────────────────────────────────────────┘

待用户提供

  • 手机热点 SSID
  • 手机热点密码
  • 电脑在热点中的固定 IP192.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. 重启设备验证开机自启