Ubuntu20.04.5树莓派4B获取Lepton3.5 Y16数据时uvc启动失败
解决Pure Thermal 2 + Lepton 3.5 Y16流启动失败(uvc_start_streaming failed: -2)的问题
核心问题分析
错误码-2对应libuvc的UVC_ERROR_IO,本质是格式枚举不匹配或帧参数与设备能力冲突,结合你的输出来看,存在两个关键矛盾:
- 固件版本显示v1.2.2,但你声称刷了v1.3.0,说明固件更新未生效
- Y16格式存在两个帧尺寸(160x120/160x122),脚本可能默认选择了设备不支持的160x122尺寸
分步解决方案
1. 重新确认并更新固件到v1.3.0
你的运行输出显示固件版本为fw:v1.2.2,和你所说的v1.3.0不符,这是Y16模式异常的根源之一:
- 按住PT2上的复位按钮不放,插入USB连接树莓派,进入DFU模式
- 使用
dfu-util刷入v1.3.0固件:sudo dfu-util -D purethermal2-firmware-v1.3.0.dfu - 刷完后重启设备,再次运行脚本确认固件版本显示为v1.3.0
2. 修改脚本,匹配设备实际的Y16格式与帧尺寸
原脚本可能依赖硬编码的UVC_FRAME_FORMAT_Y16枚举值,与当前libuvc版本不兼容,改为通过格式名称和帧尺寸动态匹配:
打开uvc-radiometry.py,找到格式选择相关代码,替换为以下逻辑:
# 遍历所有支持的格式,找到Y16格式 desired_format = None format_list = uvc.get_format_list(uvc_ctx, dev_handle) for fmt in format_list: if fmt['fourcc'] == b'Y16 ': desired_format = fmt print(f"Found Y16 format with ID: {desired_format['format_id']}") break if not desired_format: print("Error: Y16 format not supported by device") uvc.uvc_close(dev_handle) uvc.uvc_exit(uvc_ctx) exit(1) # 选择160x120的有效帧尺寸(排除160x122的元数据帧) desired_frame = None for frame in desired_format['frame_descriptors']: if frame['width'] == 160 and frame['height'] == 120: desired_frame = frame print(f"Selected Y16 frame: {frame['width']}x{frame['height']} @ {frame['fps']}fps") break if not desired_frame: print("Error: 160x120 Y16 frame not found") uvc.uvc_close(dev_handle) uvc.uvc_exit(uvc_ctx) exit(1) # 启动流时使用动态获取的格式ID和帧ID ret = uvc.uvc_start_streaming( uvc_ctx, dev_handle, desired_format['format_id'], desired_frame['frame_id'], uvc.UVC_FRAME_FORMAT_Y16, 5, frame_callback, None )
3. 修复libuvc枚举值不兼容问题
如果使用的是master+libuvc-upstream分支,确保libuvc的绑定已正确更新:
- 重新编译安装libuvc:
cd libuvc mkdir build && cd build cmake .. make && sudo make install sudo ldconfig - 确认Python绑定中的
UVC_FRAME_FORMAT_Y16值与libuvc源码一致(当前正确值为0x06,旧版本为0x10)
4. 确保USB设备权限与稳定性
- 将当前用户加入
plugdev组,避免权限问题:sudo usermod -aG plugdev $USER newgrp plugdev # 无需重启,临时生效 - 使用高质量USB线,避免供电不足或信号干扰;如果树莓派USB端口供电不稳定,尝试使用外接电源供电
验证步骤
修改完成后重新运行脚本,若成功启动Y16流,会输出类似:
Found Y16 format with ID: 2 Selected Y16 frame: 160x120 @ 9fps Streaming started successfully
此时获取的Y16数据可直接转换为温度值(转换公式:温度 = (Y16值 / 65535) * 150 + (-40),对应Lepton 3.5的基础测温范围,若需扩展到200℃需确认设备是否支持高温模式)
内容的提问来源于stack exchange,提问作者boydy33
相关产品推荐
相关产品推荐

