3. RK AIQ软件框架

好,咱们进入第三章。这一章我打算聊聊RK AIQ的软件框架。说实话,很多刚接触RK平台的工程师,一上来就被AIQ的代码结构搞懵了。代码量大,目录深,不知道从哪看起。

我个人习惯是,先看框架,再看细节。就像盖房子,你得先知道哪是承重墙,哪是隔断,才能决定怎么装修。AIQ也是一样,搞懂它的架构设计、插件机制和工具链,后面调参才能得心应手。

3.1 AIQ架构设计:分层与解耦

RK AIQ的全称是Rockchip Artificial Intelligence & Image Quality。说白了,它就是把传统的ISP调优和AI算法揉在了一起。但揉得好不好,关键看架构。

我画了一张架构分层图,你先有个整体印象:

RK AIQ 软件架构分层 应用层(Application Layer) Camera HAL / 3A库调用 / 用户自定义算法 算法插件层(Algorithm Plugin Layer) AE / AWB / AF / 去噪 / HDR / 锐化 每个算法独立.so,通过插件接口注册 核心调度层(Core Scheduler) 任务队列管理 / 帧同步 / 参数仲裁 多算法并发时的优先级与互斥处理 硬件抽象层(HAL) ISP寄存器读写 / Sensor驱动封装 / 硬件参数下发 各层之间通过标准接口通信,上层不关心下层实现细节

你看,从上到下分了五层。每一层只干自己的事,接口是固定的。这样做的好处是——你想换一个AE算法?没问题,只要实现插件接口就行,核心调度层和HAL层完全不用动。

我在项目中遇到过最典型的例子:客户想用自己的AE算法,但又不想动底层驱动。按照这个架构,我们只需要写一个新的AE插件,注册进去,调度层自动就接管了。前后只花了两天时间。

3.2 算法插件机制:动态加载与注册

插件机制是AIQ的灵魂。你想想看,ISP调优涉及十几个算法模块,如果全写死在一个库里,那维护成本得多高?

RK的做法是:每个算法独立编译成一个动态库(.so),通过统一的接口注册到AIQ框架中。框架启动时,扫描指定目录下的插件,按优先级加载。

核心接口就三个:

// 插件必须实现的接口
typedef struct {
    const char* name;           // 算法名称,如 "ae_algo"
    int32_t priority;           // 优先级,数值越小优先级越高
    int32_t (*init)(void* cfg); // 初始化
    int32_t (*run)(void* in, void* out); // 每帧处理
    int32_t (*deinit)(void);    // 反初始化
} algo_plugin_t;

// 注册宏
#define REGISTER_ALGO_PLUGIN(plugin) \
    __attribute__((constructor)) void register_##plugin() { \
        aiq_register_plugin(&plugin); \
    }

嗯,这里要注意:__attribute__((constructor)) 这个GCC扩展,保证了库加载时自动执行注册函数。你不需要手动调用任何注册代码。

我的习惯:开发新算法时,先用一个空壳插件跑通注册流程,确认框架能识别到你的.so文件,再填充算法逻辑。这样能快速定位问题是出在框架对接还是算法本身。

我曾经踩过一个坑:插件注册成功了,但run函数一直没被调用。查了两天才发现,是优先级设得太低,被其他算法模块的耗时任务阻塞了。调度层是按优先级和时间片轮转的,优先级低的算法可能几帧都轮不到一次。

3.3 Tuning工具链介绍:从离线到在线

工具链这块,RK提供了两套方案:离线调优工具和在线调试工具。我分别说一下。

对比项 离线调优工具 在线调试工具
运行环境 PC端(Windows/Linux) 设备端(RK平台)
数据来源 预先采集的RAW图 实时摄像头数据流
调优方式 批量处理 + 参数扫描 实时调节 + 即时预览
适用场景 前期标定、参数初版 现场微调、问题复现
输出产物 XML/JSON参数文件 直接写入设备寄存器

离线工具我用的最多的是 RKISP_Tuner。它支持加载RAW图,然后模拟ISP pipeline跑一遍,你可以逐个模块调参数,看效果。调完了导出XML,烧到设备里就行。

在线工具是 RKAIQ_Online,通过adb或网络连接设备,实时拉取每一帧的统计信息,你改一个参数,下一帧就能看到效果。这个在调试AE收敛速度、AWB色温跳变时特别有用。

注意:在线调试时,不要同时修改多个强相关参数(比如同时调AE的目标亮度、AWB的色温权重和去噪的强度)。我曾经这么干过,结果画面直接花了,根本分不清是哪个参数导致的。一次只改一个变量,这是调试的基本素养。

3.4 工具链工作流程

我整理了一个典型的工作流程,你照着走,基本不会乱:

  1. 采集RAW图:用RK提供的抓图工具,在不同光照、不同场景下采集RAW数据。至少采集20组以上。
  2. 离线标定:在PC上用RKISP_Tuner加载RAW图,做LSC、BLC、AWB等基础标定。生成标定文件。
  3. 参数初调:在离线工具里调整各模块参数,直到主观效果满意。导出XML参数文件。
  4. 烧录验证:把XML文件烧到设备上,跑实际场景,看效果是否符合预期。
  5. 在线微调:如果发现某个场景有问题(比如室内暖光下偏色),用RKAIQ_Online连接设备,实时微调对应参数。
  6. 固化参数:把最终调好的参数合并到固件中,发布。

这个流程我走了不下几十遍了。刚开始做的时候,我总想跳过离线标定,直接在线调。结果发现,在线调出来的参数换个场景就崩了。离线标定虽然麻烦,但它是参数鲁棒性的基础。

核心要点:AIQ框架的插件机制让算法模块解耦,工具链让调优过程可追溯。你不需要理解每一行底层代码,但必须清楚数据是怎么从sensor流到算法、再流回硬件的。这个数据流搞明白了,调优就成功了一半。

好了,这一章的内容就这些。框架、插件、工具链,这三样东西是你在RK平台上吃饭的碗。碗端稳了,后面才能谈怎么炒菜。