Sterowanie silnikami robota Lego NXT

Podobne dokumenty
Sterowanie silnikami robota Lego NXT

Korzystanie z czujników w sterowaniu robotem Lego NXT

WISPER 706 Alpino WISPER 806 Alpino

Konfiguracja podstawowych parametrów falownikóww LG ig5a na przykładzie wentylatora RF/6-630T

Wyświetlacz funkcyjny C6

Wyświetlacz funkcyjny C600E

Instrukcja obsługi lampka LivingColors Iris

1. INSTRUKCJA OBSŁUGI WYŚWIETLACZA LCD C600E USB

Konfiguracja podstawowych parametrów falownikóww LG ig5a na przykładzie wentylatora KEF/4-225/ T

INSTRUKCJA OBSŁUGI DO WYSWIETLACZA LCD C600

Wzmacniacz sygnału, repeater Wi-Fi Conrad, N300, 2 anteny, 1 x RJ45 (LAN)

Falowniki Wektorowe Rexroth Fv Parametryzacja

Programowanie w Scratch robot mbot

Lekcja budowania robotów na podstawie klocków LEGO Mindstorms NXT 2.0. Temat: GrabBot Budujemy robota, który przenosi przedmioty.

Sterowanie urządzeniami elektronicznymi przy użyciu portu LPT

1. Otwórz pozycję Piston.iam

INSTRUKCJA KALIBRACJI TRUETRUE

Dodatek A. Spis instrukcji języka Prophio.

Lokalizacja robota Lego Mindstorms NXT przy użyciu odometrii

lider projektu: finansowanie:

13. WYZNACZANIE CHARAKTERYSTYK ORAZ PRZEŁOŻENIA UKŁADU KIEROWNICZEGO

NAZWA PRODUKTU: Interaktywny ROBOT OLBRZYM K1 Walczy Strzela Y73 Cechy produktu

Windows 10 - Jak uruchomić system w trybie

Laboratorium Napędu robotów

INSTRUKCJA OBSŁUGI. Przekaźnik czasowy ETM ELEKTROTECH Dzierżoniów. 1. Zastosowanie

Laboratorium - Monitorowanie i zarządzanie zasobami systemu Windows XP

dr inż. Tomasz Krzeszowski

Falownik MOTOVARIO EM16. Skrócona instrukcja obsługi

Statyczna próba rozciągania - Adam Zaborski

Opis szybkiego uruchomienia programu APBSoft

Instrukcja wgrywania aktualizacji oprogramowania dla routera Edimax LT-6408n

Przymiar ArborSonic 3D z komunikacją Bluetooth. modele 1600 mm i 2000 mm. Instrukcja użytkownika. wer. 1.0

WYŚWIETLACZ KOMPUTERA

INSTRUKCJA OBSŁUGI DAAB DB409 PRZEMIENNIK CZĘSTOTLIWOŚCI VFD-EL. Do sterownika automatyki DAAB EP104 z oprogramowaniem w wersji 4.

Wyświetlacz BAFANG C961 oferuje szeroki zakres funkcji zapewniających komfort użytkowania

Rozdział 1. Przegląd bramofonu SAFE

Rysunek 1: Okno z lista

Spis treści. 1 Moduł RFID (APA) 3

Informatyka II. Laboratorium Aplikacja okienkowa

Materiały pomocnicze do ćwiczeń laboratoryjnych

Instrukcja. Silnik Portos DELUX- R

Zwory na płycie z łączem szeregowym ustawienie zworek dla programowania.

1. INSTRUKCJA OBSŁUGI WYŚWIETLACZA LCD C600E USB

ve Wyświetlacz LCD

lider projektu: finansowanie:

Wyświetlacz funkcyjny C600E

Program APEK Użytkownik Instrukcja użytkownika

Instrukcja sterowania T4Power. Sterowanie T4Power. Instrukcja uruchomienia i obsługi.

WAŻNE! PRZECZYTAJ KONIECZNIE!

TURBINA WIATROWA NXT. Rozpocznij

PRACA PRZEJŚCIOWA SYMULACYJNA. Zadania projektowe

USTAWIANIE GODZINY I DATY

Cyfrowy miernik cęgowy AX-3550

dokument DOK wersja 1.0

HOME VIBRATION PLATE 900 PLUS

Laboratorium - Monitorowanie i zarządzanie zasobami systemu Windows 7

System zdalnego sterowania

Safety Integrated dla napędów. Funkcje bezpieczeństwa zintegrowane w napędach Sinamics S120

OPIS PROGRAMU APEK MULTIPLEKSER RX03

Program SigmaViewer.exe

Zasada działania sprężarki inwerterowej o zmiennej wydajności na przykładzie lodówek firmy Liebherr

Wideoboroskop AX-B250

Elektryczny model pojazdu RtR Nr produktu

lider projektu: finansowanie:

SystimPlus. Dokumentacja (FAQ) dla wersji: v

6.4. Efekty specjalne

Budzik radiowy Eurochron

Instrukcja obsługi Twin1 ISR

Symulacja działania sterownika dla robota dwuosiowego typu SCARA w środowisku Matlab/Simulink.

Laboratorium Podstaw Robotyki I Ćwiczenie Khepera dwukołowy robot mobilny

PROCEDURA USTAWIANIA CZUJNIKÓW

DOKUMENTACJA TECHNICZNO-RUCHOWA. Sterownik klimatu FT-27

ADVANCE ELECTRONIC. Instrukcja obsługi aplikacji. Modbus konfigurator. Modbus konfigurator. wersja 1.1

Ćw. 18: Pomiary wielkości nieelektrycznych II

Dokąd on zmierza? Przemieszczenie i prędkość jako wektory

Mikrofon stereofoniczny STM10

DOKUMENTACJA TECHNICZNO-RUCHOWA. Sterownik mikroklimatu FAG25-III

Architektura systemów komputerowych Laboratorium 10 Symulator SMS32 Urządzenia wejścia i wyjścia

Konfiguracja Połączenia

LP2GO. Nr produktu INSTRUKCJA OBSŁUGI

ROZDZIAŁ 1. PRZEGLĄD BRAMOFONU SAFE...

E W górę (Up) Służy do wybierania trybu treningu i zwiększaniu wyświetlanych wartości

SPIS TREŚCI Specyfikacja ogólna Ekran startowy Przyciski nawigacji 1. Ustawienia regulacji 1.1 Regulacja cos 1.2 Regulacja przekładni transformatora

Misja#3. Robimy film animowany.

Kod produktu: MP01105T

Pracownia internetowa w każdej szkole (edycja Jesień 2007)

Termostat pomieszczeniowy z ekranem dotykowym i komunikacją Modbus


Delvotest Inkubator. Instrukcja obsługi. Wersja 1.0

INSTRUKCJA OBSŁUGI U700

Regulacja dwupołożeniowa.

Laboratorium Komputerowe Systemy Pomiarowe

INSTRUKCJA OBSŁUGI STEROWNIKA WIFI

Podstawy technik wytwarzania PTWII - projektowanie. Ćwiczenie 4. Instrukcja laboratoryjna

Laboratorium - Podgląd informacji kart sieciowych bezprzewodowych i przewodowych

Wskazówki montażowe. Podłaczenia elektryczne. Altus RTS pasuje do uchwytów montażowych stosowanych ze standardowymi napędami SOMFY

Wtyczka MPG XHC_WHB04B-4

NAZWA PRODUKTU: Ukryta MINI KAMERA H2 PODSŁUCH Powerbank IR LED S151 Cechy produktu

Calisto Telefon konferencyjny USB. Instrukcja użytkowania

WARIATOR USTAWIENIA Białystok, Plażowa 49/1, Poland,

Transkrypt:

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Laboratorium Sterowania Robotów Sterowanie silnikami robota Lego NXT Uwagi wstępne 1. Wszystkie przykłady i zadania wykonujemy w środowisku Matlab z użyciem skrzynki narzędziowej RWTHMindstormsNXT. 2. Komunikację z robotem rozpoczynamy od podłączenia poprzez kabel USB. Następnie wykorzystujemy połączenie poprzez Bluetooth, zgodnie z zaleceniami prowadzącego. 3. Poniższy opis został przygotowany na podstawie informacji umieszczonych na stronie: http://www.mindstorms.rwth-aachen.de/. Wstęp teoretyczny 1. Przed tworzeniem nowej aplikacji dla robota Lego NXT musimy upewnić się, że wszystkie zmienne globalne, wskaźniki do struktur i ustawienia są wyzerowane, a okna z wykresami zamknięte. W tym celu wystarczy wykonać poniższy zestaw instrukcji COM_CloseNXT( all ) close all clear all % zamykamy wszystkie połączenia z NXT % zamykamy otwarte okna % usuwamy wszystkie zmienne na początku każdej tworzonej aplikacji. Uwaga! Należy pamiętać aby polecenie close all następowało po poleceniu COM_CloseNXT( all ). 2. Aby otworzyć połączenie z robotem, możemy użyć jednego z poniższych poleceń COM_OpenNXT - wykonanie tego polecenia jest podstawowym sposobem otwarcia połączenia z robotem; wynikiem jest uchwyt(tj. wskaźnik) do struktury z parametrami połączenia. COM_OpenNXTEx - to rozszerzona wersja powyższej funkcji, umożliwiająca między innymi określenie z którym robotem chcemy się połączyć. Funkcja ta ma głównie zastosowania w przypadku budowy robota z wykorzystaniem wielu kostek NXT. 3. Połaczenie poprzez kabel USB jest najłatwiejszym i najszybszym sposobem połączenia z naszym robotem. hnxt = COM_OpenNXT(); % szukamy połaczenia przez USB NXT_PlayTone(440, 500, hnxt); Wykonując powyższe polecenia inicjujemy połączenie z robotem i odtwarzamy dźwięk aby sprawdzić połączenie. Zmienna hnxt jest uchwytem do struktury opisującej urządzenie z którym mamy połączenie. Dlatego zmienna hnxt jest argumentem funkcji NXT_PlayTone(), w przeciwnym wypadku nie wiadomo którego NXT należy użyć. W przypadku korzystania z jednej i tej samej kostki NXT przez naszą aplikację, możemy uniknąć ciągłego używania tego samego uchwytu jako argumentu każdej funkcji poprzez ustawienie domyślnej wartości. W tym celu należy wykonać poniższy program COM_CloseNXT all hnxt = COM_OpenNXT(); % szukamy połączenia przez USB COM_SetDefaultNXT(hNXT); % ustawiamy domyślną wartość uchwytu % teraz nie musimy juz używać uchwytu hnxt pause(0.5); % ale nie zapominajmy o odpowiednim zakończeniu naszej aplikacji COM_CloseNXT(hNXT); 1

4. Sterowanie silnikiem wymaga stworzenia odpowiedniego obiektu klasy NXTMotor. Obiekt ten umożliwia wysyłanie poleceń do jednego lub dwóch silników i otrzymywać od nich dane (odczyt położenia z enkoderów). Aby stworzyć obiekt klasy NXTMotor wystarczy użyć następującego polecenia ma = NXTMotor( A ) Obiekt ma posiada odpowiednie własności i metody do sterowania sinikiem podłączonym do portu A. Pierwszym poleceniem sterującym będzie uruchomienie silnika (i sprawdzenie czy działa) ma.power = 50; % ustawiamy połowę mocy = 50% ma.sendtonxt(); % uruchamiamy silnik Silnika A działa... Aby go zatrzymać, wywołujemy funkcję x ma.stop( off ); Powyższe polecenie po prostu odłącza zasilanie od silnika powodując jego zatrzymanie. Jeśli jednak potrzebujemy natychmiastowego zatrzymania, lepiej jest wywołać następujące polecenie. ma.stop( brake ); W tym przypadku tzw. aktywny hamulec będzie użyty, powodując iż silnik zatrzyma się natychmiast po otrzymaniu tego polecenia. Zatrzymanie jest natychmiastowe ale również wymaga to relatywnie dużo mocy z baterii. Dlatego po zatrzymaniu najlepiej jest wyłączyć silnik, czyli wywołujemy funkcję ma.stop( off ); 5. Precyzyjne sterowanie silnikiem. W większości przypadków, sterowanie silnikiem poprzez ustawianie tylko wartości mocy sinika nie jest wystarczające. Możemy poruszać silnikiem w następujący sposób: ma = NXTMotor( A, Power, 50); ma.sendtonxt(); pause(3); % czekaj 3 sekundy ma.stop( brake ); Korzystając z powyższego zestawu instrukcji, sinik A będzie obracał się przez 3 sekundy. Należy jednak pamiętać, że różne obciążenie silnika (różna masa silnika) lub opóźnienia w komunikacji mogą powodować iż działanie sinika przez 3 sekundy daje w rezultacie różne odległości pokonane przez naszego robota. Dlatego musimy poruszać silnikiem zadaną liczbę obrotów. W tym celu użyjemy właściwości TachoLimit. ma.tacholimit = 360; ma.sendtonxt(); % chcemy obrotu o 360 stopni Teraz silnik wykonuje dokładnie jeden obrót (360 stopni z dokładnością ±1 stopień). Bardzo ważnym jest aby zrozumieć, że po przesłaniu polecenia do silnika, rozpoczyna on jego wykonanie a program natychmiast przechodzi do kolejnej instrukcji. Przykład: mb = NXTMotor( B, Power, 50, TachoLimit, 1000); mb.sendtonxt(); Wykonując powyższe instrukcje, nasz robot zacznie wykonywać ruch silnikiem B i natychmiast wyda dźwięk (czyli przed zakończeniem ruchu silnika)! Jeśli chcemy wydać dźwięk w momencie kiedy silnik osiągnie zadaną pozycję (czyli po wykonaniu ruchu), musimy czekać na silnik aż skończy wykonywać zadane polecenie: mb.sendtonxt(); mb.waitfor(); % wstrzymujemy MATLAB a na chwile % czyli czekamy aż silnik skończy % teraz silnik jest zatrzymany 2

Należy teraz pamiętać: Aby silnik wykonał polecenie SendToNXT(), musi być w stanie bezczynności lub spoczynku, czyli wykonał już ruch zadany poprzednim poleceniem. Możemy to osiągnąć na dwa sposoby. W pierwszym przypadku oczekujemy na zakończenie ostatniego polecenia silnika wykonujemy poprzez wywołanie funkcji WaitFor() przed wykonaniem kolejnego polecenia SendToNXT(). Oczywiście, jeśli silnik aktualnie nie wykonuje żadnego polecenia (czyli jest w stanie bezczynności) to wywołanie funkcji WaitFor() nie spowoduje żadnego oczekiwania tylko natychmiastowe przejście to kolejnego polecenia. Drugą możliwością jest zatrzymanie silnika po wykonaniu metody Stop(). Jeśli nie będziemy postępować według powyższych zasad to nasz robot zignoruje drugie polecenie wysłane do silnika. Przykład: % chcemy wykonac dwa obroty po 360 stopni mb = NXTMotor( B, Power, 50, TachoLimit, 360); mb.stop( off ); % Zatrzymujemy dla pewnosci silnik % - musi być w odpowiednim stanie czyli nie poruszać się mb.sendtonxt(); % Silnik jest teraz zajęty - wykonuje obrót mb.sendtonxt(); % TO NIE DZIAŁA!!! SILNIK JEST ZAJETY % ten przykład jest zły. % musimy użyć funkcji WaitFor() pomiędzy poleceniami SendToNXT() Aby umożliwić ruch sinika bez ograniczeń musimy ustawić właściwość TachoLimit na wartość 0. 6. Różne tryby hamowania Ustawiając wartość własności TachoLimit określamy kąt obrotu silnika, a znak własności Power określa kierunek ruchu. Jednak wciąż mamy kilka możliwości sterowania hamowaniem silników. Właściwość odpowiedzilna za sterowanie hamowaniem to ActionAtTachoLimit. Możliwe wartości tej właściwości to: (a) Coast - powoduje że silnik są po prostu wyłączane kiedy wartość TachoLimit jest osiągnięta. Powoduje to jednak powolne hamowania aż do zatrzymania siników. Jeśli wartość TachoLimit nie będzie osiągnięta silniki spowodują przesunięcie robota zbyt daleko. (b) Brake - jest to wartość domyślna powodująca łagodne hamowanie aż do osiągnięcia wartości TachoLimit. Dzięki temu osiągamy wysoką dokładność ruchu robota. po zatrzymaniu siniki są wyłączane. (c) Holdbrake jest podobny Brake, jednak w tym przypadku silniki nie są wyłączane ale mamy większy pobór prądu z baterii. 7. Regulacja prędkości i rozpoczęcie ruchu silników Istnieją jeszcze dwie własności które wymagają omówienia (a) SpeedRegulation - ta własność ma domyślnie wartość true. Oznacza to, że prędkość silnika jest stała i niezależna od obciążenia (masy robota), czyli sterowanie mocą silnika jest tak naprawdę niezależne od nas (zmienia się dynamicznie w zależności od obciążenia). Jeśli jednak obciążenie się nie zmienia to możemy bez problemów używać tej opcji. (b) SmoothStart - ta własność pozwala na łagodne przyspieszanie silników podczas startu (unikamy poślizgu kół podczas ruszania). Ta opcja działa jednak tylko kiedy TachoLimit> 0 jest ustawione ( ale nie działa kiedy ActionAtTachoLimit = Coast ). 8. Sterowanie dwoma silnikami Wszystkie dotychczasowe przykłady odnosiły się do sterowania jednym silnikiem. Możemy jednak stworzyć dwa obiekty klasy NXTMotor do sterowania dwom silnikami (zakładamy że koła robota są przymocowane do silników podłączonych odpowiednio do portów B i C): mb = NXTMotor( B, Power, 50); mc = NXTMotor( C, Power, 50); mb.sendtonxt(); mc.sendtonxt(); W powyższym przypadku napotykamy dwa problemy. Polecenia do silników są wysyłane jeden po drugim. W rezultacie silnik C zostanie uruchomiony później niż silnik B. Oznacza to, że robot wykona skręt przez rozpoczęciem ruchu. Po drugie silniki mogą uruchomić się z odrobinę różnymi prędkościami, czyli robot nie będzie się poruszał po linii prostej. Rozwiązaniem jest tutaj użycie jednego obiektu klasy dla dwóch silników. Oto przykład mbc = NXTMotor( BC, Power, 50); mbc.sendtonxt(); 3

Łatwe, prawda? Możemy również użyć polecenia WaitFor() lub poleceń hamowania tak jak to było do rej pory. Dostęp do właściwości jest również taki sam jak poprzednio. Oto przykład: mymotors = NXTMotor(); mymotors.port = [MOTOR_B; MOTOR_C]; % to samo jak mymotors.port = BC ; mymotors.power = 50; mymotors.tacholimit = 1000; mymotors.smoothstart = true; mymotors.speedregulation = false; % nie zapominajmy o tym! % czyli podczas tworzenia obiektu dla dwóch silników, regulacja prędkości % będzie wyłączona automatycznie, czyli nie uzywamy: % m = NXTMotor( BC ); % bo <-- m.speedregulation = false jest już ustawione mymotors.stop( off ); mymotors.sendtonxt(); % upewnijmy się że silniki są wyłączone %przed wysłaniem polecenia wykonania ruchu. Jest jeszcze coś o czym powinniśmy pamiętać. Popatrzmy na następujący przykład: mbc = NXTMotor( BC, Power, 50, TachoLimit, 1000); mbc.actionattacholimit = Coast ; mbc.sendtonxt(); mbc.waitfor(); pause(3); Podczas pauzy (przez 3 sekundy), możemy usłyszeć dziwny szum pochodzący z siników. Wydaje się również że są one zasilane lub wibrują. To jest wynikiem synchronizacji, która wciąż jest aktywna. Jeśli więc wykonujemy ruch jednym silnikiem to wtedy drugi poruszany jest automatycznie. Dzięki temu jesteśmy pewni że silniki są na tej samej pozycji. Możemy wyłaczyć synchronizację korzystając z metody Stop(): mbc.stop( off ); 9. Przykłady sterowania robotem Posiadając już podstawową wiedzę o sterowaniu sinikami, możemy przystąpić do sterowania ruchem naszego robota. Oto przykład: leftwheel = MOTOR_B; % lewe koło napędzane silnikiem B rightwheel = MOTOR_C; % prawe koło napędzane silnikiem C bothwheels = [leftwheel; rightwheel]; drivingpower = 60; turningpower = 40; drivingdist = 1000; % w stopniach turningdist = 220; % w stopniach % tworzymy odpowiedni obiekt mforward = NXTMotor(bothWheels, Power, drivingpower, TachoLimit, drivingdist); mreverse = mforward; % kopia obiektu mreverse.power = -mforward.power; % i zamieniamy kierunek jazdy! Czyli możemy poruszać naszym robotem w przód i tył. Wyślemy więc odpowiednie polecenia i poczekamy aż zostaną wykonane: % jedziemy do przodu mforward.sendtonxt(); mforward.waitfor(); % i wracamy do początku mreverse.sendtonxt(); mreverse.waitfor(); % zrobione - wydajemy dźwięk Aby skręcić (np. o 90 stopni), wykonujemy 2 kroki: Po pierwsze jedno koło obraca się w jednym kierunku (czyli robot skręca o 45 stopni czyli połowę obrotu. ), a później wykonujemy drugi krok czyli obrót drugim kołem w przeciwnym kierunku. W ten sposób skręt o 90 stopni będzie wykonany. 4

% do skręcania, potrzebujemy odpowiednią liczbę obiektów : mturnleft1 = NXTMotor(leftWheel, Power, -turningpower, TachoLimit, turningdist); mturnleft1.speedregulation = false; % tego nie potrzebujemy do skręcania % drugi etap skrętu, Używamy powyższych ustawień i je modyfikujemy : mturnleft2 = mturnleft1; % kopia obiektu mturnleft2.port = rightwheel; % ale dla drugiego koła mturnleft2.power = -mturnleft1.power; % zamiana kierunku % teraz obiekt do skrętu w prawo mturnright1 = mturnleft1; % pierwsza kopia... mturnright2 = mturnleft2; mturnright1.power = -mturnright1.power; mturnright2.power = -mturnright2.power; Teraz możemy użyć stworzone powyżej obiekty % skręt w lewo mturnleft1.sendtonxt(); mturnleft1.waitfor(); mturnleft2.sendtonxt(); mturnleft2.waitfor(); % czekamy chwilę pause(1); % skręcamy w prawo wracając do pozycji wyjściowej mturnright1.sendtonxt(); mturnright1.waitfor(); mturnright2.sendtonxt(); mturnright2.waitfor(); 10. Odczytywanie pozycji silników poza wysyłaniem poleceń do silników, możemy również odczytywać z nich informacje. Najważniejsza informacja jaką można odczytać to aktualna pozycja w stopniach. Aby dowiedzieć się więcej na ten temat, należy sprawdzić pomoc do funkcji ReadFromNXT() i ResetPosition(). Wywołanie funkcji ReadFromNXT() zwraca strukturę zawierającą wiele użytecznych pól z informacjami. Najważniejsze z nich to pole Position, gdzie jest przechowywana informacja o aktualnej pozycji silnika. Zmiana wartości pola Position odnosi się również do kierunku obrotu: Jeśli aktualnie zadana moc silnika jest dodatnia (pole Power) to wartość Position jest zwiększana. W przeciwnym wypadku wartość ta jest zmniejszana ( i może nawet zawierać wartości ujemne).oto przykład: % Oczywiście potrzebujemy odpowiedniego obiektu silnika % aby nim sterować... m = NXTMotor( A, Power, 50 ); % zerujemy licznik: m.resetposition(); m.sendtonxt(); pause(1); m.stop( off ); % zatrzymujemy silnik, który może jeszcze się obracać - metoda Stop( off ). % odczytajmy informację z silnika data = m.readfromnxt(); % i wyświetlmy w środowisku Matlab a: disp(sprintf( Motor A is currently at position %d, data.position)); % poczekajmy jeszcze chwilkę aż silnik sie zatrzyma pause(2); % i wyświetlmy pozycję jeszcze raz: data = m.readfromnxt(); disp(sprintf( Motor A is finally at position %d, data.position)); 5

Należy tutaj podkreślić iż inne własności obiektu silnika z wyłączeniem Port nie mają związu do not matter to use the method the methods ReadFromNXT() i ResetPosition. Również struktura danych zwracana przez ReadFromNXT() odnosi się tylko do aktualnego stanu silnika, i nie ma związku z innymi właściwościami silnika używanymi do odczytu danych (np. TachoLimit i Power). Zadania do wykonania 1. Zbudować robota o napędzie różnicowym według wskazówek prowadzącego. 2. Przetestować wszystkie programy umieszczone w powyższym wprowadzeniu teoretycznym. 3. Napisać program umożliwiający wyznaczenie zależności pomiędzy zadaną mocą silnika (właściwość.power) a jego prędkością obrotową. Przyjąć czas pomiaru >= 20 sekund. Przed każdym pomiarem należy zapisać (odczytać) aktualny poziom napięcia baterii. W tym celu należy użyć polecenia voltage = NXT_GetBatteryLevel(handle), gdzie voltage to odczytany poziom napięcia baterii a handle to uchwyt do struktury z parametrami połączenia. 4. Zależność pomiędzy mocą a prędkością obrotową silnika należy wyznaczyć z użyciem funkcji polyfit, np.: p=polyfit(x,y,r); % x, y - serie danych, r - zadany stopien wielomianu. 5. Zaimplementować proste funkcje umożliwiające konwersję prędkości obrotowej ([obr/min]) na prędkość kątową [rad/sec] i vice versa. 6. Napisać program umożliwiający wyznaczenie zależności pomiędzy zadaną mocą (właściwość.power) a jego prędkością liniową robota. Wykorzystać wyznaczone już zależności pomiędzy mocą a prędkością obrotową silnika. Przyjąć czas pomiaru >= 20 sekund a średnicę koła napędowego = 56 mm. Przed każdym pomiarem należy zapisać (odczytać) aktualny poziom napięcia baterii. Wyznaczyć zależność z użyciem funkcji polyfit. 7. Napisać program do poruszania robotem 20 cm w przód i w tył. Wykonać oddzielnie sterownie niezależne dwoma silnikami osobno, a następnie to samo przy użyciu synchronicznego sterowania silnikami. Zmierzyć fizycznie pokonaną odległość przez robota. Wskazać możliwe źródła błędów. 8. Zaimplementować funkcję do skrętu w dowolną stronę i o dowolną liczbę stopni. Użyć zaimplementowaną funkcję do programu umożliwiającego poruszaniem robotem wzdłuż następujących trajektorii Sprawozdanie trójkąt równoboczny, gdzie bok ma długość 30 cm; kwadrat, gdzie bok ma długość 30 cm. Sprawozdanie z przeprowadzonego laboratorium powinno zawierać: Kody źródłowe wszystkich utworzonych podczas laboratorium skryptów(nie zamieszczać kodów programów przykładowych!) wraz z komentarzem. Wyniki pomiarów i odpowiednie wykresy zależności. Uwagi i wnioski 6