# 在树莓派上部署

我们的设备也可以连接到树莓派（RPi）这类小型单板计算机。要在树莓派上安装 [DepthAI](https://github.com/luxonis/depthai-python)，您需要先安装
[依赖项](https://docs.luxonis.com/software/depthai/manual-install.md#raspberry-pi-os)，然后使用 pip 安装 [DepthAI
库](https://docs.luxonis.com/software/depthai/manual-install.md#install-from-pypi)。

DepthAI 库在 [PyPi](https://pypi.org/project/depthai/) 上为树莓派提供了预编译的 wheel 文件。

## 使用预配置的树莓派操作系统镜像

我们提供了已预装 DepthAI
及其所有依赖项的树莓派操作系统镜像。[可在此获取预配置的树莓派镜像](https://drive.google.com/drive/folders/1O50jPpGj_82jkAokdrsG--k9OBQfMXK5?usp=sharing)。

 * OAK_CM4_POE - 使用默认的树莓派操作系统，已预装 DepthAI。所需硬件：8 GB 或更大的 uSD 卡。该镜像被刷写到与 [OAK-D
   CM4](https://shop71313603.taobao.com/?spm=pc_detail.30350276.shop_block.dshopinfo.27a17dd635FNDA) 和 [OAK-D CM4
   PoE](https://shop71313603.taobao.com/?spm=pc_detail.30350276.shop_block.dshopinfo.27a17dd635FNDA) 一起发货的 uSD 卡上。如需启用第二张 uSD
   卡，请参见下方的解决方法 [此处](#Known%20image%20limitations)。我们建议用户对所有 OAK 相机使用此镜像。
 * KS_Rpi_OS_Full - 使用树莓派完整版操作系统，已预装 DepthAI 和 [CEP](https://github.com/cortictechnology/cep)。所需硬件：32 GB 或更大的 uSD 卡，4 GB RAM 的树莓派
   4。该镜像被刷写到用于 KickStarter 支持者的 uSD 卡上。仅当您需要 CEP 平台时才使用此镜像！

创建这些镜像的步骤和更新日志可参考 [此处](https://docs.google.com/document/d/1c4JhIY2ulcgaaycUBOsAbUI1EJ_7Zx4ux4alaxFc_ts/edit?usp=sharing)。

### 刷写 uSD 卡

 1. 从 Google Drive（上方链接）下载树莓派镜像。下载 [Balena Etcher](https://www.balena.io/etcher) 程序。您也可以使用树莓派镜像烧录器，但我们注意到有时会出现问题。
 2. 打开 Balena Etcher。如果您下载了 .AppImage 文件，可能需要右键单击并点击运行来启动程序。
 3. 点击从文件刷写，然后选择您之前下载的 .zip 镜像文件。
 4. 选择目标 uSD 卡。
 5. 点击**刷写！**并等待完成。
 6. 刷写完成后，安全移除 uSD 卡，将其插入树莓派，然后为树莓派供电。

## 从树莓派为 OAK 供电

根据 [树莓派文档](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#typical-power-requirements)，树莓派 2 或更新型号可通过 USB
端口提供高达 1.2A 的电流。在简单流水线中，OAK 相机功耗低于 1A，这意味着您可以通过 USB-C 线缆直接从树莓派为 OAK 相机供电，但以下情况除外：

 * 您的流水线较复杂——尤其是视频编码和 AI 推理会产生电流尖峰，可能导致欠压断电。

 * 您连接了额外的 USB 设备到树莓派 USB 端口，这些设备消耗过多电流。树莓派总共只能提供 1.2A，因此如果所有 USB 设备总电流超过 1.2A，就会发生欠压断电。
   
   > **绕过电流限制**
   > 查看
   > [此指南](https://raspberrypi.stackexchange.com/questions/104038/can-the-pi-4-power-2-external-usb-3-hdds/104044#104044)
   > 了解如何绕过电流限制。
   > **请注意，这将使您的保修失效。**

 * 您拥有 Pro 版本的 OAK 相机，其配有 IR 激光点阵投影仪和 IR 照明 LED，额外消耗高达 0.25A 的电流。

我们仍然建议为您的 OAK 相机外部供电，无论是通过DC 接口（在较旧设备上），还是使用 [Y 型适配器](https://docs.luxonis.com/hardware/products/Y-adapter.md)。原因是 OAK
存在电流尖峰（尤其是在使用视频编码器和运行 AI 推理时），可能导致欠压断电。

## 通过 SSH 连接树莓派

如果您使用预配置的树莓派操作系统镜像，SSH 服务器已启用；否则，您需要在引导卷中创建文件 ssh，以便 SSH
服务器在启动时启用（[教程在此](https://linuxize.com/post/how-to-enable-ssh-on-raspberry-pi/)）。

如果您的树莓派具备WiFi 连接功能，您可以通过在引导卷中创建（并编辑）wpa_supplicant.conf 来设置 WiFi 名称/密码（[教程在此](https://raspberrytips.com/raspberry-pi-wifi-setup)）。

通过以太网/WiFi将RPi与电脑连接到同一局域网后，您可以使用以下命令通过SSH连接到RPi。如果RPi和电脑不在同一局域网内，则需要指定RPi的IP地址而非luxonis.local——这是预配置RPi镜像中RPi的默认名称。

```bash
ssh pi@luxonis.local -X
```

-X参数在Linux上启用X11转发，因此OpenCV的imshow图像会通过SSH转发到您的电脑。在MacOS上，默认未安装X11，因此您需要[下载](https://www.xquartz.org)它，更多信息请参考[此处](https://www.raspberrypi.com/documentation/computers/remote-access.html#secure-shell-from-linux-or-mac-os)。

首次SSH连接到RPi时，会警告您关于主机真实性，如下所示：

```bash
The authenticity of host 'raspberrypi.local (192.168.1.222)' can't be established.
ECDSA key fingerprint is SHA256:stb5mbRQeX6veOq8Wzg81rz9IHonxJR2++Q8bDYryTo.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```

输入yes继续。

此命令后，您需要提供密码。默认的RPi OS密码是raspberry。您应该修改它。

SSH成功后，让我们尝试运行一个示例应用：

```bash
python depthai-python/examples/MobileNet/rgb_mobilenet.py
```

## 已知镜像限制

 1. 在 OAK_CM4_PoE 上，自 V8
    镜像起，第二个uSD卡支持被禁用。这是因为如果启用uSD卡支持（用于存储目的），WiFi连接将被禁用。要启用第二个uSD卡支持（并禁用WiFi连接），您可以编辑/boot/config.txt并取消文件末尾行dtoverlay=sdhost,poll_once=off的注释，然后重启系统。

## 将镜像刷写到eMMC

[OAK-D CM4](https://docs.luxonis.com/hardware/products/OAK-D%2520CM4.md) 和 [OAK-D CM4
PoE](https://docs.luxonis.com/hardware/products/OAK-D%2520CM4%2520PoE.md) 板载了树莓派Compute Module
4（CM4）。大多数OAK-D-CM4批次配备了带eMMC存储的CM4，而大多数OAK-D CM4 PoE板则配备了不带eMMC的CM4 Lite，后者从uSD卡启动。将镜像刷写到uSD卡很简单直接，这里我们将介绍将镜像刷写到CM4上eMMC的过程。

这是一个OAK-D-CM4，它带有红色箭头指示的eMMC存储的CM4。CM4 Lite版本在该位置不会有此芯片。

要将镜像刷写到CM4的eMMC（[官方RPi指南](https://www.raspberrypi.com/documentation/computers/compute-module.html#flashing-the-compute-module-emmc)），首先需要通过排针启用USB_BOOT。默认情况下，连接器位于标记为DIS（禁用）的两个排针上，因此我们必须将连接器移到EN（启用）排针上。

将排针连接器切换到EN后，我们可以将计算机上的micro-USB线连接到上图中红色矩形指示的micro-USB连接器。连接micro-USB后，您应通过5V桶形插头供电。

同时连接micro-USB和电源后，我们需要启用RPi USB启动。我们按照[此教程](https://github.com/raspberrypi/usbboot)进行操作。构建程序并运行后，您会看到类似以下内容：

```bash
/Documents/usbboot$ sudo ./rpiboot
RPIBOOT: build-date Apr 21 2022 version 20220315~121405 445356e1
Waiting for BCM2835/6/7/2711...
Loading embedded: bootcode4.bin
Sending bootcode.bin
Successful read 4 bytes
Waiting for BCM2835/6/7/2711...
Loading embedded: bootcode4.bin
Second stage boot server
Loading embedded: start4.elf
File read: start4.elf
Second stage boot server done
```

启动完成后，您会在[Raspberry Pi Imager](https://www.raspberrypi.com/software)或[Balena
Etcher](https://www.balena.io/etcher)（我们使用的工具，见下方截图）中看到eMMC存储，因此您可以轻松地将所需镜像刷写到eMMC。刷写完成后，确保禁用USB启动（再次切换连接器）并重启设备。设备应该会从新刷写的镜像启动！

## Raspberry Pi Zero

[Raspberry Pi Zero](https://www.raspberrypi.com/products/raspberry-pi-zero) 是一款性价比极高的单板计算机（SBC）。大约只需5美元即可获得。它拥有512MB
RAM，1GHz单核CPU，并可选择板载蓝牙和WiFi连接（RPI Zero W，约10美元）。功耗约为0.5W。

RPi Zero 足以用于传输元数据（NN结果）、低分辨率编码视频或轻量计算。如果您打算传输高分辨率视频、进行繁重计算（例如使用OpenCV）或后期处理，RPi Zero 并不是主机计算机的最佳选择。

### 将 OAK 相机连接到 RPI Zero

RPI Zero 有一个用于外设的 micro USB 接口。你可以使用标准 USB-C（转 USB-A）数据线，但需要 OTG 适配器/线缆 才能将 OAK 相机连接到 RPI Zero。

以上所有方案均有效。我们与这些公司没有关联或附属关系，以下是左侧连接器（[Aliexpress](https://www.aliexpress.com/item/1005001873492004.html?spm=a2g0o.productlist.0.0.4259778c8zzJWk&algo_pvid=108d8130-3b53-4e3b-98ab-e025d519330d&algo_exp_id=108d8130-3b53-4e3b-98ab-e025d519330d-1&pdp_ext_f=%7B%22sku_id%22%3A%2212000022480660847%22%7D)）和右侧连接器（[Aliexpress](https://www.aliexpress.com/item/1005001894832301.html?spm=a2g0o.productlist.0.0.4259778c8zzJWk&algo_pvid=108d8130-3b53-4e3b-98ab-e025d519330d&algo_exp_id=108d8130-3b53-4e3b-98ab-e025d519330d-0&pdp_ext_f=%7B%22sku_id%22%3A%2212000018040382364%22%7D)）的购买链接。

根据我们的测试，RPi Zero 能够为 OAK-D 提供足够的电力，无需外部电源（电源插孔或 [Y 型适配器](https://docs.luxonis.com/hardware/products/Y-adapter.md)）。

## RPi 故障排除

### RPi 死机 / OAK 在 RPi 上崩溃

Raspberry Pi 所有 USB 端口的总电流上限为 1.2A，而 OAK 相机最高可消耗 1A（最大功率时，通常接近 500mA）。

因此，如果你遇到死机问题，可能是因为从 Pi 取电的 USB 设备总功率超过了 1.2A 限制。使用带供电的 USB 集线器可以避免此问题，或者减少通过 USB 从 Pi 取电的其他设备数量。

这个问题也可能表现为 OAK 在 Pi 上随机崩溃。当 OAK 配置为同时执行多项任务时，这种情况尤其频繁。随着我们让 DepthAI 能够同时执行越来越多的任务，OAK 可拉取的最大功率也随之增加，这种情况越来越容易发生。OAK 的峰值电流尖峰可能超过 Pi
的承受能力，导致 OAK 电压过低并返回错误。

因此，如果你在 Raspberry Pi 上遇到 DepthAI 稳定性问题，请尝试通过电源适配器或带供电的 USB 集线器为 OAK 相机供电，看看错误是否消失。

### 无 X11 转发的 SSH 连接

如果你没有使用 -x 参数 SSH 到 RPi 并尝试显示图像（例如 cv2.imshow()），很可能会遇到如下错误：

 * (-2:Unspecified error) Can't initialize GTK backend in function 'cvInitSystem'
 * qt.qpa.xcb: could not connect to display. qt.qpa.plugin: Could not load the Qt platform plugin "xcb".
 * This application failed to start because no Qt platform plugin could be initialized.

解决方法是在 SSH 连接到 RPi 时使用 X11 转发，参见 [SSH 进入 RPi](#SSH%20into%20the%20RPi)。
