我是靠谱客的博主 义气诺言,这篇文章主要介绍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:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
''' 定义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:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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进行内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部