Srereo shm
sequenceDiagram
participant P as Producer (Xavier VI/ISP)
participant UDS as Unix Domain Socket
participant SHM as Shared Memory (realtime_buffer)
participant C as Consumer (Demo/OpenCV)
Note over P: 1. NvBufSurfaceAllocate 分配硬件内存
P->>P: 2. V4L2 采集图像到 NvBufSurface (零拷贝)
rect rgb(200, 230, 255)
Note right of P: 3. 跨进程传输 "钥匙" (FD)
P->>UDS: 通过 sendmsg (SCM_RIGHTS) 发送 Buffer FD
UDS-->>C: recvmsg 接收并转换 FD (本地有效)
end
rect rgb(230, 255, 230)
Note over P, C: 4. 同步控制状态 (基于同事的代码)
P->>SHM: realtime_buffer_insert (仅写入 FD 编号和元数据)
C->>SHM: realtime_buffer_peek (获取当前活跃的 FD 索引)
end
Note over C: 5. NvBufSurfaceFromFd(fd) 映射内存
Note over C: 6. GPU 直接处理/显示 (GpuMat)
C-->>P: 7. (可选) release_blk 信号,循环复用 Buffer
sequenceDiagram
participant Cam as Camera (V4L2/ISP)
participant Prod as Stereo Producer (GStreamer)
participant UDS as Unix Socket (socket_utils)
participant SHM as Shared Memory (StereoShmLayout)
participant Cons as Demo Client (StereoAPI)
Note over Cam, Prod: 1. nvv4l2camerasrc 获取 NVMM Buffer
Prod->>Prod: 2. 获取 Buffer 的 DMABUF FD
rect rgb(230, 245, 255)
Note right of Prod: 跨进程"发钥匙"
Prod->>UDS: 3. send_fd(fd_left, fd_right)
UDS-->>Cons: 4. recv_fd() -> 转换成本地有效 FD
end
rect rgb(230, 255, 230)
Note over Prod, Cons: 同步控制状态
Prod->>SHM: 5. 更新 write_index / sequence
Cons->>SHM: 6. 获取最新的帧元数据(idx)
end
Note over Cons: 7. mmap(local_fd) 映射地址
Note over Cons: 8. cv::Mat 直接引用映射地址 (0 拷贝)
Cons->>Cons: 9. ReleaseFrame (munmap + close FD)
graph TB
subgraph "硬件层"
H1[立体相机]
H2[Jetson平台]
H3[GPU加速器]
end
subgraph "核心库 (libstereo_api.a)"
A1[stereo_api.cpp<br/>立体视觉API]
A2[shm_utils.cpp<br/>共享内存管理]
A3[socket_utils.cpp<br/>IPC通信]
end
subgraph "生产者进程 (stereo_producer)"
P1[相机采集]
P2[图像预处理]
P3[共享内存分配]
P4[FD广播]
end
subgraph "消费者进程"
C1[demo_client<br/>实时显示]
C2[demo_client_cuda<br/>CUDA处理]
C3[record_client<br/>录制存储]
end
subgraph "依赖库"
D1[OpenCV 4.5.4]
D2[GStreamer 1.0]
D3[CUDA Runtime]
D4[Jetson Multimedia API]
end
H1 --> P1
H2 --> P1
H3 --> P2
P1 --> P2
P2 --> P3
P3 --> P4
A1 --> P3
A2 --> P3
A3 --> P4
P4 --> C1
P4 --> C2
P4 --> C3
D1 --> A1
D2 --> A1
D3 --> A1
D4 --> A1
D1 --> C1
D3 --> C2
D2 --> C3
graph LR
subgraph "数据流"
Camera[立体相机] -->|原始图像| GStreamer[GStreamer管道]
GStreamer -->|预处理图像| Producer[生产者进程]
Producer -->|写入| SHM[共享内存区域]
SHM -->|零拷贝访问| Client1[显示客户端]
SHM -->|零拷贝访问| Client2[CUDA客户端]
SHM -->|零拷贝访问| Client3[录制客户端]
Producer -->|FD广播| Socket[UNIX Socket]
Socket -->|FD传递| Client1
Socket -->|FD传递| Client2
Socket -->|FD传递| Client3
end
subgraph "控制流"
Config[配置文件] --> Producer
Producer -->|状态信息| Monitor[系统监控]
Client1 -->|用户交互| UI[用户界面]
end
classDiagram
class StereoAPI {
+initialize()
+createSharedMemory()
+destroySharedMemory()
+writeFrame()
+readFrame()
}
class SHMUtils {
-shm_fd
-shm_size
+createSHM()
+mapSHM()
+unmapSHM()
+destroySHM()
}
class SocketUtils {
-server_fd
-clients
+send_fd()
+recv_fd()
+broadcast_fds()
}
class StereoProducer {
-camera_pipeline
-api
+startCapture()
+processFrame()
+broadcastFrame()
}
class ClientBase {
+connectToServer()
+receiveFD()
+processFrame()
}
class DemoClient {
+displayFrame()
}
class CUDAClient {
+cudaProcessing()
}
class RecordClient {
+saveFrame()
}
StereoAPI --> SHMUtils
StereoAPI --> SocketUtils
StereoProducer --> StereoAPI
ClientBase --> StereoAPI
DemoClient --|> ClientBase
CUDAClient --|> ClientBase
RecordClient --|> ClientBase

浙公网安备 33010602011771号