You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派小车移动追踪代码position_x未定义报错及罗技C270摄像头适配问题

报错及兼容性问题解决方案

1. 'position_x' is not defined 报错修复

报错原因

你的代码存在缩进错误:check_for_direction 函数定义结束后,所有和position_x判断相关的代码没有缩进进函数内部,作为全局代码直接运行,而全局作用域里并没有定义position_x变量,因此启动时直接触发未定义报错。
同时代码中还有两处额外错误:

  • 代码中&lt;、&gt;是HTML转义字符,需要替换为Python语法的<、>
  • camera = PiCamera() 缩进错误,缩进到了前面的else分支内部,会导致全局作用域找不到camera变量

修复方法

把check_for_direction函数修改为如下格式:

def check_for_direction(position_x):
    GPIO.setmode(GPIO.BOARD)
    GPIO.setwarnings(False)
    GPIO.setup(11,GPIO.OUT)
    GPIO.setup(12,GPIO.OUT)
    GPIO.setup(15,GPIO.OUT)
    GPIO.setup(16,GPIO.OUT)
    GPIO.setup(38,GPIO.OUT)

    if position_x == 0 or position_x == width:
        print( 'out of bound')
        t_stop()
    if position_x <= ((width-tracking_width)/2 - tracking_width):
        print ('move right!')
        t_right()
    elif position_x >= ((width-tracking_width)/2 + tracking_width):
        print('move left!')
        t_left()
    else:
        # print 'move front'
        t_up()

然后把camera = PiCamera() 这行的缩进删除,和后面的camera.resolution代码对齐即可。

2. 罗技C270兼容性说明

不兼容点

你当前代码使用的picamera库仅支持树莓派官方CSI接口摄像头,罗技C270是USB网络摄像头,无法通过picamera库驱动,必须替换摄像头读取逻辑。

适配方法

首先删除代码中所有和picamera相关的导入、初始化代码,替换为OpenCV的USB摄像头读取逻辑:

  1. 替换导入部分:删除from picamera.array import PiRGBArray、from picamera import PiCamera两行
  2. 替换摄像头初始化部分:
# 替换原来的camera初始化、rawCapture相关所有代码
cap = cv2.VideoCapture(0) # 设备号如果识别失败可以尝试改为1、2
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
# 摄像头预热
time.sleep(0.1)
  1. 替换帧读取逻辑:把原来的帧读取循环、首帧ROI捕获逻辑修改为如下格式,原有颜色追踪、小车控制逻辑无需改动:
# 读取第一帧设置ROI
ret, frame = cap.read()
if not ret:
    print("摄像头读取失败")
    exit()

# 原有ROI、直方图计算逻辑适配,把rawCapture2.array替换为frame即可
c,r,w,h = (width/2 - tracking_width/2), (height/2 - tracking_height/2), tracking_width, tracking_height
track_window = (c,r,w,h)
roi = frame[r:r+h, c:c+w]
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array([0,30,32]), np.array([180,255,255]))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0,180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 80, 1)

# 主循环替换
while True:
    ret, frame = cap.read()
    if not ret:
        break
    image = frame
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    dst = cv2.calcBackProject([hsv], [0], roi_hist, [0,180], 1)
    ret, track_window = cv2.meanShift(dst, track_window, term_crit)
    x,y,w,h = track_window
    cv2.rectangle(image, (x,y), (x+w,y+h), 255, 2)
    cv2.putText(image, 'Tracked', (x-25, y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
    cv2.imshow("Raspberry Pi RC Car", image)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    check_for_direction(x)
    time.sleep(0.01)

# 释放资源
cap.release()
cv2.destroyAllWindows()

罗技C270是标准UVC摄像头,树莓派系统默认集成驱动,修改后可正常运行。

内容的提问来源于stack exchange,提问作者方耀廷

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 15:42:01