# Multi-Device-Synchronization-Example
**Repository Path**: orbbecdeveloper/Multi-Device-Synchronization-Example
## Basic Information
- **Project Name**: Multi-Device-Synchronization-Example
- **Description**: Femto Mega 多机同步示例
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: v2-main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-10-31
- **Last Updated**: 2026-07-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Multi-Device Synchronization Example
Demonstrates multi-device synchronization. This sample supports network devices, USB devices, and GMSL devices.
- The primary purpose of this repository is to demonstrate the multi-device synchronization functionality of different types of Orbbec devices, including detailed instructions for hardware connections and software configuration.
- The v2-main branch is based on the [multi device sync sample](https://github.com/orbbec/OrbbecSDK_v2/tree/main/examples/https://github.com/orbbec/OrbbecSDK_v2/tree/main/examples/3.advanced.multi_devices_sync) and [gmsl trigger sample](https://github.com/orbbec/OrbbecSDK_v2/tree/main/examples/3.advanced.multi_devices_sync_gmsltrigger) provided by [Orbbec SDK v2](https://github.com/orbbec/OrbbecSDK_v2). If there are any updates or changes to the samples in Orbbec SDK v2, please refer to the official implementation in Orbbec SDK v2 as the authoritative version.
- The legacy main branch is based on Orbbec SDK v1 and only demonstrates multi-device synchronization for Femto Mega.
## Supported Device Series
## Program Overview
This project builds two standalone executables:
| Program | Connection | Platform | Function |
| ------- | ---------- | -------- | -------- |
| **MultiDeviceSync** | USB / Ethernet /GMSL | Windows / Linux x64 / Linux ARM64 | Multi-device sync configuration, data stream acquisition, real-time preview |
| **MultiDeviceSyncGmslTrigger** | GMSL | Linux ARM64 (NVIDIA Jetson AGX Orin, NVIDIA Jetson Orin NX) | GMSL PWM hardware trigger signal source |
- Notes: **GMSL** devices require two applications: MultiDeviceSync and MultiDeviceSyncGmslTrigger. The MultiDeviceSyncGmslTrigger application is responsible for sending trigger signals, while **USB and Ethernet** devices only require the MultiDeviceSync application.
## Quick Start
### 1. Build
```bash
cd Multi-Device-Synchronization-Example
mkdir build && cd build
cmake ..
cmake --build . --config Release
```
Build artifacts are in the `build/bin/` directory:
- **Windows**: `MultiDeviceSync.exe`
- **Linux**: `MultiDeviceSync`, `MultiDeviceSyncGmslTrigger`
### 2. Configuration
The program reads `./MultiDeviceSyncConfig.json` from the current working directory by default. Device serial numbers can be found using the OrbbecViewer tool or in the program log after connecting devices.
#### Configuration File Structure
The following example includes all optional fields; use as needed based on your device series:
```json
{
"version": "1.0.1",
"configTime": "2026/05/07",
"devices": [
{
"sn": "CP123456789",
"syncConfig": {
"syncMode": "OB_MULTI_DEVICE_SYNC_MODE_PRIMARY",
"depthDelayUs": 0,
"colorDelayUs": 0,
"trigger2ImageDelayUs": 0,
"triggerOutEnable": true,
"triggerOutDelayUs": 0,
"framesPerTrigger": 1
}
}
]
}
```
**Field descriptions:**
| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `sn` | string | Yes | Device serial number, used to match connected devices |
| `syncConfig.syncMode` | string | Yes | Sync mode, see table below for available values |
| `syncConfig.depthDelayUs` | int | Yes | IR/Depth/ToF trigger signal input delay (microseconds), increment by 160us per device to achieve staggered exposure |
| `syncConfig.colorDelayUs` | int | Yes | RGB trigger signal input delay (microseconds), typically 0 |
| `syncConfig.trigger2ImageDelayUs` | int | Yes | Delay from trigger signal input to image capture (microseconds), typically 0 |
| `syncConfig.triggerOutEnable` | bool | Yes | Device trigger signal output enable switch. Set to true for PRIMARY/SECONDARY mode, false for SOFTWARE_TRIGGERING and HARDWARE_TRIGGERING mode |
| `syncConfig.triggerOutDelayUs` | int | Yes | Device trigger signal output delay (microseconds), typically 0 |
| `syncConfig.framesPerTrigger` | int | Yes | Number of frames captured per trigger, only effective in software and hardware trigger modes |
**`syncMode` available values:**
| Mode | Description |
| ---- | ----------- |
| `OB_MULTI_DEVICE_SYNC_MODE_PRIMARY` | Primary mode, outputs sync trigger signal |
| `OB_MULTI_DEVICE_SYNC_MODE_SECONDARY` | Secondary mode, receives trigger signal |
| `OB_MULTI_DEVICE_SYNC_MODE_SOFTWARE_TRIGGERING` | Software trigger mode, PC controls capture timing |
| `OB_MULTI_DEVICE_SYNC_MODE_HARDWARE_TRIGGERING` | Hardware trigger mode, triggered by external hardware signal |
| `OB_MULTI_DEVICE_SYNC_MODE_SECONDARY_SYNCED` | Secondary synced variant, starts capturing immediately, auto-aligns when trigger signal is received |
### 3. Run MultiDeviceSync
```bash
./MultiDeviceSync
```
- Enter `0`: Configure device sync mode and start streaming
- Enter `1`: Start streaming directly (use when devices are already configured)
**Keyboard shortcuts:**
| Key | Function |
| --- | -------- |
| `T` | Software trigger capture |
| `ESC` | Stop streaming and exit |
### 4. Run MultiDeviceSyncGmslTrigger
For GMSL2 connections to NVIDIA Jetson platforms. Devices must be configured as `HARDWARE_TRIGGERING` mode.
```bash
./MultiDeviceSyncGmslTrigger
```
- Enter `0`: Set trigger frequency (FPS)
- Enter `1`: Start PWM trigger signal
- Enter `2`: Stop PWM trigger signal
- Enter `3`: Exit
## Notes
1. Femto series and Gemini 2 series sync configurations are written to Flash and persist after power-off; frequent configuration will reduce Flash lifespan. Gemini 305 and Gemini 330 sync configurations do not persist after power-off and must be reconfigured each time the device is powered on.
2. **MultiDeviceSyncGmslTrigger** only provides PWM trigger signal source and does not include data stream acquisition or preview functionality.
3. When exiting MultiDeviceSyncGmslTrigger, select `3` to ensure the `/dev/camsync` device is properly closed.
## Project Structure
```text
├── CMakeLists.txt # Build configuration
├── MultiDeviceSync/ # Standard USB/Ethernet multi-device sync
│ └── MultiDeviceSync.cpp # Main program
├── MultiDeviceSyncGmslTrigger/ # GMSL PWM hardware trigger
│ └── MultiDeviceSyncGmslTrigger.cpp # Main program
├── common/ # Shared core modules
│ ├── PipelineHolder.hpp/cpp # Pipeline wrapper
│ ├── FramePairingManager.hpp/cpp # Cross-device frame pairing
│ └── utils/ # Utility library
│ ├── cJSON.c/h # JSON parser
│ ├── utils.cpp/hpp # Basic utility functions
│ ├── utils_c.c/h # C utility functions
│ ├── utils_opencv.cpp/hpp # OpenCV visualization windows
│ └── utils_types.h # Common type definitions
├── config/
│ ├── OrbbecSDKConfig.xml # SDK device configuration
│ ├── MultiDeviceSyncConfig.json # Current sync configuration
├── docs/ # Per-series documentation
│ ├── Astra2.md
│ ├── FemtoSeries.md
│ ├── Gemini2Series.md
│ ├── Gemini301Series.md
│ ├── Gemini330Series.md
│ └── Gemini435Le.md
├── res/ # Documentation image resources
└── 3rdparty/orbbecsdk/ # OrbbecSDK
├── win_x64/
├── linux_x86_64/
└── linux_arm64/
```