# master_launch.py 使用指南

## 启动顺序

```
t=0s  底盘驱动 + EKF + TF + IMU (origincar_bringup)
t=2s  激光雷达 (lslidar_driver)
t=5s  SLAM 建图 (slam_toolbox)
t=8s  Nav2 导航栈
t=10s VLM 图生文 + TTS 语音播报
```

每个阶段依赖前一个阶段就绪，属于**严格时间线启动**，不可调换。

---

## 参数一览

| 参数 | 默认值 | 说明 |
|---|---|---|
| `use_base` | true | 底盘驱动 + EKF + TF |
| `use_lidar` | true | 激光雷达 (lsn10) |
| `use_slam` | true | slam_toolbox 建图 |
| `use_nav2` | true | Nav2 导航栈 |
| `use_vlm` | true | VLM 图生文 + TTS |
| `use_tts` | true | TTS 语音播报开关 |
| `akmcar` | true | 阿克曼底盘 (false=差速) |
| `carto_slam` | false | 使用 Cartographer 替代 EKF |
| `vlm_host` | http://192.168.10.189:8000 | VLM 推理服务地址 |
| `use_sim_time` | false | 使用仿真时间 |

---

## 常用命令

### 全部启动
```bash
ros2 launch my_robot_bringup master_launch.py
```

### 只调试底盘
```bash
ros2 launch my_robot_bringup master_launch.py use_lidar:=false use_slam:=false use_nav2:=false use_vlm:=false
```

### 只建图（底盘 + 雷达 + SLAM）
```bash
ros2 launch my_robot_bringup master_launch.py use_nav2:=false use_vlm:=false
```

### 只启动 VLM（调试图生文）
```bash
ros2 launch my_robot_bringup master_launch.py use_base:=false use_lidar:=false use_slam:=false use_nav2:=false
```

### 底盘 + 雷达 + SLAM + 导航（不加 VLM）
```bash
ros2 launch my_robot_bringup master_launch.py use_vlm:=false use_tts:=false
```

### 更换 VLM 服务地址
```bash
ros2 launch my_robot_bringup master_launch.py vlm_host:=http://192.168.10.200:8000
```

### 差分底盘模式
```bash
ros2 launch my_robot_bringup master_launch.py akmcar:=false
```

### 使用 Cartographer 替代 EKF
```bash
ros2 launch my_robot_bringup master_launch.py carto_slam:=true
```

### 使用自定义 SLAM 参数
```bash
ros2 launch my_robot_bringup master_launch.py slam_params_file:=/path/to/my_slam.yaml
```

### 使用自定义 Nav2 参数
```bash
ros2 launch my_robot_bringup master_launch.py nav2_params_file:=/path/to/my_nav2.yaml
```

---

## 前置条件

1. **VLM 服务** — WSL 中先启动 `python vlm_server.py`（如需使用 VLM）
2. **Portproxy 转发** — Windows 上管理员 PowerShell 执行 `setup_vlm_forward.ps1`（仅需一次，IP 不变则不用重跑）
3. **重刷环境** — 启动前清理残留进程：
   ```bash
   pkill -f ros2; pkill -f espeak; pkill -f ffplay
   ```

---

## 网络架构（VLM 相关）

```
机器人 (192.168.10.x)
    ↓ http://192.168.10.189:8000
Windows 宿主机 (IP 需固定)
    ↓ netsh portproxy → 127.0.0.1:8000
WSL2 vlm_server.py
```

- Windows IP 不变 → 一切正常
- Windows IP 变化 → 重跑 `setup_vlm_forward.ps1`，启动时传 `vlm_host:=http://新IP:8000`


## 改动的地方
  master_launch.py 变更内容

  阶段: 1 (t=0s)
  原来: 底盘 + EKF + TF + IMU
  现在: 不变
  ────────────────────────────────────────
  阶段: 2 (t=2s)
  原来: 激光雷达
  现在: 不变
  ────────────────────────────────────────
  阶段: 3 (t=4s)
  原来: —
  现在: 障碍物检测
    (obstacle_scanner.launch.py)
  ────────────────────────────────────────
  阶段: 4 (t=5s)
  原来: SLAM Toolbox
  现在: Map Server + AMCL 定位 (预建地图替代
    SLAM)
  ────────────────────────────────────────
  阶段: 5 (t=7s)
  原来: Nav2 导航栈
  现在: Hybrid A* 路径规划 + Pure Pursuit
    轨迹跟随
  ────────────────────────────────────────
  阶段: 6 (t=10s)

● Bash(rm -f /c/Users/DHQ/master_launch_new.py)
  ⎿  Done

● 修改完成。以下是改动总结：

  master_launch.py 变更内容

  ┌───────────┬───────────────────────┬────────────────────────────────────────────┐
  │   阶段    │         原来          │                    现在                    │
  ├───────────┼───────────────────────┼────────────────────────────────────────────┤
  │ 1 (t=0s)  │ 底盘 + EKF + TF + IMU │ 不变                                       │
  ├───────────┼───────────────────────┼────────────────────────────────────────────┤
  │ 2 (t=2s)  │ 激光雷达              │ 不变                                       │
  ├───────────┼───────────────────────┼────────────────────────────────────────────┤
  │ 3 (t=4s)  │ —                     │ 障碍物检测 (obstacle_scanner.launch.py)    │
  ├───────────┼───────────────────────┼────────────────────────────────────────────┤
  │ 4 (t=5s)  │ SLAM Toolbox          │ Map Server + AMCL 定位 (预建地图替代 SLAM) │
  ├───────────┼───────────────────────┼────────────────────────────────────────────┤
  │ 5 (t=7s)  │ Nav2 导航栈           │ Hybrid A* 路径规划 + Pure Pursuit 轨迹跟随 │
  ├───────────┼───────────────────────┼────────────────────────────────────────────┤
  │ 6 (t=10s) │ VLM + TTS             │ 不变                                       │
  └───────────┴───────────────────────┴────────────────────────────────────────────┘

  具体改动点

  1. 移除：cyy_slamtoolbox、gc_navigation2_slamtoolbox、slam_toolbox 节点、nav2_bringup launch
  2. 新增：obstacle_scanner 节点（发布 /obstacles）
  3. 新增：map_server + amcl + lifecycle_manager 用于定位
  4. 新增：grid_astar_theta_node（路径规划，发布 /plan）
  5. 新增：topology_pure_pursuit_node.py（轨迹跟随，发布 /cmd_vel）
  6. 话题对齐：planner 的 obstacles_topic 参数覆盖为 /obstacles（与 obstacle_scanner 发布的 topic 一致）
  7. 原文件已备份为 master_launch.py.bak
  
  常用命令
  source /opt/ros/humble/setup.bash
  source ~/yiliao_ws/install/setup.bash
  全部启动

  ros2 launch my_robot_bringup master_launch.py

  只调试底盘

  ros2 launch my_robot_bringup master_launch.py use_lidar:=false use_obstacle:=false use_planner:=false use_vlm:=false

  底盘 + 雷达 + 定位 + 规划跟踪（不开障碍物检测和 VLM）

  ros2 launch my_robot_bringup master_launch.py use_obstacle:=false use_vlm:=false

  只启动 VLM（调试图生文）

  ros2 launch my_robot_bringup master_launch.py use_base:=false use_lidar:=false use_obstacle:=false use_planner:=false

  底盘 + 雷达 + 障碍物检测 + 规划跟踪（不加 VLM）

  ros2 launch my_robot_bringup master_launch.py use_vlm:=false use_tts:=false

  只做障碍物检测（不开规划不开 VLM）

  ros2 launch my_robot_bringup master_launch.py use_planner:=false use_vlm:=false

  只做路径规划+跟踪（不开障碍物检测，靠预建地图）

  ros2 launch my_robot_bringup master_launch.py use_obstacle:=false use_vlm:=false

  更换 VLM 服务地址

  ros2 launch my_robot_bringup master_launch.py vlm_host:=http://192.168.10.200:8000

  差分底盘模式

  ros2 launch my_robot_bringup master_launch.py akmcar:=false

  使用 Cartographer 替代 EKF

  ros2 launch my_robot_bringup master_launch.py carto_slam:=true

  更换地图文件

  ros2 launch my_robot_bringup master_launch.py map_file:=/path/to/my_map.yaml

  更换规划器/跟踪器/AMCL 参数文件

  ros2 launch my_robot_bringup master_launch.py planner_params_file:=/path/to/planner.yaml
  ros2 launch my_robot_bringup master_launch.py tracker_params_file:=/path/to/tracker.yaml
  ros2 launch my_robot_bringup master_launch.py amcl_params_file:=/path/to/amcl.yaml


