prescan(⼗三):使⽤UDP进⾏linux与simulink通讯并解析⼀、⽬的
使⽤simulink的ros 功能模块进⾏simulink与linux的通讯存在⼀个问题,激光雷达数据的下发,速度较慢,并且,simulink对⾃定义消息格式的模块⽀持不友好(也可能是我研究的不够深⼊),现在使⽤新的⽅法 UDP 进⾏建模。
⼆、simulink模块
使⽤如上图所⽰simulink模块模型搭建udp发送模块,由于udp的数据发送是通过字节发送,所以需要进⾏打包,打包操作是byte pack,点开 byte pack,各参数如下所⽰:
红⾊箭头指向数据的类型,原有数据需要满⾜数据的打包规则,先确定其格式,才能正确打包给udp nd,蓝⾊箭头指向打包⽅式,在多
个数据打包时需要注意,不同的数字代表不同的打包⽅式,在linux下的解析也是不同的。
上图中, ip address指要发送的⽬的地⽹络端⼝,ip port指要使⽤的端⼝。
接收端使⽤udp recieve模块,如下图所⽰:
其中,byte unpack是的原打包数据的解析,这个⽐较重要,不同的解析⽅式对应出来的数据是不同的,所以在发送端⼀定需要清楚数据格式,数据的打包规则。
如上图所⽰,参数 maximum length for message 会影响数据的接收发送成功与否,我这⾥填 8,是因为在发送端我使⽤了⼀个 double 类型的数据,它占8个字节。不同的数据类型,在此处的长度是不⼀样的,如果是多个数据,需要加起来,⽐如两个 double + ⼀个float,那么就是 8+8+4 = 20
如上图所⽰,⼀个是决定了数据的维度,⼀般选择1维,⼀个是选择数据类型。
三、代码模块
定义 udp rver:
'''
定义rver
'''
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.ndto(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 t address")
nd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print("t the inet")
洋务运动的内容
while True:
for data in [99.9,111.1]:
data = pack('d',data)
nd.ndto(data, (address, i_port))
print("v")
#v(1024))
绞丝旁加侯#data_recv, ADDR = nd.recvfrom(bufferSize)
print(data)
nd.clo()
代码就不详述了,每个函数都可以百度查到的,需要留意的是在 rver中我打印了很多数据,这是为了验证从simulink中传输过来的数据,分别是什么格式的,我们接收到的不是可以直接使⽤的数据,需要打包解析。
总结:
udp可⽤于⼤量数据的传输,但是udp不需要建⽴连接,也就是说,我不管对⽅接不接得到我的数据,我都可以向外发送,同时,我发错了或者丢数据了,它也不管,但是对于激光点云和摄像头数据这样的⼤量的数据是⽐较⾼效的,毕竟丢⼀帧两帧的,不应该影响算法的响应。
>缠绵母爱