# 语义推理与导航

智能语义推理框架包含两个核心模块：  
语义目标标注：利用 VLM识别物体  
语义导航：机器人借助已保存的物体记忆，通过语义路标完成导航。  

语义标注模块将 Faster R-CNN 与 CLIP 结合，实现零样本目标检测。  

给定一个物体列表（例如：["Refrigerator", "water dispenser", "sofa", "white toilet", "office chair with wheels"]），由 Faster R-CNN 从 RGB 图像帧中生成候选区域。

随后，使用 CLIP 将每个候选区域进行特征编码，并与文本标签做余弦相似度对比，为区域分配最可能的类别标签。

点击 RViz2 中Nav2 Goal，在地图上选择目标位置，调整箭头设置机器人到达后的朝向，确认后机器人将自主导航，在探索过程中，系统会结合 RGB-D 数据 记录物体的中心坐标，并将置信度分数与位置信息存入 JSON 文件。
只有当检测到更高置信度的结果时，才会更新原有记录。

## 1. 注意事项
之后每打开一个新终端，都建议先执行：

```bash
source /opt/ros/humble/setup.bash
source /workspace/install/setup.bash
```

## 2. 启动仿真

先点击平台左下角的“终端”，再点击“+”新建终端。在终端1执行下面的依赖安装和编译命令，等待完成

终端1下继续执行启动命令：

```bash
./gzsim_run.sh
```
该脚本会启动仿真和websocket服务，并生成带时间记录的日志文件，预计打印结果：

![图2](assets/picture02.png)

脚本启动成功后，可以在右上角点击添加gazebo界面。等待刷新后，即可查看仿真画面：

![图3](assets/picture03.png)

![图4](assets/picture04.png)

同时可以在左侧点击“数据流”，并点击“refresh”查看当前的ros2话题：

![图5](assets/picture05.png)

## 3. 启动 AMCL节点（负责 “map_server + amcl”）
在终端中点击“+”，新建终端，并执行下面的命令：

![图6](assets/picture06.png)

```bash
source /opt/ros/humble/setup.bash
source /workspace/install/setup.bash
export NAV2_MAP_PATH=/workspace/src/turtlebot3_simulations/turtlebot3_gazebo/map/office_map.yaml
ros2 launch nav2_rrtstar_planner bringup_localization_with_initial_pose.launch.py \
    use_sim_time:=true \
    map:=$NAV2_MAP_PATH \
    params_file:=/workspace/src/TurtleBot-RRT-Star/nav2_params.yaml
```
预计打印结果：

![图7](assets/picture07.png)

## 4. 启动 Nav2导航栈（负责 “RRT* 规划器 + controller + bt_navigator）
在终端中点击“+”，新建终端，并执行下面的命令：

![图8](assets/picture08.png)

```bash
source /opt/ros/humble/setup.bash
source /workspace/install/setup.bash
ros2 launch nav2_bringup navigation_launch.py \
    use_sim_time:=True \
    params_file:=/workspace/src/TurtleBot-RRT-Star/nav2_params.yaml
```
预计打印结果：

![图9](assets/picture09.png)

## 5. 打开rviz
在“仿真器”界面下添加“远程桌面”界面：

![图10](assets/picture10.png)

“远程桌面”界面：

![图11](assets/picture11.png)

在终端中点击“+”，新建终端，并执行下面的命令：

![图12](assets/picture12.png)

```bash
ros2 run rviz2 rviz2 -d /opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rviz --ros-args -p use_sim_time:=true
```
执行完后可以在“远程桌面”界面看到代价地图和路径规划等信息：

![图13](assets/picture13.png)

## 6. 启动目标检测节点
新开终端，执行环境生效后启动vlm_perception_pkg的语义检测节点，开始目标语义标注并构建语义记忆库，在机器人导航过程中，节点实时检测环境中的目标并生成语义标注结果，保存JSON 格式的语义记忆库到指定路径。

![图14](assets/picture14.png)

```bash
source /opt/ros/humble/setup.bash
source /workspace/install/setup.bash
# 该命令启动时重置上次记录的语义记忆库
ros2 run vlm_perception_pkg vlm_detection --ros-args -p use_sim_time:=true -p reset_records_on_startup:=true
# ros2 run vlm_perception_pkg vlm_detection
# 不带参数的启动命令：启动时加载历史 JSON（同一个语义记忆库文件），分数高的记录会覆盖低分记录，适合连续测试时使用
```
启动后，在终端中可以看到小车相机拍摄的图像的检测结果：

![图15](assets/picture15.png)

开始检测后，可以在rviz中使用“Nav2 Goal”设置目标点，让小车在地图内跑动，小车会拍摄实时图像，并实时检测目标，并将检测结果保存到JSON文件中。

![图16](assets/picture16.png)

检测完成后可查看目标标注结果（in /workspace/src/vlm_nav_pkg/config/example_object_detection_vlm.json，带时间戳,可参考测试效果较好的test_vlm.json），后续语义导航功能会加载生成的语义记忆库文件，通过 CLIP 将语义标签编码为shared embedding space，当用户输入自然语言查询时，系统匹配最接近的已知目标，提取其坐标并发送至 Nav2，实现基于自然语言的语义导航。

![图17](assets/picture17.png)

### 导航建议
- TurtleBot3 机身较矮，相机视角较低，高目标物体适合较远距离观测。
- 建议在机器人低速或短暂停止时运行检测，以提高 RGB-D 与 TF 的稳定性。
- 建议目标距离相机约 1~3 米，可以多角度对目标进行观察。
- 本项目保存的是“最高分对应的目标坐标”，适合用于导航到目标附近，不保证是物体几何中心。

## 7. 启动语义导航节点
在终端5关闭检测节点，在终端中点击“+”，新建终端，并执行下面的命令：
```bash
# 关闭检测节点后
source /opt/ros/humble/setup.bash
source /workspace/install/setup.bash
ros2 run vlm_nav_pkg semantic_nav
```

![图18](assets/picture18.png)

节点启动后，在终端输入自然语言语义目标（如 “water dispenser”,“sofa”,“refrigerator”,“white toilet”，“office chair with wheels”），系统将自动完成：语义查询与shared embedding space匹配，提取目标对应的地图坐标（检测节点保存的json文件）并向 Nav2 发送导航目标位姿，然后机器人自主规划路径并导航至语义目标位置，RViz2 中实时可视化规划路径与导航过程。当前导航会默认在目标周围生成多个候选接近点，并优先选择距离当前机器人最近的可行点，避免直接撞向物体中心点。候选点会先经过 `/map` 自由空间筛选，再逐个试算全局路径，只在“有路径”的候选点里选最优目标。
![图19](assets/picture19.png)