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
posted @ 2026-02-02 17:30  Zenith_Hugh  阅读(2)  评论(0)    收藏  举报