关于可见光通信具体实现方案的一些研究

资源分享

首先分享几篇很好的可见光通信帖子。

介绍可见光通信背景:

基于图像传感器的可见光通信的优缺点分析:

可见光成像通信(OOC)驱动频率区域的计算公式:

可见光成像通信(Optical Camera Communication,OCC)——基于IEEE 802.15.7-2018标准的解读:

看完上面这三篇你就差不多了解了可见光通信是什么了。

【可见光室内定位】基于图像传感器CMOS的可见光室内定位技术:

这篇文章详细的介绍了可见光通信编码解码的基本技术原理,包括卷帘快门效应、如何用 OpenCV 解码等等。还介绍了可见光定位的原理,也可以了解一下。

介绍

可见光通信(visible light communication,VLC)是通过以人眼识别不了的高频(>200HZ)来控制LED的亮度变换。在照明的同时实现通信。对于VLC的接收端可以分为两种类型:PD(光电转换器)和camera。传统的意义的VLC可以认为是以PD为接收端的非成像通信。

将信息编码到可见光里面,不仅可以实现照明功能,还解决了需要介质承载的问题,采用用户手机摄像头可以识别的可见光,用户只需要下载手机APP就可以实现信息的解析。

优势

前二维码/条形码存在的信息单一不可变、信息容易被复刻、污染环境。

例如如果你在某物品前面贴了二维码,扫码即可跳转到详情链接,加入日后你的跳转链接更换,你就必须更换二维码,非常麻烦。而且大家扫码二维码之后都能看到内容是什么,安全性也不高。

使用可见光通信编码,运动到那些本来就有光源的场景,所需成本低,而且别人不知道你的编码就无法解码,安全性高。另外只需要给操控光源的单片机发送命令就可以改变编码内容,非常方便。

技术原理

信息发送端

远程服务器将这物品的数据信息以二进制比特流的形势通过无线网络发送给信息发送端的接收设备。

接收设备上的光源驱动模块,根据所述数据信息产生驱动电流,驱动各光源发出包含对应数据信息的光信号。

通过开关调制(OOK)技术,对数据进行调制,生产“01”符号流,并通过灯具内 的控制器输出高低电平信号,(即高电平代表“1”,低电平代表“0”),该电平信号控制 LED 的驱动三极管控制 LED 亮灭,从而使 LED 灯具发送编码。

信息接收端

信息接收端包括获取光信号和解码功能,一部安装 APP 的智能手机即可作为接收端。其工作过程为:手机摄像头接收光源发出的包含数据信息的光信号,将光信号传输给解码软件的信息转换模块;信息转换模块接收光信号并将其转换成对应的数据信息,然后将数据信息传输给解码模块;解码模块接收所述数据信息并进行解码。

信息传输方法

编码方案

这里提出一种比较可靠的编码传输方法,仅供参考。

在发送端,把数据包结构分为开头、数据、结尾三个部分。

开头部分均为11110,即五个1一个0。数据部分使用4B6B编码,这种编码可以保证编码后的数据最多出现4位连续的1或0。结尾部分均为000001,即五个0一个1。这样的编码方式可以很明显的分辨出来开头和结尾——开头是亮条纹最宽的地方,结尾是宽条纹最暗的地方。在数据部分,除了采用4B6B编码,还可以使用汉明码编码,在一定程度上纠正数据在传输过程中的发送的错误。

注意,这种编码方式仅为参考,实际上包结尾部分的连续五个0会导致很宽的暗条纹,可能导致闪烁的出现,更好的编码方法等待各位的研究。

解码方案

使用安卓APP进行解码。

首先需要大概了解一下安卓开发,我推荐这个教程来速成:

解码部分需要用安卓 APP 编写,因为需要调用摄像头,且需要控制摄像头的快门速度,这点无法通过微信小程序实现,故只能采用编写安卓 APP 的方式。

解码部分主要分为三个阶段,我们以下图为例讲解:

图片

  1. 灰度处理

得到 LED 的 RGB 三色图后需要进行灰度化处理,从而方便后续的形态学操作。

图片

  1. 二值化处理

灰度图像的每个像素点值在 0~255 内,背景区域像素点值较小,而属于 LED 区域的值较大,为了方便后续区分 LED 区域以及解码,调用 Opencv 里的 THRESH_OTSU 函数进行图像二值化。

图片

  1. 闭运算操作

为了确定 LED-ROI 区域和中心坐标,接下来对二值化图像进行闭运算操作,首先进行腐蚀操作去除噪点,再对图像进行膨胀操作把被暗条纹隔断的 LED 区域连接起来。

图片

  1. LED 轮廓检测

在得到填充满的 LED 图像后,可以进行轮廓检测并计算轮廓中心。轮廓检测可以使用 OpenCV 库里的 findCounters 函数,得到 LED-ROI 区域的轮廓,并将轮廓质心作为 LED 轮廓的中心。同时,除了 LED 区域的背景像素之和为零,统计每一行、列的像素总和从而确定 LED 的外接矩形框,根据外接矩形框对 LED 区域进行裁剪方便后续的 LED-ID 解码。

图片

  1. 解码

前面的操作做完之后,只需将亮暗条纹转化为 0/1 数据码,根据编码来解码即可。