Talaan ng mga Nilalaman:

Mars Roomba Project UTK: 4 na Hakbang
Mars Roomba Project UTK: 4 na Hakbang

Video: Mars Roomba Project UTK: 4 na Hakbang

Video: Mars Roomba Project UTK: 4 na Hakbang
Video: Моя работа наблюдать за лесом и здесь происходит что-то странное 2024, Hulyo
Anonim
Mars Roomba Project UTK
Mars Roomba Project UTK
Mars Roomba Project UTK
Mars Roomba Project UTK

DISCLAIMER: GAGAGAWA LANG ITO KUNG ANG ROOMBA AY NA-SET SA A

Napaka-tiyak na Paraan, ANG INSTRUCTABLE NA ITO AY NILIKHA PARA SA AT GINAWA NG GAMIT NG UNIVERSITY OF TENNESSEE STUDENTS AND FACULTY

Ginagamit ang code na ito upang mag-set up ng isang Roomba upang magpatakbo ng lokal na nakasulat at nai-save na code sa MATLAB. Hindi ito gagana kung hindi mo makuha ang mga kinakailangang aklatan mula sa website ng University of Tennessee. Kung mayroon kang mga aklatan maaari mong magamit ang mga ito upang mai-program ang iyong sariling Roomba gamit ang mga pag-andar sa silid-aklatan. Itinuturo sa iyo ng Instructable na ito kung paano i-install ang mga aklatan, lumikha ng isang folder para sa lahat ng code, at kung paano i-code at gamitin ang program na aming ibinigay sa ibaba.

Mga Kinakailangan na Materyales:

· Roomba

· MATLAB

· Raspberry Pi at Pi Camera

Hakbang 1: Pagkuha ng Mga Aklatan

Sa website ng engineering may ibinigay na toolbox / library, i-download ito at ilagay ito sa isang bagong folder. Ang folder na ito ay dapat na naglalaman ng lahat ng mga file ng proyekto sa trabaho bilang, ang anumang pagpapaandar na ginamit sa isang program na iyong ginawa ay kailangang mag-refer sa library. Matapos mong magawa ito maaari kang magsimulang magtrabaho sa iyong mga programa

Hakbang 2: Pagsulat ng mga Program

Mayroong ilang mga pag-andar na maaaring magamit sa programa, ang mga pagpapaandar na ito ay maaaring ma-access sa pamamagitan ng paggamit ng utos na "doc roomba". Gamit ang mga pagpapaandar na ito, makokontrol mo ang iyong Roomba sa maraming iba't ibang paraan. Ang code na ibinigay sa ibaba ay gumagamit ng mga sensor ng paga, sensor ng light bar, camera, at cliff sensor sa iba't ibang paraan upang lumikha ng isang mars rover. Ginamit namin ang mga sensor ng paga upang matukoy kapag ang Roomba ay tumama sa isang bagay, kapag nangyari ito ang robot ay babaliktad, paikot, at magpatuloy na gumalaw. Bago mag-hit ang Roomba ng isang bagay, matutukoy ng light bar ang bagay at babagal ang Roomba upang kapag bumagsak ito sa object upang maisaaktibo ang sensor ng bula ang Roomba ay hindi gaanong nasisira / naapektuhan ng epekto. Ang camera ay naghahanap ng tubig o lava sa ibabaw, kung walang natagpuang likido pagkatapos ay ang robot ay magpapatuloy sa paghahanap, kung may natagpuang tubig pagkatapos ay ang mensahe ng robot sa mga operator. Ang mga sensor ng bangin ay idinisenyo upang ihinto ang robot kung papalapit ito sa isang bangin. Kung ang robot ay may pakiramdam ng isang bangin ito ay babaliktad at lumingon upang maiwasan ang pagkahulog.

Hakbang 3: Code

Kopyahin at i-paste ito sa isang MATLAB file na matatagpuan sa parehong folder tulad ng mga aklatan

functionMainRoombaFile (r)

r.setDriveVelocity (0.1, 0.1)

habang totoo% Infinte habang loop upang mapanatili ang pagpapatakbo ng code

dontFall = cliffCheck (r)% Nagtatalaga ng variable na 'dontFall' sa pagpapaandar na 'cliffCheck'

kung dontFall% kung pahayag upang magpatuloy sa code pagkatapos na makumpleto ang 'cliffCheck'

r.setDriveVelocity (0.1, 0.1)% Pinapanatili ang paggalaw ng Roomba pagkatapos makumpleto ang 'cliffCheck'

magtatapos ang% end 'dontFall' kung pahayag

bumper = bumpcheck (r)% Nagtatalaga ng variable na 'bumper' sa pagpapaandar na 'bumpcheck'

kung bumper% kung ang pahayag upang magpatuloy sa code pagkatapos ng 'bumpcheck' ay kumpleto na

r.setDriveVelocity (0.1, 0.1)% Pinapanatili ang paggalaw ng Roomba pagkatapos makumpleto ang 'bumpcheck'

magtatapos ang% end 'bumper' kung pahayag

likido = LiquidCheck (r)% Nagtatalaga ng mga variable na 'likido' sa pagpapaandar na 'LiquidCheck'

kung ang mga likido% kung ang pahayag upang magpatuloy sa code pagkatapos na makumpleto ang 'LiquidCheck'

r.setDriveVelocity (0.1, 0.1)% Pinapanatili ang paggalaw ng Roomba pagkatapos makumpleto ang 'LiquidCheck'

ang pagtatapos ng% ay magtatapos sa 'mga likido' kung pahayag

lightbumper = lightcheck (r)% Nagtatalaga ng variable na 'lightbumper' sa pagpapaandar na 'lightcheck'

i-pause (0.1)% Sandaling i-pause upang maiwasan ang tuluy-tuloy na pag-ulit ng loop

magtatapos ang% end infinite habang loop

nagtatapos sa paggana ng end%

function bumper = bumpcheck (r)% Lumilikha ng function na 'bumpcheck'

bumpdata = r.getBumpers% Itinatalaga ang lahat ng data mula sa bumper hanggang sa variable na 'bumpdata'

bumper = bumpdata. tama || bumpdata.kaliwa || bumpdata.front% Lumilikha ng isang nakaimbak na variable, 'bumper', para sa iba't ibang mga bumper

kung bumpdata.kano> 0% Kung ang pahayag na sanhi upang mangyari ang iba't ibang mga pag-andar ng roomba kung bumper ang Bumper

r.stop% Itigil ang Roomba

r.moveDistance (-0.3, 0.2)% Reverses Roomba 0.3m

r.turnAngle (90, 0.5)% Paikutin ang Roomba ng 90 degree nang mas mabilis hangga't maaari

magtapos

kung bumpdata.front> 0

r.stop

r.moveDistance (-0.3, 0.2)

r.turnAngle (randi (270), 0.5)% Paikutin ang Roomba sa isang random na agwat sa pagitan ng 0 at 270 degree nang mas mabilis hangga't maaari

magtapos

kung bumpdata.kaliwa> 0

r.stop

r.moveDistance (-0.3, 0.2)

r.turnAngle (-90, 0.5)% Paikutin ang Roomba -90 degree nang mas mabilis hangga't maaari

magtapos

magtapos

function lightbumper = lightcheck (r)% Lumilikha ng function na 'lightcheck'

lightdata = r.getLightBumpers% Itinatalaga ang lahat ng data mula sa light bump sensor sa variable na 'lightdata'

lightbumper = lightdata.kaliwa || lightdata. tama || lightdata. RightCenter || lightdata.leftCenter% Lumilikha ng isang nakaimbak na variable, 'lightbumper', para sa iba't ibang mga light bumper

kung lightbumper% Kung pahayag upang tawagan ang data ng lightbumper mula sa itaas

kung lightdata.kaliwa> 10% Kung ang pahayag na sanhi upang mangyari ang iba't ibang mga pag-andar ng roomba kung ang light bumper ay nakakaramdam ng higit sa 10 mga halaga

r.setDriveVelocity (0.05, 0.05)% Pinapabagal ang roomba upang maghanda para sa paga

pagtatapos% magtatapos pauna kung pahayag

kung lightdata. RightCenter> 10

r.setDriveVelocity (0.05, 0.05)

magtapos

kung lightdata. tama> 10

r.setDriveVelocity (0.05, 0.05)

magtapos

kung lightdata.leftCenter> 10

r.setDriveVelocity (0.05, 0.05)

magtapos

magtatapos ang% light 'lightbumper' kung pahayag

natapos ang pagtatapos ng paggana ng lightcheck

function dontFall = cliffCheck (r)% Lumilikha ng function na 'cliffCheck'

data = r.getCliffSensors; % Nagtatalaga ng lahat ng data mula sa cliff sensor patungo sa variable na 'data'

dontFall = data.kaliwa <1020 || data.leftFront <1020 || data. RightFront <1020 || data. Right <1020% Lumilikha ng isang naka-imbak na variable, 'dontFall', para sa iba't ibang mga sensor ng cliff

kung dontFall% Kung pahayag upang tawagan ang data ng cliff sensor mula sa itaas

kung data.left <1010% Kung ang pahayag na sanhi ng iba't ibang mga pag-andar ng roomba ay nangyari kung ang sensor ng cliff ay nakakaramdam ng mas mababa sa 1010 na halaga

r.stop

r.moveDistance (-0.2, 0.2)% Reverses Roomba 0.2m

r.turnAngle (-90, 0.5)% Paikutin ang Roomba -90 degree nang mas mabilis hangga't maaari

kung hindi man ang data.leftFront <1010

r.stop

r.moveDistance (-0.3, 0.2)

r.turnAngle (90, 0.5)% Paikutin ang Roomba ng 90 degree nang mas mabilis hangga't maaari

kung hindi man ang data. RightFront <1010

r.stop

r.moveDistance (-0.3, 0.2)

r.turnAngle (90, 0.5)% Paikutin ang Roomba ng 90 degree nang mas mabilis hangga't maaari

kung hindi man ang data. tama <1010

r.stop

r.moveDistance (-0.3, 0.2)

r.turnAngle (90, 0.5)% Paikutin ang Roomba ng 90 degree nang mas mabilis hangga't maaari

magtapos

magtapos

magtapos

mga likido sa pag-andar = LiquidCheck (r)% Lumilikha ng paggana ng 'LiquidCheck'

habang ang tunay na% ay nagsisimulang walang katapusan na loop para sa pag-calibrate

img = r.getImage; % basahin ang camera off ng robot

imahe (img)% ipinapakita ang imahe sa isang window ng figure

binabasa ng red_mean = mean (mean (img (200, 150, 1)))% ang average na halaga ng mga pulang pixel

blue_mean = ibig sabihin (ibig sabihin (mean (img (200, 150, 3)))% binabasa ang average na halaga ng mga asul na pixel

likido = red_mean || blue_mean% Lumilikha ng isang nakaimbak na variable, 'mga likido', para sa iba't ibang mga variable ng kulay

kung likido% Kung pahayag upang tawagan ang data ng imahe mula sa itaas

kung red_mean> 170% Kung ang pahayag na sanhi upang mangyari ang iba't ibang mga pag-andar ng roomba kung ang camera ay nakakita ng isang ibig sabihin ng pulang kulay na mas malaki sa 170

ihinto ni r.stop ang roomba

r.setLEDCenterColor (255)% nagtatakda ng bilog sa kulay pula

r.setLEDDigits (); % i-clear ang display

f = waitbar (0, '* INCOMING MESSAGE *'); Lumilikha si% ng isang waitbar para sa isang mensahe sa paglo-load

r.setLEDDigits ('HOT'); % nagtatakda ng LED display upang maglabas ng 'PANAHON'

i-pause (0.5)% Maikling Pag-pause upang basahin ang impormasyong hindi naaayon

r.setLEDDigits ('LAVA'); % nagtatakda ng LED display upang i-output ang 'LAVA'

i-pause (0.5)

waitbar (.33, f, '* INCOMING MESSAGE *'); Lumilikha ang% ng pagtaas sa waitbar

r.setLEDDigits ('HOT');

i-pause (0.5)

r.setLEDDigits ('LAVA');

i-pause (0.5)

waitbar (.67, f, '* INCOMING MESSAGE *'); Lumilikha ang% ng pagtaas sa waitbar

r.setLEDDigits ('HOT');

i-pause (0.5)

r.setLEDDigits ('LAVA');

waitbar (1, f, '* INCOMING MESSAGE *'); % nakumpleto ang waitbar

i-pause (1)

isara (f)% isinasara ang waitbar

r.setLEDDigits (); % nililimas ang LED display

isara ang lahat% Isinasara ang lahat ng nakaraang windows

axes ('Colour', 'none', 'XColor', 'none', 'YColor', 'none')% Inaalis ang window ng plot ng mga palakol at tsart

y = 0.5; Itinatakda ni% ang y-posisyon ng teksto sa window ng paglalagay

x = 0.06; Itinatakda ni% ang x-posisyon ng teksto sa window ng paglalagay

pamagat ('MULA SA MARS ROOMBA', 'fontsize', 32)% Nagdaragdag ng isang pamagat sa window ng paglalagay

quadeqtxt = 'DANGER LAVA'; % Itinatakda ang variable na 'quadeqtxt' sa output 0

teksto (x, y, quadeqtxt, 'interpreter', 'latex', 'fontsize', 36); % ipinapakita ang teksto ng quadeq sa window ng paglalagay

r.moveDistance (-0.2, 0.2)% baligtarin ang roomba 0.2m

r.turnAngle (180, 0.5)% lumiliko sa roomba 180 degree nang mas mabilis hangga't maaari

r.setLEDCenterColor (128, 128); Itinatakda ng% ang roomba center na LED sa orange

isara ang lahat ng% magsasara ng natitirang bukas na windows

kung hindi man blue_mean> 175% Kung ang pahayag na sanhi upang mangyari ang iba't ibang mga pag-andar ng roomba kung nakikita ng camera ang isang ibig sabihin ng asul na kulay na mas malaki sa 175

ihinto ni r.stop ang roomba

r.setLEDCenterColor (255)% nagtatakda ng bilog sa kulay pula

r.setLEDDigits (); % i-clear ang display

f = waitbar (0, '* INCOMING MESSAGE *'); Lumilikha si% ng isang waitbar para sa isang mensahe sa paglo-load

r.setLEDDigits ('LOOK'); % nagtatakda ng LED display upang i-output ang 'LOOK'

i-pause (0.5)% Maikling Pag-pause upang basahin ang impormasyong hindi naaayon

r.setLEDDigits ('WATR'); % nagtatakda ng LED display upang i-output ang 'WATR'

i-pause (0.5)

waitbar (.33, f, '* INCOMING MESSAGE *'); Lumilikha ang% ng pagtaas sa waitbar

r.setLEDDigits ('LOOK');

i-pause (0.5)

r.setLEDDigits ('WATR');

i-pause (0.5)

waitbar (.67, f, '* INCOMING MESSAGE *'); Lumilikha si% ng pagtaas sa waitbar

r.setLEDDigits ('LOOK');

i-pause (0.5)

r.setLEDDigits ('WATR');

waitbar (1, f, '* INCOMING MESSAGE *'); % nakumpleto ang waitbar

i-pause (1)

isara (f)% isinasara ang waitbar

r.setLEDDigits (); % nililimas ang LED display

isara ang lahat% Isinasara ang lahat ng nakaraang windows

axes ('Colour', 'none', 'XColor', 'none', 'YColor', 'none')% Inaalis ang window ng plot ng mga palakol at tsart

y = 0.5; Itinatakda ni% ang y-posisyon ng teksto sa window ng paglalagay

x = 0.06; Itinatakda ni% ang x-posisyon ng teksto sa window ng paglalagay

pamagat ('MULA SA MARS ROOMBA', 'fontsize', 32)% Nagdaragdag ng isang pamagat sa window ng paglalagay

quadeqtxt = 'NAPUNONG TUBIG'; % Itinatakda ang variable na 'quadeqtxt' sa output 0

teksto (x, y, quadeqtxt, 'interpreter', 'latex', 'fontsize', 36); % ipinapakita ang teksto ng quadeq sa window ng paglalagay

r.moveDistance (-0.2, 0.2)% baligtarin ang roomba 0.2m

r.turnAngle (180, 0.5)% lumiliko sa roomba 180 degree nang mas mabilis hangga't maaari

r.setLEDCenterColor (128, 128); Itinatakda ng% ang roomba center na LED sa orange

isara ang lahat ng% magsasara ng natitirang bukas na windows

magtatapos ang% end 'red_mean' kung pahayag

ang pagtatapos ng% ay magtatapos sa 'mga likido' kung pahayag

Ang end% ay nagsasara ng walang katapusan habang loop

nagtatapos sa pagtatapos ng% function na 'LiquidCheck'

Hakbang 4: Pagpapatakbo ng Code

Matapos mong makopya at mai-paste ang code sa MATLAB dapat kang kumonekta sa Roomba. Kapag nakakonekta ang Roomba dapat mong pangalanan ang variable r. Ginagamit ng mga pagpapaandar ang variable r kapag tumutukoy sa Roomba, kaya't ang Roomba ay dapat na tinukoy bilang variable r. Matapos patakbuhin ang code ang Roomba ay dapat tumakbo tulad ng itinuro.

Inirerekumendang: