# Get data from the robot and store it in spec[]
# while returning one of the following result codes
ROBOT_DATA_OK = 0
CANNOT_CONNECT = 1
SOCKET_ERROR = 2
BAD_DATA = 3
def getRobotData(spec):
# This function connects, via TCP/IP to an ePuck robot running in V-REP
# create a TCP/IP socket and connect it to the simulated robot
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect(server_address_port)
except:
return CANNOT_CONNECT
sock.settimeout(0.1) # set connection timeout
# pack a dummy packet that will provoke data in response
# this is, in effect, a ‘ping’ to ask for a data record
strSend = struct.pack(‘fff’,1.0,1.0,1.0)
sock.sendall(strSend) # and send it to V-REP
# wait for data back from V-REP
# expect a packet with 1 time, 2 joints, 2 motors, 3 line sensors, 8 irSensors
# all floats because V-REP
# total packet size = 16 x 4 = 64 bytes
data = b”
nch_rx = 64 # expect this many bytes from V-REP
try:
while len(data) < nch_rx:
data += sock.recv(nch_rx)
except:
sock.close()
return SOCKET_ERROR
# unpack the received data
if len(data) == nch_rx:
# V-REP packs and unpacks in floats only so
vrx = struct.unpack(‘ffffffffffffffff’,data)
# now move data from vrx[] into spec[], while rounding the floats
spec[“botTime”] = [ round(vrx[0],2) ]
spec[“jntDemands”] = [ round(vrx[1],2), round(vrx[2],2) ]
spec[“jntAngles”] = [round(vrx[3]*180.0/math.pi,2)
round(vrx[4]*180.0/math.pi,2) ]
spec[“lfSensors”] = [ round(vrx[5],2), round(vrx[6],2), round(vrx[7],2) ]
for i in range(8):
spec[“irSensors”][i] = round(vrx[8+i],3)
result = ROBOT_DATA_OK
else:
result = BAD_DATA
sock.close()
return result
The structure of this function is very simple: first create a socket then open it, then make a dummy packet and send it to V-REP to request EBB data from the robot. Then, when a data packet arrives, unpack it into spec. The most complex part of the code is data wrangling.
Would a real EBB collect data in this way? Well if the EBB is embedded in the robot then probably not. Communication between the robot controller and the EBB might be via ROS messages, or even more directly, by – for instance – allowing the EBB code to access a shared memory space which contains the robot’s sensor inputs, command outputs and decisions. But an external EBB, either running on a local server or in the cloud, would most likely use TCP/IP to communicate with the robot, so getRobotData() would look very much like the example here.
Alan Winfield is Professor in robotics at UWE Bristol. He communicates about science on his personal blog.
guest author
Alan Winfield is Professor in robotics at UWE Bristol. He communicates about science on his personal blog.