23 de January de 2022

Volver a Codificación de robots, parte 3: Probar el EBB

[ad_1]

# Obtenga datos del robot y guárdelos en la especificación[]

# mientras devuelve uno de los siguientes códigos de resultado

ROBOT_DATA_OK = 0

CANNOT_CONNECT = 1

SOCKET_ERROR = 2

DATOS_MALOS = 3

def getRobotData(Especificaciones):

# Esta función se conecta a un robot ePuck que se ejecuta en V-REP a través de TCP / IP

# Cree un socket TCP / IP y conéctelo al robot simulado

calcetín = enchufe.enchufe (enchufe.AF_INET, enchufe.SOCK_STREAM)

Intentar::

sock.connect (puerto_dirección_servidor)

excepto::

regreso NO SE PUEDE CONECTAR

sock.settimeout (0.1) # Establecer tiempo de espera de conexión

# Empaque un paquete ficticio que provoque datos en respuesta

# Esto es prácticamente un “ping” para pedir un registro

strSend = struct.pack (‘F ff’1,0,1,0,1,0)

sock.sendall (strSend) # y envíelo a V-REP

# Espere los datos de V-REP

# Espere un paquete de 1 vez, 2 articulaciones, 2 motores, 3 sensores de línea, 8 irSensores

# todo flota porque V-REP

# Tamaño total del paquete = 16 x 4 = 64 bytes

Datos = B “

nch_rx = 64 # Espere tantos bytes de V-REP

Intentar::

tiempo len (datos)

datos + = calcetín.recv (nch_rx)

excepto::

calcetín.close ()

regreso ERROR DE SOCKET

# descomprime los datos recibidos

Si len (datos) == nch_rx:

# V-REP solo empaca y desempaca en nadadores

vrx = struct.unpack (‘ffffffffffffffff’, datos)

# Ahora mueva datos de vrx[] en especificación[]mientras los flotadores se redondean

Especificaciones[“botTime”] = [ round(vrx[0], 2)]

Especificaciones[“jntDemands”] = [ round(vrx[1], 2), redondo(vrx[2], 2)]

Especificaciones[“jntAngles”] = [round(vrx[3]* 180.0 / math.pi, 2)

redondo(vrx[4]* 180.0 / math.pi, 2)]

Especificaciones[“lfSensors”] = [ round(vrx[5], 2), redondo(vrx[6], 2), redondo(vrx[7], 2)]

hacia I en el Distancia(8º):

Especificaciones[“irSensors”][i] = redondo(vrx[8+i], 3)

Resultado = ROBOT_DATA_OK

de lo contrario::

Resultado = BAD_DATA

calcetín.close ()

regreso Resultado

La estructura de esta función es muy simple: primero cree un socket, ábralo, luego cree un paquete ficticio y envíelo a V-REP para solicitar datos EBB del robot. Luego, cuando llegue un paquete de datos, extráigalo en la especificación. La parte más compleja del código es la manipulación de datos.

¿Un EBB real recopilaría datos de esta manera? Bueno, si el EBB está integrado en el robot, probablemente no lo esté. La comunicación entre el controlador del robot y el EBB puede tener lugar a través de mensajes ROS o incluso más directamente, por ejemplo, dando acceso al código EBB a un espacio de memoria compartida que contiene las entradas del sensor, las salidas de comando y las decisiones del robot. Sin embargo, un EBB externo que se ejecuta en un servidor local o en la nube probablemente usaría TCP / IP para comunicarse con el robot. getRobotData() sería muy similar al ejemplo aquí.


Alan Winfield

Autor invitado

Alan Winfield es profesor de robótica en UWE Bristol. Comunica sobre ciencia en su blog personal.

[ad_2]