树莓派4B使用经验

Python + OpenCV

Posted by iStar on March 16, 2022

因为研究生选的时边缘计算方向,最近搞毕设也就是类似的课题,老师给了我块树莓派 4B+,让我在上面跑一个光流法的运动检测。于是本文就记录下我在使用树莓派,配置环境和运行代码等过程中遇到的问题。

系统选择与安装

awesome raspberry pi这个 github 项目中介绍了几乎所有树莓派系统,可供参考,这里我仅仅讨论我尝试过的树莓派系统:

  • 官方 32 位系统,官方推荐,但我并不是太推荐。32 位系统的优势或许是稳定吧,如果用来长期浏览网页/写写文档/刷刷剧啥的或许可以,但是不适合开发。自带的 Python 版本较旧,conda 的最新支持要追溯到 2015 年,armv7 几乎已经是被淘汰的架构了,因此许多包和软件对它的支持并不好。

  • 官方 64 位系统,推荐用来进行开发。64 位系统是基于 debian 定制的系统,aarch64 的系统架构,对软件的支持更好,而且性能相较 32 位更高。同时由于是官方系统,不需要太多折腾就能使用硬件上的资源,我认为是更加方便的选择。本文后面提到的环境配置等问题就是针对此系统。

  • kali linux,美观炫酷,而且很适合网络安全。对于这个系统,我也只是简单尝试了一下,感觉很适合程序员日常使用,如果不是要搞毕设希望稳定一些,我想这或许是更好的选择。需要注意的是,新装好系统后要先apt dist-upgrade,之后才能正常apt upgrade,不然会报一个软件包版本不支持的错误。

  • OPENFANS,树莓派爱好者基地系统,适合在没有显示器键盘等外设的情况下日常使用。可以说这个系统帮用户配好了绝大部分环境,可以直接在网页上访问 ssh 和 vnc,还能直接开启 docker 等,可以说是非常贴心。但是让人难受的一点是,他是中文系统,而且有些过于臃肿了,对程序员不太友好。

  • Ubuntu,没有特点就是最大的特点。可以说这是最常用的 Linux 系统,如果更习惯这个系统就可以去用。我也只是使用了这个系统很短的时间,总感觉有点高不成低不就的样子,或许这就是适合大众的代价吧。

当然,你甚至可以定制属于自己的树莓派操作系统,raspberry pi os是一个不错的学习资料。

系统的安装是很简单的事,只需要下载 Raspberry Pi Imager,傻瓜式烧录就可以了。如果没有外设,推荐使用官方系统,可以直接在烧录时配置 WiFi 和 ssh。否则需要在烧录完成后,将 sd 卡通过读卡器连接到另外的 Linux 系统中,修改一些配置文件后才能使用。

环境配置

conda 的安装

虽然树莓派官方 64 位系统是 aarch64 的系统架构,理论上讲直接下载最新的 miniconda 就能直接安装,但事实并非如此,在安装或者使用中会报错,提示某条命令无法执行。对此我没有找到很好的解决办法,于是放弃 miniconda,转用了Miniforge。这个 conda 直接装上就可以使用,但是需要注意,不能修改 conda 源,否则也将无法正常使用。使用原装源速度也还不错,亲测可用。

pytorch 的安装

pytorch 官方并没有给 aarch64 版本的直接安装方式,如果想要使用 pytorch,一种方法是自己从源码构建,另一种就是直接使用别人建好的轮子。pytorch aarch64这个项目就是针对 aarch64 构建的 pytorch 轮子,而且安装很方便,也还在保持更新。

pytorch 安装并不是什么大问题,但是并不建议在树莓派上部署这些应用,因为树莓派没有 GPU 加速,进行人工智能计算实在是有点拉跨。

遇到的问题

VNC 无法连接,提示无法认证之类的错误

一种方法是安装配套的 VNC Viewer,使用这个软件可以正常连接到树莓派。

另一种方式是修改树莓派端的 VNC 设置,这前提是你要有外设,连接树莓派后将 Authentication 从 UNIX password 改成 VNC password,之后就可以正常使用 Mobaxterm 等软件连接 VNC 了。

所以还是直接安装 VNC Viewer 更加方便,而且界面也还挺美观的。

VNC 显示‘Cannot Currently Show the Desktop’

这种情况出现在我从raspi-config打开了摄像头功能后,我认为这种联动是很离谱的事情,大致的影响过程好像是开启摄像头后,开机不会进入桌面,所以 VNC 无法连接过去。如果树莓派在开机过程中连接了屏幕,那之后使用 VNC 就正常了(但这又有什么用)。

国内的许多文章都说这种情况需要修改 VNC 分辨率或者重装 lxsession,我不知道这在以前的旧系统中能否解决,但在我这里毫无作用。

解决方法是在国外树莓派论坛上看到的:

  1. Enable video without HDMI connected (aka headless), by adding video=HDMI-A-1:1920x1080@60D to /boot/cmdline.txt (hdmi_force_hotplug=1 in /boot/config.txt is no longer sufficient)

  2. Disable Mutter, otherwise your system will crawl to a halt. In /usr/bin/startlxde-pi, edit $TOTAL_MEM -ge 2048 to $TOTAL_MEM -ge 20480 and reboot.

  3. Disable the KMS Overlay in /boot/config.txt, to further increase performance. #dtoverlay=vc4-kms-v3d

虽然第一步中说将hdmi_force_hotplug=1解除注释已经不够了,但我使用这种方法可以解决问题,并没有修改 cmdline.txt 中的内容。

树莓派连接摄像头后无法使用

我给树莓派装的是官方的 camera module v2,但在一开始无法在树莓派访问摄像头。

现在网上流传的大多教程都是在使用 raspistill 命令,但在 aarch64 系统上,这种方式已经被舍弃,需要使用 libcamera 相关的命令来替代,详情可见libcamera 官方文档

我进行的尝试有:

  1. /etc/modules-load.d/modules.conf 中添加bcm2835-v4l2

  2. sudo modprobe bcm2835-v4l2

  3. 连接外网后执行sudo rpi-update

前两个方法并没有解决我的问题,但我并不清楚是否产生了作用。我实在最后一步后才顺利访问到摄像头的,而这一步最难的要数连接外网。这里需要感谢我的好室友,他在路由器上配置了翻墙规则,因此连接他的 WiFi 后就可以直接访问外网。我虽然有 Windows 和 Android 上的软件可用,但在 Linux 上翻墙还是比较困难的事情,我安装并配置了 V2RayA,但并没有顺利访问到外网。

我也查到了一种本地更新的方式,但没有尝试,放在这里供大家参考:树莓派固件更新(rpi-update)的那些坑

OpenCV 无法访问摄像头

我的 OpenCV 版本是 4.5.5,在树莓派连接摄像头并可以使用 libcamera 正常访问后,我在 python 代码中声明cap = cv2.VideoCapture(0),理论上讲这样就可以正常使用cap.read()来读取帧了,但是我的代码中它一直返回 false。

解决方法是在 raspi-config 中将摄像头功能打开,这也导致上面 VNC 出现问题,好在这两个都是可以修复的。

此外我还在论坛上看到说可以通过源码安装 OpenCV 的方法解决,但由于我的 OpenCV 是使用 conda 安装的,也不想折腾 OpenCV 了,就没尝试这种方法。