Use uv for Python environment
This commit is contained in:
+28
-4
@@ -13,12 +13,33 @@ scripts/
|
||||
|
||||
## 使用场景
|
||||
|
||||
### 0. 初始化 Python 环境
|
||||
|
||||
项目使用 `uv` 统一管理 Python 虚拟环境,依赖声明在仓库根目录 `pyproject.toml`,锁定版本在 `uv.lock`。
|
||||
|
||||
```bash
|
||||
# 如系统尚未安装 uv,先安装 uv
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
|
||||
# 在仓库根目录执行
|
||||
cd ~/work/smart-inspection
|
||||
uv sync
|
||||
```
|
||||
|
||||
`uv sync` 会按 `.python-version` 创建 Python 3.10 虚拟环境到 `.venv`。ROS2 Humble 仍使用系统环境 `/opt/ros/humble`,不要把 ROS2 系统包写入 `pyproject.toml`。
|
||||
|
||||
系统依赖仍需通过系统包管理器安装:
|
||||
|
||||
```bash
|
||||
sudo apt install -y ffmpeg libzbar0
|
||||
```
|
||||
|
||||
### 1. 首次开机 / 完整重启
|
||||
```bash
|
||||
# 在 AGV 上执行
|
||||
cd ~/work/smart-inspection/scripts
|
||||
./stop_all.sh # 先彻底清理
|
||||
./start_all.sh # 完整启动
|
||||
cd ~/work/smart-inspection
|
||||
./scripts/stop_all.sh # 先彻底清理
|
||||
./scripts/start_all.sh # 完整启动
|
||||
```
|
||||
|
||||
### 2. 修改代码后快速部署
|
||||
@@ -45,7 +66,8 @@ ssh elephant@192.168.60.80 'bash -s' < scripts/start_flask.sh
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `AGV_APP_DIR` | `/home/elephant/work/agv_app` | Flask 项目目录 |
|
||||
| `AGV_PROJECT_DIR` | `/home/elephant/work/smart-inspection` | 仓库根目录 |
|
||||
| `AGV_APP_DIR` | `$AGV_PROJECT_DIR/agv_app` | Flask 应用目录 |
|
||||
| `AGV_ROS2_DIR` | `/home/elephant/agv_pro_ros2` | ROS2 工作空间 |
|
||||
| `SCAN_FIXER_DIR` | `/home/elephant/work/scan_fixer` | 时间戳修正工具目录 |
|
||||
| `FIXER_SCRIPT` | `fix_scan_timestamp_v6.py` | fixer 脚本名 |
|
||||
@@ -64,6 +86,8 @@ ssh elephant@192.168.60.80 'bash -s' < scripts/start_flask.sh
|
||||
机械臂 (Pi) 的启动由 systemd 托管,在 Pi 上执行:
|
||||
|
||||
```bash
|
||||
cd ~/work/smart-inspection
|
||||
uv sync
|
||||
sudo systemctl start arm_server # 启动
|
||||
sudo systemctl status arm_server # 查看状态
|
||||
sudo systemctl enable arm_server # 开机自启
|
||||
|
||||
@@ -8,6 +8,7 @@ set -e
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
AGV_APP_DIR="$PROJECT_DIR/agv_app"
|
||||
AGV_ROS2_DIR="${AGV_ROS2_DIR:-/home/elephant/agv_pro_ros2}"
|
||||
|
||||
echo "=========================================="
|
||||
echo " 本地开发模式 - 仅启动 Flask"
|
||||
@@ -15,6 +16,9 @@ echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# 切换到项目目录
|
||||
source /opt/ros/humble/setup.bash 2>/dev/null || true
|
||||
source "$AGV_ROS2_DIR/install/setup.bash" 2>/dev/null || true
|
||||
|
||||
cd "$AGV_APP_DIR"
|
||||
|
||||
# 检查是否有运行的 Flask 进程
|
||||
@@ -36,4 +40,4 @@ fi
|
||||
echo "启动 Flask (前台模式,Ctrl+C 停止)..."
|
||||
echo "访问: http://127.0.0.1:5000"
|
||||
echo ""
|
||||
exec python3 app.py
|
||||
exec uv run --locked python app.py
|
||||
|
||||
@@ -2,11 +2,17 @@
|
||||
# ============================================================
|
||||
# restart_flask.sh - 语法检查 + 重启 Flask + 验证
|
||||
# 用法: ssh elephant@<AGV_IP> 'bash -s' < scripts/restart_flask.sh
|
||||
# 或在 AGV 上: cd ~/work/agv_app && ../../scripts/restart_flask.sh
|
||||
# 或在 AGV 上: cd ~/work/smart-inspection && ./scripts/restart_flask.sh
|
||||
# ============================================================
|
||||
set -e
|
||||
|
||||
AGV_APP_DIR="${AGV_APP_DIR:-/home/elephant/work/agv_app}"
|
||||
AGV_PROJECT_DIR="${AGV_PROJECT_DIR:-/home/elephant/work/smart-inspection}"
|
||||
AGV_APP_DIR="${AGV_APP_DIR:-$AGV_PROJECT_DIR/agv_app}"
|
||||
AGV_ROS2_DIR="${AGV_ROS2_DIR:-/home/elephant/agv_pro_ros2}"
|
||||
|
||||
source /opt/ros/humble/setup.bash 2>/dev/null || true
|
||||
source "$AGV_ROS2_DIR/install/setup.bash" 2>/dev/null || true
|
||||
|
||||
cd "$AGV_APP_DIR"
|
||||
|
||||
echo "=========================================="
|
||||
@@ -16,7 +22,7 @@ echo ""
|
||||
|
||||
# 1. 语法检查
|
||||
echo "[1/3] Python 语法检查..."
|
||||
python3 -m py_compile app.py
|
||||
uv run --locked python -m py_compile app.py
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "❌ 语法错误,请先修复"
|
||||
exit 1
|
||||
@@ -29,8 +35,9 @@ find "$AGV_APP_DIR" -name '*.pyc' -delete 2>/dev/null
|
||||
find "$AGV_APP_DIR" -name '__pycache__' -type d -exec rm -rf {} + 2>/dev/null
|
||||
|
||||
pkill -f "python.*app.py" 2>/dev/null || true
|
||||
pkill -f "uv run .*python app.py" 2>/dev/null || true
|
||||
sleep 1
|
||||
nohup python3 app.py > /tmp/agv_flask.log 2>&1 &
|
||||
nohup uv run --locked python app.py > /tmp/agv_flask.log 2>&1 &
|
||||
FLASK_PID=$!
|
||||
echo " Flask PID: $FLASK_PID"
|
||||
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
set -e
|
||||
|
||||
# ---- 可配置项(环境变量覆盖默认值) ----
|
||||
AGV_APP_DIR="${AGV_APP_DIR:-/home/elephant/work/agv_app}"
|
||||
AGV_PROJECT_DIR="${AGV_PROJECT_DIR:-/home/elephant/work/smart-inspection}"
|
||||
AGV_APP_DIR="${AGV_APP_DIR:-$AGV_PROJECT_DIR/agv_app}"
|
||||
AGV_ROS2_DIR="${AGV_ROS2_DIR:-/home/elephant/agv_pro_ros2}"
|
||||
SCAN_FIXER_DIR="${SCAN_FIXER_DIR:-/home/elephant/work/scan_fixer}"
|
||||
FIXER_SCRIPT="${FIXER_SCRIPT:-fix_scan_timestamp_v6.py}"
|
||||
@@ -34,6 +35,7 @@ pkill -f "robot_state_publisher" 2>/dev/null || true
|
||||
pkill -f "fix_scan_timestamp" 2>/dev/null || true
|
||||
pkill -f "clock_publisher" 2>/dev/null || true
|
||||
pkill -f "python.*app.py" 2>/dev/null || true
|
||||
pkill -f "uv run .*python app.py" 2>/dev/null || true
|
||||
sleep 2
|
||||
|
||||
# 【关键】硬杀确保干净
|
||||
@@ -252,7 +254,7 @@ echo " ✅ 精度参数已设置"
|
||||
echo "[7/8] 启动 Flask API..."
|
||||
export ROS_DOMAIN_ID=1
|
||||
cd "$AGV_APP_DIR"
|
||||
nohup python3 app.py > /tmp/agv_flask.log 2>&1 &
|
||||
nohup uv run --locked python app.py > /tmp/agv_flask.log 2>&1 &
|
||||
FLASK_PID=$!
|
||||
echo " Flask PID: $FLASK_PID"
|
||||
sleep 4
|
||||
@@ -308,7 +310,7 @@ echo " 当前文件数: $FASTRTPS_NEW (正常运行时会有一些)"
|
||||
# 8e. Flask API 测试
|
||||
echo ""
|
||||
echo "验证 Flask API..."
|
||||
FLASK_RUNNING=$(ps aux | grep "[p]ython3 app.py" | wc -l || echo 0)
|
||||
FLASK_RUNNING=$(pgrep -f "app.py" | wc -l || echo 0)
|
||||
if [ "$FLASK_RUNNING" -gt 0 ]; then
|
||||
echo " ✅ Flask 进程运行中"
|
||||
else
|
||||
|
||||
@@ -3,13 +3,19 @@
|
||||
# start_flask.sh - 仅启动/重启 Flask 服务(不启动 ROS2)
|
||||
# 适用于: 修改了前端/API 代码后快速重启
|
||||
# ============================================================
|
||||
AGV_APP_DIR="${AGV_APP_DIR:-/home/elephant/work/agv_app}"
|
||||
AGV_PROJECT_DIR="${AGV_PROJECT_DIR:-/home/elephant/work/smart-inspection}"
|
||||
AGV_APP_DIR="${AGV_APP_DIR:-$AGV_PROJECT_DIR/agv_app}"
|
||||
AGV_ROS2_DIR="${AGV_ROS2_DIR:-/home/elephant/agv_pro_ros2}"
|
||||
|
||||
pkill -f "python.*app.py" 2>/dev/null || true
|
||||
pkill -f "uv run .*python app.py" 2>/dev/null || true
|
||||
sleep 1
|
||||
|
||||
source /opt/ros/humble/setup.bash 2>/dev/null || true
|
||||
source "$AGV_ROS2_DIR/install/setup.bash" 2>/dev/null || true
|
||||
|
||||
cd "$AGV_APP_DIR"
|
||||
nohup python3 app.py > /tmp/agv_flask.log 2>&1 &
|
||||
nohup uv run --locked python app.py > /tmp/agv_flask.log 2>&1 &
|
||||
echo "Flask started, PID: $!"
|
||||
sleep 2
|
||||
|
||||
|
||||
+2
-1
@@ -14,7 +14,8 @@ echo ""
|
||||
|
||||
# ---------- 1. 软杀所有相关进程 ----------
|
||||
echo "[1/5] 软杀所有相关进程..."
|
||||
pkill -f "python3 app.py" 2>/dev/null || true
|
||||
pkill -f "python.*app.py" 2>/dev/null || true
|
||||
pkill -f "uv run .*python app.py" 2>/dev/null || true
|
||||
pkill -f "agv_pro_bringup" 2>/dev/null || true
|
||||
pkill -f "agv_pro_navigation2" 2>/dev/null || true
|
||||
pkill -f "agv_pro_node" 2>/dev/null || true
|
||||
|
||||
Reference in New Issue
Block a user