DepthAI v2 has been superseded by DepthAI v3. You are viewing legacy documentation.
此页面由 AI 自动翻译。查看英文原版

本页目录

  • 设备 API
  • 连接到指定设备
  • 时钟
  • 主机时钟同步
  • 设备队列
  • 输出队列设置
  • 看门狗
  • 自定义看门狗超时
  • 环境变量
  • 参考

设备

Device 类代表单个 Luxonis 的硬件设备(OAK 相机或 RAE 机器人)。在我们的所有设备上都有一个强大的 Robotics Vision Core (RVC)。RVC 经过优化,可用于执行 AI 推理、CV 操作以及 处理传感器输入(例如,立体深度、视频编码器等)。

设备 API

Device 对象代表一个 OAK 设备。启动设备时,您必须向其上传一个 Pipeline,该 Pipeline 将在 VPU 上执行。 在代码中创建设备时,固件会与 Pipeline 和其他资产(例如 NN blob)一起上传。
Python
1pipeline = depthai.Pipeline()
2
3# 创建节点,配置它们并将它们链接在一起
4
5# 连接到设备并将其上的 Pipeline 上传
6with depthai.Device(pipeline) as device:
7    # 打印 MxID、USB 速度和设备上可用的相机
8    print('MxId:',device.getDeviceInfo().getMxId())
9    print('USB speed:',device.getUsbSpeed())
10    print('Connected cameras:',device.getConnectedCameras())

连接到指定设备

如果您有 多个设备,只想连接到特定设备,或者您的 OAK PoE 相机不在您的 子网中,您可以指定要连接的设备(使用 MxID、IP 或 USB 端口名称)。
Python
1# 指定 MXID、IP 地址或 USB 路径
2device_info = depthai.DeviceInfo("14442C108144F1D000") # MXID
3#device_info = depthai.DeviceInfo("192.168.1.44") # IP 地址
4#device_info = depthai.DeviceInfo("3.3.3") # USB 端口名称
5with depthai.Device(pipeline, device_info) as device:
6    # ...

时钟

depthai 时钟 dai.Clock.now() (Python) 或 dai::Clock::now() (C++) 是一个单调时钟,用于 depthai 库中的时间戳。它源自 std::chrono::steady_clock,不受系统时间更改(例如 NTP 同步)的影响。该方法返回自主机(PC)启动以来的 datetime.timedelta (Python) 或 std::chrono::steady_clock::duration (C++)。它在调用设备 消息 上的 getTimestamp() 时使用,并指示消息在设备上创建的时间。设备上还有一个单独的单调时钟,用于检索自设备(OAK)启动以来的时间,可以通过 getTimestampDevice() 调用。

主机时钟同步

当 depthai 库连接到设备时,它会自动将设备的时间戳同步到主机的时间戳。时间戳同步大约每 5 秒连续进行一次, 可以通过 API 配置(示例如下)。
PoE 相机的设备时钟与主机时钟同步的精度低于 500µs,USB 相机在 1σ(标准差)下精度低于 200µs。
上面是设备时钟相对于主机时钟精度的图表。我们连接了 3 个设备(OAK PoE 相机),它们都使用 FSYNC Y 型适配器 进行了硬件同步。 Raspberry Pi(主机)有一个连接到 FSYNC 线的中断引脚,因此在每帧开始时都会发生中断,并记录主机时钟。然后,我们将帧(同步)时间戳与 主机时间戳进行比较并计算标准差。对于上面的直方图,我们进行了大约 3 小时的测试。下面是设备和主机时钟之间差异的图表。该图显示了设备和主机时钟随时间变化的差异。该图是与上一个测试相同的结果。
Python
1# 配置主机时钟同步示例
2
3import depthai as dai
4from datetime import timedelta
5# 配置 Pipeline
6with dai.Device(pipeline) as device:
7    # 第一个值:timesync 运行之间的间隔
8    # 第二个值:每次运行用于计算更好值的 timesync 样本数
9    # 第三个值:如果为 true,则将在随机间隔执行部分 timesync 请求,否则将在固定间隔执行
10    device.setTimesync(timedelta(seconds=5), 10, True) # (这些是默认值)

设备队列

初始化设备后,您可以创建与 Pipeline 中的 XLinkIn/XLinkOut 节点匹配的输入/输出队列。这些队列将位于主机计算机上(在 RAM 中)。
Py
1pipeline = dai.Pipeline()
2
3xout = pipeline.createXLinkOut()
4xout.setStreamName("output_name")
5# ...
6xin = pipeline.createXLinkIn()
7xin.setStreamName("input_name")
8# ...
9with dai.Device(pipeline) as device:
10
11  outputQueue = device.getOutputQueue("output_name", maxSize=5, blocking=False)
12  inputQueue = device.getInputQueue("input_name")
13
14  outputQueue.get() # 从队列读取,阻塞直到消息到达
15  outputQueue.tryGet() # 从队列读取,如果没有消息则返回 None(不阻塞)
16  if outputQueue.has(): # 检查队列中是否有任何消息
定义输出队列后,设备可以随时向其推送新消息,主机也可以随时从中读取。

输出队列设置

当主机从队列读取速度非常快时(例如在 while True 循环中),无论队列大小如何,它在大多数时间都会保持为空。但如果我们向主机端添加内容(附加处理、分析等),可能会出现设备向主机队列推送消息的速度快于主机读取的速度。此时,队列中的消息数量将开始增加——maxSizeblocking 设置都将决定队列在这种情况下的行为。两种常见配置是:
Py
1with dai.Device(pipeline) as device:
2  # 如果你只需要最新消息,不关心之前的消息;
3  # 当新消息到达主机时,如果它仍在队列中,它将覆盖之前的(最旧的)消息
4  q1 = device.getOutputQueue(name="name1", maxSize=1, blocking=False)
5
6  # 如果你关心每一条消息(例如 H264/5 编码视频;如果你错过一帧,就会出现伪影);
7  # 如果队列已满,设备将等待直到主机从队列中读取一条消息
8  q2 = device.getOutputQueue(name="name2", maxSize=30, blocking=True) # 也是默认值(maxSize=30/blocking=True)
我们仅以 maxSize=30 为例,但它可以是任何 int16 数字。由于设备队列位于主机计算机上,内存(RAM)通常并不稀缺,因此 maxSize 的影响不大。 但如果你使用的是像 RPI Zero(512MB RAM)这样的小型 SBC,并且正在流式传输大型帧(例如未编码的 4K),如果你将 maxSize 设置得很高(并且没有足够快地从队列读取),你可能会很快耗尽内存。

一些额外信息

  • 队列是线程安全的——可以从任何线程访问它们。
  • 队列的创建方式是每个队列都有自己的线程,负责接收、序列化/反序列化以及将消息转发出去(输入/输出队列也是如此)。
  • Device 对象并非完全线程安全。一些 RPC 调用(例如 getLogLevelsetLogLevelgetDdrMemoryUsage)在设置互斥锁后将变得线程安全(目前可能存在竞争条件)。

看门狗

看门狗是 POE(以太网供电)设备与 DepthAI 配合运行时的一个关键组件。当 DepthAI 与 POE 设备断开连接时,看门狗机制会首先响应,启动对摄像头的重置。此重置之后是完整的系统重启,包括加载 DepthAI 引导加载程序和初始化整个网络堆栈。看门狗过程对于使摄像头可重新连接是必需的,通常需要大约 10 秒,这意味着最快的可能重新连接时间是 10 秒。

自定义看门狗超时

将环境变量 DEPTHAI_WATCHDOG_INITIAL_DELAYDEPTHAI_BOOTUP_TIMEOUT 设置为您想要的超时值(以毫秒为单位),如下所示:

Windows Powershell

Powershell
1$env:DEPTHAI_WATCHDOG_INITIAL_DELAY=<my_value>
2$env:DEPTHAI_BOOTUP_TIMEOUT=<my_value>
3python3 script.py

Linux/macOS

Command Line
1DEPTHAI_WATCHDOG_INITIAL_DELAY=<my_value> DEPTHAI_BOOTUP_TIMEOUT=<my_value> python3 script.py

Windows CMD

Bat
1set DEPTHAI_WATCHDOG_INITIAL_DELAY=<my_value>
2set DEPTHAI_BOOTUP_TIMEOUT=<my_value>
3python3 script.py
或者,您也可以直接在代码中设置超时:
Python
1pipeline = depthai.Pipeline()
2
3# 创建一个 BoardConfig 对象
4config = depthai.BoardConfig()
5
6# 设置参数
7config.watchdogInitialDelayMs = <my_value>
8config.watchdogTimeoutMs = <my_value>
9
10pipeline.setBoardConfig(config)
通过调整这些设置,您可以根据自己的具体需求定制看门狗功能。

环境变量

以下表格列出了系统中使用的各种环境变量及其描述:
环境变量描述
DEPTHAI_LEVEL设置日志详细级别,选项:'trace'、'debug'、'warn'、'error'、'off'
XLINK_LEVEL设置 XLink 库的日志详细级别,选项:'debug'、'info'、'warn'、'error'、'fatal'、'off'
DEPTHAI_INSTALL_SIGNAL_HANDLER设置为 0 可禁用安装用于打印堆栈跟踪的后向信号处理程序
DEPTHAI_WATCHDOG设置设备看门狗超时。用于调试(DEPTHAI_WATCHDOG=0),以防止在进程暂停时设备重置。
DEPTHAI_WATCHDOG_INITIAL_DELAY指定设备看门狗启动后的延迟。
DEPTHAI_SEARCH_TIMEOUT指定阻塞函数中设备搜索的超时时间(以毫秒为单位)。
DEPTHAI_CONNECT_TIMEOUT指定连接到给定设备的超时时间(以毫秒为单位)。
DEPTHAI_BOOTUP_TIMEOUT指定发送二进制文件后等待设备启动的超时时间(以毫秒为单位)。
DEPTHAI_PROTOCOL限制默认搜索到指定协议。选项:any、usb、tcpip。
DEPTHAI_DEVICE_MXID_LIST限制默认搜索到指定的 MXID。接受逗号分隔的 MXID 列表。列表以“AND”方式过滤结果,而不是“OR”。
DEPTHAI_DEVICE_ID_LISTMXID 列表的别名。列表以“AND”方式过滤结果,而不是“OR”。
DEPTHAI_DEVICE_NAME_LIST限制默认搜索到指定的名称。接受逗号分隔的名称列表。列表以“AND”方式过滤结果,而不是“OR”。
DEPTHAI_DEVICE_BINARY覆盖设备固件二进制文件。主要用于内部调试目的。
DEPTHAI_BOOTLOADER_BINARY_USB覆盖设备 USB 引导加载程序二进制文件。主要用于内部调试目的。
DEPTHAI_BOOTLOADER_BINARY_ETH覆盖设备网络引导加载程序二进制文件。主要用于内部调试目的。
DEPTHAI_DISABLE_CRASHDUMP_COLLECTION设置为 1 时,禁用将崩溃转储发送到 Luxonis。默认情况下,崩溃转储、管道、操作系统和 depthai 版本信息会发送到 Luxonis 进行诊断。
DEPTHAI_ENABLE_ANALYTICS_COLLECTION设置为 1 时,会将分析数据(管道架构)发送到 Luxonis,用于进一步改进库。

参考

class

depthai.Device(depthai.DeviceBase)

class
Config
Device specific configuration
method
method
method
method
getInputQueueNames(self) -> list[str]: list[str]
Get all available input queue names  Returns:     Vector of input queue names
method
method
getOutputQueueNames(self) -> list[str]: list[str]
Get all available output queue names  Returns:     Vector of output queue names
method
method