5.2. PoE系列入门必看

本教程适用的设备可在 这里 查看。

PoE 允许使用单根 Cat5e(或更高)以太网电缆为设备供电并为其提供长达 100 米(328 英尺)的 1,000 Mbps (1 Gbps) 全双工连接。

POE

连接 PoE 设备后,以太网连接 LED(如上所示)应亮起并开始偶尔闪烁。

5.2.1. 分步教程

  1. 您将需要一个 PoE 交换机或注入器 来为PoE设备供电. 单击此处获取完整教程. 为设备供电后,LED 应开始闪烁,如上面的 GIF 所示。

  2. 将您的计算机连接到与PoE 设备相同的 LAN

  3. 确保你有 depthai version 2.7.0.0 或更新版本。您可以使用以下命令更新您的depthai python包 python3 -m pip install depthai>=2.7.0.0

  4. 现在,您可以像使用 USB-C 电缆连接 DepthAI 设备一样运行任何 代码示例 / depthai 实验 / depthai_demo

POE-working

在这些步骤之后,depthai_demo 正在 OAK-D-POE 上工作!

5.2.2. POE版本的OAK如何运作

当您的程序尝试创建设备 (with dai.Device(pipeline) as device:) 时,depthai将搜索通过 USB 端口或 LAN 连接的可用设备。它在同一网络(例如 LAN)上搜索 PoE 设备并通过 TCP 协议进行通信。这样 PoE 设备的工作方式与 USB 设备相同。与 USB-C 连接一样,您可以指定 Mx ID 以指定您想要连接到哪个 DepthAI PoE 设备(了解更多信息请点击此处)。

5.2.3. PoE 故障排除

  • DHCP和静态IP

    默认情况下,PoE 设备会尝试从 DHCP 获取 IP 地址。如果网络上没有 DHCP 服务器,设备将回退到静态IP 169.254.1.222. 在这种静态回退情况下,您的计算机需要在相同的范围内。这可以通过在您的计算机上设置静态IP来实现(例如使用静态IP: 169.254.1.10 和网络掩码: 255.255.0.0).

    Windows:

    ../../../_images/pc_static_ip.png

    Linux:

    您可以使用以下命令修改主机以太网静态IP:

    sudo ifconfig eth0 169.254.1.10 netmask 255.255.0.0 up
    
  • 端口和防火墙

    UDP设备发现在端口上处理 11491, TCP XLink 连接在端口上处理 11490.

    默认情况下,在Ubuntu上防火墙是禁用的,因此您应该没有任何问题。您可以通过执行以下命令来检查这一点:

    > sudo ufw status
    Status: inactive
    

    如果您启用了防火墙,则可能需要允许这两个端口:

    sudo ufw allow 11490/tcp
    sudo ufw allow 11491/udp
    

    如果以上操作防火墙命令不起作用,可以尝试下面的方案:

    sudo iptables -F
    

    Warning

    此命令为当时生效重启即恢复原样。且此方案为暂时解决方案。

  • VPN连接

    VPN 连接也可能会中断与 PoE 设备的连接(因为您的计算机可能仅在远程网络中搜索该设备,因此无法在本地网络上发现它),因此我们建议在使用 PoE 时关闭 VPN设备或以其他方式确保您的本地路由设置为当 VPN 连接处于活动状态时本地设备可用/发现。

  • 通过2个接口(WiFi/以太网)连接到同一个LAN

    我们已经看到,在一些罕见的情况下,当您的主机连接到同一个局域网时,设备发现可能会发现两次相同的 POE 设备,因此它会打印该设备的 IP 地址两次。在极少数情况下,这可能会导致初始化错误(我们在使用多个设备时看到过这种情况); 运行时错误:启动后无法找到设备,错误消息: X_LINK_DEVICE_NOT_FOUND。 我们会尽快修复这个错误。 解决方法:断开其中一个接口;所以断开(from the)WiFi应该可以解决这个问题。

  • 供电不足
    如果您的PoE设备不工作,或者在极少数情况下,它工作了一段时间后突然停止工作,则您的PoE交换机可能存在问题。例如,当每个端口的功率预算似乎足够时,但由于其他端口上的设备的需求而超出了交换机的整体功率预算。

    有必要根据整体功率预算检查 PoE 交换机/注入器的规格。

测试

您可以在 此处下载 测试程序。

5.2.4. 闪存静态IP

您可以刷写OAK-POE设备的静态/动态IP,演示在这里。您还可以指定DNS和MAC地址,但这不包含在此演示中。

5.2.5. 手动指定设备IP

如果您想访问 ping 一个设备,但是发现失败了(例如,设备本身不在同一个LAN中), 您可以手动指定POE设备的IP地址。

import cv2
import depthai as dai

pipeline = dai.Pipeline()

camRgb = pipeline.createColorCamera()

xoutRgb = pipeline.createXLinkOut()
xoutRgb.setStreamName("rgb")
camRgb.preview.link(xoutRgb.input)

device_info = dai.DeviceInfo()
device_info.state = dai.XLinkDeviceState.X_LINK_BOOTLOADER
device_info.desc.protocol = dai.XLinkProtocol.X_LINK_TCP_IP
device_info.desc.name = "169.254.1.222"

with dai.Device(pipeline, device_info) as device:
    qRgb = device.getOutputQueue(name="rgb", maxSize=4, blocking=False)
    while True:
        cv2.imshow("rgb", qRgb.get().getCvFrame())
        if cv2.waitKey(1) == ord('q'):
            break

5.2.6. 恢复出厂设置

如果您可以ping设备但无法以任何方式连接到它(搜索设备,指定IP),您应该做一个工厂 重置,因为设备可能已被 软砖 。 这通常发生在较旧的引导加载程序版本中。 请注意,仅 OAK-D-PoE 和 OAK-1-PoE 具有 USB-C 连接器,OAK-D Pro PoE 具有通过 M8 连接器的 USB 连接。.

  1. 打开 OAK POE 摄像机的外壳

  2. 找到 USB-C 连接器和引导 DIP 开关

  3. 将 DIP 开关更改为 0x16(开关 2、4、5 向上,其他向下,如下图所示)用于 USB 通信

  4. 通过 USB-C 电缆将 OAK POE 摄像机连接到计算机

  5. Run the (first) 恢复出厂设置脚本

  6. 将 DIP 开关改回 0x3(开关 5,6 向上,其他开关向下)以进行 POE 通信

  7. 关闭外壳,确保垫圈在正确的位置(防水)

../../../_images/factoryReset.png

5.2.7. Standalone 模式

Standalone / Hostless / On-The-Edge 模式 意味着 OAK 没有连接到主机。这可以通过 闪存 bootloader 然后 闪存 pipeline 和 assets ( NN 模型)到 OAK 的闪存。

只有在具有板载闪存的 OAK 中才能使用 Standalone 模式,目前支持的有 OAK IOTOAK POE 型号。

由于主机和设备之间不会有任何通信,因此首先需要删除所有 XLinkOutXLinkIn 节点。这意味着设备只能通过 SPI (SPIOut/SPIIn) 或 Script 节点 (GPIO/UART 或网络协议 HTTP/TCP/UDP…)与 “外界” 通信。

接下来你还可以删除主机端代码,通常是这样的:

with dai.Device(pipeline) as device:
    videoQ = device.getOutputQueue("video")
    faceDetQ = device.getOutputQueue("face_det")
    nnQ = device.getOutputQueue("nn")

    while True:
        frame = videoQ.get().getCvFrame()
        # ...

删除所有主机端代码之后,您将只剩下 Pipeline 定义 (带有节点 / 链接)。由于设备不再与主机通信,您需要通过 SPI 或脚本节点 “路由” 程序的输出,如上所述。

执行下面的代码(或此处代码 ),将 Bootloader 闪存到设备上。Bootloader 与 depthai 一起打包,因此如果您有最新的 depthai 版本,您将闪存最新的 bootloader 版本。这个步骤只需要一次。

import depthai as dai
(f, bl) = dai.DeviceBootloader.getFirstAvailableDevice()
bootloader = dai.DeviceBootloader(bl)
progress = lambda p : print(f'Flashing progress: {p*100:.1f}%')
bootloader.flashBootloader(progress)

当你有独立的 Pipeline 定义并且Bootloader 已经闪存在设备上,你可以开始闪存 pipeline 了。你可以用下面的代码片段来闪存 pipeline:

import depthai as dai

pipeline = dai.Pipeline()

# Define standalone pipeline; add nodes and link them
# cam = pipeline.create(dai.node.ColorCamera)
# script = pipeline.create(dai.node.Script)
# ...

# Flash the pipeline
(f, bl) = dai.DeviceBootloader.getFirstAvailableDevice()
bootloader = dai.DeviceBootloader(bl)
progress = lambda p : print(f'Flashing progress: {p*100:.1f}%')
bootloader.flash(progress, pipeline)

在成功地闪存 pipeline 之后,当你打开设备电源时,它将自动启动。如果你想更换 pipeline ,只需再次闪存即可。

由于 pipeline 会在设备供电时启动这可能导致不必要的发热。如果您想要清除闪存的 pipeline ,请使用下面的代码片段。

Warning

下面的代码还不能工作。我们将在未来的版本中添加 flashClear 函数。

import depthai as dai
(f, bl) = dai.DeviceBootloader.getFirstAvailableDevice()
if not f:
    print('No devices found, exiting...')
    exit(-1)

with dai.DeviceBootloader(bl) as bootloader:
    bootloader.flashClear()

如果您设备已经 软变砖,或者只是想清除所有内容(闪存的 pipeline / assets 和 bootloader 配置),我们建议运行下面的出厂重置脚本。它还将闪存最新的 bootloader 。

import depthai as dai
import tempfile

blBinary = dai.DeviceBootloader.getEmbeddedBootloaderBinary(dai.DeviceBootloader.Type.NETWORK)
blBinary = blBinary + ([0xFF] * ((8 * 1024 * 1024 + 512) - len(blBinary)))

with tempfile.NamedTemporaryFile() as tmpBlFw:
    tmpBlFw.write(bytes(blBinary))

    (f, device_info) = dai.DeviceBootloader.getFirstAvailableDevice()
    if not f:
        print('No devices found, exiting...')
        exit(-1)

    with dai.DeviceBootloader(device_info, allowFlashingBootloader=True) as bootloader:
        progress = lambda p : print(f'Factory reset progress: {p*100:.1f}%')
        # Override SBR table, to prevent booting flashed application
        [success, msg] = bootloader.flashBootloader(progress, tmpBlFw.name)
        if success:
            print('Successfully overwritten SBR table. Device should now be reacheable through PoE')
        else:
            print(f"Couldn't overwrite SBR table to unbrick the device. Error: {msg}")

如果不能访问 (不在同一局域网中) OAK POE ,可以在指定 IP 上重置。

import depthai as dai
import tempfile

blBinary = dai.DeviceBootloader.getEmbeddedBootloaderBinary(dai.DeviceBootloader.Type.NETWORK)
blBinary = blBinary + ([0xFF] * ((8 * 1024 * 1024 + 512) - len(blBinary)))

with tempfile.NamedTemporaryFile() as tmpBlFw:
    tmpBlFw.write(bytes(blBinary))

    device_info = dai.DeviceInfo()
    device_info.state = dai.XLinkDeviceState.X_LINK_BOOTLOADER
    device_info.desc.protocol = dai.XLinkProtocol.X_LINK_TCP_IP
    device_info.desc.name = "192.168.34.110" # Set IP here

    with dai.DeviceBootloader(device_info, allowFlashingBootloader=True) as bootloader:
        progress = lambda p : print(f'Factory reset progress: {p*100:.1f}%')
        # Override SBR table, to prevent booting flashed application
        [success, msg] = bootloader.flashBootloader(progress, tmpBlFw.name)
        if success:
            print('Successfully overwritten SBR table. Device should now be reacheable through PoE')
        else:
            print(f"Couldn't overwrite SBR table to unbrick the device. Error: {msg}")

有疑问?

我们很乐意为您提供代码或其他问题的帮助。

我们的联系方式

售后技术支持
oak_china_wechat

企业微信:OAK中国

售前技术和项目咨询
WeChat

微信号:13951940532

加好友请备注"OAK咨询"

欢迎到淘宝选购
taobao
OAK中国官方淘宝店

还可以通过我们发布的视频和文章了解OAK