Python ROS(Linux)和非ROS(Windows)计算机之间的通信
我有一台在Linux下使用Python运行的ROS计算机,我正试图从同样使用Python的Windows计算机向它发送数据。我已经能够使用TCP套接字成功地将数据从Windows传输到Linux,但一旦我将脚本实现为ROS脚本,ROS脚本在尝试从套接字接收数据时崩溃,特别是在Python ROS(Linux)和非ROS(Windows)计算机之间的通信,python,linux,communication,Python,Linux,Communication,我有一台在Linux下使用Python运行的ROS计算机,我正试图从同样使用Python的Windows计算机向它发送数据。我已经能够使用TCP套接字成功地将数据从Windows传输到Linux,但一旦我将脚本实现为ROS脚本,ROS脚本在尝试从套接字接收数据时崩溃,特别是在socketName.recvfrom(bufferSize) 通过在线调查,我发现这是预期的行为。ROS使用TCP进行通信,故意使实现单独的套接字变得困难(如果我理解正确的话) 有办法解决这个问题吗?实现从非ROS计算机读
socketName.recvfrom(bufferSize)
通过在线调查,我发现这是预期的行为。ROS使用TCP进行通信,故意使实现单独的套接字变得困难(如果我理解正确的话)
有办法解决这个问题吗?实现从非ROS计算机读取数据的ROS脚本的最有效方法是什么?我发现了这个节点,最近我使用它与使用NMEA地理定位协议发送数据的Windows TCP/IP套接字通信 它使用一个线程连接TCP/IP连接,然后使用一个进程解码消息并将其转换为ros格式 附言:你能发布你的脚本来尽力帮助你吗
#!/usr/bin/env python
import roslib; roslib.load_manifest('collision_avoidance')
import rospy
from collision_avoidance.msg import vipos
from socket import *
import thread
import time
import multiprocessing
from multiprocessing import Process
from multiprocessing import Queue
def checkcrc(msgSplitted):
checksum = msgSplitted[0]
for i in range (1,len(msgSplitted)-3):
checksum = chr(ord(checksum) ^ ord(msgSplitted[i]))
print int(msgSplitted[-2:],16 )
print ord(checksum)
if (ord(checksum) == int(msgSplitted[-2:],16)):
print "true"
return True
else:
print "(!)- Checksum failed"
return False
#client handler thread
fullMessageRead=""
def parseNmeaMessages(msgToParse,q):
""" parse the nmea messages expected
"""
print "will parse following message",msgToParse
if msgToParse.find("VIPOS") == -1 :
return
if checkcrc(msgToParse):
msgSplitted = msgToParse.replace("*",",").replace("\t","").replace("$","")
print msgSplitted
msgSplitted = msgSplitted.split(",")
if len(msgSplitted) > 1:
keyWord = msgSplitted[0]
if keyWord =="VIPOS" :
if len(msgSplitted) >= 9 :
print msgSplitted
Timestamp_trans = msgSplitted[1]
trans_x_value = msgSplitted[2]
trans_y_value = msgSplitted[3]
trans_z_value = msgSplitted[4]
Timestamp_rot = msgSplitted[5]
rot_x_value = msgSplitted[6]
rot_y_value = msgSplitted[7]
rot_z_value = msgSplitted[8]
try :
TRAT = float(Timestamp_trans)
TRAx = float(trans_x_value)
TRAy = float(trans_y_value)
TRAz = float(trans_z_value)
ROTT = float(Timestamp_rot)
ROTx = float(rot_x_value)
ROTy = float(rot_y_value)
ROTz = float(rot_z_value)
q.put([TRAT,TRAx,TRAy,TRAz,ROTT,ROTx,ROTy,ROTz])
except Exception,msg:
print "(!)- cannot convert to float"
#do stuff
else:
pass
else:
print "(!)- bad message :",msgToParse
pass
def getNmeaMessage(msgRead,q):
""" get an nmea message expected like $keywor,value,value*crc\r\n"
"""
global fullMessageRead
fullMessageRead += msgRead
startOfFrame =-1
endOfFrame =-1
endOfFrame= fullMessageRead.find("\n")
while endOfFrame != -1:
startOfFrame = fullMessageRead.find("$")
if (startOfFrame!= -1) and (endOfFrame != -1):
if startOfFrame > endOfFrame:
#error in trame read
fullMessageRead = fullMessageRead[startOfFrame:len(fullMessageRead)]
else:
#get string we need
msgToParse = fullMessageRead[startOfFrame:endOfFrame]
try:
fullMessageRead = fullMessageRead[endOfFrame+1:len(fullMessageRead)]
except:
fullMessageRead =""
parseNmeaMessages(msgToParse,q)
endOfFrame= fullMessageRead.find("\n")
def handler(clientsock,addr,q,BUFSIZ):
data= "1"
timestamp = time.time()
while data != "" :
data = clientsock.recv(BUFSIZ)
getNmeaMessage(data,q)
timestamp = time.time()
#clientsock.close()
class DecoderProcess(Process):
def __init__(self,q):
super(DecoderProcess, self).__init__()
self.HOST = ''
self.PORT = 4321
self.BUFSIZ = 1024
self.ADDR = (self.HOST, self.PORT)
self.q =q
def run(self):
self.serversock = socket(AF_INET, SOCK_STREAM)
self.serversock.bind(self.ADDR)
self.serversock.listen(2)
while not rospy.is_shutdown():
print 'waiting for connection...'
clientsock, addr = self.serversock.accept()
print '...connected from:', addr
thread.start_new_thread(handler, (clientsock, addr,self.q,self.BUFSIZ))
if __name__=='__main__':
rospy.init_node('Vicon_Ros')
pub = rospy.Publisher('vicon', vipos)
r = rospy.Rate(20) # 10hz
q=Queue()
decoderProcess = DecoderProcess(q)
decoderProcess.start()
print "waiting from main thread"
while not rospy.is_shutdown():
#data = "$VIPOS,092751,136,6259,630.33,61.32,0.06,31.66,280511*4B"
#parseNmeaMessages(data,q)
if not q.empty():
dataRead= q.get()
message = vipos()
message.Timestamp_translation = float(dataRead[0])
message.translation_x = float(dataRead[1])
message.translation_y = float(dataRead[2])
message.translation_z = float(dataRead[3])
message.Timestamp_rotation = float(dataRead[4])
message.rotation_x = float(dataRead[5])
message.rotation_y = float(dataRead[6])
message.rotation_z = float(dataRead[7])
pub.publish(message)
r.sleep()
decoderProcess.stop()
这可能是一个很长的文件,但它可能会为您提供一个模板。希望有帮助 发生的实际错误是什么?我相当怀疑你的说法,他们可能有一个嵌入式Python,在Linux上运行,对套接字的支持不好。如果数据量较大,则需要使用“while 1:”。您是否有关于通信的标准输出?如果您的答案是
否
@DanD,请使用流。没有错误消息,当我运行脚本时,它会在此时中止整个过程。我将自己运行正常的套接字脚本复制到一个ROS脚本中,假设它可以工作。@dsgdfg它处于“while 1:”循环中。我只接收到1字节的数据,特别是一个ASCII字符。data=None;而1:dat=socketName.recvfrom(bufferSize);如果不是dat:中断;数据+=dat代码>这个例子放在哪里?当接受连接时!这上面的压痕都不可靠。我通常会自己修复它,但使用Python可以更改实现逻辑,我对自己进行正确更改的能力没有信心。您能将其与源脚本进行比较并修复它吗?