ADAS远程调试软件——基于QT OpenGL的视频及毫米波与视觉目标显示

14 篇文章 0 订阅

ADAS远程调试软件——基于QT OpenGL的视频及毫米波与视觉目标显示

微信公众号:幼儿园的学霸
个人的学习笔记,关于OpenCV,关于机器学习, …。问题或建议,请公众号留言;

最近忙于ADAS项目,目前,项目代码部分已基本完成,经过自测没有问题,需要交给测试人员按照测试用例要求对每一项进行测试。为方便测试人员的测试工作,特编写了一个调试软件,便于其测试工作。趁今天晚上有时间,赶紧进行总结,现将相关框架说明如下。

目录


缘由

由于ADAS软件运行在一个开发板上,在车辆上实际运行时,不可能给开发板配置一个显示屏来显示车道线/车辆等的检测过程,而对于我们开发人员来讲,界面是必须的,通过将调试信息实时显示在界面上,可以方便我们查看算法的效果,及时修改配置参数,以最优化检测结果;对测试人员来说,可以通过界面观察ADAS软件各项指标是否满足要求.对此,有几种方案可以选择:
1°显示屏.测试时,带一个显示屏可以完美解决问题,直接将各种调试过程通过屏幕显示,同时可以修改参数进行调试.不过受限于客观条件,不可能每次测试时带上一个显示屏.
2°teamviewer.通过远程控制软件,这个问题也可以迎刃而解,不过…仍然不能采用.
3°自己编写软件,通过网络传输视频.
4°其他方案.

基于某些因素,最终采用方案3进行,因此需要编写一套代码来方便测试人员进行测试,最好是傻瓜式的,打开即可运行. 本文即是讲解方案3的实现.

ADAS硬件框架

整个ADA模块的硬件架构如图所示.对于其他模块,图中未展示.
ADAS硬件架构
开发板的输入数据有:1)摄像头的视频数据;2)毫米波数据–通过交换机接收;3)车辆状态信息;4)预警控制指令;5)调试指令等.
开发板的输出结果有:1)预警结果;2)视频等调试信息;
可以看到,上述硬件位于一个局域网内,可以通过网络进行信息的传递。

ADAS远程调试软件框架

考虑到软件的跨平台特性,以及给测试人员操作的便捷性,远程控制软件采用QT进行开发,这样方便进行界面开发,以及后续的windows平台移植。当然,最初也考虑过采用python Tkinter进行界面开发,不过由于在开发界面时,软件的核心代码已经用C++编写完毕,时间紧迫,没必要重新编写一套python的代码,所以就选择了QT进行界面部分的编写。

软件功能划分

1)视频接收部分.将ADAS软件的检测结果实时显示.这样测试人员可以方便知道当前车道线检测是否准确,车辆是否漏检、误检等;
2)目标点接收、显示.将车道线的世界坐标、障碍物的世界坐标以及毫米波信息显示出来,观察视觉和毫米波的融合情况,以及车道线坐标转换是否正常.
3)配置文件更新.ADAS软件有一部分调试参数可以修改,如是否保存视频,是否发送检测结果等,通过将原始视频保存下来,可以在事后进行分析.配置文件部分截图如下:
ADAS软件配置界面
ADAS软件在接收到新的配置文件后,需要自动重启加载更新后的参数。

视频发送/接收、显示

在我的调研中,视频的发送/接收有3种选择:1)通过socket()函数;2)通过OpenCV gstream 功能;3)采用RTMP直播流的方式。这3种方案我均尝试过。其特点总结如下:

1)通过OpenCV gstream功能,编写代码最为简单,视频的发送和接收可以通过cv::VideoWrite()cv::VideoCapture()函数实现,几行代码即可搞定。简单示例见网址:https://github.com/leonardohaig/cv_gstream.但是其发送时需要指定接收方IP地址,对于接收方来说,若IP地址和发送端指定的IP不一致,将不能接收到数据。

2)采用RTMP直播推流的方式,编写发送端代码有一定的复杂度(接收端代码仍然非常简单),可以保证接收视频的清晰度,但是在我的测试中发现,接收方在接收视频时,不能保证实时。也即是说,如果发送端已经发送了一段时间的视频后接收端此时才打开,那么此时接收端显示的视频明显和发送端的视频不同步,有滞后现象。当然,这个也有可能是编写代码的原因导致的,未详细研究。

3)通过socket()函数,该方式需要自己编写发送和接收代码,比较灵活自由。我采用了该方式。当然,视频不能直接发送,需要经过编码(发送端)和解码(接收端).对应的函数为cv::imencode()cv::imdecode(),对于1080P的图像来说,网络传输过程中最好进行压缩,以降低延迟和丢包现象的发生。图片编码和压缩代码如下:

int jpeg_quality = 80;
std::vector<int> params;
params.push_back(cv::IMWRITE_JPEG_QUALITY);
params.push_back(jpeg_quality);

std::vector<uchar> img_encoded;
cv::imencode(".jpg", videoFrame, img_encoded, params);

代码中的int jpeg_quality = 80;表示图像压缩质量,该值范围为0-100,值越大,图像质量越高,当然,传输的数据量也越大,延迟以及丢包也相对比较严重。该参数需要自己根据实际情况测试、衡量后进行选择。

在控制软件接收到视频数据后,需要进行显示,显示图片可以直接在界面上画出来,或者采用显示控件进行显示。我采用了基于QT的QOpenGLWidget控件编写视频显示控件进行显示。

目标点接收、显示

对于车道线、障碍物、毫米波信息等如果仅仅在图像上进行展示,观察其深度信息不够直观,因此我将这些目标在世界坐标系下的坐标通过网络发送出来,接收端收到数据后将其在界面上进行展示。坐标点的显示部分仍然采用QT的QOpenGLWidget控件。不过该控件有一个特点,显示文字比较麻烦。如果采用QGLWidget,可以直接采用函数renderText函数显示文字,不过需要额外依赖opengl库,对我来说,依赖越少,跨平台移植越简单,因此未采用该控件。

配置文件更新

该部分用来修改ADAS软件的配置文件。其做法为控制软件向ADAS软件请求获取某个配置文件,控制软件收到之后,由测试人员对配置参数进行修改,然后将修改后的配置文件上传会ADAS软件,ADAS软件接收到配置文件后程序会自动退出,然后由开发板上的看门狗再次将其启动。

软件效果

ADAS控制软件启动后界面如图所示:
ADAS_Control界面
界面分为左中右3部分,左边负责配置文件的下载和上传,配置文件列表的显示采用树控件;中间显示目标点在世界坐标系下的坐标,采用QOpenGLWidget控件,竖直和水平红线表示Y轴(深度方向)和X轴,原点可以理解为摄像头位置,可以通过鼠标实现网格的缩放以及平移;右边显示接收到的视频。整个界面显示部分可以根据主界面的大小自动调整。
软件运行之后的界面见下面视频(视频卡顿是由于截屏的原因,请忽略,实际运行时,无该现象)。

ps:核心代码的编写很快,但是涉及到界面交互之后,明显感觉到代码的编写速度慢了下来。



下面的是我的公众号二维码图片,欢迎关注。
图注:幼儿园的学霸

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值