Преобразование строк в числа - PullRequest
0 голосов
/ 01 апреля 2019

Я строю робота и мне нужно дистанционно управлять им. Я решил сделать это с помощью Zeromq. Со своего компьютера (сервера) я отправлю координаты x и y роботу (клиенту). Поэтому мне нужно, чтобы сообщение было отправлено в виде чисел, чтобы я мог заставить робота перейти к координатам. Как мне это сделать? Я очень новичок в программировании (как вы, вероятно, можете сказать), в настоящее время у меня есть этот код:

клиент

import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://127.0.0.1:5555")
while True:
        socket.send_string("Robot Ready")
        coordinates= socket.recv_string()
        print("From server",coordinates)
#And here i want to use the received coordinates to give the robot commands#

Сервер

import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://127.0.0.1:5555")

while True:
    msg = socket.recv()
    print(msg)
    smsg = input("Enter coordinates : ")
    socket.send_string(smsg)`

Я обновил свой код до этого (он работает, но я чувствую, что он не нужен долго):

client2

import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://127.0.0.1:5555")

while True:
        socket.send_string("AGV Ready")
        x_start = float(socket.recv())
        socket.send_string("X-coordinate registred")
        y_start = float(socket.recv())
        socket.send_string('Y-coordinate registred')
        x_end = float(socket.recv())
        socket.send_string("X-coordinate registred")
        y_end = float(socket.recv())
        print("Start position: ",x_start, y_start)
        print("End position: ", x_end, y_end)

server2

import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://127.0.0.1:5555")

while True:
    msg = socket.recv()
    print(msg)
    smsg = input("Pick up product at x,y : ")
    smsg_new = smsg.split(',')
    socket.send_string(smsg_new[0])
    socket.recv()
    socket.send_string(smsg_new[1])
    socket.recv()
    smsg2 = input("Leave product at x,y : ")
    smsg2_new = smsg2.split(',')
    socket.send_string(smsg2_new[0])
    socket.recv()
    socket.send_string(smsg2_new[1])

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Я предполагаю, что входные данные будут целочисленными.Поэтому я бы предложил

socket.send_string(int(smsg))

Редактировать:

Какой ожидаемый формат?Должны ли координаты X и Y быть разделены запятой и т. Д.?

Если вы отправляете одновременно X и Y, вы должны ограничить ввод данных пользователем в следующем формате:

<X-coordinates>, <Y-coordinates>

Затем разбить строку:

xy = smsg.split(',')
socket.send_string((int(xy[0]), int(xy[1]))
0 голосов
/ 01 апреля 2019

Я предполагаю, что ваши координаты будут в форме "x y". Для разбора ваших координат вам понадобится split() и приведение.

Добавьте это к своему клиентскому коду:

sp = coordinates.split(' ') #This splits the string into a string array
                            #Using the specified delimiter
x = float(sp[0]) #This float() command converts the string into an number
y = float(sp[1])
print("X Cordinate: " + str(x))
print("Y Cordinate: " + str(y))

Если ваши координаты разделены запятыми, просто используйте вместо этого split(',').

EDIT

Согласно предложению в комментариях, кастинг действительно можно упростить до

x, y = map(float, coordinates.split(' '))

Вы можете прочитать немного о map() здесь . Тем не менее, я все еще рекомендую дополнительное чтение на python casting . Это фундаментальный навык, который нельзя игнорировать.

0 голосов
/ 01 апреля 2019
try:
    value = int(strvalue)
except ValueError:
    print("Failed to convert str to int.")
...