【问题标题】:Communication between ROS (Linux) and non-ROS (Windows) computersROS (Linux) 和非 ROS (Windows) 计算机之间的通信
【发布时间】:2016-07-03 19:21:27
【问题描述】:

我有一台使用 Python 在 Linux 下运行的 ROS 计算机,我正在尝试从一台也使用 Python 的 Windows 计算机向它发送数据。我已经成功地能够使用 TCP 套接字将数据从 Windows 传输到 Linux,但是一旦我将脚本实现到 ROS 脚本中,ROS 脚本就会在尝试从套接字接收数据时崩溃,特别是在socketName.recvfrom(bufferSize)

在线研究,我发现这是预期的行为。 ROS 使用 TCP 进行通信,并故意为此难以实现单独的套接字(如果我理解正确的话)。

有没有办法解决这个问题?实现从非 ROS 计算机读取数据的 ROS 脚本最有效的方法是什么?

【问题讨论】:

  • 实际发生的错误是什么?我相当怀疑您声称他们有可能在 Linux 上运行的嵌入式 Python,但对套接字的支持已被破坏。
  • 包数据,数据对象不同。如果有大量数据,您需要使用“while 1 :”。你有关于通信的标准输出吗?如果您的答案是NO,请使用流媒体。
  • @DanD。没有错误消息,当我运行脚本时,它会在那时中止整个事情。我将自己运行良好的套接字脚本复制到了 ROS 脚本中,假设它可以工作。
  • @dsgdfg 它在“while 1:”循环中。我只收到 1 个字节的数据,特别是一个 ASCII 字符。
  • data = None ; while 1 : dat = socketName.recvfrom(bufferSize); if not dat: break; data += dat; 这个例子放在哪里?接受连接时!

标签: python linux communication


【解决方案1】:

我发现了这个节点,我最近使用它与 Windows TCP/IP 套接字通信,使用 NMEA 地理定位协议发送数据。

它使用一个线程在 TCP/IP 连接中进行连接,然后使用一个进程来解码消息并将其转换为 ros 格式。

PS : 你能发布你的脚本来尽力帮助你吗?

#!/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 可以更改实现逻辑,而且我对自己做出正确更改的能力没有信心。你能将它与你的源脚本进行比较并修复它吗?
最近更新 更多