在 RealSense 中共享上下文时进程冻结

Process freezes when sharing context in RealSense

一个周期性初始化 Realsense 管道的进程,在共享上下文时在一个周期后冻结。 这是一个最小的重新创建代码:

import pyrealsense2 as rs
from multiprocessing import Process

ctx = rs.context()


class RS:

    def __init__(self):
        print("init")
        pipe = rs.pipeline(ctx)
        print(pipe)


class Proc(Process):

    def __init__(self):
        super(Proc, self).__init__()

    def run(self):
        for i in range(10):
            print(i)
            RS()
            print("after")


vs = Proc()
vs.start()

如果不共享上下文,代码会在 337 个循环后崩溃:

import pyrealsense2 as rs
from multiprocessing import Process


class RS:

    def __init__(self):
        print("init")
        ctx = rs.context()
        pipe = rs.pipeline(ctx)
        print(pipe)


class Proc(Process):

    def __init__(self):
        super(Proc, self).__init__()

    def run(self):
        for i in range(400):
            print(i)
            RS()
            print("after")

vs = Proc()
vs.start()

当使用线程而不是进程时,不会发生这种情况。

在第一个代码片段中(当使用全局 ctx 时),您在主进程中初始化 ctx,然后创建一个访问该 ctx 的新进程。

在第二个代码片段中(ctx inside __init__),您在每次循环迭代中初始化一个新的上下文。

您需要将两者结合起来:在新进程中初始化上下文,但仅初始化一次。类似的东西:

ctx = None

class RS:
    def __init__(self):
        global ctx
    
        if ctx is None:
            ctx = rs.context()

        print("init")
        pipe = rs.pipeline(ctx)
        print(pipe)