Mundarija:

Roombani Mars sayyorasiga aylantirish: 5 qadam
Roombani Mars sayyorasiga aylantirish: 5 qadam

Video: Roombani Mars sayyorasiga aylantirish: 5 qadam

Video: Roombani Mars sayyorasiga aylantirish: 5 qadam
Video: 800 000 yildan keyin odamlar maxluqlarga aylanishadi / Uzbek tilida tarjima kinolar 2024, Noyabr
Anonim
Roombani Mars Roverga aylantirish
Roombani Mars Roverga aylantirish

1 -qadam: Materiallaringizni to'plang

Loyihani bajarish uchun siz quyidagi materiallarni to'plashingiz kerak bo'ladi.

1 xonali robot

1 ta Raspberry Pi to'plami

1 videokamera

MATLAB -ga kirish

2 -qadam: MATLAB uchun Roomba asboblar qutilarini yuklab oling

MATLAB uchun Roomba asboblar qutilarini yuklab oling
MATLAB uchun Roomba asboblar qutilarini yuklab oling
MATLAB uchun Roomba asboblar qutilarini yuklab oling
MATLAB uchun Roomba asboblar qutilarini yuklab oling

Ushbu loyihani bajarish uchun kerakli asboblar qutilarini o'rnatish uchun quyidagi kodni ishga tushiring.

roombaInstall funksiyasi

clc;

% o'rnatiladigan fayllar ro'yxati

fayllar = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% joylashuvi

variantlar = weboptions ('CertificateFilename', ''); % sertifikat talablarini e'tiborsiz qoldirishni aytadi

server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'Roomba o'rnatish/yangilash';

% ko'rsatish maqsadi va tasdiqni oling

taklif = {

'Bu dastur EF 230 Roomba fayllarini yuklaydi:'

''

strjoin (fayllar, '')

''

'bu papkaga:'

''

CD

''

'Davom etishni xohlaysizmi? '

};

ovozli signal;

yn = questdlg (tezkor,…

dlgTitle,…

"Ha", "Yo'q", "Ha");

if ~ strcmp (yn, 'Ha'), qaytish; oxiri

% mavjud fayllar ro'yxatini oladi

mavjud_files = fayllar (cellfun (@exist, files)> 0);

if ~ isempty (mavjud_fayllar)

% ularni almashtirish haqiqatan ham to'g'ri ekanligiga ishonch hosil qiling

prompt = {'Siz bu fayllarni almashtiryapsiz:'

''

strjoin (mavjud_fayllar, '')

''

'O'zgartirish yaxshimi?'

};

ovozli signal;

yn = questdlg (tezkor,…

dlgTitle,…

"Ha", "Yo'q", "Ha");

if ~ strcmp (yn, 'Ha'), qaytish; oxiri

oxiri

% fayllarni yuklab oladi

cnt = 0;

i = 1 uchun: uzunlik (fayllar)

f = fayllar {i};

disp (['Yuklanmoqda' f]);

harakat qilib ko'ring

url = [server f];

veb -saqlash (f, url, variantlar); % xavfsizlik xatolarining oldini olish uchun variantlarni qo'shdi

cnt = cnt + 1;

tutmoq

disp (['Yuklab olishda xatolik' f]);

qo'g'irchoq = [f '.html'];

agar mavjud bo'lsa (qo'g'irchoq, 'fayl') == 2

o'chirish (qo'g'irchoq)

oxiri

oxiri

oxiri

agar cnt == uzunligi (fayllar)

msg = 'O'rnatish muvaffaqiyatli bo'ldi';

kutish (msgbox (msg, dlgTitle));

boshqa

msg = 'O'rnatish xatosi - tafsilotlar uchun buyruq oynasiga qarang';

kutish (errordlg (msg, dlgTitle));

oxiri

end %roombaInstall

3 -qadam: Roomba -ga ulaning

Endi Wi -Fi orqali Roomba -ga ulanish vaqti keldi. Roomba -ni yoqish yoki tiklash uchun 2 barmog'ingiz bilan Dock va Spot tugmalarini bir vaqtning o'zida bosing. Keyin, robotingizga ulanish uchun MATLAB buyruqlar oynasida r = roomba (Roomba raqamingiz) kodini ishga tushiring. Siz ushbu buyruqni bajarganingizdan so'ng, Roomba ishga tayyor bo'lishi kerak.

4 -qadam: Roomba -ni qanday boshqarishni tanlang

Roomba -ni qanday boshqarishni xohlayotganingizni tanlang
Roomba -ni qanday boshqarishni xohlayotganingizni tanlang
Roomba -ni qanday boshqarishni xohlayotganingizni tanlang
Roomba -ni qanday boshqarishni xohlayotganingizni tanlang

Roomba -ni boshqarishning ikkita usuli bor: avtonom yoki smartfonni boshqaruvchi sifatida ishlatish.

Agar siz Roomba-ni avtonom boshqarishni tanlasangiz, siz uchta o'rnatilgan sensorlardan foydalanishingiz kerak bo'ladi: jarlik, zarba va yorug'lik sezgichlari.

Smartfondan foydalanish uchun avval quyidagi amallarni bajarib, smartfonni kompyuterga ulash lozim.

DIQQAT: To'g'ri ulanish uchun sizning kompyuteringiz va smartfoningiz bitta Wi -Fi tarmog'ida bo'lishi kerak!

1. Qurilmangizdagi ilovalar do'konidan MATLAB ilovasini yuklab oling.

2. Buyruqlar oynasiga "ulagich yoqilgan" yozing va ikkala qurilmaga kiritilishi kerak bo'lgan parolni o'rnating.

3. Buni qilganingizdan so'ng, MATLAB sizga kompyuteringizning IP -manzilini beradi. Siz smartfoningizdagi MATLAB ilovasidagi sozlash sahifasiga kirishingiz va berilgan IP -manzil va avval kiritgan parolingiz yordamida kompyuter qo'shishingiz kerak.

4. Kompyuteringizning buyruqlar oynasida m = mobiledev kodini kiriting va bu sizning smartfoningizni Roomba -ni boshqaruvchi sifatida ishga tushirishi kerak.

5. Sizning kompyuteringiz va smartfoningiz hozir ishga tayyor bo'lishi kerak.

5 -qadam: Roomba -ni haydang

Endi sizda Mars Rover -ni yaratish uchun barcha kerakli vositalar mavjud, siz o'z kodingizni yaratishga tayyormiz. Biz avtonom haydash uchun ham, smartfon boshqariladigan haydash uchun ham misol kodini biriktirdik.

Avtonom haydash

Explor_modified funktsiyasi (r)

%kiritish argumentlari: 1 roomba obyekti, r

%chiqish argumentlari: yo'q

%tavsifi:

%funktsiyasi avtonomga ruxsat berish uchun cheksiz while loopidan foydalanadi

%bot atrofini o'rganish.

%

%funciton shuningdek, Roomba -ga nima qilish kerakligi haqida ko'rsatma beradi

%quyidagi holatlar: g'ildirak (lar) ning er bilan aloqasi yo'qoladi

%obyekti bot oldida yoki uning yon tomonida aniqlanadi va a

botning oldida yoki yon tomonida %to'satdan pasayish aniqlanadi.

%

%odatdagi ko'rsatmalarni maksimal darajada oshirish uchun mo'ljallangan harakat buyruqlari kiradi

%tadqiqot yoki aniqlangan xavfdan qochish va muloqot qilish buyruqlari

botlarning kashfiyotlari haqida %ma'lumot (rasmlar), pozitsiya (grafik), Matlab va/yoki elektron pochta orqali foydalanuvchi bilan %va davlat (yopiq ogohlantirish). Bir nechta

zavqlanish uchun %ovozli buyruqlar qo'shiladi.

%elektron pochta imkoniyatlarini sozlash

pochta = '[email protected]';

parol = 'EF230Roomba';

setpref ("Internet", "SMTP_Server", "smtp.gmail.com");

setpref ("Internet", "E_mail", pochta);

setpref ("Internet", "SMTP_Username", pochta);

setpref ("Internet", "SMTP_Password", parol);

rekvizitlar = java.lang. System.getProperties;

props.setProperty ('mail.smtp.starttls.enable', 'rost');

props.setProperty ('mail.smtp.auth', 'rost');

props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');

props.setProperty ('mail.smtp.socketFactory.port', '465');

% r = xona (19)

r.beep ('G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C1 ^^, C1) ^^, D1 ^^, C1 ^^, D2 ^^, E4 ^^, G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C2 ^^, E1 ^^, E1 ^^, E1 ^^, D1 ^^, C4 ^^ ');

v =.1;

aks_datum = 2700; %o'rnatilgan jarlik sensorlar mos yozuvlar qiymati

yorug'likBumper_datum = 200; %o'rnatilgan yorug'lik Bamper sensorlar mos yozuvlar qiymati

pos = [0, 0]; Ma'lumotni ishga tushirgan holda joylashuvni saqlash uchun %o'zgaruvchi

burchak = 0; mos yozuvlar burchagi %

aniq burchak = 0; %aniq burchak siljishi

i = 2; joylashishni saqlash o'zgaruvchisiga qatorlarni qo'shish uchun %iterator

dist = 0;

r.setDriveVelocity (v, v); %Roomba oldinga siljishni boshlang

rost bo'lsa ham

Cliff = r.getCliffSensors;

Bump = r.getBampers;

Yorug'lik = r.getLightBampers;

RandAngle = randi ([20, 60], 1); %20 dan 60 gradusgacha bo'lgan 1 tasodifiy burchak hosil qiladi. Botning pastadirda qolishini oldini olish uchun ishlatiladi

%Agar bir yoki bir nechta g'ildirak er bilan aloqa qilmasa nima qilish kerak:

%harakatni to'xtating, atrof tasviri bilan ogohlantiruvchi elektron pochta xabarini yuboring, %va foydalanuvchidan davom etishini yoki yordam kutishini so'rang

agar Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi

i = i+1;

r.beep ('F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^ ')

img = r.getImage;

imwrite (img, 'stuck.png');

%--------------------------

imfile = 'stuck.png';

pozitsiya = saqlash joylari (pos);

%---------------------------

sendmail (pochta, 'YARDIM!', 'Men qoyada qolib ketdim!', {imfile, pozitsiya})

list = {'Davom etish', 'To'xtatish'};

idx = menyu ('Nima qilishim kerak?', ro'yxat);

agar idx == 2 bo'lsa

tanaffus

oxiri

%Agar bot oldida ob'ekt aniqlansa nima qilish kerak:

%to'xtating, orqaga qayting, rasmga oling, foydalanuvchini kashfiyot haqida ogohlantiring

%elektron pochta orqali, 90 gradusga buriling va o'rganishni davom eting

elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi

i = i+1;

r.beep ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')

img = r.getImage;

imwrite (img, 'FrontBump.png')

%--------------------------

imfile = 'FrontBump.png';

pozitsiya = saqlash joylari (pos);

%---------------------------

sendmail (pochta, "Ogohlantirish!", "Men nimadir topdim!", {imfile, position})

burchak = 90;

to'r burchak = to'r+burchak;

r.turnAngle (burchak);

r.setDriveVelocity (v, v);

%Botning chap tomonida ob'ekt aniqlansa nima qilish kerak:

%to'xtating, ob'ekt tomon buriling, zaxira qiling, rasmga oling, ogohlantiring

Elektron pochta orqali kashfiyotning %foydalanuvchisi, 90 gradusga burilib, o'rganishda davom eting

elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi

i = i+1;

burchak = 30;

to'r burchak = to'r+burchak;

r.turnAngle (burchak);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi

i = i+1;

r.beep ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')

img = r.getImage;

imwrite (img, 'LeftBump.png')

%--------------------------

imfile = 'LeftBump.png';

pozitsiya = saqlash joylari (pos);

%---------------------------

sendmail (pochta, "Ogohlantirish!", "Men nimadir topdim!", {imfile, position})

burchak = -90;

to'r burchak = to'r+burchak;

r.turnAngle (burchak);

r.setDriveVelocity (v, v);

%Agar ob'ekt botning o'ng tomonida aniqlansa nima qilish kerak:

%to'xtating, ob'ekt tomon buriling, zaxira qiling, rasmga oling, ogohlantiring

Elektron pochta orqali kashfiyotning %foydalanuvchisi, 90 gradusga burilib, o'rganishda davom eting

elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi

i = i+1;

burchak = -30;

to'r burchak = to'r+burchak;

r.turnAngle (burchak);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi

i = i+1;

pauza (1,5);

r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')

img = r.getImage;

imwrite (img, 'RightBump.png')

%--------------------------

imfile = 'RightBump.png';

pozitsiya = saqlash joylari (pos);

%---------------------------

sendmail (pochta, 'Ogohlantirish!', 'Men nimadir topdim!', {imfile, position});

burchak = 90;

to'r burchak = to'r+burchak;

r.turnAngle (burchak);

r.setDriveVelocity (v, v);

%Botning chap tomonida jarlik aniqlansa nima qilish kerak:

%to'xtang, orqaga o'ting, o'ngga buriling, o'rganishni davom ettiring

elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi

i = i+1;

burchak = -RandAngle;

to'r burchak = to'r+burchak;

r.turnAngle (burchak);

r.setDriveVelocity (v, v);

%Botning o'ng tomonida jarlik aniqlansa nima qilish kerak:

%to'xtang, orqaga o'ting, chapga buriling, o'rganishni davom ettiring

elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (burchak); %x koordinatasini oladi

pos (i, 2) = dist * cosd (burchak); %y koordinatasini oladi

i = i+1;

r.moveDistance (-. 125);

burchak = RandAngle;

to'r burchak = to'r+burchak;

r.turnAngle (burchak);

r.setDriveVelocity (v, v);

oxiri

oxiri

Smartfon boshqaruvchisi

Variantlar = {'Avtonom', 'Qo'lda boshqarish'}

Prompt = menyu ('Roverni qanday boshqarishni xohlaysiz?', Tanlovlar)

m = mobil

r = xona (19)

agar so'rov == 1 bo'lsa

O'rganish (r)

boshqa

rost bo'lsa ham

pauza (.5)

PhoneData = m yo'nalishi;

Azi = PhoneData (1);

Pitch = PhoneData (2);

Yon = PhoneData (3);

agar Side> 130 || Yon <-130 %, agar telefon pastga qaragan bo'lsa, xonani to'xtating va pastadirdan chiqing

r.stop

r.beep ('C, C, C, C')

tanaffus

elseif Side> 25 && Side <40 %, agar telefon 25 dan 40 darajagacha yon tomonga burilsa, 5 gradus chapga buriladi

r.turnAngle (-5);

elseif Yon> 40 %, agar telefon 40 gradusdan yuqori tomonga burilsa, chapga 45 gradus buriladi

r.turnAngle (-45)

elseif Yon -40 %, agar telefon -25 dan -40 darajagacha yon tomonga burilsa, o'ngga 5 gradusga buriladi

r.turnAngle (5);

elseif Yon <-40 %, agar telefon -40 darajadan pastroqqa burilsa, chapga 45 gradus buriladi

r.turnAngle (45)

oxiri

%Agar telefon vertikal yonida bo'lsa, tasvirni oling va uni tuzing

agar Pitch <-60 && image <= 9

r. ovozli ovoz

img = r.getImage;

kichik reja (3, 3, rasm)

imshow (img)

oxiri

%old va orqa yo'nalishga qarab oldinga va orqaga siljiydi

agar Pitch> 15 && Pitch <35 %, agar 15 dan 35 gradusgacha bo'lgan qadam qisqa masofaga oldinga siljiydi

%ko'chishdan oldin engil bamper ma'lumotlarini oladi

litBump = r.getLightBampers;

agar litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, agar biror narsa xonaning oldida bo'lsa va u oldinga siljiganida uriladi, shovqin va xabarni ko'rsatish

r.beep ('C ^^, F#^, C ^^, F#^')

boshqa %harakatlaning

r.moveDistance (.03);

Ko'chib o'tgandan keyin bamper ma'lumotlarini oling

Bump = r.getBampers;

agar Bump.right == 1 || Bump.left == 1 || Bump.front == 1

r. ovozli signal ('A, C, E')

r.moveDistance (-. 01)

oxiri

%jarlik sensori ma'lumotlarini oladi

Cliff = r.getCliffSensors;

agar Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, agar biror narsa jarlik sezgichini ishga tushirsa, uni lava va zaxira sifatida ko'rib chiqing

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

oxiri

oxiri

Boshqa pitch> 35 %, agar balandligi 35 daraja bo'lsa, uzoqroq masofaga oldinga siljiydi

%ko'chishdan oldin engil bamper ma'lumotlarini oladi

litBump = r.getLightBampers;

agar litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, agar biror narsa xonaning oldida bo'lsa va u oldinga siljiydigan bo'lsa, u uriladi va xabarni ko'rsatadi

r.beep ('C ^^, F#^, C ^^, F#^')

boshqa %harakatlaning

r.moveDistance (.3)

Ko'chib o'tgandan keyin bamper ma'lumotlarini oling

Bump = r.getBampers;

agar Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %, agar biror narsaga tegsa, shovqin, xabarni ko'rsatish va zaxiralash

r. ovozli signal ('A, C, E')

r.moveDistance (-. 01)

oxiri

%harakatdan keyin jarlik sensori ma'lumotlarini oladi

Cliff = r.getCliffSensors;

agar Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, agar biror narsa jarlik sezgichini ishga tushirsa, uni lava va zaxira sifatida ko'rib chiqing

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 31)

oxiri

oxiri

elseif Pitch -35 %, agar -15 dan -35 gradusgacha bo'lgan masofa qisqa masofaga orqaga qaytsa

r.moveDistance (-. 03);

%harakatdan keyin jarlik sensori ma'lumotlarini oladi

Cliff = r.getCliffSensors;

agar Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, agar biror narsa jarlik sezgichini ishga tushirsa, uni lava va zaxira sifatida ko'rib chiqing

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.04)

oxiri

elseif Pitch -60 %, agar -35 dan -60 gradusgacha bo'lgan masofa uzoqroq masofaga qaytsa

r.moveDistance (-. 3)

%harakatdan keyin jarlik sensori ma'lumotlarini oladi

Cliff = r.getCliffSensors;

agar Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, agar biror narsa jarlik sezgichini ishga tushirsa, uni lava va zaxira sifatida ko'rib chiqing

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

oxiri

oxiri

oxiri

oxiri

Tavsiya: