# camera (ROS2 Humble)

面向低延迟的彩色相机 ROS2 节点（默认 MJPEG），支持：

- 按摄像头名称筛选
- 按稳定标识（`/dev/v4l/by-id` 或 `/dev/v4l/by-path`）筛选
- 按 `width` 自动匹配相机支持分辨率
- USB / MIPI 类型筛选

发布话题：

- `/camera/image_raw` (`sensor_msgs/msg/Image`, `bgr8`)

---

## 1. 编译

```bash
cd ~/opt/dev/project/aiagent/capabilities
source /opt/ros/humble/setup.bash
colcon build --packages-select camera --cmake-args -DCMAKE_BUILD_TYPE=Release
source install/setup.bash
```

---

## 2. 启动

### 2.1 默认启动（自动选择）

```bash
ros2 run camera camera_node
```

### 2.2 按名称选择（示例）

```bash
ros2 run camera camera_node --ros-args \
  -p camera_name:="USB Camera" \
  -p width:=640 \
  -p fps:=30 \
  -p output_topic:=/camera/color/image_raw
```

### 2.3 按稳定标识选择（推荐）

先查看：

```bash
ls -l /dev/v4l/by-id | cat
ls -l /dev/v4l/by-path | cat
```

启动时：

```bash
ros2 run camera camera_node --ros-args \
  -p stable_id:="usb-046d" \
  -p width:=640
```

### 2.4 明确指定设备节点

```bash
ros2 run camera camera_node --ros-args -p device_path:=/dev/video0 -p width:=640
```

### 2.5 指定总线类型

```bash
# 仅 USB
ros2 run camera camera_node --ros-args -p bus_type:=usb -p width:=640

# 仅 MIPI
ros2 run camera camera_node --ros-args -p bus_type:=mipi -p width:=640
```

---

## 3. 参数说明

- `frame_id` (string, 默认 `camera_link`)
- `bus_type` (string, 默认 `auto`): `auto` / `usb` / `mipi`
- `camera_name` (string, 默认空): 按名称子串匹配
- `stable_id` (string, 默认空): 按 by-id/by-path 名称子串匹配
- `device_path` (string, 默认空): 显式设备，如 `/dev/video0`
- `width` (int, 默认 `640`): 目标输出宽度，自动选择最匹配分辨率
- `height` (int, 默认 `0`): 高度提示（可选）
- `fps` (int, 默认 `30`): 采集帧率参数
- `pixel_format` (string, 默认 `MJPG`)
- `output_topic` (string, 默认 `/camera/image_raw`): 输出话题名
- `topic_name` (string, 默认空): `output_topic` 的别名，若非空则优先使用

分辨率策略：

- 优先选择与 `width` 最接近的 MJPEG 离散分辨率；
- 若提供 `height`，会同时考虑高度接近度；
- 若设备未枚举到 MJPEG 分辨率，则回退到请求值。

---

## 4. 低延迟建议

1. 使用 `pixel_format=MJPG`（默认）。
2. 节点内已设置 `CAP_PROP_BUFFERSIZE=1`，减少缓存堆积。
3. 订阅端使用 `best_effort`、小队列。
4. 降低分辨率与 fps 以获得更稳时延。
5. 避免系统中多个进程同时占用同一摄像头。

---

## 5. 运行检查

```bash
ros2 topic list
ros2 topic hz /camera/image_raw
ros2 topic echo /camera/image_raw --once
```

可视化：

```bash
ros2 run rqt_image_view rqt_image_view
```

