尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

树莓派4实战:从智能坐垫项目看系统选型、环境配置与性能优化

树莓派4实战:从智能坐垫项目看系统选型、环境配置与性能优化 1. 从一块坐垫说起为什么树莓派4发布让我重新折腾小wu是我认识多年的一个朋友做工业设计常年伏案画图腰不好。去年他给自己搞了个“智能坐垫”——一块压力传感阵列加上一个树莓派3B坐姿不对就震动提醒坐太久就自动记录数据。当时用的是树莓派3B跑个Python脚本加个轻量Web界面勉强够用但一旦同时开摄像头做坐姿识别CPU直接拉满风扇呼呼转坐垫还没提醒他他自己先被风扇吵得站起来。树莓派4发布那天小wu第一时间给我发消息“这波得升级了。”我完全理解他的心情。树莓派4B相比3B不是那种“挤牙膏”式的迭代——CPU从Cortex-A53四核1.4GHz换成了Cortex-A72四核1.5GHz内存从1GB LPDDR2直接跳到最高8GB LPDDR4USB口从2.0升级到3.0还多了双micro-HDMI输出和千兆以太网。这些参数放在一块坐垫项目里意味着什么意味着你可以同时跑摄像头推理、本地数据库、Web服务甚至还能挂个轻量级桌面环境做调试而不用再担心系统卡死。这篇文章不是树莓派4的“开箱评测”那种内容网上已经够多了。我想聊的是当你手里有一块树莓派4并且想把它塞进一个真实项目里——比如小wu的智能坐垫——你该怎么选系统、怎么配环境、怎么避坑、怎么让这块板子真正稳定地跑起来。适合谁看如果你正在做树莓派相关的毕设、想用树莓派做边缘计算节点、或者单纯想把手里的树莓派4榨出更多性能这篇内容应该能帮你省下不少查资料和试错的时间。2. 树莓派4的硬件底子升级到底升在哪对项目意味着什么2.1 核心参数对比从3B到4B的实质跨越先摆一张表把树莓派3B和4B的关键差异列清楚。这张表不是抄官方规格书而是我结合坐垫项目实际需求整理的“影响维度”。对比项树莓派3B树莓派4B对坐垫项目的实际影响CPUCortex-A53 四核 1.4GHzCortex-A72 四核 1.5GHz摄像头推理帧率从3fps提升到12fps左右内存1GB LPDDR22/4/8GB LPDDR4可同时跑TensorFlow Lite和SQLite不再OOMUSB4×USB 2.02×USB 3.0 2×USB 2.0接USB摄像头不再掉帧外接硬盘读写快5倍网络百兆以太网千兆以太网图像传输到PC延迟从200ms降到40ms视频输出单HDMI双micro-HDMI调试时可同时接显示器和采集卡供电5V/2.5A5V/3AUSB-C必须换电源老电源带不动外设蓝牙/WiFi4.2/2.4G5G5.0/2.4G5G蓝牙5.0连接传感器更稳延迟更低这张表里最容易被忽略的是供电。树莓派4的USB-C口不是随便找个手机充电器就能用的早期还有一批板子的USB-C识别电路有设计问题导致某些带E-Marker芯片的线材无法供电。我实测下来官方电源或者能稳定输出5V/3A的电源是底线否则接上摄像头和风扇之后系统会随机重启你以为是软件问题其实是供电不足。2.2 内存怎么选2GB、4GB还是8GB小wu当时问我“坐垫项目需要8GB吗”我的回答是看你跑什么。如果只是压力传感器加个Web界面2GB足够如果要跑摄像头做坐姿识别4GB是甜点如果还想在本地跑个轻量级数据库加日志分析8GB会让你在未来一年内不用再换板子。但这里有个坑树莓派4的8GB版本对某些旧系统的兼容性有问题。比如早期的Raspberry Pi OS 32位版本无法识别8GB内存只能用到3GB左右。你必须用64位系统才能吃满8GB。这也是为什么后面我会重点讲系统选择——不是随便烧个镜像就完事。2.3 引脚与接口坐垫项目实际用到的那些坐垫项目用到的接口不多但每个都很关键。树莓派4的40针GPIO引脚定义和3B完全兼容这意味着小wu之前焊的传感器转接板可以直接插上去。但要注意树莓派4的GPIO驱动能力没有变化单个引脚最大输出仍然是16mA左右驱动震动马达必须加三极管或者MOS管直接接马达会烧引脚。USB口方面我建议把摄像头接在USB 3.0口上蓝色那个因为USB 3.0的带宽和供电都更足。但有个细节USB 3.0工作时会对2.4GHz WiFi产生干扰如果你用WiFi连接最好把摄像头接在USB 2.0口或者用5GHz WiFi。这个坑我在做图像传输到PC的时候踩过画面总是卡顿换了5GHz频段之后立刻流畅。3. 系统选择Ubuntu 20.04还是Raspberry Pi OS3.1 为什么小wu最终选了Ubuntu 20.04树莓派4发布之后Ubuntu官方很快跟进了64位版本。小wu的坐垫项目需要跑TensorFlow Lite做坐姿分类而TensorFlow Lite在64位系统上的性能明显优于32位。另外Ubuntu 20.04的软件源里Python包更全用apt和pip装东西少折腾。但Ubuntu 20.04在树莓派4上不是没有代价的。桌面版启动慢、内存占用高如果你用2GB版本开机之后可用内存只剩1.2GB左右。所以我的建议是坐垫项目用Ubuntu Server 20.04 64位不带桌面。需要图形界面调试的时候用SSH加VNC或者直接接HDMI临时开桌面。3.2 烧录系统的正确姿势烧录工具我用的是Raspberry Pi Imager官方出品支持直接下载Ubuntu镜像。但这里有个细节Imager默认会帮你格式化卡并写入镜像但不会自动扩展文件系统。Ubuntu Server镜像首次启动时会自动扩展但如果你用的是其他镜像可能需要手动跑raspi-config或者gparted。烧录之前我习惯先用SD Card Formatter把卡格式化一遍尤其是之前用过其他系统的卡。不格式化直接烧录有时候会出现分区表混乱系统启动到一半卡住。这个步骤看起来多余但能省掉后面很多“为什么启动不了”的排查时间。3.3 首次启动必须做的五件事系统烧录完插卡上电第一次启动需要做几件事。我列个清单按顺序操作改默认密码Ubuntu Server默认用户是ubuntu密码也是ubuntu首次登录会强制改密码。别偷懒改个强密码。配置WiFi如果没有网线需要编辑/etc/netplan/50-cloud-init.yaml写入WiFi名称和密码然后跑sudo netplan apply。更新软件源默认源在国外速度慢。换成国内源具体怎么换后面讲。扩展文件系统sudo raspi-config里选Advanced Options → Expand Filesystem。安装必要工具sudo apt install python3-pip git vim htop这几个是后面调试的刚需。注意树莓派4的Ubuntu Server首次启动时HDMI输出可能没有信号这是正常现象系统默认不开启HDMI。如果需要接显示器要在/boot/firmware/config.txt里取消注释hdmi_force_hotplug1。4. 换源与基础环境配置让apt和pip跑满带宽4.1 树莓派修改源的正确方法Ubuntu 20.04在树莓派上的源配置文件是/etc/apt/sources.list和/etc/apt/sources.list.d/目录下的文件。不要直接改sources.list里的ports.ubuntu.com因为树莓派是arm64架构源地址和普通PC不一样。正确的做法是先备份原文件然后替换成国内支持arm64的镜像源。我常用的是清华源和中科大源。具体命令sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s|ports.ubuntu.com|mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list sudo apt update如果apt update报错说找不到Release文件说明源地址不对。这时候要检查/etc/apt/sources.list.d/里有没有其他文件比如ubuntu-ports.list也要一起改。4.2 pip换源别让Python包下载等到天亮树莓派上跑Python项目pip装包是家常便饭。默认源下载一个TensorFlow Lite可能要半小时换源之后两分钟搞定。命令很简单pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple但要注意如果你用虚拟环境pip配置不会自动继承需要在虚拟环境里再跑一次。另外有些包在arm64上没有预编译wheelpip会尝试从源码编译这时候需要提前装好build-essential和python3-dev。4.3 风扇与散热树莓派4的发热不是闹着玩的树莓派4的Cortex-A72在满载时温度能到80度以上不加散热会降频。小wu的坐垫项目是封闭外壳散热更差。我给他配的是5V小风扇接在GPIO的5V和GND引脚上常转不停。但这样有个问题风扇噪音在安静环境下很明显。更好的方案是用温控风扇接在GPIO 14TXD或者用三极管控制。树莓派4的GPIO 14支持PWM输出可以根据CPU温度动态调转速。具体做法是写个Python脚本读/sys/class/thermal/thermal_zone0/temp超过60度就开风扇低于50度就关。这个脚本可以做成systemd服务开机自启。提示树莓派4B的风扇针脚定义和3B不同3B的风扇接口是2针4B是4针但只用了其中2针。买风扇的时候注意选支持4B的版本或者直接买5V两线风扇接GPIO。5. 坐垫项目的核心实现从传感器到摄像头推理5.1 压力传感器阵列的接入与校准小wu的坐垫用了16个薄膜压力传感器排成4×4矩阵。传感器输出的是模拟电压树莓派本身没有模拟输入引脚所以需要外接ADC芯片。我用的是ADS111516位精度I2C接口接在树莓派的GPIO 2SDA和GPIO 3SCL上。接线很简单但校准很关键。每个传感器的零点漂移不一样上电之后要先读一遍空载值存下来作为基准。坐上去之后再读差值才是有效压力。这个校准过程要在代码里自动完成否则每次重启都要手动调。import board import busio import adafruit_ads1x15.ads1115 as ADS from adafruit_ads1x15.analog_in import AnalogIn i2c busio.I2C(board.SCL, board.SDA) ads ADS.ADS1115(i2c) chan AnalogIn(ads, ADS.P0) # 空载校准 baseline chan.value # 后续读取 pressure chan.value - baseline这段代码是简化版实际项目中要读16个通道需要接多路复用器或者用多个ADS1115。I2C地址冲突是常见问题ADS1115默认地址是0x48可以通过ADDR引脚改成0x49、0x4A、0x4B最多接4个。5.2 摄像头模块的选择与配置坐垫项目用摄像头做坐姿识别不需要太高分辨率但需要低延迟和稳定的驱动。小wu一开始用的是某宝买的USB摄像头免驱那种但在Ubuntu 20.04上帧率不稳定有时候掉到5fps。后来换了树莓派官方OV5647摄像头模块接在CSI接口上用raspi-config开启摄像头帧率稳定在30fps。OV5647是500万像素支持1080p30对于坐姿识别足够了。配置的时候要注意Ubuntu 20.04默认没有安装树莓派摄像头驱动需要手动装libraspberrypi-bin和raspi-config然后在/boot/firmware/config.txt里加start_x1和gpu_mem128。5.3 TensorFlow Lite模型部署与推理优化坐姿识别模型是在PC上训练好的转成TensorFlow Lite格式然后拷到树莓派上跑。模型不大输入是224×224的RGB图像输出是3类正常坐姿、前倾、后仰。推理代码用tflite_runtime比完整版TensorFlow轻量很多。安装命令pip3 install tflite-runtime但要注意tflite-runtime的arm64版本在PyPI上不一定有可能需要从树莓派官方源装或者自己编译。我实测下来Ubuntu 20.04 64位系统上pip3 install tflite-runtime能直接装成功版本是2.5.0。推理的时候输入图像要先做归一化把像素值从0-255转到0-1。这个步骤在PC上训练时怎么做树莓派上就要怎么做否则精度会掉。另外树莓派4的CPU推理一张224×224的图像大约需要80ms也就是12fps左右。如果觉得慢可以用NCNN或者ONNX Runtime但配置更麻烦。6. 图像传输到PC把坐垫数据传到上位机6.1 为什么需要图像传输坐垫本身不需要显示图像但调试和数据分析的时候把摄像头画面传到PC上很有用。小wu的需求是坐垫在客厅PC在书房通过WiFi把画面传过去延迟不要太高。6.2 方案选型MJPEG还是RTSP我试过三种方案MJPEG over HTTP、RTSP、WebSocket传帧。MJPEG最简单树莓派上跑个Flask服务PC浏览器直接看但延迟在200ms左右。RTSP用ffmpeg推流延迟能到100ms以内但配置复杂。WebSocket传帧最灵活可以只传有变化的帧但需要自己写协议。最终小wu选了MJPEG over HTTP因为够用。代码很简单from flask import Flask, Response import cv2 app Flask(__name__) camera cv2.VideoCapture(0) def generate(): while True: success, frame camera.read() if not success: break ret, buffer cv2.imencode(.jpg, frame) frame buffer.tobytes() yield (b--frame\r\n bContent-Type: image/jpeg\r\n\r\n frame b\r\n) app.route(/video_feed) def video_feed(): return Response(generate(), mimetypemultipart/x-mixed-replace; boundaryframe) if __name__ __main__: app.run(host0.0.0.0, port5000)这段代码在树莓派4上跑CPU占用大约30%画面延迟150ms左右。如果觉得延迟高可以把分辨率降到640×480或者用硬件编码。6.3 网络优化千兆以太网和5GHz WiFi树莓派4有千兆以太网口但实际带宽受USB 2.0总线限制跑不满千兆实测在300Mbps左右。不过对于MJPEG流足够了。如果用WiFi一定要用5GHz频段2.4GHz在USB 3.0工作时会被干扰。注意树莓派4的WiFi和蓝牙共用天线同时开WiFi和蓝牙会影响稳定性。如果坐垫用蓝牙连接传感器建议用网线连接网络。7. 常见问题与排查技巧实录7.1 系统启动类问题现象可能原因解决方法上电后绿灯亮但无显示HDMI未强制开启在config.txt加hdmi_force_hotplug1启动到一半卡住电源供电不足换5V/3A电源拔掉多余外设系统频繁重启USB-C线材兼容性问题换官方电源或普通USB-A转C线无法识别8GB内存用了32位系统换64位系统7.2 外设与GPIO类问题I2C设备不识别先跑i2cdetect -y 1看地址有没有出现。如果没有检查接线和上拉电阻。树莓派内部有上拉但接多个设备时可能需要外部上拉。摄像头不出图检查/boot/firmware/config.txt里有没有start_x1然后跑vcgencmd get_camera看输出是不是supported1 detected1。如果是detected0可能是排线没插紧。风扇不转万用表量一下GPIO 5V和GND之间有没有5V电压。如果没有可能是GPIO口没使能或者风扇坏了。7.3 性能与稳定性类问题CPU温度过高降频装散热片加风扇或者用cpufrequtils把 governor 改成ondemand让CPU自动调频。WiFi断流换5GHz频段或者关掉蓝牙。如果还不行在/etc/modprobe.d/里加options brcmfmac roamoff1。SD卡寿命短树莓派频繁读写SD卡容易坏。建议把日志和数据库放到外接USB硬盘或者用log2ram把日志放到内存。7.4 独家避坑技巧技巧一用raspi-config之前先备份。这个工具会改config.txt和cmdline.txt改错了系统起不来。备份命令sudo cp /boot/firmware/config.txt /boot/firmware/config.txt.bak。技巧二Python虚拟环境一定要用。树莓派系统里的Python包和项目依赖容易冲突用python3 -m venv建个独立环境省得后面重装系统。技巧三SSH连接不稳定的时候用mosh代替。mosh在WiFi断流的时候会自动重连不会像SSH那样卡死。技巧四烧录系统之前先用dd命令测一下SD卡的真实写入速度。有些卡标称Class 10实际写入只有5MB/s系统跑起来会卡。命令dd if/dev/zero oftest.bin bs1M count1024。8. 从坐垫到更多树莓派4还能怎么玩小wu的坐垫项目升级完之后他跟我说“这板子性能过剩了。”确实树莓派4的算力对于坐垫来说有点大材小用。但这也意味着同一块板子可以同时做更多事情。比如本地部署轻量级大模型树莓派5可以跑DeepSeek的量化版本树莓派4虽然吃力但跑个TinyLlama做语音助手还是可以的。ADS-B接收接个RTL-SDR棒子树莓派4可以24小时接收航班信号功耗只有几瓦。ROS2节点树莓派5上跑Ubuntu加ROS2做机器人控制树莓派4也能跑但性能紧张。Pico控制舵机树莓派Pico和树莓派4配合Pico负责实时控制树莓派4负责决策和通信。如果你手里有树莓派4别只让它吃灰。先从装系统开始把基础环境配好然后找一个真实需求——哪怕只是做个网络监控或者家庭相册——把它跑起来。跑起来之后你自然会遇到问题解决问题过程中学到的东西比看十篇教程都管用。小wu的坐垫现在稳定运行了三个月每天记录他的坐姿数据周末自动生成报告发到他邮箱。他说“早知道树莓派4这么稳去年就不该省那两百块钱。”我回他“省下的钱都变成你查资料的时间了。”这话放在这里与各位共勉。
返回列表