vioplugin 无法正常退出

代码是这样的:-

auto vio_plg = std::make_shared(vio_config_file);-
vio_plg->Init();-
vio_plg->Start();-
…-
vio_plg->Stop();

vio_plg->DeInit();

vio_plg = nullptr;

printf(“==vio_plg exit()\r\n”);-

结果程序退出时报错,系统卡住:-
terminate called after throwing an instance of ‘cv::Exception’

what(): OpenCV(3.4.5) /tmp/tmp.fAVojfHTaz/modules/imgproc/src/imgwarp.cpp:1708: error: (-215:Assertion failed) !_map1.empty() in function ‘remap’

[ 609.177012] [S0]GP0(res 4, rcnt 0)

[ 609.180454] [S1]GP0(res 4, rcnt 0)

[ 609.183880] [S3]GP0(res 4, rcnt 0)

[ 609.190337] [S2]GP0(res 4, rcnt 0)

[ 609.217021] [S0]GP0(res 4, rcnt 0)

[ 609.220465] [S1]GP0(res 4, rcnt 0)

[ 609.223886] [S3]GP0(res 4, rcnt 0)

[ 609.230343] [S2]GP0(res 4, rcnt 0)

[ 609.257024] [S0]GP0(res 4, rcnt 0)

[ 609.260480] [S1]GP0(res 4, rcnt 0)

…-

/*

* @Description: implement of vioplugin by J3 media lib

* @Author: hangjun.yang@horizon.ai

* @Date: 2020-08-22 16:00:00

* @LastEditors: hangjun.yang@horizon.ai

* @LastEditTime: 2020-08-22 18:00:00

* @Copyright 2017~2020 Horizon Robotics, Inc.

*/

你好,我是地平线研发负责vio相关模块。有几个问题需求确认下以方便我们复现和解决:

1. 退出出现上述问题是必现还是偶现?

2. 使用的环境:

a) 使用的镜像版本是什么,利用 cat /etc/version来确认。

b) 使用的AI Express版本?以及是从哪儿获取的代码?

c) 跑的是哪个solution?以及对应使用的是哪个sensor?

d) 代码有做过修改吗?如果有,请贴出修改的部分。

这里面是opencv的报错,您可以查看下似乎否是图像的内存没有释放

opencv会自动管理mat,不必手动去释放图像的内存的;-
另外,整段代码来源于贵司,没看到说明文档,所以想请贵司协助确认一下,vioplugin stop之后,哪里可能出问题,谢谢;

是必现的;-
环境:-
1,镜像版本:x3j3_lnx_db_20210616 debug-
2,AI Express版本不大清楚:

代码上对应的软件版本:

/*

* @Description: implement of vioplugin by J3 media lib

* @Author: hangjun.yang@horizon.ai

* @Date: 2020-08-22 16:00:00

* @LastEditors: hangjun.yang@horizon.ai

* @LastEditTime: 2020-08-22 18:00:00

* @Copyright 2017~2020 Horizon Robotics, Inc.

*/

代码没有做过修改;-

板子连接的是1280*720的摄像头(海康思通);-

尝试做过一些调试:-
发现在退出的时候,会先调用stop函数;

int VioProduce::Finish() {

if (is_running_) {

is_running_ = false;

}

WaitUntilAllDone();

return kHorizonVisionSuccess;

}

在WaitUntilAllDone() 无法返回;-
因为 consumed_vio_buffers_ 始终大于0;-

再往下跟,发现这个值和以下两个函数有关:

bool VioProduce::AllocBuffer() {

LOGV << “AllocBuffer()”;

LOGV << "count: " << consumed_vio_buffers_;

if (consumed_vio_buffers_ < max_vio_buffer_) {

consumed_vio_buffers_++;

LOGV << “alloc buffer success, consumed_vio_buffers_=”

<< consumed_vio_buffers_;

return true;

}

return false;

}

void VioProduce::FreeBuffer() {

LOGV << “FreeBuffer()”;

if (0 == consumed_vio_buffers_)

return;

consumed_vio_buffers_–;

LOGV << “free buffer success, consumed_vio_buffers_=”

<< consumed_vio_buffers_;

}

然而,在运行时,很容易卡到

int VioCamera::Run() {-

if (cam_type_ == “mono”) {

//1. check allow buffers , >=max_vio_buffer_, wait…

while (!AllocBuffer()) {

LOGV << “NO VIO_FB_BUFFER”;

std::this_thread::sleep_for(std::chrono::microseconds(1));

// continue;

}-
导致无法退出;-

或者退出整个while循环后,仍然无法让consumed_vio_buffers_ =0;-
导致WaitUntilAllDone() 无法返回;-

从而整个程序无法退出;

因为对这块的代码不是很了解,想请贵司协助处理一下,谢谢。-

我司开发人员建议使用gdb调试进行断点测试哈

请问关于这个问题,有没有一些指导思路呢?

你好。

1. 原因:consumed_vio_buffers_ 始终大于0 说明订阅这个vio message的消费对象(例如bpu模型推理模块对象或者codec编码模块),没有释放这个message。导致consumed_vio_buffers没有执行减一操作。

2. 代码实现原理:vio每发送一个message前,consumed_vio_buffers_ 会加一,接收者消费完这个message后,message析构函数内会自动做销毁动作(释放金字塔图+consumed_vio_buffers减一操作)

3. 建议:你这边跑的是哪个solution代码?试试其他的solution呢?现在是单路camera还是多路?

好的,我查看一下,谢谢。-
现在是多路camera(3~4路);solution不确定;