MessageLink#
Введение#
MessageLink позволяет двум роботам V5 Brain обмениваться данными, отправляя короткие строковые сообщения с дополнительными небольшими фрагментами информации. Он предназначен для координации действий между роботами — например, для запуска алгоритмов, обмена результатами измерений с датчиков или запуска действий на другом роботе.
Каждое использование send добавляет сообщение в очередь связанного V5 Brain, и очередь читается по принципу «первым пришел — первым вышел» (FIFO). Если несколько сообщений отправлены до того, как другой V5 Brain использует receive, они будут сохраняться и возвращаться по одному в порядке их отправки. Поскольку сообщения могут стоять в очереди, многократная отправка одного и того же статуса в каждом цикле может создавать задержку; для критически важной по времени логики отправка должна происходить только при изменении значений.
Важно: Оба робота должны одновременно запускать проекты, использующие MessageLink MessageLink , иначе сообщения отправляться/получаться не будут.
На этой странице в качестве примера используется имя MessageLink , а в качестве имени link При необходимости замените его на собственное имя.
Ниже приведён список доступных методов:
Создать ссылку#
Создайте интерфейс MessageLink на обоих блоках управления V5, чтобы установить канал связи между ними — либо беспроводным способом с помощью радиомодулей V5 Robot Radios, либо через проводной интеллектуальный кабель — чтобы роботы могли отправлять друг другу сообщения.
MessageLink(smartport, name, linktype, wired)
Параметр |
Описание |
|---|---|
|
Для этой связи используется «умный порт» — порт, к которому подключено радиоустройство робота V5 (беспроводное соединение) или в который вставлен «умный кабель» (проводное соединение). Записывается как |
|
Уникальное имя для этой ссылки в виде строки. |
|
Роль, которую этот «мозг» будет использовать для этой пары связей. Каждая пара должна включать одного менеджера и одного работника:
|
|
Необязательно. Тип соединения: проводное или беспроводное:
|
Код для робота 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Код для робота 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Доступные методы#
После настройки MessageLink и подключения устройств Brains вы можете использовать описанные ниже методы для отправки, получения и ответа на сообщения.
is_linked#
Метод is_linked возвращает значение, указывающее, связаны ли между собой модули V5 Brains на MessageLink.
True– Два мозга V5 соединены парой и обмениваются данными по этой связи.False– Два мозга V5 не соединены в паре по этой ссылке.
Примечание: Рекомендуется всегда проверять правильность подключения модулей V5 Brains в начале проекта, прежде чем запускать какой-либо дальнейший код.
Usage:
link.is_linked()
Параметры |
Описание |
|---|---|
Этот метод не имеет параметров. |
Код для робота 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Код для робота 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
send#
send , отправляя строку и/или целое число и/или число с плавающей запятой на другой связанный модуль V5 Brain.
Usage:
send(string, integer, float)
Параметры |
Описание |
|---|---|
|
Строка, которую нужно отправить на другой связанный модуль V5 Brain. |
|
Необязательно. Целочисленное значение для отправки на другой связанный модуль V5 Brain. |
|
Необязательно. Число с плавающей запятой для отправки на другой связанный модуль V5 Brain. Числа с плавающей запятой форматируются до 4 знаков после запятой; если указано меньше десятичных знаков, добавляются нули в конце, пока не отобразится 4 знака после запятой. |
Если отправлена только строка string , то другой связанный с ним модуль V5 Brain получит именно эту строку.
Если включены integer и/или float , принимающий Brain получает единую закодированную строку, которая объединяет все поля в следующем порядке: .string_integer_float
Пример: При использовании link.send(“string”, 1, 2.55) получено как .string_1_2.5500.
Код для робота 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Код для робота 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
Код для робота 1
# Tell the other robot where the screen was pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") brain.screen.next_row() brain.screen.print("Tap to send circles") # Send the coordinates whenever the screen is pressed while True: if brain.screen.pressing(): x = brain.screen.x_position() y = brain.screen.y_position() link.send("touch", x, y) wait(10, MSEC)Код для робота 2
# Draw a circle where Robot 1's screen was pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") while True: # Get the full encoded string circle_coordinates = link.receive(200) if circle_coordinates: # Split the encoded string by _ parts = circle_coordinates.split("_") if len(parts) == 3: # Convert the coordinates back into numbers x = float(parts[1]) y = float(parts[2]) brain.screen.set_fill_color(Color.WHITE) brain.screen.draw_circle(x, y, 20) wait(10, MSEC)
receive#
receive возвращает следующее сообщение из очереди от другого связанного модуля V5 Brain. Сообщения читаются в порядке FIFO (самое старое непрочитанное первым). Если очередь пуста при вызове receive , она ожидает нового сообщения до истечения указанного timeout . Если в течение этого времени сообщение не поступает, receive возвращает None, и любое сообщение, отправленное после этого, остается в очереди для чтения при следующем использовании функции receive.
Если другой связанный V5 Brain отправил только строку string, receive , вернет именно эту строку.
Если другой связанный модуль V5 Brain отправил целое число и/или число с плавающей запятой, receive , и возвращается одна закодированная строка, объединяющая все поля в следующем порядке: .string_integer_float
Например, если другой связанный V5 Brain использует link.send(“string”, 1, 2.55), то использование link.receive() возвращает закодированную строку, например .string_1_2.5500. Вы можете разделить эту закодированную строку (см. примеры ниже), чтобы извлечь имя сообщения, целочисленные и дробные значения.
Если вы предпочитаете избегать ручного разделения/анализа, используйте received, чтобы зарегистрировать обработчик для конкретного имени сообщения; обработчик получает отправленные значения в качестве аргументов.
Usage:
receive(timeout)
Параметры |
Описание |
|---|---|
|
Необязательный параметр. Время ожидания в миллисекундах |
Код для робота 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Код для робота 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
Код для робота 1
# Send a math problem for the other Brain to solve # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") """ Change whether to "add" or "subtract", then what numbers to use in the operation. """ link.send("add", 7, 2.5)Код для робота 2
# Solve the math problem that the other Brain sends # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() math_problem = link.receive() if math_problem: # Split the encoded string by _ parts = math_problem.split("_") if len(parts) == 3: # Remove the . from the beginning of the string operator = "".join([c for c in parts[0] if c.isalpha()]) # Separate out the numbers for the operation a = int(parts[1]) b = float(parts[2]) # Use what operator was sent if operator == "add": result = a + b elif operator == "subtract": result = a - b # If neither add or subtract is sent, do nothing else: pass brain.screen.print("Result = ", result)
received#
received регистрирует функцию, которая будет вызываться всякий раз, когда V5 Brain получает отправленное сообщение.
Usage:
link.received(message, arg)
Параметры |
Описание |
|---|---|
|
Имя сообщения (строка), которое нужно сопоставить. Если имя полученного сообщения совпадает с этим значением, вызывается функция обратного вызова |
|
Ранее определенная функция, которая запускается, когда мозг V5 получает сообщение, соответствующее сообщению |
Получено received обратный вызов с четырьмя аргументами:
Сигнатура обратного вызова:
callback(message, linkname, index, value)
Аргумент |
Описание |
|---|---|
|
Имя полученного сообщения (например, |
|
Название ссылки, с которой было получено сообщение. |
|
Целочисленное значение, отправляемое вместе с сообщением (если указано). |
|
Значение с плавающей запятой, отправляемое вместе с сообщением (если оно предоставлено). |
Код для робота 1
# Send a math problem for the other Brain to solve # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") """ Change whether to "add" or "subtract", then what numbers to use in the operation. """ link.send("add", 7, 2.5)Код для робота 2
# Solve the math problem that the other Brain sends # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() # add if "add" is received def add_cmd(message, linkname, a, b): result = a + b brain.screen.print("Result = ", result) # subtract if ""subtract" is received def subtract_cmd(message, linkname, a, b): result = a - b brain.screen.print("Result = ", result) # Create event handlers for "add" and "subtract" link.received("add", add_cmd) link.received("subtract", subtract_cmd)