在我之前的文章中,我向大家介绍了Simulink环境下如何使用通信模块建立两个Simulink程序之间的数据传输,而对于无人驾驶平台Qcar的用户来说,由于QCar支持了多种编程语言,如果使用了Python作为编程语言,就会遇到两台QCar通信以及QCar与其他只支持Simulink编程的设备之间的通信问题。在本篇文章中我将向各位介绍QCar在Python环境下通信的使用方式。
首先对于仅使用Simulink的用户而言,通信模块的使用与上一篇文章中提到的使用方法一致,都是利用Quarc提供的Simulink模块去构建程序之间的通信。假设我们构建了一个在主机端运行的信号灯控制系统,以及多个在QCar上运行的控制程序,我们就可以利用通信模块去实现主机与QCar、QCar与QCar之间的通信,从而搭建出基于网络通信的智慧交通系统模型。
而在我的假设的基础上,可能有的用户已经使用Python设计了一套完整的无人驾驶控制系统,现在他想要将他的算法移植到QCar,那么选择利用QCar对Python的支持,直接使用Python编程显然是更加方便的。如果要将运行Python程序的QCar融入到智慧交通的系统中,就要考虑Python环境下通信模块的使用。
这里我先给大家简单介绍一下我们为QCar提供的Python上的支持。我们在QCar的Linux系统中已经预装了Python3和Quanser相关API的内容,这是我们让QCar使用Python的最底层配置,在此基础上,我们提供了驱动QCar的Python模块库:
其中有包含了QCar接口调用相关Class的product_QCar.py,包含通信相关Class的q_misc.py,以及一个可以使用的PI速度控制的函数q_control.py等一系列Class和函数。这些Class和函数帮助用户可以快速使用Python代码驱动QCar硬件,而不是投入大量时间研究底层接口,减少移植算法的难度,让用户更快的将其想法在QCar实现。
该Class包含了对IP地址、缓冲区的设置等初始化信息、收发数据的函数、通信是否成功的检测等功能。
我们可以看到再设置初始化信息处,与使用Simulink模块的设置是有许多的相似处。首先设置uri,即IP地址;之后是设置agent值,当agent=‘s’时,这意味着将其设置为与StreamServer相同的功能,简单的讲就是以所填的IP为中心收发数据流,当agent=‘c’时,模块将被设置为与StreamClient相同的功能,即与所填IP对应的StreamServer模块进行数据交互;send_buffer_size和 recv_buffer_size则是对收发数据的缓冲区大写进行设置,在使用Simulink通信模块时我们也需要进行这样的操作。
接着我们打开提供的数据通信的Demo:Stream_Clinent.py及Stream_Server.py。
Demo程序的功能是,Client端采集一个摄像头的图像,将图像信息发送给Server端,在Server端弹窗显示该图像。我们可以看到程序中调用了q_misc的模块库,并使用了BasicStream的Class,在进行初始设置时,agent值的不同区分开了两个模块的功能;以IP地址为192.168.2.19的设备为Server端,通信通道为18001,Clinet端同样设置了这个IP,构建起了两个程序的连接;send_buffer_size和 recv_buffer_size设置为单帧图像信息的大小。之后Server端采用了receive,Client端采用了send,实现了数据的接受与发送。
通过与我们Demo类似的方式,即可建立起两个或多个QCar之间的联系。
回到我们一开始假设的情景,现在车与车的通信可以解决,那车与信号灯控制系统的通信又该如何解决呢?答案是使用Simulink中的StreamServer和StreamClient模块。
其实不仅仅在我假设的智慧交通的情景下需要用到设备间的通信,一些特殊情况,比如需要将QCar上Python程序的运行数据保存并进行数据分析,就可以利用我介绍的通信模块,将QCar的数据发送到Matlab/Simulink,利用Matlab/Simulink的相关工具进行数据的处理和分析。或者说利用PC端装载的更高性能的显卡进行神经网络训练、图像处理,仅将处理后得到的结果发送到QCar一端,以此获得更好的效果等等。了解了QCar通信的使用,相信用户会有更多的灵感,能以此展开更丰富的研究。