# vision_object_recg

基于 ROS2 的视觉目标识别服务示例包，提供 `VisionObjectRecognition.srv` 服务端（service server）。

## 功能概述
`vision_object_recg_node` 提供一个服务：`/vision_object_recognition`。

请求(`interfaces/srv/VisionObjectRecognition`):
```
string object_id
---
bool found
geometry_msgs/PoseStamped pose
```

当前示例逻辑：
- 若 `object_id` 非空且不等于 `"unknown"`，认为识别成功：
  - `found = true`
  - 返回一个示例位姿（frame_id = `map`，位置固定 (1.0, 0.2, 0.8)）
- 否则：
  - `found = false`
  - 位姿为零初始化（frame_id = `map`）

> 实际项目中可替换为：调用视觉推理 / 订阅检测结果 / 检索感知缓存 等。

## 依赖
- rclcpp
- interfaces (提供 `VisionObjectRecognition.srv`)
- geometry_msgs

这些依赖已在本包的 `package.xml` 与 `CMakeLists.txt` 中声明。

## 编译
在工作空间根目录（含有 `src/`）执行：
```bash
colcon build --packages-select vision_object_recg
```
编译完成后加载环境：
```bash
source install/setup.bash
```

## 运行服务节点
```bash
ros2 run vision_object_recg vision_object_recg_node
```
启动后会输出类似：
```
[INFO] [..] [vision_object_recg]: VisionObjectRecognition service server ready on /vision_object_recognition
```

## 查看可用服务
```bash
ros2 service list | grep vision_object_recognition
```
应看到：
```
/vision_object_recognition
```

## 测试调用 (命令行)
### 成功示例
```bash
ros2 service call /vision_object_recognition interfaces/srv/VisionObjectRecognition '{object_id: "cup"}'
```
期望部分输出：
```
found: True
pose: ... position: {x: 1.0, y: 0.2, z: 0.8} ...
```

### 未找到示例
```bash
ros2 service call /vision_object_recognition interfaces/srv/VisionObjectRecognition '{object_id: "unknown"}'
```
期望部分输出：
```
found: False
```

### 空字符串
```bash
ros2 service call /vision_object_recognition interfaces/srv/VisionObjectRecognition '{object_id: ""}'
```
期望：`found: False`。

## 在其它节点中作为客户端调用 (C++)
简要示例：
```cpp
#include <rclcpp/rclcpp.hpp>
#include "interfaces/srv/vision_object_recognition.hpp"

using interfaces::srv::VisionObjectRecognition;

auto node = rclcpp::Node::make_shared("test_client");
auto client = node->create_client<VisionObjectRecognition>("vision_object_recognition");
if (!client->wait_for_service(std::chrono::seconds(2))) {
  RCLCPP_ERROR(node->get_logger(), "Service not available");
}
auto req = std::make_shared<VisionObjectRecognition::Request>();
req->object_id = "cup";
auto future = client->async_send_request(req);
if (future.wait_for(std::chrono::seconds(2)) == std::future_status::ready) {
  auto resp = future.get();
  RCLCPP_INFO(node->get_logger(), "found=%d", resp->found);
}
```

## 与 SkillManager 的关系
`SkillManager` 中会为 `VisionObjectRecognition` 技能创建同名（snake_case）服务客户端，名称映射：
```
VisionObjectRecognition  -->  /vision_object_recognition
```
因此服务名必须保持为 `vision_object_recognition`。

## 典型扩展方向
- 集成真实检测模型 (YOLO / RT-DETR / OpenVINO / TensorRT)
- 支持多类别批量查询：将 `string object_id` 扩展为 `string[] object_ids`
- 增加置信度字段：`float32 confidence`
- 增加错误码：例如 `uint8 status` + 常量定义
- 发布可视化 Marker (`visualization_msgs/MarkerArray`)

## 常见问题
| 问题 | 可能原因 | 解决 |
|------|----------|------|
| 服务调用卡住 | 服务端未启动 | 确认已运行节点并 source 环境 |
| include 找不到接口 | 未重新编译/未 source | 重新 `colcon build` 并 `source install/setup.bash` |
| frame 不一致 | 下游期望的坐标系不同 | 修改返回位姿 header.frame_id |

## 许可证
示例代码，可根据项目需要补充实际 License。

---
若你需要我继续：接入真实识别逻辑 / 添加测试 / 修改服务定义，请再告诉我。
