This commit is contained in:
obyalian
2025-10-19 16:06:36 +08:00
parent 69fa710737
commit 5513cf2882
200 changed files with 2925 additions and 19 deletions
@@ -0,0 +1,66 @@
# GMSL 相机
> 本节介绍如何在 OrbbecSDK_ROS2 中使用 GMSL 相机。目前仅支持 Gemini 335Lg GMSL 设备,其他 GMSL 设备将在不久的将来得到支持。
您可以在 [example](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples) 中找到示例使用代码。
## 单个 GMSL 相机
GMSL 相机在 OrbbecSDK_ROS2 中的使用与通过 USB 的 Gemini 330 系列相机相同。
```bash
ros2 launch orbbec_camera gemini_330_gmsl.launch.py
```
## 多个 GMSL 相机
要获取 GMSL 相机的 `usb_port`,插入相机并在终端中运行以下命令:
```bash
ros2 run orbbec_camera list_devices_node
```
例如,获得的 gmsl 相机 `usb_port`:`gmsl2-1`
转到 [multi_gmsl_camera.launch.py](https://github.com/orbbec/OrbbecSDK_ROS2/blob/v2-main/orbbec_camera/examples/gmsl_camera/multi_gmsl_camera.launch.py) 文件并更改 `usb_port`。
```bash
ros2 launch orbbec_camera multi_gmsl_camera.launch.py
```
> 注意:默认情况下,multi_gmsl_camera.launch.py 仅启动 color 和 left_ir。如果您想启动其他传感器,请转到 [camera_secondary_params.yaml](https://github.com/orbbec/OrbbecSDK_ROS2/blob/v2-main/orbbec_camera/config/camera_secondary_params.yaml) 进行修改。
## 多个 GMSL 相机同步
首先,请查看如何使用 [multi_camera_synced](./multi_camera_synced.md)。
此外,GMSL 多相机同步不需要 Multi-Camera Sync Hub Pro,因此无需设置 `primary` 模式。每个 GMSL 相机都是 `secondary`。
**额外的参数设置**
* `gmsl_trigger_fps`:设置硬件 soc 触发源帧率。
* `enable_gmsl_trigger`:启用硬件 soc 触发。
**运行启动文件**
请参考 [multi_gmsl_camera_synced.launch.py](https://github.com/orbbec/OrbbecSDK_ROS2/blob/v2-main/orbbec_camera/examples/gmsl_camera/multi_gmsl_camera_synced.launch.py) 中的配置。
```bash
ros2 launch orbbec_camera multi_gmsl_camera_synced.launch.py
```
> 注意:默认情况下,multi_gmsl_camera_synced.launch.py 仅启动 color 和 left_ir。如果您想启动其他传感器,请转到 [camera_secondary_params.yaml](https://github.com/orbbec/OrbbecSDK_ROS2/blob/v2-main/orbbec_camera/config/camera_secondary_params.yaml) 和 [camera_params.yaml](https://github.com/orbbec/OrbbecSDK_ROS2/blob/v2-main/orbbec_camera/config/camera_params.yaml) 进行修改。
## GMSL 相机的使用限制
GMSL 相机与各种反序列化器芯片(如 MAX9296 和 MAX92716)接口。Orbbec GMSL 相机支持多个流,包括深度、彩色、IR 和 IMU 数据,但存在某些使用限制:
- GMSL 仅支持 V4L2 和 YUYV 格式;不支持 MJPG 格式。RGB 输出源自 YUYV 格式转换。
- Gemini-335Lg 的元数据通过单独的节点提供,而其他型号的元数据嵌入在视频帧中,这对用户保持透明。
- 当使用 Max96712 作为反序列化器芯片时,由于 Max96712 芯片的特性,在 secondary_synced 模式下必须提供多机同步触发信号。否则,在切换数据流时会发生数据流中断。
- 连接在同一个 MAX9296、MAX96712 LinkA/B 或 MAX96712 LinkC/D 上的两个相机有以下限制:
- 在驱动程序版本 v12.02 之前,存在一个限制,即一个相机的 RGB 和另一个相机的右 IR 不能同时流式传输。在驱动程序版本 v12.02 之后,限制修改为一个相机的 RGB 和另一个相机的左 IR 不能同时流式传输。
- 在驱动程序版本 v12.02 之前,存在一个限制,即一个相机的 DEPTH 和另一个相机的左 IR 不能同时流式传输。在驱动程序版本 v12.02 之后,限制修改为一个相机的 DEPTH 和另一个相机的右 IR 不能同时流式传输。
- 两个相机的活动流的组合最大数量限制为四个(满足上述两个条件即可确保合规)。
有关更多已知限制,请参考 [Orbbec GMSL 相机的使用限制](https://github.com/orbbec/MIPI_Camera_Platform_Driver/blob/main/doc/Instructions%20for%20Using%20GMSL%20Camera.md)
@@ -0,0 +1,55 @@
# 多相机同步说明
> 本文档的目的是说明如何在 OrbbecSDK_ROS2 中使用多相机同步
### 设置说明
* 请阅读多相机同步设置指南:[多相机同步设置](https://www.orbbec.com/docs/set-up-cameras-for-external-synchronization_v1-2/)
* 确保相机正确连接到多相机同步器。
![深度点云可视化](../../image/multi_camera_synced/multi_camera_synced1.png)
### 使用 OrbbecSDK_ROS2 检查相机端口
```bash
ros2 run orbbec_camera list_devices_node
```
### OrbbecSDK_ROS2 多相机同步配置
打开 multi_camera_synced.launch.py,并按照下面所示配置相机设置:
![深度点云可视化](../../image/multi_camera_synced/multi_camera_synced2.png)
1. `gemini_330_series.launch.py` 是用于启动相机的启动文件。
2. 将 `camera_name` 设置为 `G330_0`。例如,发布的彩色图像话题将是 `/G330_0/color/image_raw`。
3. 将 `usb_port` 设置为 `2-2`,表示正在使用端口 `2-2` 上的相机设备。此值可以在 `ros2 run orbbec_camera list_devices_node` 命令的输出中找到。
4. 将 `device_num` 设置为 `2`,表示将使用两个相机。
5. 将 `sync_mode` 设置为 `primary`,表示 `2-7` 相机设备处于主模式。多相机同步模式选项可以在下图中找到。
6. 来自 `config_file_path` 的参数可以覆盖在 `gemini_330_series.launch.py` 中设置的参数(可选)。
7. 对于从属相机,将 `trigger_out_enabled` 设置为 false。
| **模式名称** | **设置效果说明** |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| free_run | - 支持不同的帧率设置<br />- 8 针同步接口不支持外部输出同步相关信号 |
| standalone(默认) | ● 默认与 Primary 相同<br />● 内置 RGBD 帧同步<br />● 8 针同步接口默认不向外部输出信号 |
| primary | ● 设置为主相机<br />● 8 针同步接口向外部设备输出信号 |
| secondary | ● 设置为从属(被动同步;当外部有硬件连续触发信号输入且连续触发信号与当前设置的帧率匹配时,根据外部触发信号采集图像;当没有外部触发信号时,停止流)<br />● 8 针同步接口向外部设备输出信号 |
| secondary_synced | ● 设置为从属同步(被动同步;当外部有硬件连续触发信号输入且连续触发信号与当前设置的帧率匹配时,根据外部触发信号采集图像;当没有外部触发信号时,根据设置的帧率的内部触发信号采集图像)<br />● 8 针同步接口向外部设备输出信号 |
| hardware_triggering | ● 设置为硬件触发(被动触发;当外部有硬件触发信号输入且触发信号时间间隔不小于当前上限时,根据外部触发信号采集图像;当没有外部触发信号时,不采集图像)<br />● 8 针同步接口向外部设备输出信号 |
| software_triggering | ● 设置为软件触发(被动触发;当主机有触发命令输入且触发命令时间间隔不小于当前上限时,根据触发命令采集图像;当没有触发命令时,不采集图像)<br />● 8 针同步接口向外部设备输出信号 |
* 主相机应该最后启动。
* 理想情况下,启动每个相机之间应该有 2 秒的延迟。
### 运行以下命令启动多相机同步
```bash
ros2 launch orbbec_camera multi_camera_synced.launch.py
```
@@ -0,0 +1,161 @@
# 多相机同步验证工具
> 本文将介绍如何验证多相机同步的同步精度。
>
> 首先,请查看如何使用 [multi_camera_synced](./multi_camera_synced.md)。
您可以在 [example](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples) 中找到示例使用代码。
## 目录结构
```plaintext
.
├── multicamera_sync/
│ ├── output/
│ ├──20250218102900/
│ ├──DevicesInfo.txt
│ ├──StreamProfileInfo.txt
│ ├── Python/
│ ├──Config.ini
├── gemini_330_series_synced_verify.launch.py
├── multi_camera_synced_verify.launch.py
```
**multicamera_sync**
* `gemini_330_series_synced_verify.launch.py`:单相机运行启动文件,为 multi_camera_synced_verify.launch.py 提供相机运行节点。
* `multi_camera_synced_verify.launch.py`:多相机同步 + save_rgbir 工具的启动文件。
**output**
> `ouput` 文件夹是相机图片输出的文件夹
在提供的输出示例中
* `20250218102900`:表示在 2025 年 2 月 18 日 10:29:00 收集的相机图像信息。
* `TotalModeFrames`:相机图像信息存储目录。
* `results-2025-02-25_163648`:分析和匹配 TotalModeFrames 图像信息后的结果。
* `DevicesInfo.txt`:相机设备基本信息(需要修改)。
* `StreamProfileInfo.txt`:相机视频流信息(无需修改)。
**Python**
* `Config.ini`:Python 分析脚本的配置文件(需要修改)。
## 运行准备
**save_rgbir 节点**
编辑 multi_camera_synced_verify.launch.py 并填写激活的相机设备,我们可以看到 save_rgbir 在最后启动。
> 重要
>
> 如果您使用 ROS 2 Foxy,需要先启动 save_rgbir 节点。
```python
# Launch description
ld = LaunchDescription(
[
shared_orbbec_container,
TimerAction(period=0.0, actions=[GroupAction([launch2_include])]),
TimerAction(period=2.0, actions=[GroupAction([launch1_include])]),
# The primary camera should be launched at last
TimerAction(period=6.0, actions=[GroupAction([save_rgbir])]),
# save_rgbir is synced verification tool
]
)
return ld
```
save_rgbir 是一个用于保存图像的工具。该工具的配置文件在 [multi_save_rgbir_params.json](../../config/tools/multisavergbir/multi_save_rgbir_params.json) 中。
```json
{
"save_rgbir_params": {
"time_domain": "global",
"usb_ports": [
"2-1",
"2-3"
],
"camera_name": [
"camera_01",
"camera_02"
]
}
}
```
* `time_domain`:时间戳类型
* `usb_ports`:"primary"、"secondary 1"、"secondary 2"、"secondary 3",根据相机数量填写 usb_ports
* `camera_name`:相机设置的名称,例如:camera_01
**DevicesInfo.txt**
编辑 DevicesInfo.txt。只需要更改 `primarySerialNumber`、`index` 和 `serialNumber` 参数。其他参数不需要更改。请参考 [20250218102900](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900) 的示例。
* `primarySerialNumber`:主相机的 SN 序列号
* `index`:相机索引
* `serialNumber`:相机的 SN 序列号
**Config.ini**
编辑 Config.ini。修改 `frameRate` 和 `tspRangeThreshold`。
## 运行此示例
**运行启动文件并保存相机图片**
* 第一个终端
```bash
ros2 launch orbbec_camera multi_camera_synced_verify.launch.py
```
* 第二个终端
```bash
ros2 service call /save_rgbir/start_capture orbbec_camera_msgs/srv/SetInt32 '{data: 100}'
```
当终端显示"over"时,图像已保存。将在工作空间下生成一个新的 multicamera_sync 文件夹。
**相机图片命名格式**
以 [color_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543327_e50_d16_.jpg](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543327_e50_d16_.jpg) 为例
* `color`:此图像是彩色流的快照。
* `SNCP1E5420006D`:相机的 SN 序列号是 CP1E5420006D。
* `Index0`:相机 0(通常指主相机)。
* `g1739874543227`:"g"表示全局时间戳,意味着此帧的全局时间戳是 1739874543227。
* `f0`:此相机彩色流采集的第 0 张图片。
* `s1739874543327`:"s"表示当前系统的时间戳,意味着此帧的当前系统时间戳是 1739874543327。
* `e50`:此帧的曝光为 50。
* `d16`:此帧的增益为 16。
**分析相机图像数据**
您需要将修改后的 [Python 文件夹](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples/multi_camera_synced_verification_tool//multicamera_sync/Python) 复制到新的 multi_camera_synced 子目录,并将修改后的 [DevicesInfo.txt](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/DevicesInfo.txt) 和 [StreamProfileInfo.txt](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples/multi_camera_synced_verification_tool//multicamera_sync/output/20250218102900/StreamProfileInfo.txt) 复制到与 TotalModeFrames 文件夹同级的目录。
* 最后一切准备就绪,运行 python 脚本
```bash
cd multicamera_sync/Python
python3 SyncFramesMain.py
```
操作成功后,您可以在 `results 文件夹` 中查看同步效果
## 需要更改的文件
**分析工具**
* [multi_save_rgbir_params.json](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/config/tools/multisavergbir/multi_save_rgbir_params.json)
* [DevicesInfo.txt](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples/multi_camera_synced_verification_tool//multicamera_sync/output/20250218102900/DevicesInfo.txt)
* [Config.ini](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples/multi_camera_synced_verification_tool//multicamera_sync/Python/Config.ini)
**相机配置**
[camera_params.yaml](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/config/camera_params.yaml)(相机启动参数设置)
[multi_camera_synced_verify.launch.py](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples/multi_camera_synced_verification_tool//multi_camera_synced_verify.launch.py)