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 控制是否参与整体编译;cfg 目录放 JSON 配置文件;src 目录下的 vio_scenario_sample.c 是 main 入口。
1.4. API 流程说明
API 的调用流程可以参考下面这张图:
主干代码大致是这样:
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 optsret = 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 应用处理接口”。
获取数据和释放数据的代码:
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_HBPLAYERPYM_LAYER_TYPE pym_layer_type = (PYM_LAYER_TYPE)g_pym_show_layer;
2. 编译
2.1. 编译环境
本 sample 的编译环境直接用 SDK 自带的 build 工具就行,具体操作参考“Build 环境建立”。
2.2. 编译说明
编译时需要 VPS 系统相关的头文件:
#include "hb_vin_data_info.h"#include "hb_vpm_data_info.h"#include "hb_vio_interface.h"
依赖的库如下:
LIBS += -lvio -lpthread -lalog -lhbmem
编译命令:
# 进入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 测试命令:
/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 测试命令:
/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 测试命令:
/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 测试命令为例:
/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 参数指定 VIO 配置文件路径,该 JSON 的具体配置参考“VPM 配置”。
-c 参数指定 camera 配置文件路径,该 JSON 的具体配置参考“J6X Camera 配置说明”。
-m 参数为 1,表示使能 pipe0 数据流。
-l 参数为 1000,表示获取 1000 帧 PYM 数据。
-s 参数为 10,表示 dump 前面 10 帧 PYM 数据。
除了以上参数,还有几个可选项:
- 增加
-t参数,例如-t 50000表示程序最长运行 50000ms。当-t和-l同时使用时,各线程只要满足其中一个条件(获取到指定帧数或达到运行时间)就会退出。一般情况下不建议同时使用这两个参数。 - 增加
-e参数,例如-e 2表示通过 hbplayer 看图工具显示 PYM ds 层第 2 层。 - 增加
-r参数,例如-r 1表示开启自恢复模式,热拔插后能自动恢复,最长等待 15s,超过 15s 没插上就会报错退出。
1.21.3.4.3. 运行结果说明
程序运行时,可以用下面的命令查看每个 IP 的帧率。如果不开启 dump,帧率符合预期就说明程序跑通了。
cat /sys/class/vps/flow/fps
注意:这个命令每次执行间隔必须大于一秒,否则帧率数据会变成 0。
1V 测试结果:
帧率如下:
2V 测试结果:
帧率如下:
6V 测试结果:
帧率如下:
以 6V 测试为例,加上 -t 5000 指定运行 5000ms,结果如下——5000ms 后线程正常退出。其他场景用 -t 参数的现象类似,不再重复。
如果开启自恢复模式(-r 1),摄像头意外断开后各 pipe 会在报错的同时尝试自恢复。恢复正常连接后,当前 loop 报错结束,下一次 loop 到来时就能正常取流,不再继续报错:
若通过 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 配置文件:/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,或者直接用环境变量来选择帧率:
export CAM_CONFIG_SELECT=config_25fps
综上,6V 25fps 场景的完整测试命令如下:
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
运行后查看实时帧率,应该是预期的 25fps:
如果不需要 25fps,执行下面命令取消环境变量,再跑测试命令即可:
unset CAM_CONFIG_SELECT
其他场景修改帧率的方法和过程完全类似,不再赘述。
用户还可以在 camera 配置文件中指定效果库文件(不配置或置空则用默认),例如指定 lib_CW_OX8DGB_AST1_065_L.so:
"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 工具看图。先设置平台、IP 地址等参数:
以 6V 测试为例,在命令后加上 -e 2 显示 ds 层第二层:
/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 看图的方法和效果完全一样,不再赘述。
