prescan(十三):使用UDP进行linux与simulink通讯并解析

prescan(十三):使用UDP进行linux与simulink通讯并解析

2023年7月15日发(作者:)

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 socketfrom struct import unpackif __name__ == '__main__': address = '192.168.1.13' i_port = 25005 bufferSize = 1024 s = (_INET, _DGRAM) ((address, i_port)) #print("address has been binded to :", address) while True: #print("into the circle") data, addr = om(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)) (data, (address, i_port))定义client:import socketfrom struct import packif __name__ == '__main__': address = '192.168.1.10' i_port = 25009 bufferSize = 1024 print("ready to set address") send = (_INET, _DGRAM) print("set the inet") while True: for data in [99.9,111.1]: data = pack('d',data) (data, (address, i_port)) print("before ") #print((1024)) #data_recv, ADDR = om(bufferSize) print(data) ()代码就不详述了,每个函数都可以百度查到的,需要留意的是在 server中我打印了很多数据,这是为了验证从simulink中传输过来的数据,分别是什么格式的,我们接收到的不是可以直接使⽤的数据,需要打包解析。

总结:udp可⽤于⼤量数据的传输,但是udp不需要建⽴连接,也就是说,我不管对⽅接不接得到我的数据,我都可以向外发送,同时,我发错了或者丢数据了,它也不管,但是对于激光点云和摄像头数据这样的⼤量的数据是⽐较⾼效的,毕竟丢⼀帧两帧的,不应该影响算法的响应。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1689410412a243563.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信