概述
一、目的
使用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 通讯并解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复