Spisu treści:

Projekt UTK EF 230 MarsRoomba Jesień 2018: 5 kroków
Projekt UTK EF 230 MarsRoomba Jesień 2018: 5 kroków

Wideo: Projekt UTK EF 230 MarsRoomba Jesień 2018: 5 kroków

Wideo: Projekt UTK EF 230 MarsRoomba Jesień 2018: 5 kroków
Wideo: UTK - EF 230 Autonomous Vehicle Project 2024, Listopad
Anonim
Projekt UTK EF 230 MarsRoomba Jesień 2018
Projekt UTK EF 230 MarsRoomba Jesień 2018

Obecnie łaziki marsjańskie są używane do zbierania danych na powierzchni Marsa różnymi metodami, aby ostatecznie dowiedzieć się więcej o potencjale planety dla życia mikrobiologicznego. Łaziki wykorzystują przede wszystkim narzędzia fotograficzne i analizy gleby do zbierania danych, ale łaziki zawierają również instrumenty nawigacyjne, detektory promieniowania, czujniki atmosferyczne i laser do odparowywania próbek skał. Według NASA cel planowanej misji łazika na 2020 rok jest w większości taki sam, ale ze specjalnym zadaniem „zbierania próbek gleby i skał i buforowania ich na powierzchni w celu potencjalnego powrotu na Ziemię w przyszłej misji”.

Jednak przy założeniu, że przyszłe łaziki będą wykorzystywane do pomocy ludziom, nasz zespół rozważył, jakie aspekty ludzi może monitorować łazik. Doszliśmy do wniosku, że gdyby jakiś wypadek spowodował nieprzytomność astronauty z powodu awarii systemu podtrzymywania życia i sprzętu, nasz łazik mógłby służyć jako mobilna latarnia morska, obserwując, że astronauta, za którym podąża, jest nieruchomy i przekazuje wiadomość o niebezpieczeństwie. Aby podążać za człowiekiem i określić bezruch, łazik pobierał dane wejściowe, takie jak kolor butów człowieka i ich ruch. Innym elementem, który należy wziąć pod uwagę, jest to, że musiałby zapamiętać swoją ścieżkę, aby przekazać sygnał o niebezpieczeństwie w sytuacji awaryjnej. Nasz łazik spełnia potrzebę na Marsie, ponieważ próba tak kosztownej misji na tak obcym terenie wymaga wielu warstw zabezpieczeń, a jeśli astronauta nie będzie w stanie uzyskać własnej pomocy z powodu awarii lub utraty przytomności, łazik może ostrzec innych.

Ta instrukcja ma na celu pomóc czytelnikowi w zaprogramowaniu robota Roomba, aby pomyślnie podążał za „astronautą” i wysyłał sygnał o niebezpieczeństwie, jeśli ma to zastosowanie.

Krok 1: Potrzebne materiały

Potrzebne materiały
Potrzebne materiały

1) komputer/laptop z dostępem do Internetu

2) MATLAB_R2018a

3) Roomba i Roomba do pobrania

Krok 2: Konfiguracja/Pobieranie

Konfiguracja/Pobieranie
Konfiguracja/Pobieranie

Uruchom ten skrypt w MATLAB, aby pobrać oprogramowanie potrzebne do uzyskania dostępu do Roomby (zapisane we własnym pliku w folderze projektu)

Dodatkowa pomoc:

% Program instalacyjny dla EF 230 Roomba Project% Ostatnia aktualizacja: 13 września 2017 r. (Naprawiono problemy z bezpieczeństwem związane z serwerem https i usunięto ostrzeżenie o usunięciu pliku w przypadku wystąpienia błędów) function roombaInstall clc; % lista plików do zainstalowania pliki = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'}; % lokalizacja do zainstalowania z options = weboptions('CertificateFilename', ''); % każ mu ignorować wymagania certyfikatu server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/'; dlgTitle = 'Instalacja/aktualizacja Roomba'; % wyświetl cel i otrzyma monit o potwierdzenie = { 'Ten program pobierze te pliki EF 230 Roomba:' '' strjoin(files, ' ') '' 'do tego folderu:' '' cd '' 'Czy chcesz kontynuować? ' }; brzęczyk; yn = questdlg(monit, … dlgTitle, … 'Tak', 'Nie', 'Tak');

if ~strcmp(yn, 'Tak'), zwróć; kończyć się

% pobierz listę istniejących plików istniejące_pliki = pliki(cellfun(@istnieje, pliki) > 0); if ~isempty(istniejące_pliki) % upewnij się, że naprawdę można je zastąpić prompt = {'Zastępujesz te pliki: ' '' strjoin(istniejące_pliki, ' ') '' 'Czy zamienić?' }; brzęczyk; yn = questdlg(monit, … dlgTitle, … 'Tak', 'Nie', 'Tak'); if ~strcmp(yn, 'Tak'), zwróć; koniec koniec

% pobierz pliki cnt = 0; dla i=1:długość(pliki) f=pliki{i}; disp(['Pobieranie' f]); spróbuj url = [serwer f]; websave(f, url, opcje); % dodanych opcji, aby uniknąć błędów bezpieczeństwa cnt = cnt + 1; catch disp(['Błąd pobierania' f]); manekin = [f '.html']; jeśli istnieje(atrapa, 'plik')==2 usuń(atrapa) end end end

if cnt == length(files) msg = 'Instalacja powiodła się'; waitfor(msgbox(msg, dlgTitle)); else msg = 'Błąd instalacji - szczegóły w oknie poleceń'; waitfor(errordlg(msg, dlgTitle)); kończyć się

zakończ %roombaInstall

Krok 3: część kodu 1: funkcja śledzenia

Część kodu 1: Funkcja śledzenia
Część kodu 1: Funkcja śledzenia

Ta funkcja pobiera zmienną Roomba i obraz z kamery na Roombie i znajduje współrzędne środka xy śledzonego obiektu

Zapisz ten kod w innym pliku w tym samym folderze.

funkcja [xm, ym] = trackingblue(r)% Wejścia: zmienna roomba % Wyjścia: x i y wartość środka następującego obiektu % Cel: znajduje środek niebieskiego obiektu na podstawie obrazu % Użycie [wartość x, y wartość] = trackingblue (zmienna roomba) img=r.getImage; % odczytuje kamerę z robota subplot(1, 2, 2) subimage(img); % pokazuje obraz w tym samym oknie co tytuł ścieżki('Obraz śledzący') red = img(:,:, 1); zielony = obraz(:,:, 2); niebieski = obraz(:,:, 3); justBlue = niebieski - zielony/2 - czerwony/2; bw = justBlue > 40; przytrzymaj subplot(1, 2, 2) subimage(bw); [x, y] = znajdź(mc); if ~isempty(x) && ~isempty(y) xm = round(mean(x)); ym = okrągły(średnia(y)); xx = max(1, xm-5):min(xm+5, rozmiar(mc, 1)); yy = max(1, ym-5):min(ym+5, rozmiar(m.c., 2)); bwbw = zera(rozmiar(mc), 'uint8'); bwbw(xx, yy) = 255; przytrzymaj subplot(1, 2, 2) subimage(justBlue + bwbw); kończyć się

Krok 4: Część kodu 2: Podczas pętli

Ten kod steruje robotem Roomba w oparciu o położenie x i y obiektu z funkcji śledzenia. To sprawi, że Roomba będzie uważać na ściany i klify, szukając niebieskiego. Spowoduje to również pobranie współrzędnych x i y ścieżki robota Roomba i utworzenie odpowiedniego wykresu z obrazem śledzenia. Jeśli czujnik uderzeń jest aktywny, przejdzie do sekcji poczty e-mail

%Rover projekt

% Jonah Zahn, Wade Price, Noah Sloan %jzahn2, wprice15, nsloan1 % Wejścia: wartość Roomba, dane kamery, czujniki wstrząsów, światła i ściany % Cel: Podąża za astronautą i omija przeszkody. W przypadku powiadomienia, Roomba wysyła wiadomość e-mail z wyszczególnieniem mapy i lokalizacji zgodnie z jego pozycją początkową. %Użycie: po prostu uruchom program z zadeklarowaną zmienną roomba, dodatkowo % miej ruchomy zielony obiekt %Wyjścia: pokazuje obraz śledzenia obrazu, mapę e-maili i tekst do użytkownika %% Po sekcji b=0; %zmienne inicjujące c=0; x=0; y=0; theta=0; while c==0 %Pętla, aby wykryć niebieski obiekt i przeszkody t = r.timeGet; d = r.getDistance; [xval, yval] = trackingblue(r); klif=getCliffSensors(r); %inicjowanie struktur dla wartości czujników light=getLightBumpers(r); bump= getBumpers(r); jeśli light.leftCenter >= 10 || light.rightCenter >= 10 % Wykrywa, czy w pobliżu r.stop znajduje się ściana r.setLEDDigits('help') c=1 % while b==0 % if bump.right == 1 || bump.left == 1 || bump.front == 1 %Wyczuwa, czy uderzył w coś po wykryciu ściany % c=1 % b=1 % disp('bump') % end % end elseif bump.right == 1 || bump.left == 1 || bump.front == 1 %Wyczuwa, jeśli na coś wpadł, jeśli tak, wyśle e-mail r.stop c=1 b=1 elseif cliff.leftFront <= 100 || cliff.rightFront <= 100 || urwisko.lewo <= 100 || cliff.right <= 100 %Wykrywa klif w pobliżu r.stop c=1 r.setLEDDigits('help') else % Ustawia prędkość jazdy na niebieską jeśli yval = 100 r.setDriveVelocity(0.1) elseif yval 400 r.turnAngle(-5) koniec koniec theta = theta + r.getAngle; x = d.*cosd(theta) + x; % x współrzędna pokoju y = d.*sind(theta).*d + y; % y współrzędna podrzędnego wykresu Roomba(1, 2, 1) plot(x, y, 'bd') % kreśli ścieżkę i dodaje tytuł tytułu('Roomba Path') hold; kończyć się

Krok 5: Część kodu 3: Sekcja e-mail

Spowoduje to zabranie wykreślonej ścieżki i obrazu i wysłanie go na określony adres e-mail

(Pokazane tutaj z przykładowym adresem e-mail)

%% sekcja e-mail

if b==1 saveas(gcf, 'rovermap.png') %zapisuje figurę setpref('Internet', 'SMTP_Server', 'smtp.gmail.com'); setpref('Internet', 'E_mail', '[email protected]'); % konto pocztowe do wysłania z setpref('Internet', 'SMTP_Username', '[email protected]'); % senders username setpref('Internet', 'SMTP_Password', 'gssegsse'); % Nadawcy hasła props = java.lang. System.getProperties; props.setProperty('mail.smtp.auth', 'prawda'); props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory'); props.setProperty('mail.smtp.socketFactory.port', '465'); sendmail('example email', 'RoverBeacon', 'Astronauta przestał się poruszać. Aby odzyskać sprawność, postępuj zgodnie ze wskazówkami w załączonym pliku.', 'rovermap.png') disp('email wysłany') end

Zalecana: