This repository contains solutions for semifinal tasks for SkillsComp - Robotyka Mobilna with all the files used to develop those solutions (folders labeledtest
).
logo has been generated using simple logo generator
This code is a solution for first problem maze.
Maze solving algorythm is in two python files: mazeSolver.py
and backendSolvable.py
File labeled backendSolvable.py
contains all modules used to read maze from a file, dfs, path ploting.
File labeled mazeSolver.py
uses all moduls from backendSolvable.py
and solves the maze.
Program sprawdza czy dookoła obecnego położenia są wolne komórki - " ", jeżeli tak zapisuje wszystkie pozycje do których jest w stanie przejść w następnym kroku. Następnie wykonuje możliwy ruch usuwając go jednocześnie z listy ruchów możliwych do wykonania, a poprzednią pozycje dodaje do tabeli z poprzednimi popzycjami. Jeżeli dana pozycja nie ma żadnego możliwego ruchu do wykonania, progam wraca do innych możliowych pozycji (jeżeli takie zostały zapisane podczas np. jakiegoś rozwidlenia).
Algorytm zwraca True
jeżeli dotarł do wyjścia E i liste z dokładnym rozwiązaniem labiryntu, np. ['RIGHT', 'RIGHT', 'RIGHT', 'DOWN', 'DOWN', 'DOWN']. Jeżeli program nie jest we stanie dotrzeć do wyjścia zwróci False
oraz dlaczego nie rozwiązał labiryntu, np. E3 - multiple starting positions for letter 'r' - oznacza, to że w podanym labiryncie znajduje się więcej niż jedno rozpoczęcie (więcej niż jedna litera, od której program ma zacząć rozwiązywanie)
Aby rozwiązać wybrany labirynt należy:
- wpisać lokalizację pliku tekstowego z tym labiryntem
maze = getMazeFromTXT(r"TUTAJ LOKALIZACJA PLIKU")
NP.
maze = getMazeFromTXT(r"F:\skillscomp\z1textFiles\labirynt9.txt")
- wpisać jaka litera oznacza pozycję od której program ma zacząć rozwiązywanie labiryntu
solvable, info = mazeSolver(maze, "LITERA")
NP.
solvable, info = mazeSolver(maze, "r")
- Program rozwiąże labirynt dla małej litery r
Aby wyświetlić dane do debagowania należy w poniższej lini zmienić level=logging.ERROR na level=logging.DEBUG
logging.basicConfig(level=logging.ERROR, format="%(asctime)s %(levelname)s %(message)s", datefmt="%y-%m-%d %H:%M")
Ta aplikacja jest rozwiązaniem 2 zadania, znajduje się w folderze pid i składa się z dwóch plików,
aplikacji app.py
oraz algorytmu PID i obiektu sterowanego w pliku pid.py
Poniżej został przedstawiony użyty obiekt drugiego rzędu, którym steruje regulator PID.
Program pobiera dane wprowadzone przez użytkownika i używa ich do symulacji regulatora PID. Aby wyświetlić wykres symulacji należy nacisnać przycisk Submit
Jeżeli opcja Ziegler-nichols autotuning
nie jest zaznaczona, użytkownik może ręcznie dobierać nastawy (za pomocą suwaków lub wprowadzając z klawiatury)
Jeżeli opcja Zeigler-nichols autotuning
jest zaznaczona, program wyświetli wykres symulacji regulatora PID dla nastaw obliczonych za pomocą metody Zeiglera-nicholsa
Dodatkowo użytkownik może zmienić poniższe wartości:
- Cel symulacji, domyślnie 100
- Wartość początkową, domyślnie 0
- ilość powtórzeń, domyślnie 250
- zmianę czasu, domyślnie 0.1
Oscylacja układu została wyznaczona eksperymentalnie, używając ręcznej manipulacji nastaw w aplikacji.
Układ oscyluje przy nastawach: Ki = 0, Kd = 0, Kp = 7.(27) czyli Ku = 7.(27)
Okres oscylacji układu (Tu): 0.1s
Do wyznaczenia nastaw użyto poniższych wzorów:
- Kp = 0.6 * Ku = 0.6 * 7.(27) = +-4.36
- Ki = 0.5 * Tu = 0.5 * 0.1 = 0.05
- Kd = 0.125 * Tu = 0.125 * 0.1 = 0.0125
Ten program jest rozwiązaniem trzeciego zadania, znajduje się w folderze colorRecogniotion i składa się z dwóch plików,
aplikacji app.py
oraz algorytmów rozpoznających i zaznaczających kolory w pliku backend.py
Kiedy użytkownik zaimportuje wybrany obraz i naciśnie przycisk Detect Colors
, program wykona dwie funkcje:
- Funkcja pierwsza
detectColor_markOutlines()
. Wykryje kolor, stworzy maskę, gdzie tylko ten kolor jest zaznaczony, wyznaczy zarys i doda ten zarys do ostatecznej grafiki (sam obrys na czarnym tle). Ta funkcja wykona się 4 razy dla każdego z zdefiniowanego w programie koloru (czerwony, zielony, niebieski, żółty). Ta funkcja również zwraca jakie kolory zostały wykryte. - Funckja druga
detectPositionsOfColors()
. Wykrywa kolory i je zaznacza na tym samym zdjęciu, z którego kolory zostały wykryte. Dodatkowo funkcja ta zwraca słownik - nazwę koloru jako klucz i przpisaną do niego wartość jako tuple, w którym znajdują się: odległość środka prostokąta (prostokątem jest oznaczony wykryty przedmiot w daynym kolorze) od lewego górnego rogu w osi X oraz w osi Y, pozycja środka tego zaznaczenia w odniesieniu od środka ekranu (left, right, top, bottom) oraz odległość tego zaznaczenia od środka obrazu w osi X i Y
Dodatkową funkcją programu jest możliwość zapisania danych do pliku tekstowego przyciskiem Plot Data
Program ten jest rozwiązaniem czwartego zadania, znajduje się w folderze qrCode i składa się z dwóch plików,
aplikacji app.py
oraz algorytmów przekształcających i rozpoznających kody QR backend.py
Kiedy użytkownik zaimportuje kod QR i naciśnie przycisk detect QR
, program wykona poniższe funkcje. Jeżeli jednej z poniższych funkcji uda się odczytać kod QR, pozostałe nie zostaną wykonane:
Najpierw program zastosuje poszczególne filtry dla pierwotnego zdjęcia:
- znajdzie rogi kodu QR i go "wyprostuje" poczym spróbuje odczytać kod QR
- zastosuje rozmycie Gaussa i spóbuje odczytać kod QR
- użyje funkcji
fixBlur()
, której zadaniem jest pozbycie się rozmazania obrazu, nastęnie spróbuje odczytać kod QR
Jeżeli żadnej z powyższych funkcji nie udało się odczytać kodu QR program zastosuje poszczególne filtr dla zdjęcia wcześniej zmodyfikowanego. Program:
- znajdzie rogi kodu QR i go "wyprostuje" poczym spróbuje odczytać kod QR
- użyje zdjęcia uzyskanego przez użycie powyższego filtra i zastosuje rozmycie Gaussa, a następnie spróbuje odczytać kod QR
- wykona funkcję
fixBlur()
na zdjęciu uzyskanym po zastosowaniu rozmycia Gaussa i spróbuje odczytać kod QR
Jeżel żadnej z powyższych funkcji nie uda się odczytać kodu QR program zwróci No QR code detected
Dodatkową funkcją programu jest, tak jak w programie colorRecognition, możliwość zapisania danych do pliku tekstowego przyciskiem Plot Data