我是靠谱客的博主 义气诺言,最近开发中收集的这篇文章主要介绍prescan(十三):使用UDP进行 linux 与 simulink 通讯并解析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、目的

使用simulink的ros 功能模块进行simulink与linux的通讯存在一个问题,激光雷达数据的下发,速度较慢,并且,simulink对自定义消息格式的模块支持不友好(也可能是我研究的不够深入),现在使用新的方法 UDP 进行建模。

二、simulink模块

使用如上图所示simulink模块模型搭建udp发送模块,由于udp的数据发送是通过字节发送,所以需要进行打包,打包操作是byte pack,点开 byte pack,各参数如下所示:

红色箭头指向数据的类型,原有数据需要满足数据的打包规则,先确定其格式,才能正确打包给udp send,蓝色箭头指向打包方式,在多个数据打包时需要注意,不同的数字代表不同的打包方式,在linux下的解析也是不同的。

上图中, ip address指要发送的目的地网络端口,ip port指要使用的端口。

接收端使用udp recieve模块,如下图所示:

其中,byte unpack是的原打包数据的解析,这个比较重要,不同的解析方式对应出来的数据是不同的,所以在发送端一定需要清楚数据格式,数据的打包规则。

如上图所示,参数 maximum length for message 会影响数据的接收发送成功与否,我这里填 8,是因为在发送端我使用了一个 double类型的数据,它占8个字节。不同的数据类型,在此处的长度是不一样的,如果是多个数据,需要加起来,比如两个 double + 一个float,那么就是 8+8+4 = 20 

如上图所示,一个是决定了数据的维度,一般选择1维,一个是选择数据类型。

三、代码模块

定义 udp server:

'''
定义server
'''
import socket
from struct import unpack


if __name__ == '__main__':

    address = '192.168.1.13'
    i_port = 25005
    bufferSize = 1024

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    s.bind((address, i_port))

    #print("address has been binded to :", address)

    while True:
        #print("into the circle")
        data, addr = s.recvfrom(bufferSize)
        #print("after recieve")
        #print("recieve from %s: %s, ", address)
        #data = unpack('f', data[0])
        print(data)

        unpackdata = unpack('d', data)
        print("data type", type(data))
        print("unpack data:", unpackdata)
        print("type of data", type(unpackdata))
        print("data out:", unpackdata[0])
        print("datatype of unpackdata:", type(unpackdata[0]))
        print("lenght of the data", len(data))
        #print(type(data))
        s.sendto(data, (address, i_port))

定义client:

import socket
from struct import pack

if __name__ == '__main__':
    address = '192.168.1.10'
    i_port = 25009
    bufferSize = 1024

    print("ready to set address")
    send = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print("set the inet")
    while True:
        for data in [99.9,111.1]:
            data = pack('d',data)
            send.sendto(data, (address, i_port))
            print("before send.recv")
            #print(send.recv(1024))
            #data_recv, ADDR = send.recvfrom(bufferSize)
            print(data)
    send.close()

代码就不详述了,每个函数都可以百度查到的,需要留意的是在 server中我打印了很多数据,这是为了验证从simulink中传输过来的数据,分别是什么格式的,我们接收到的不是可以直接使用的数据,需要打包解析。

 

 

总结:

udp可用于大量数据的传输,但是udp不需要建立连接,也就是说,我不管对方接不接得到我的数据,我都可以向外发送,同时,我发错了或者丢数据了,它也不管,但是对于激光点云和摄像头数据这样的大量的数据是比较高效的,毕竟丢一帧两帧的,不应该影响算法的响应。

最后

以上就是义气诺言为你收集整理的prescan(十三):使用UDP进行 linux 与 simulink 通讯并解析的全部内容,希望文章能够帮你解决prescan(十三):使用UDP进行 linux 与 simulink 通讯并解析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部