聆思CSK芯片,会运行ap及cp两个固件。
ap:主要是涉及业务逻辑相关,如电机、led、智能跟随逻辑、串口通信等,ap代码可对外释放,客户可二次开发;
cp:主要运行聆思算法模型及摄像头相关驱动,并通过核间通信与ap交互,将摄像头送算法,出来的算法数据(如人形特征或者手势结果),输出给ap的回调接口,用户可通过该接口获取到数据并进行业务逻辑开发,cp不提供代码,仅提供编译好的固件,放置在ap代码中的res/目录下;
res:聆思算法模型,默认提供编译好的固件;
注意:cp及res固件由聆思编译好输出,放置于ap代码中的res目录下,ap需要用户自行编译,烧录需要烧录三个固件,具体烧录地址及指令可参考res目录下的
烧录说明.txt。
目前默认支持032A摄像头,DVP接口,算法分辨率320 X 240(6011B),及640 X 480(6011A)。
配置IO口相关属性及功能可以点击下载聆思IO口映射表 ————> 60xx_iomux_v1.0.xlsx。
聆思默认基础固件框架,使用的硬件IO口资源,全部在src/pin_config.h文件中定义。
用户查看是否IO口被冲突,可以通过这里来查看。
定义的硬件io口使用主要又分到几个模块使用:LED、电机、摄像头的DVP接口、I2C、串口。
串口可以配置成通讯口及日志口,串口打印日志方式为聆思芯片调试方式;
调试串口又分为ap和cp两个调试口,正常用户只需关注ap调试口即可。
默认cp日志口关闭,用户无需关注,该日志口为聆思辅助排查用户问题时候才会指导用户打开。
但注意ap和cp串口号及IO口不能被占用冲突。
注:默认ap通讯口没初始化,需要自己到boot_task初始化函数中创建线程初始化。
相关串口通讯的代码可参考task_prot.c中。
通讯口配置的宏和引脚配置主要在 uartcom.h 文件中的UART_PORT_APP宏定义配置串口号,在uart_port函数中配置引脚。
聆思跟随流程图简要说明(仅供参考,不一定与最新代码流程完全一致):

摄像头的数据给到聆思的算法接口(cp处理),聆思算法接口返回图片中的人物坐标以及人体特征等信息,用户通过获取该信息,自行做业务逻辑,比如点亮led,或者发送串口数据,驱动电机等等。
聆思云台方案处理摄像头的帧率在20fps左右,最低15+fps。
算法识别到的人越多,会影响处理的效率,正常最低可以处理15帧左右。
与算法相关的处理逻辑主要在ap/src/hsd_service/hsd_follow.c文件中处理。
摄像头每一帧数据给到算法(cp处理),cp会回调ap的接口函数hsd_receive_result_for_follow,从该接口输出算法的结果数据,如坐标,人体特征,手势等等,用户可以围绕该接口函数,展开自己的业务逻辑。
聆思基础框架相关接口说明:
算法返回的坐标在结构体中可以获取:hsd_head_shoulder_detect->head_shoulder_detect->ifr_rect:如下图所示:


手势处理结果接口:process_gesture_result,用户可在此做出对应业务逻辑。

将选中的人物ID设置到算法中(算法开始锁定跟踪): set_track_id_target,设置完成,算法不会再跟随目标ID,直到超时。
led显示:send_led_to_display,具体led灯控逻辑显示,在led_display.c文件中做处理;

目前仅支持032A及0328驱动!
cp_global_cfg.h文件中:

cp_global_cfg.h文件中:

注意:摄像头翻转需要等到摄像头初始化完成后才能翻转。
cp_dev_set.h中的
int camera_flip_set(uint8_t flip);
flip参数参考如下:
#define NO_FLIP (1 << 0) // 不反转
#define X_FLIP (1 << 1) // 水平/左右翻转
#define Y_FLIP (1 << 2) // 上下翻转

hsd_set_params(HSD_PARAM_GESTURE_FOR_VERTICAL, HORIZONTAL); //VERTICAL
具体可参考hsd_follow.c文件中的
int hsd_config_params(void)函数使用,如下图所示:

背景:由于每一帧都送聆思算法手势接口,会影响效率,影响识别结果及手势识别距离,故特地开放该宏定义可供用户适配,隔几帧才真正送一次算法接口。又为了规避一次手势引入的误识别,故采用多次手势识别数据作为一次识别结果的方式进行统计,相关宏定义如下图所示:
hsd_follow.c文件中:


如图示BODY_LOST_TIMEOUT_CNT宏,该宏表示,人物离开,不在摄像头范围内,算法保留框多久,聆思提供的基础sdk默认值是80帧,大概3s,用户可以根据自己实际需求改动该值;
但是由于环境及人物的变动,可能会引起算法波动,有可能环境或人物运动干扰了算法,导致人物重新回到摄像头范围内,算法识别到的人物ID变化(算法识别成另一个人),又由于锁定了上一个ID的人,从而在超时时间内,不跟随新的ID(可能人物还是同一个人物),所以建议用户谨慎延长锁定功能时长。
人物超时锁定功能与人物丢失判断不是一个概念,区别如下:
人物超时锁定:是指人离开后,算法依然会输出框的坐标(人物ID号还在,坐标随机);
人物丢失:在人物超时锁定的状态下,即便框还在,ID还在,坐标也还有,但是算法还有另外一个变量,表示人物已经不在摄像头中,看下一章节说明。


算法会给出time_out变量,表示人物是否存在于摄像头中,但由于可能会有误差波动,上层应用再针对优化,设置了阈值LOST_THRES,即判断多少帧的time_out变量为1之后,才真正判断人物是否存在,并置位全局变量g_track_id_target.exist,用户可以根据该变量自行开发逻辑,如设置led亮灭等操作。
将
hsd_follow.c文件中,
hsd_receive_result_for_follow函数,
里面的
if (property_id == LSF_CTL_MSGID_HSD_GESTURE)
改成
if(0),
并且将GESTURE_INTERVAL_FRAME宏的值,尽可能改大,如1000或10000,
即等同于关闭手势功能。


其他相关算法配置,如头肩特征识别阈值(HEAD_SHOULDER_DETECT_THRES)、手势阈值(GESTURE_THRESHOLD_OK等),人离开摄像头后的超时时间(BODY_LOST_TIMEOUT_CNT,超时80帧,约3s)等等,用户可自行配置在hsd_follow.c中改动。
