Përmbajtje:
2025 Autor: John Day | [email protected]. E modifikuara e fundit: 2025-01-13 06:58
Mohimi: Kjo do të punojë vetëm nëse dhoma është e vendosur në
SHUMY M SPNYREC SPECIFIKE, K INT IN UDHUCTZUESE SHT KRIJUAR DHE MENDUAR T BE P USRDORET NGA UNIVERSITETI I NXUDNSVE DHE FAKULTETIT NEN TENENCE
Ky kod përdoret për të krijuar një Roomba për të ekzekutuar kodin e shkruar dhe ruajtur në vend në MATLAB. Kjo nuk do të funksionojë nëse nuk jeni në gjendje të merrni bibliotekat e nevojshme nga faqja e internetit e Universitetit të Tennessee. Nëse keni biblioteka, atëherë mund t'i përdorni ato për të programuar Roomba -n tuaj duke përdorur funksionet në bibliotekë. Ky Instructable ju mëson se si të instaloni bibliotekat, të krijoni një dosje për të gjithë kodin dhe si të kodoni dhe përdorni programin që kemi dhënë më poshtë.
Materialet e kërkuara:
· Roomba
· MATLAB
· Kamera Raspberry Pi dhe Pi
Hapi 1: Marrja e bibliotekave
Në uebfaqen inxhinierike ofrohet një kuti veglash/bibliotekë, shkarkojeni dhe vendoseni në një dosje të re. Kjo dosje duhet të përmbajë të gjithë skedarët e punës së projektit, pasi çdo funksion i përdorur në një program që bëni do t'i duhet t'i referohet bibliotekës. Pasi ta keni bërë këtë, mund të filloni të punoni në programet tuaja
Hapi 2: Shkrimi i programeve
Ka mjaft funksione që mund të përdoren në program, këto funksione mund të arrihen duke përdorur komandën "doc roomba". Duke përdorur këto funksione, ju mund të kontrolloni Roomba -n tuaj në shumë mënyra të ndryshme. Kodi i dhënë më poshtë përdor sensorët e përplasjes, sensorët e shiritit të dritës, kamerën dhe sensorët e shkëmbinjve në mënyra të ndryshme për të krijuar një rover mars. Ne përdorëm sensorët e përplasjes për të zbuluar kur Roomba godet një objekt, kur kjo ndodh roboti do të kthehet mbrapsht, do të kthehet dhe do të vazhdojë të lëvizë. Para se Roomba të godasë një objekt, drita e dritës do të zbulojë objektin dhe do të ngadalësojë Roomba -n, kështu që kur të përplaset me objektin për të aktivizuar sensorin e goditjes, Roomba do të jetë më pak i dëmtuar/prekur nga ndikimi. Kamera kërkon ujë ose lavë në sipërfaqe, nëse nuk ka lëng të gjetur atëherë roboti do të vazhdojë të kërkojë, nëse gjendet pak ujë atëherë roboti do t’i dërgojë mesazh operatorëve. Sensorët e shkëmbit janë krijuar për të ndaluar robotin nëse i afrohet një shkëmbi. Nëse roboti ndjen një shkëmb ai do të kthehet mbrapsht dhe do të kthehet për të shmangur rënien.
Hapi 3: Kodi
Kopjoni dhe ngjisni këtë në një skedar MATLAB që ndodhet në të njëjtën dosje me bibliotekat
funksionMainRoombaFile (r)
r.setDriveVelocity (0.1, 0.1)
ndërsa e vërtetë % Infinte ndërsa lak për të mbajtur kodin në punë
dontFall = cliffCheck (r) % Cakton ndryshoren 'dontFall' në funksionin 'cliffCheck'
if dontFall % if deklarata për të vazhduar në kod pas përfundimit të 'cliffCheck'
r.setDriveVelocity (0.1, 0.1) % Mban Roomba në lëvizje pasi 'cliffCheck' të ketë përfunduar
fund % përfundon 'dontFall' if statement
bumper = bumpcheck (r) % Cakton variablin 'parakolp' në funksionin 'bumpcheck'
nëse parakolp % if deklarata për të vazhduar në kod pasi të ketë përfunduar 'kontrollimi i bumpcheck'
r.setDriveVelocity (0.1, 0.1) % Mban Roomba në lëvizje pasi të ketë përfunduar 'kontrollimi i gabimeve'
fund % përfundon 'parakolp' nëse deklarata
lëngje = LiquidCheck (r) % Cakton variablin 'lëngje' në funksionin 'LiquidCheck'
nëse lëngjet % nëse deklarata për të vazhduar në kod pasi të ketë përfunduar "LiquidCheck"
r.setDriveVelocity (0.1, 0.1) % Mban Roomba të lëvizë pasi "LiquidCheck" të ketë përfunduar
fund % përfundon 'lëngje' nëse deklarata
lightbumper = lightcheck (r) % Cakton variablin 'lightbumper' në funksionin 'lightcheck'
pauzë (0.1) % Pauzë e shkurtër për të shmangur përsëritjen e vazhdueshme të lakut
fund % përfundon pafund ndërsa lak
fundi % përfundon funksionin
funksion bumper = bumpcheck (r) % Krijon funksionin 'bumpcheck'
bumpdata = r.getBumpers % Cakton të gjitha të dhënat nga parakolpi në ndryshoren 'bumpdata'
parakolp = bumpdata.djathtas || bumpdata.left || bumpdata.front % Krijon një ndryshore të ruajtur, 'bumper', për parakolpët e ndryshëm
nëse bumpdata.right> 0 % Nëse deklarata të shkaktojë funksione të ndryshme të dhomës ndodh nëse Parakolp përplaset
r.ndal % Ndalon Roomba
r.moveDistanca (-0.3, 0.2) % Kthen dhomën Roomba 0.3m
r.turnAngle (90, 0.5) % Rrotullon Roomba 90 gradë sa më shpejt që të jetë e mundur
fund
nëse bumpdata.front> 0
r.ndaloj
r.moveDistanca (-0.3, 0.2)
r.turnAngle (randi (270), 0.5) % Rrotullon Roomba në një interval të rastit midis 0 dhe 270 gradë sa më shpejt që të jetë e mundur
fund
nëse bumpdata.left> 0
r.ndaloj
r.moveDistanca (-0.3, 0.2)
r.turnAngle (-90, 0.5) % Rrotullon Roomba -90 gradë sa më shpejt që të jetë e mundur
fund
fund
funksioni lightbumper = lightcheck (r) % Krijon funksionin 'lightcheck'
lightdata = r.getLightBumpers % Cakton të gjitha të dhënat nga sensori i përplasjes së dritës në 'lightdata' të ndryshueshme
lightbumper = lightdata.left || lightdata.djathtas || lightdata.rightCenter || lightdata.leftCenter % Krijon një ndryshore të ruajtur, 'lightbumper', për parakolpët e ndryshëm të dritës
if lightbumper % If deklarata për të thirrur të dhënat e lightbumper nga lart
nëse lightdata.left> 10 % Nëse deklarata shkakton funksione të ndryshme të dhomës ndodh nëse parakolpi i dritës ndjen më shumë se 10 vlera
r.setDriveVelocity (0.05, 0.05) % Ngadalëson dhomën për t'u përgatitur për përplasje
fund % përfundon deklaratën fillestare if
nëse lightdata.rightCenter> 10
r.setDriveVelocity (0.05, 0.05)
fund
nëse lightdata.djathtas> 10
r.setDriveVelocity (0.05, 0.05)
fund
nëse lightdata.leftCenter> 10
r.setDriveVelocity (0.05, 0.05)
fund
fund % përfundon 'lightbumper' if statement
fund %përfundon funksionin e kontrollit të dritës
funksioni dontFall = cliffCheck (r) % Krijon funksionin 'cliffCheck'
të dhëna = r.getCliffSensorë; % Cakton të gjitha të dhënat nga sensori i shkëmbit në 'të dhëna' të ndryshueshme
dontFall = data.left <1020 || të dhëna.majtas Përpara <1020 || data.djathtas <1020 || data.right <1020 % Krijon një ndryshore të ruajtur, 'dontFall', për sensorët e ndryshëm të shkëmbinjve
if dontFall % If deklarata për të thirrur të dhënat e sensorit të shkëmbit nga lart
nëse të dhënat.majtas <1010 % Nëse deklarata që shkakton funksione të ndryshme të dhomës ndodh nëse sensori i shkëmbit ndjen më pak se 1010 vlera
r.ndaloj
r.moveDistanca (-0.2, 0.2) % Kthen dhomën Roomba 0.2m
r.turnAngle (-90, 0.5) % Rrotullon Roomba -90 gradë sa më shpejt që të jetë e mundur
elseif data.leftP front <1010
r.ndaloj
r.moveDistanca (-0.3, 0.2)
r.turnAngle (90, 0.5) % Rrotullon Roomba 90 gradë sa më shpejt që të jetë e mundur
të dhëna elseif.djathtas <1010
r.ndaloj
r.moveDistanca (-0.3, 0.2)
r.turnAngle (90, 0.5) % Rrotullon Roomba 90 gradë sa më shpejt që të jetë e mundur
të dhëna elseif.drejta <1010
r.ndaloj
r.moveDistanca (-0.3, 0.2)
r.turnAngle (90, 0.5) % Rrotullon Roomba 90 gradë sa më shpejt që të jetë e mundur
fund
fund
fund
funksionin e lëngjeve = LiquidCheck (r) % Krijon funksionin 'LiquidCheck'
ndërsa %e vërtetë fillojnë lak të pafund për kalibrimin
img = r.getImage; % lexon kamerën e fikur të robotit
imazhi (img) % tregon imazhin në një dritare me figura
red_mean = mesatarja (mesatarja (img (200, 150, 1)))% lexon sasinë mesatare të pikselave të kuq
blu_mean = mesatarja (mesatarja (img (200, 150, 3)))% lexon sasinë mesatare të pikselave blu
lëngjet = mjeti i kuq || blue_mean % Krijon një ndryshore të ruajtur, 'lëngje', për ndryshoret e ndryshme të ngjyrave
nëse lëngjet % If statement për të thirrur të dhënat e figurës nga lart
nëse red_mean> 170 % Nëse deklarata që shkakton funksione të ndryshme të dhomës ndodh nëse kamera sheh një ngjyrë të kuqe mesatare më të madhe se 170
r.ndal % ndalon roomba
r.setLEDCenterColor (255) % vendos rrethin në ngjyrë të kuqe
r.setLEDDigjet (); % pastroni ekranin
f = shirit pritjeje (0, '*MESAZH HYR*'); % krijon një shirit pritjeje për një mesazh ngarkimi
r.setLEDDigrit ('Nxehtë'); % vendos ekranin LED në dalje 'HOT'
pauzë (0.5) %Pushim i shkurtër për të lexuar informacionin e shpërndarë
r.setLEDDigrit ('LAVA'); % vendos ekran LED në dalje 'LAVA'
pauzë (0.5)
shirit pritjeje (.33, f, '*MESAZH HYRS*'); %krijon një rritje në shiritin e pritjes
r.setLEDDigrit ('Nxehtë');
pauzë (0.5)
r.setLEDDigrit ('LAVA');
pauzë (0.5)
shirit pritjeje (.67, f, '*MESAZH HYRS*'); % krijon një rritje në shiritin e pritjes
r.setLEDDigrit ('Nxehtë');
pauzë (0.5)
r.setLEDDigrit ('LAVA');
shirit pritjeje (1, f, '*MESAZH HYR*'); %plotëson shiritin e pritjes
pauzë (1)
mbyll (f) %mbyll shiritin e pritjes
r.setLEDDigjet (); % pastron ekranin LED
mbyll të gjitha %Mbyll të gjitha dritaret e mëparshme
akset ("Ngjyra", "asnjë", "XColor", "asnjë", "YColor", "asnjë") % Pastron dritaren e komplotit të akseve dhe tabelës
y = 0.5; % vendos pozicionin y të tekstit në dritaren e vizatimit
x = 0.06; % vendos pozicionin x të tekstit në dritaren e vizatimit
titulli ('NGA MARS ROOMBA', 'fontsize', 32) % Shton një titull në dritaren e vizatimit
quadeqtxt = 'LAVA E RREZIKUT'; % Vendos ndryshoren 'quadeqtxt' në daljen 0
tekst (x, y, quadeqtxt, 'interpretues', 'latex', 'fontsize', 36); % shfaq tekstin katror në dritaren e vizatimit
r.moveDistanca (-0.2, 0.2) %përmbys dhomën 0.2m
r.turnAngle (180, 0.5) %e kthen dhomën 180 gradë sa më shpejt që të jetë e mundur
r.setLEDCenterColor (128, 128); % vendos LED -in e qendrës së dhomës në portokalli
mbyll të gjitha %mbyll dritaret e mbetura të hapura
elseif blue_mean> 175 % Nëse deklarata që shkakton funksione të ndryshme të dhomës ndodh nëse kamera sheh një ngjyrë blu mesatare më të madhe se 175
r.ndal % ndalon roomba
r.setLEDCenterColor (255) % vendos rrethin në ngjyrë të kuqe
r.setLEDDigjet (); % pastroni ekranin
f = shirit pritjeje (0, '*MESAZH HYR*'); % krijon një shirit pritjeje për një mesazh ngarkimi
r.setLEDDigrit ('SHIKO'); % e vendos ekranin LED në dalje "SHIKO"
pauzë (0.5) %Pushim i shkurtër për të lexuar informacionin e shpërndarë
r.setLEDDigits ('WATR'); % vendos ekran LED në dalje 'WATR'
pauzë (0.5)
shirit pritjeje (.33, f, '*MESAZH HYRS*'); %krijon një rritje në shiritin e pritjes
r.setLEDDigrit ('SHIKO');
pauzë (0.5)
r.setLEDDigits ('WATR');
pauzë (0.5)
shirit pritjeje (.67, f, '*MESAZH HYR*'); % krijon një rritje në shiritin e pritjes
r.setLEDDigits ('SHIKO');
pauzë (0.5)
r.setLEDDigits ('WATR');
shirit pritjeje (1, f, '*MESAZH HYR*'); %plotëson shiritin e pritjes
pauzë (1)
mbyll (f) %mbyll shiritin e pritjes
r.setLEDDigjet (); % pastron ekranin LED
mbyll të gjitha %Mbyll të gjitha dritaret e mëparshme
akset ("Ngjyra", "asnjë", "XColor", "asnjë", "YColor", "asnjë") % Pastron dritaren e komplotit të akseve dhe tabelës
y = 0.5; % vendos pozicionin y të tekstit në dritaren e vizatimit
x = 0.06; % vendos pozicionin x të tekstit në dritaren e vizatimit
titulli ('NGA MARS ROOMBA', 'fontsize', 32) % Shton një titull në dritaren e vizatimit
quadeqtxt = 'UJI I GJETUR'; % Vendos ndryshoren 'quadeqtxt' në daljen 0
tekst (x, y, quadeqtxt, 'interpretues', 'latex', 'fontsize', 36); % shfaq tekstin katror në dritaren e vizatimit
r.moveDistanca (-0.2, 0.2) %përmbys dhomën 0.2m
r.turnAngle (180, 0.5) %e kthen dhomën 180 gradë sa më shpejt që të jetë e mundur
r.setLEDCenterColor (128, 128); % vendos LED -in e qendrës së dhomës në portokalli
mbyll të gjitha %mbyll dritaret e mbetura të hapura
fund %përfundon 'red_mean' nëse deklarata
fund %përfundon 'lëngje' nëse deklarata
fund % mbyll pafund ndërsa loop
fundi % përfundon funksionin 'LiquidCheck'
Hapi 4: Drejtimi i Kodit
Pasi të keni kopjuar dhe ngjitur kodin në MATLAB, duhet të lidheni me Roomba. Pasi Roomba është e lidhur ju duhet të emërtoni ndryshoren r. Funksionet përdorin ndryshoren r kur i referohen Roomba, kështu që Roomba duhet të përcaktohet si ndryshorja r. Pas ekzekutimit të kodit Roomba duhet të funksionojë sipas udhëzimeve.