运行人脸追踪代码时Raspberry Pi 4B SSH连接频繁断开求助
问题描述
- 树莓派4B运行人脸居中伺服控制程序时,10-20秒后SSH连接断开,终端报错
client_loop: send disconnect: Connection reset - 设备未崩溃或短路,SSH空闲状态下可长时间保持连接
- 代码昨日运行正常,未对树莓派做任何修改
运行环境
- 树莓派4B,32位Raspbian OS Lite,32GB SD卡
- 客户端为Windows 10系统
相关代码
import os from math import floor from gpiozero import AngularServo SERVO_X = AngularServo(18, min_angle=-90, max_angle=90) SERVO_Y = AngularServo(15, min_angle=-90,max_angle=90) VIDEOCENTREX = 640 VIDEOCENTREY = 360 VIDEO_CAPTURE = cv2.VideoCapture(0) CASCADE_PATH = "FACE_DETECTION.xml" FACE_CASCADE = cv2.CascadeClassifier(CASCADE_PATH) ##CENTRE THE SERVOS SERVO_X.angle = 0 SERVO_Y.angle = 0 while True: # Capture frame-by-frame ret, frame = VIDEO_CAPTURE.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = FACE_CASCADE.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30, 30)) print(len(faces)) # Draw a rectangle around the faces for (x, y, w, h) in faces: centre_x = floor(x+(w/2)) centre_y = floor(y+(h/2)) print(centre_x, centre_y) if len(faces) == 1: if centre_x > VIDEOCENTREX: SERVO_X.angle += -1 print("X - 1") elif centre_x < VIDEOCENTREX: SERVO_X.angle += 1 print("X +1") if centre_y > VIDEOCENTREY: SERVO_Y.angle += -1 print("y - 1") elif centre_y < VIDEOCENTREY: SERVO_Y.angle += 1 print("Y + 1") if cv2.waitKey(1) & 0xFF == ord('q'): break # When everything is done, release the capture VIDEO_CAPTURE.release() cv2.destroyAllWindows()
排查与解决方法
1. 修复代码潜在错误
- 代码遗漏
import cv2语句,补上该导入; - 当未检测到人脸(
len(faces) != 1)时,centre_x和centre_y未定义会触发NameError,导致程序崩溃,需在while循环开头初始化变量:# 在while True:后添加 centre_x = VIDEOCENTREX centre_y = VIDEOCENTREY
2. 排查硬件供电问题
伺服电机运行时电流消耗大,可能导致树莓派网卡/USB供电不足:
- 更换为5V 3A及以上的官方树莓派电源;
- 若伺服电机直接从树莓派GPIO取电,改为外接独立电源供电,仅保留信号线连接GPIO引脚。
3. 优化SSH连接配置
修改树莓派SSH配置,避免高负载下连接超时:
- 编辑配置文件:
sudo nano /etc/ssh/sshd_config - 添加或修改以下参数:
ClientAliveInterval 60 ClientAliveCountMax 3 TCPKeepAlive yes - 重启SSH服务:
sudo systemctl restart sshd
4. 监控系统资源
开额外SSH窗口运行以下命令,排查资源耗尽问题:
htop:实时查看CPU、内存占用情况;ping <树莓派IP>:观察程序运行时是否出现网络丢包。
5. 排查硬件资源冲突
部分摄像头模块与GPIO引脚存在资源竞争,尝试:
- 更换摄像头的视频输入端口(若支持);
- 更换伺服电机连接的GPIO引脚,避开摄像头占用的资源。
内容的提问来源于stack exchange,提问作者Anton Chernyshov
相关产品推荐
相关产品推荐

