专栏算法工具链vioplugin 无法正常退出

vioplugin 无法正常退出

已解决
ohenry2021-06-11
161
8
代码是这样的:

auto vio_plg = std::make_shared<VioPlugin>(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.

*/

算法工具链
评论2
0/1000
  • yong.wu
    Lv.1

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

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

    2. 使用的环境:

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

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

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

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

    2021-06-15
    2
    4
    • ohenry回复yong.wu:
      是必现的;
      环境:
      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

      LOGV

      if (consumed_vio_buffers_ < max_vio_buffer_) {

      consumed_vio_buffers_++;

      LOGV

      if (0 == consumed_vio_buffers_)

      return;

      consumed_vio_buffers_--;

      LOGV

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

      while (!AllocBuffer()) {

      LOGV

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

      // continue;

      }
      导致无法退出;

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

      从而整个程序无法退出;
      因为对这块的代码不是很了解,想请贵司协助处理一下,谢谢。

      2021-06-18
      0
    • ohenry回复yong.wu:

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

      2021-06-26
      0
    • yong.wu回复ohenry:

      你好。

      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还是多路?

      2021-06-26
      0
    • ohenry回复yong.wu:
      好的,我查看一下,谢谢。
      现在是多路camera(3~4路);solution不确定;
      2021-07-08
      0
  • Horizon_guosheng
    Lv.1

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

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

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

      2021-06-15
      2