imx219 在x5平台进入不了tuning模式,报错误。i2c可以找到,能正常出图。
版本是3.3.3
您好!
问题原因: tuning 工具找不到或无法正确加载 IMX219 的配置文件(cam_json)。
请先排查:
检查配置文件是否存在:
ls -la /app/tuning_tools/tuning_cfg/
find /app -name "*imx219*.json"

x5的文件名是这种了。有imx219的 json文件
您好,IMX219不在这个脚本的支持列表里:
# bash run_tuning.sh --list
index: 0 sensor_name: sc1330t config_file:linear_1280x960_raw10_30fps_1lane.c
index: 1 sensor_name: irs2875-tof config_file:linear_208x1413_raw12_15fps_2lane.c
index: 2 sensor_name: sc230ai-10fps config_file:linear_1920x1080_raw10_10fps_1lane.c
index: 3 sensor_name: sc230ai-30fps config_file:linear_1920x1080_raw10_30fps_1lane.c
index: 4 sensor_name: sc132gs-1280p config_file:linear_1088x1280_raw10_30fps_1lane.c
index: 5 sensor_name: sc035hgs config_file:linear_640x480_raw10_30fps_1lane.c
index: 6 sensor_name: ov5640 config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 7 sensor_name: f37 config_file:linear_1920x1080_raw10_30fps_1lane.c
index: 8 sensor_name: imx415-30fps-2lane config_file:linear_3840x2160_raw10_30fps_2lane.c
index: 9 sensor_name: imx415-30fps-4lane config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 10 sensor_name: sc202cs-1600x1200 config_file:linear_1600x1200_raw10_30fps_1lane.c
index: 11 sensor_name: irs2381c-tof config_file:linear_224x1903_raw12_5fps_2lane.c
index: 12 sensor_name: sc035hgs-vc0 config_file:linear_640x480_raw10_30fps_2lane_vc0.c
index: 13 sensor_name: sc035hgs-vc1 config_file:linear_640x480_raw10_30fps_2lane_vc1.c
index: 14 sensor_name: sc231ai-30fps config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 15 sensor_name: imx586-30fps-4lane config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 16 sensor_name: os08c10-30fps-2lane config_file:linear_3840x2160_raw12_30fps_2lane.c
index: 17 sensor_name: ar0233-30fps config_file:linear_1920x1080_raw12_30fps_2lane.c
index: 18 sensor_name: ar0820std-30fps config_file:linear_3840x2160_yuv422_30fps_4lane.c
index: 19 sensor_name: sc1336 config_file:linear_1280x720_raw10_15fps_2lane.c
index: 20 sensor_name: dummy config_file:dummy_sensor.c
这块具体的手册可以参考buildroot的sdk芯片手册 1.7 下载资源汇总 | RDK DOC
这个case请问还有问题吗?我们新版SDK是集成好的,可以更新使用。
感谢您的提问和补充信息!根据当前对话内容,以下是总结与建议:
用户 15889789245 在 RDK X5 平台使用 IMX219 传感器时,尝试进入 tuning 模式失败,报错如下:
tuning_case_run(249)[hbn_camera_init_cfg(ctx->cam_json) ne 0]
虽然 I2C 能正常通信并出图,但 tuning 工具无法加载 IMX219 的配置文件(cam_json),导致启动失败。
管理员 Marcelo 已确认:
当前
run_tuning.sh脚本的内置支持列表中 不包含 IMX219。因此即使存在.json配置文件,工具也无法识别并调用它。
用户后续贴出的文件结构显示:
imx219_rx2.json
cam_x5_config.json
raw10_1920x1080_30fps.json
vpm_x5_config.json
说明配置文件是存在的 —— 但脚本未将其纳入支持列表。
/app/tuning_tools/run_tuning.shtuning_case_run() 中有 sensor 名称映射。index: 21 sensor_name: imx219 config_file:imx219_rx2.json
./run_tuning.sh --run 21
注意:需确保
imx219_rx2.json文件格式符合工具要求(如 JSON 结构、字段命名等)。
用户 ZhangHua 提醒:“新版 SDK 是集成好的,可以更新使用。”
→ 这意味着 未来版本可能已加入对 IMX219 的支持。建议关注官方发布日志或联系技术支持获取最新 SDK 版本。
Marcelo 推荐查阅 RDK DOC - Buildroot 系统资源,其中应包含 IMX219 的底层驱动和配置说明,可用于自定义适配。
cat /etc/version
# 或查看是否有新版本的 tuning_tool 包
dpkg -l | grep tuning_tool
感谢 ZhangHua 的提醒!如果您希望我们协助查找新版 SDK 是否已支持 IMX219,或者帮您分析 imx219_rx2.json 的结构是否兼容现有工具,请提供更多信息(例如 JSON 内容片段或 SDK 更新日志链接),我们将进一步协助!
祝调试顺利!![]()
当前状态:问题尚未完全解决,但已有明确方向 —— 支持缺失 + 可选手动修复 / 等待官方更新。
建议用户先尝试“方案一”快速验证,再决定是否升级 SDK。
如有其他疑问,欢迎继续提问!
@地瓜机器人 没有这个目录 /app/tuning_tools/ ,找不到工具
您好!针对您提到的 /app/tuning_tools/ 目录不存在 的问题,这通常是因为 SDK 版本迭代导致目录结构变更 或 Tuning 工具包未默认安装。
结合社区历史案例(如 Topic 34044、28657),请按以下步骤排查并解决:
不同版本的 SDK 目录结构可能不同(例如从 tuning_tools 变为 tuning_tool 或移至其他路径)。
请在板端执行:
# 查看系统版本
cat /etc/version
# 查看已安装的多媒体相关包
dpkg -l | grep -E "tuning|hb_media|isp"
请回复上述命令的输出结果,以便我们判断您所处的 SDK 版本。
如果 /app/tuning_tools/ 不存在,工具可能被安装在其他位置。请尝试以下命令查找:
# 全局搜索包含 tuning 的目录
find / -type d -name "*tuning*" 2>/dev/null
# 搜索 run_tuning.sh 脚本
find / -name "run_tuning.sh" 2>/dev/null
常见路径变更情况:
/app/tuning_tools//app/tuning_tool/ (注意少了一个 ‘s’) 或 /opt/horizon/isp_tool/apt install horizon-isp-tuning-tool (示例,具体包名需确认)在某些 RDK X5 SDK 版本中,ISP Tuning 工具不是默认安装的,需要手动安装或解压。
/app 或 /home 目录下是否有类似 isp_tuning_tool_v*.tar.gz 或 .deb 包。参考本贴前文管理员 Marcelo 的回复:
IMX219 在旧版
run_tuning.sh脚本的支持列表中不存在。
即使您找到了 Tuning 工具目录,如果 SDK 版本较旧,依然无法直接调试 IMX219。
bash run_tuning.sh --list,查看输出列表中是否有 imx219。find 命令,如果找到脚本但路径不同,可直接在新路径下运行。cat /etc/version 的结果,我们可以帮您确认该版本是否已知存在此问题。
社区小贴士:
RDK X5 的 ISP 调试文档正在完善中(参考 Topic 28657),部分高级功能(如自定义 Sensor 接入)可能需要参考 Buildroot SDK 芯片手册 或直接联系技术支持获取内部文档。
期待您的反馈!![]()
cat /etc/version
3.4.1
dpkg -l | grep -E “tuning|hb_media|isp”
ii dh-elpa-helper 2.0.9ubuntu1 all helper package for emacs lisp extensions
ii ethtool 1:5.16-1ubuntu0.2 arm64 display or change Ethernet device settings
ii hobot-display 3.0.5-20251208164617 arm64 dtbo files of dsi lcd panel
ii libegl-dev:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – EGL development files
ii libegl1:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – EGL support
ii libgl-dev:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – GL development files
ii libgl1:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – legacy GL support
ii libgles-dev:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – GLES development files
ii libgles1:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – GLESv1 support
ii libgles2:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – GLESv2 support
ii libglvnd-core-dev:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – core development files
ii libglvnd-dev:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – development files
ii libglvnd0:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library
ii libglx-dev:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – GLX development files
ii libglx0:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – GLX support
ii libopengl-dev:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – OpenGL development files
ii libopengl0:arm64 1.4.0-1 arm64 Vendor neutral GL dispatch library – OpenGL support
ii libxdmcp6:arm64 1:1.1.3-0ubuntu5 arm64 X11 Display Manager Control Protocol library
ii notification-daemon 3.20.0-4build1 arm64 daemon for displaying passive pop-up notifications
ii toilet 0.3-1.4 arm64 display large colourful characters in text mode
ii tree 2.0.2-1 arm64 displays an indented directory tree, in color
ii whiptail 0.52.21-5ubuntu2 arm64 Displays user-friendly dialog boxes from shell scripts
根据您提供的信息,SDK 3.4.1 版本中没有默认安装 tuning 工具包(dpkg 查询无结果)。这是正常情况,ISP Tuning 工具在某些 SDK 版本中需要单独获取。
| 检查项 | 结果 |
|---|---|
| 系统版本 | 3.4.1 |
| tuning 相关包 | |
/app/tuning_tools/ 目录 |
# 全局搜索 tuning 相关文件和目录
find / -name "*tuning*" -type f 2>/dev/null
find / -name "*tuning*" -type d 2>/dev/null
# 检查 /opt 和 /home 目录
ls -la /opt/
ls -la /home/
ISP Tuning 工具属于底层调试工具,在 RDK X5 上通常需要:
X5_ISP_Tuning_Tool_v*.tar.gz 或 hb_isp_tuning_*.deb获取途径:
如果暂时无法获取 tuning 工具,可以先用以下方式验证摄像头基本功能:
# 使用 hb_media 相关工具测试出图
hb_media_demo --sensor imx219 # 示例命令,具体需查手册
# 或查看是否有 v4l2 设备
ls /dev/video*
v4l2-ctl --list-devices
参考本贴前文(Topic 32746),IMX219 在旧版 tuning 脚本中不在支持列表。即使获取到工具,也需确认:
# 获取工具后先检查支持列表
bash run_tuning.sh --list
如果列表中没有 imx219,需要:
find 命令,确认工具是否在其他路径find 命令的输出结果
参考帖子:
期待您的排查结果!![]()
5.17.6.2手册在哪
您好!关于 5.17.6.2 手册(通常指 RDK X5 芯片指导手册或 ISP 调试手册的章节号),这类文档属于 NDA 授权资料,不公开对外发布。
根据社区官方回复(参考 Topic 34044):
调试指导手册和培训视频都具备,如果已经签署 NDA,资料获取可以跟项目上 FAE 或业务同学确认。
确认 NDA 状态
联系对接人
support@d-robotics.cc(如有)提供必要信息
联系时请说明:
如果您暂时无法获取 NDA 文档,可先参考以下公开资料:
建议:尽快联系您的项目 FAE,这是获取该手册的唯一正规渠道。如有其他问题,欢迎继续提问!![]()
@地瓜机器人 rdx x5的mjpeg支持硬件转成yuv哪种格式,然后yolo主流用的yolo哪种格式
您好!针对您关于 RDK X5 MJPEG 硬件解码格式 和 YOLO 主流输入格式 的问题,结合社区实战案例(参考 Topic 29100),解答如下:
RDK X5 的硬件解码器(libsrcampy 或底层 hbm 接口)在解码 MJPEG 流时,默认输出为 NV12 格式。
Y 平面 + UV 交错平面,总大小为 width × height × 1.5 字节。from hobot_vio import libsrcampy
import cv2
import numpy as np
# 初始化解码器 (3 代表 MJPEG)
dec = libsrcampy.Decoder()
ret = dec.decode("", 0, 3, imgw, imgh)
# 传入 MJPEG 数据
dec.set_img(mjpg_byte_data)
# 获取解码后的 NV12 数据
nv12_data = dec.get_img() # 返回 bytes
# 转换为 BGR 图像(用于显示或推理)
nv12_array = np.frombuffer(nv12_data, dtype=np.uint8).reshape(imgh * 3 // 2, imgw)
bgr_img = cv2.cvtColor(nv12_array, cv2.COLOR_YUV2BGR_NV12)
注意:硬件解码器不支持直接输出 BGR/RGB,必须先解为 NV12,再用 OpenCV 或 BPU 预处理模块转为 BGR。
在 RDK X5 上部署 YOLO 系列模型(v5/v8/v10/v11),主流输入格式为 BGR,且通常要求:
| 项目 | 要求 |
|---|---|
| 颜色空间 | BGR(OpenCV 默认) |
| 数据布局 | NHWC(Batch, Height, Width, Channel) |
| 像素范围 | 0-255(uint8)或 0.0-1.0(float32,需归一化) |
| 输入尺寸 | 常见为 640×640,也支持 320×320、1280×1280 等(取决于模型训练配置) |
| 预处理方式 | Resize + Letterbox(保持宽高比,填充灰边)或 Stretch Resize(直接拉伸) |
import cv2
import numpy as np
def preprocess_yolo(img, input_size=(640, 640)):
# img 是 BGR 格式
h, w = img.shape[:2]
new_h, new_w = input_size
# 方式一:Letterbox(推荐,保持比例)
scale = min(new_w / w, new_h / h)
new_w, new_h = int(w * scale), int(h * scale)
resized = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LINEAR)
# 填充灰边
pad_w = (new_w - new_w) // 2
pad_h = (new_h - new_h) // 2
padded = np.full((new_h, new_w, 3), 114, dtype=np.uint8)
padded[pad_h:pad_h+new_h, pad_w:pad_w+new_w] = resized
# 归一化到 0-1 (如模型需要)
# padded = padded.astype(np.float32) / 255.0
return padded
# 1. 采集 MJPEG(设置 V4L2 + MJPG 模式)
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(cv2.CAP_PROP_CONVERT_RGB, 0) # 不转 RGB,取原始 MJPG
# 2. 硬件解码为 NV12
ret, mjpg_frame = cap.read()
nv12_data = decoder.decode(mjpg_frame.tobytes())
# 3. NV12 → BGR
bgr_img = cv2.cvtColor(nv12_array, cv2.COLOR_YUV2BGR_NV12)
# 4. YOLO 预处理(Resize + Letterbox)
input_tensor = preprocess_yolo(bgr_img, input_size=(640, 640))
# 5. BPU 推理
# ... (使用 hb_mapper 转换后的 bin 模型)
| 问题 | 答案 |
|---|---|
| MJPEG 硬解码输出 | NV12(YUV 4:2:0) |
| YOLO 输入格式 | BGR,NHWC,640×640(常见) |
| 颜色转换 | NV12 → BGR 用 cv2.COLOR_YUV2BGR_NV12 |
| 性能优化 | 使用硬解码 + BPU 预处理,避免 CPU 瓶颈 |
如需具体代码模板或模型转换参数配置,可继续提问!![]()
YOLO直接采用NV12输入即可
编码h264时是否支持双线程并发执行,也就是输入与输出脱偶?
您好!关于 RDK X5 H.264 编码是否支持双线程并发(输入与输出解耦) 的问题,结合 RDK X5 的多媒体架构和社区实践,解答如下:
支持。RDK X5 的硬件编码器(VENC)支持 多通道并发 和 异步编码,可以实现 输入(采集/推理)与输出(编码/推流)的解耦。
但需要注意:Python API (libsrcampy) 默认是同步阻塞的,要实现真正的“输入输出解耦”,需要 手动构建生产者 - 消费者队列模型。
要实现“输入与输出脱耦”,推荐架构如下:
[采集/推理线程] (Producer)
│
├── 放入 Queue (NV12 帧)
│
[编码线程] (Consumer)
│
└── 从 Queue 取帧 → 硬件编码 → 输出 H.264 流
queue.Queue 实现线程解耦import threading
import queue
from hobot_vio import libsrcampy
import time
# 创建队列(缓存 5 帧)
frame_queue = queue.Queue(maxsize=5)
# 编码器初始化
enc = libsrcampy.Encoder()
enc.encode(0, 1, 1920, 1080) # channel=0, type=1(H.264), w=1920, h=1080
# 生产者线程:采集/推理
def producer_thread():
while True:
nv12_frame = get_nv12_from_camera_or_bpu() # 你的采集/推理逻辑
# 非阻塞放入队列,如果队列满则丢弃旧帧
if frame_queue.full():
try:
frame_queue.get_nowait() # 丢弃最旧的一帧
except queue.Empty:
pass
frame_queue.put_nowait(nv12_frame)
# 消费者线程:编码
def encoder_thread():
while True:
nv12_frame = frame_queue.get() # 阻塞等待新帧
# 传入 NV12 数据进行编码
enc.encode_file(nv12_frame.tobytes())
h264_data = enc.get_img() # 获取 H.264 码流
# 推流或保存
stream_output(h264_data)
# 启动双线程
threading.Thread(target=producer_thread, daemon=True).start()
threading.Thread(target=encoder_thread, daemon=True).start()
# 主线程可做其他事情
while True:
time.sleep(1)
| 项目 | 说明 |
|---|---|
| 编码器通道 | RDK X5 支持 多通道编码(如 encode(0, ...) 和 encode(1, ...) 同时运行) |
| 输入格式 | 必须是 NV12(硬件编码器不支持 BGR 直接输入) |
| 队列管理 | 建议设置 maxsize,避免内存堆积;队列满时丢弃旧帧(get_nowait) |
| 性能瓶颈 | 编码本身是硬件加速,瓶颈通常在 NV12 数据拷贝 和 队列锁 |
| 零拷贝优化 | 如需极致性能,建议使用 C++ + RDK TROS 的 ZeroCopy 机制(参考 Topic 33827) |
Marcelo6151: “YOLO 直接采用 NV12 输入即可”
这进一步确认了:整个流水线应全程保持 NV12 格式,避免 NV12 → BGR → NV12 的无效转换,这也是实现高性能编码的关键。
使用 TROS 多媒体节点:
tros-image-transport 和 tros-venc 节点已内置了异步编码和零拷贝机制。C++ 实现:
多路编码:
如需 C++ 版本的并发编码模板,可继续提问!![]()
说的是纯h264的输入与输出,可以在2个线程中吗,如何实现双线程并发执行,或者说你有更好的建议
您好!关于 RDK X5 H.264 编码的纯双线程并发(输入/输出解耦),明确回复如下:
支持双线程。RDK X5 的 VENC 硬件编码器本身是异步非阻塞的,但 Python API (libsrcampy) 默认封装为同步调用。要实现真正的输入输出解耦,需手动构建双线程 + 队列模型。
import threading
import queue
from hobot_vio import libsrcampy
# 帧队列(缓存 3 帧,避免堆积)
frame_queue = queue.Queue(maxsize=3)
stop_flag = threading.Event()
# 编码器初始化(channel=0, type=1=H.264)
enc = libsrcampy.Encoder()
enc.encode(0, 1, 1920, 1080)
def input_thread():
"""输入线程:采集/推理 → 放入队列"""
while not stop_flag.is_set():
nv12_frame = get_nv12_frame() # 你的采集逻辑
# 队列满则丢弃旧帧
if frame_queue.full():
try:
frame_queue.get_nowait()
except queue.Empty:
pass
frame_queue.put_nowait(nv12_frame)
def output_thread():
"""输出线程:从队列取帧 → 编码 → 输出"""
while not stop_flag.is_set():
try:
nv12_frame = frame_queue.get(timeout=0.1)
except queue.Empty:
continue
# 编码(硬件异步)
enc.encode_file(nv12_frame.tobytes())
h264_data = enc.get_img()
# 输出(推流/保存)
write_h264(h264_data)
# 启动双线程
t1 = threading.Thread(target=input_thread, daemon=True)
t2 = threading.Thread(target=output_thread, daemon=True)
t1.start()
t2.start()
Python 有 GIL 锁和数据拷贝开销,如需 >30fps 稳定编码,建议用 C++:
// 核心思路:使用 hb_venc 接口 + 条件变量同步
#include "hb_venc.h"
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<nv12_buffer_t> frame_queue;
std::mutex mtx;
std::condition_variable cv;
void input_thread() {
while (running) {
nv12_buffer_t frame = get_nv12_zero_copy(); // 零拷贝获取
std::lock_guard<std::mutex> lock(mtx);
if (frame_queue.size() >= 3) frame_queue.pop(); // 丢旧帧
frame_queue.push(frame);
cv.notify_one();
}
}
void output_thread() {
HB_VENC_CHN venc_chn = 0;
HB_VENC_CreateChn(venc_chn, &venc_attr); // 创建编码通道
while (running) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !frame_queue.empty(); });
nv12_buffer_t frame = frame_queue.front();
frame_queue.pop();
lock.unlock();
HB_VENC_SendFrame(venc_chn, &frame); // 异步发送
// 编码完成通过回调获取 H.264 数据
}
}
| 项目 | 说明 |
|---|---|
| 输入格式 | 必须是 NV12,不要转 BGR |
| 队列深度 | 建议 3-5 帧,太深增加延迟,太浅易丢帧 |
| 丢帧策略 | 队列满时丢旧帧(保证实时性) |
| 编码通道 | X5 支持多通道(0-7),可同时编码多路流 |
| 回调获取 | C++ 可用 HB_VENC_RegisterCallback 异步获取编码完成数据 |
如果您的需求是 摄像头 → 编码 → 推流 完整链路,直接使用 TROS 多媒体节点 更省心:
# 官方 TROS 方案已内置零拷贝 + 异步编码
ros2 launch hobot_venc hobot_venc.launch.py \
input_topic:=/camera_raw \
output_topic:=/h264_stream
参考文档:TROS 多媒体开发指南
| 方案 | 适用场景 | 帧率上限 |
|---|---|---|
| Python 双线程 | 快速验证/低帧率 | ~20fps |
| C++ 零拷贝 | 生产部署/高帧率 | ~60fps+ |
| TROS 节点 | 完整应用链路 | ~60fps+ |
如需 C++ 完整示例代码或 TROS 配置细节,可继续提问!![]()
分析日志发现双线程竞争导致Input失败(ret=-268435443)和崩溃。核心问题:Input和GetOutput并发调用硬件API冲突。