J6B vio scenario sample

1. 功能概述

本文的 sample 实现单路、多路 VIO 通路接入和处理,以下介绍 1V、2V、6V 接入的场景。

1.1. 软件架构说明

调用 VIO API 来实现整个数据通路,实现多路 camera 接入。同时能够 dump 每一路数据的图像。 软件控制图如下:

1.2. 硬件数据流说明

每个场景的图中已经标明硬件连接关系。

备注

运行 sample 示例需要硬件外设满足场景图中的硬件连接关系,如果不满足则需要根据当前的硬件连接更改配置文件 hb_j6dev.json 或更换硬件外设。 修改配置文件参考:VIN 配置 章节。

1V 场景如下:

2V 场景如下:

6V 场景如下:

1.3. 代码位置及目录结构

sample 代码位置在 SDK 工程目录 {sdk_dir}/test/samples/platform_samples/source/S83_Sample/S83E04_Module/vio_scenario_sample。

根目录包含 Kconfig 和外部接口的 Makefile , Kconfig 用于控制该 sample 是否加入整体编译;cfg 目录中包含了本 sample 使用到的 JSON 配置文件;src 目录下的 vio_scenario_sample.c 是 main 入口的所在文件。

1.4. API 流程说明

API 流程图如下:

主干代码:

Plain 复制代码
int main(int argc, char *argv[])
{
    int ret = 0;
    pthread_t thid[HB_VIO_PIPELINE_MAX];
    uint32_t pipe_id[HB_VIO_PIPELINE_MAX];

    signal(SIGINT, get_exit_signal);

    // get opts
    ret = get_opts_for_vio(argc, argv);

如果不做单独的 sensor 开关流,上面代码中的 hb_cam_start 和 hb_cam_stop 可不调用,hb_vio_start_pipeline 和 hb_vio_stop_pipeline 已经对应包含了 sensor 开关流功能。

其他 sample 文档中涉及这两对 api 的代码的解释同上,具体可参考 VIO 应用处理接口

获取数据及释放数据的代码:

Plain 复制代码
int vio_worker_func(uint32_t pipe_id, int loop_count)
{
        int ret = 0, recovery_time = 0;
        pthread_t recov_thid[HB_VIO_PIPELINE_MAX];
        pym_buffer_v3_t pym_buf;
        VIO_DATA_TYPE_E pym_data_type;
        pym_data_type = HB_VIO_PYM_DATA_V3;
        struct timeval recovery_start_time, recovery_current_time;
#ifdef ENABLE_HBPLAYER
        PYM_LAYER_TYPE pym_layer_type = (PYM_LAYER_TYPE)g_pym_show_layer;

2. 编译

2.1. 编译环境

本 sample 的编译环境使用 SDK 中的 build 工具,请参考: Build 环境建立

2.2. 编译说明

本 sample 编译需要 VPS 系统相关的头文件:

Plain 复制代码
#include "hb_vin_data_info.h"
#include "hb_vpm_data_info.h"
#include "hb_vio_interface.h"

编译依赖的库有如下:

Plain 复制代码
LIBS += -lvio -lpthread -lalog -lhbmem

编译命令:

Plain 复制代码
# 进入SDK所在目录{sdk_dir},并source构建环境(参见上)。
# 编译本sample:
bdm libvio-scenario-sample
# 输出文件:
{sdk_dir}/install/aarch64le/sample/S83_Sample/S83E04_Module/vio_scenario_sample

3. 运行

3.1. 支持平台

J6B Plus Evm

3.2. 硬件环境搭建

接口连接如下:

模组:联创模组 OVX8D、IMX623,LONGHORN-ISX031。

连接方式: 一路 OVX8D FOV120 通过 4 合 1 线束的 C 口连接到板子的 DES1;

一路 IMX623 FOV60 通过 4 合 1 线束的 D 口连接到板子的 DES1;

四路 ISX031 通过 4 合 1 线束的 ABCD 口连接到板子的 DES2。

3.3. 板端部署及配置

刷写系统软件镜像后,本 sample 的可执行文件位于板端: /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/bin/;

需要用到的配置文件位于板端: /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/。

3.4. 运行指南

3.4.1. 运行方法

1V 测试命令:

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/bin/vio_scenario_sample \
-v /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/Scenario_1V_cpe0_sen_cim0_isp0_pym0_mode2_sample/vpm_config.json \
-c /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/case_j6evm/1V_OVX8D_RX0/hb_j6dev_plus.json -m 1 -l 1000 -s 10

2V 测试命令:

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/bin/vio_scenario_sample \
-v /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/Scenario_2V_cpe0_sen_x8d_imx623_cim0_isp0_pym0_mode1_sample/vpm_config.json \
-c /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/case_j6evm/2V_OVX8D_IMX623_RX0/hb_j6dev.json -m 3 -l 1000 -s 10

6V 测试命令:

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/bin/vio_scenario_sample \
-v /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/Scenario_6V_cpe04_sen_cim04_isp0_pym04_sample/vpm_config.json \
-c /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/case_j6evm/6V_1xOVX8D_1xIMX623_RX0_4xISX031_RX4_SYNC/hb_j6dev.json -m 63 -l 1000 -s 6

3.4.2. 运行命令行说明

vio_scenario_sample:应用程序名字。

下面的表格是具体参数的说明:

例如上面的 1V 测试命令:

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/bin/vio_scenario_sample \
-v /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/Scenario_1V_cpe0_sen_cim0_isp0_pym0_mode2_sample/vpm_config.json \
-c /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/case_j6evm/1V_OVX8D_RX0/hb_j6dev_plus.json -m 1 -l 1000 -s 10

-v 参数是 /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/Scenario_1V_cpe0_sen_cim0_isp0_pym0_mode2_sample/vpm_config.json,代表 VIO 配置文件的所在位置,json 里面的具体配置可参考 VPM 配置

-c 参数是 /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/case_j6evm/1V_OVX8D_RX0/hb_j6dev_plus.json,代表 camera 的配置文件的所在位置,json 里面的具体配置可参考 J6X Camera 配置说明

-m 参数是 1,表示使能 pipe0 数据流;

-l 参数是 1000,表示获取 PYM 数据 1000 帧;

-s 参数是 10,表示 dump 前面 10 帧 PYM 的数据。

除了上述已有参数外,可增加 -t 参数,例如 -t 50000 表示程序最长运行时间为 50000ms。 当 -t 参数与 -l 参数同时使用时,各线程在满足其中任意一个条件,即已获取指定的 PYM 数据帧数或者已达到指定的运行时间后就会退出,一般情况下不建议同时使用这两个参数。

可增加 -e 参数,例如 -e 2 表示通过 hbplayer 看图工具显示 PYM ds 层第 2 层。

可增加 -r 参数,例如 -r 1 表示开启自恢复模式,在热拔插后能够进行自恢复,支持最长 15s,15s 后没插上就自动报错退出。

1.21.3.4.3. 运行结果说明

程序运行时通过下面的命令可以看到每个 IP 的帧率,如果不开 dump,帧率符合预期,则程序正常运行。

Plain 复制代码
cat  /sys/class/vps/flow/fps

上面的命令只能间隔一秒以上执行一次,过快执行帧率数据会变成 0。

1V 测试结果:

帧率如下:

2V 测试结果:

帧率如下:

6V 测试结果:

帧率如下:

以 6V 测试为例,通过 -t 5000 指定运行时间为 5000ms,测试结果如下,5000ms 后线程正常退出。 其他场景下使用 -t 参数的现象均类似,不再赘述。

可以通过 -r 1 开启自恢复模式,此时在摄像头意外断开连接后,各 pipe 在报错的同时将尝试进行自恢复操作。当恢复正常连接后,各 pipe 将在当前 loop 报错结束、下一次 loop 到来后正常取流,不再继续报错:

若选择通过 hbplayer 工具进行看图,hbplayer 将在自恢复成功后继续正常显示实时图像。

其他场景下使用 -r 参数选择是否开启自恢复模式的现象均类似,不再赘述。

3.4.4. 运行可变更说明

3.4.4.1. 帧率变更

本 sample 中各个 pipe 的帧率可以通过改动配置文件内容实现。如果需要帧率为 25fps,可直接修改所使用的 vpm_config.json 各 pipe 指定的 lpwm.json 文件中的 period 参数为 40000,即 40.000ms:

lpwm.json 配置文件中其他参数的功能说明和设置方法可参考: LPWM 使用

以 6V 测试为例,本 sample 提供了设为 LPWM 使用 中 25fps 场景推荐使用配置的 lpwm_25fps.json 文件: /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/case_j6evm/6V_1xOVX8D_1xIMX623_RX0_4xISX031_RX4_SYNC/lpwm_25fps.json ,及指定使用该 lpwm.json 的 vpm_config.json 文件: /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/Scenario_6V_cpe04_sen_cim04_isp0_pym04_sample/vpm_config.json 可以直接使用或参考修改;

此外,camera 配置文件 hb_j6dev.json 中各 port 的 fps 参数也需要对应更改为 25,或者可以直接使用环境变量选择帧率情形:

Plain 复制代码
export CAM_CONFIG_SELECT=config_25fps

综上,6V 25fps 场景的完整测试命令如下:

Plain 复制代码
export CAM_CONFIG_SELECT=config_25fps

/app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/bin/vio_scenario_sample \
-v /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/Scenario_6V_cpe04_sen_cim04_isp0_pym04_sample/vpm_config_25fps.json \
-c /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/case_j6evm/6V_1xOVX8D_1xIMX623_RX0_4xISX031_RX4_SYNC/hb_j6dev.json -m 63 -l 1000 -s 6

查看 6V 运行时的实时帧率为预期的 25fps:

如果不需要 25fps,那么执行如下命令,取消环境变量,再跑测试命令。

Plain 复制代码
unset CAM_CONFIG_SELECT

其他场景修改帧率的方法和过程均类似,不再赘述。

用户可在 camera 的配置文件中增加指定效果库文件,不配置或空时使用默认,例如指定 lib_CW_OX8DGB_AST1_065_L.so :

Plain 复制代码
"port_0": {
        "sensor_name": "ovx8dstd",
        "calib_lname": "lib_CW_OX8DGB_AST1_065_L.so",
        "serial_addr": "0x41",
        "sensor_addr": "0x11",
        "eeprom_addr": "0x51",
        "sensor_mode": 5,
        "fps": 30,
        "width": 3840,
        "height": 2160,

本 sample 提供了此场景下的 hb_j6dev.json 供参考,位于: /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/case_j6evm/6V_1xOVX8D_1xIMX623_RX0_4xISX031_RX4_SYNC/hb_j6dev.json 。

3.4.5. 看图结果

Dump 出的数据保存在当前目录下,例如上文中的 6V 测试命令执行后:

以 960x640_pipe5_pym_ds1_f2_roi_2.yuv 为例,该文件名具体代表宽 960,高 640 的 pipe5 PYM ds1 层输出图像的第 2 帧(f2),对应 loop 次数为 2(roi_2)。

需要额外说明的是,由于收敛时间,各 pipe 的前几帧图像可能出现效果不佳情况,属于正常现象,具体帧数也与实际模组有关,用户关注和使用后续正常帧即可。

此外,由于实际分配 buffer 时内存需要 16 对齐,当用户配置文件中设置的图像尺寸非 16 对齐时,按分配 buffer 大小 dump 出来的图像右侧就会出现无效数据,即右侧绿边,属于正常现象,可通过调整配置文件中的图像 width 为 16 的整数倍对齐内存大小或按图像实际大小保存。

本文的 sample 也支持通过 hbplayer 工具进行看图。首先在 hbplayer 中设置平台、IP 地址等相关参数:

以 6V 测试为例,可在 6V 测试命令后增加-e 参数 -e 2 显示 ds 层第二层:

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/bin/vio_scenario_sample  \
-v /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/Scenario_6V_cpe04_sen_cim04_isp0_pym04_sample/vpm_config.json \
-c /app/sample/S83_Sample/S83E04_Module/vio_scenario_sample/cfg/case_j6evm/6V_1xOVX8D_1xIMX623_RX0_4xISX031_RX4_SYNC/hb_j6dev.json -m 63 -l 1000 -s 6 -e 2

执行命令后,点击 hbplayer 左侧栏中的 connect 即可完成连接并在右侧界面看到实时 6V 图像:

当满足 -l 或 -t 参数指定的条件后,sample 将自动退出运行,也可通过 Ctrl+C 手动结束运行。其他测试场景连接 hbplayer 工具看图的方法和效果均类似,不再赘述。

相关推荐
BothSavage13 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn13 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽15 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六2 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程