Как посылать команды из графики черепахи Python на кирпич Lego EV3? - PullRequest
0 голосов
/ 16 декабря 2018

РЕДАКТИРОВАТЬ ДЛЯ T KINTER:

IDE - это код Visual Studio

Вызов трассировки выводится ниже сценариев

TkinterTest.py

#!/usr/bin/env python3

from tkinter import *
from tkinter import ttk
import Ev3_Motor

ev3 = Ev3_Motor.Ev3_Motor()

def calculate(*args):
    ev3.TestFunction("SUCCESSS YAHOOOOOO")
    print("command to robot >>>>")

root = Tk()
root.title("TEST TKINTER")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

ttk.Button(mainframe, text="TEST BUTTON", command=calculate).grid(column=3, row=3, sticky=W)

#ttk.Label(mainframe, text="feet").grid(column=3, row=1, sticky=W)
for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)

root.bind('<Return>', calculate)
root.mainloop()

Ev3_Motor.py

#!/usr/bin/env python3
from ev3dev.ev3 import *
import os
import sys
from time import sleep
import shutil 
import fileinput

os.system('setfont Lat15-TerminusBold14')

## FUNCTIONS ##

def __init(self):
    debug_print("Constructor Ev3")

def TestFunction(randomString):
    debug_print("Connection established: " + randomString)

ОШИБКА ОБРАТНОЙ СВЯЗИ:

Starting: brickrun --directory="/home/robot/vscode-hello-python-master/Ev3" "/home/robot/vscode-hello-python-master/Ev3/TkinterTest.py"
Started.
----------
Traceback (most recent call last):
  File "/usr/lib/python3.5/tkinter/__init__.py", line 36, in <module>
    import _tkinter
ImportError: No module named '_tkinter'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/robot/vscode-hello-python-master/Ev3/TkinterTest.py", line 3, in <module>
    from tkinter import *
  File "/usr/lib/python3.5/tkinter/__init__.py", line 38, in <module>
    raise ImportError(str(msg) + ', please install the python3-tk package')
ImportError: No module named '_tkinter', please install the python3-tk package
----------
Exited with error code 1.

** ОРИГИНАЛВОПРОС: Что я пытаюсь сделать: **

Я пытаюсь создать дизайн программы, в котором программа с пользовательским интерфейсом, созданная с помощью графической библиотеки Turtle в Python , напрямую связывается с EV3Программа Python, которая существует на кирпиче LEGO EV3.

Что у меня есть:

  1. FrontEnd.py - объектно-ориентированная программа, которая распознает уникальные нажатия кнопокна основе указателя мыши x и y и форм, используемых для рисования кнопки в виде объектов
  2. RobotInstruction.py - программа EV3, которая включает двигатели на основе вызовов функций

Чтопроизошло, когда я попытался заставить его работать:

Казалось, что есть конфликт в зависимостях.Вроде черепаха и ев3 не совместимы.Мне показалось, что файл FrontEnd.py пытался загрузить в файл RobotInstruction.py и в конечном итоге на кирпич, а это не то, что я хотел.

Важное примечание:

Самостоятельно эти скрипты работают нормально.Например, RobotInstruction.py может получать ввод с клавиатуры, чтобы воздействовать на двигатели.Я просто хочу получить эту «командную» стрельбу из графической программы вместо этого

Моя первая попытка обходного решения Janky Super:

- СУЩЕСТВУЮЩИЙЭКСПЕРТЫ КОДА ПРИКЛЮЧЕНЫ В КОНЦЕ -

Используйте FrontEnd.py, чтобы записать строковую команду в файл, и RobotInstruction.py постоянно читает этот файл для команды, а затем, основываясь на этой команде, вызываетсоответствующая функция для вращения двигателей.

Что сработало:

Может успешно записать в файл с помощью команды из FrontEnd.py

Может успешно прочитатькоманда из того же файла

НО

Это не происходит в реальном времени.Я не очень хорошо знаком с чтением / записью файлов с помощью Python ... настолько возможно, что я могу делать что-то неловкое ...

Мой вопрос:

Возможно ли то, что я пытаюсь сделать?Можете ли вы щелкнуть по кнопке, созданной графикой черепахи, чтобы отправить команду роботу ev3?Если это так, как бы мне было сформировать СОЕДИНЕНИЕ между двумя отдельными скриптами?

КОД "ЭКСКЕРПТЫ"

FrontEnd.py

def TurnTier(ButtonName):
   if ButtonName == "TurnT1":
      fileName = open("file1.txt", "w+")
      fileName.write("TurnT1")
      fileName.close()

RobotInstruction.py

while (not blnTierFound):
   # file1.txt is written to from FrontEnd.py through a button click
   # We are writing "TurnT1" into file1.txt
   # Here we are opening the same file for reading to check for changes

   fileName = open("file1.txt", "r+")
   ButtonName = fileName.read()
   fileName.close()

   ButtonName = str(ButtonName)
   if (ButtonName == "TurnT1"):
        blnTierFound = True
        strMotor = 'A'

   # In the main part of the code 
   motorLeft = fncStartMotor(strMotor)

1 Ответ

0 голосов
/ 24 декабря 2018

Важная информация :

Обычно EV3 программируется с использованием блочного языка программирования от Lego.Операционная система по умолчанию программируется на этом языке.Чтобы использовать текстовый язык программирования, такой как Python, для взаимодействия с роботом, вы должны установить новую операционную систему под названием ev3dev , которая основана на Linux , с использованием двойной загрузки SD-карты.Полные инструкции по настройке доступны здесь .Эта настройка обязательна до запуска приведенных ниже сценариев.

После обсуждения в разделе комментариев я собрал решение, которое может работать для вас.При этом в вопросе используется скрипт Tkinter (который был протестирован для работы), а скрипт Ev3_Motor был изменен, чтобы включить класс Ev3_Motor (который позволяет легко импортировать скрипт и создать объект этого класса).Однако этот сценарий не проверен и может привести к другим ошибкам, поскольку у меня нет робота Ev3.Эти ошибки могут быть отлажены позже.Убедитесь, что Ev3_Motor.py находится в той же директории, что и TkinterTest.py.

Ev3_Motor.py

#!/usr/bin/env python3
from ev3dev.ev3 import *
import os
import sys
from time import sleep
import shutil 
import fileinput
import debug_print

os.system('setfont Lat15-TerminusBold14')

## Main Ev3 Motor Class ##
class Ev3_Motor:

    def __init__(self):
        debug_print("Constructor Ev3")

    def TestFunction(randomString):
        debug_print("Connection established: " + randomString)

TkinterTest.py

#!/usr/bin/env python3
from tkinter import *
from tkinter import ttk
import Ev3_Motor

ev3 = Ev3_Motor.Ev3_Motor()

def calculate(*args):
    ev3.TestFunction("SUCCESSS YAHOOOOOO")
    print("command to robot >>>>")

root = Tk()
root.title("TEST TKINTER")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

ttk.Button(mainframe, text="TEST BUTTON", command=calculate).grid(column=3, row=3, sticky=W)

#ttk.Label(mainframe, text="feet").grid(column=3, row=1, sticky=W)
for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)

root.bind('<Return>', calculate)
root.mainloop()
...