Агуулгын хүснэгт:

Roomba -гээ Ангараг гараг руу эргүүлэх: 5 алхам
Roomba -гээ Ангараг гараг руу эргүүлэх: 5 алхам

Видео: Roomba -гээ Ангараг гараг руу эргүүлэх: 5 алхам

Видео: Roomba -гээ Ангараг гараг руу эргүүлэх: 5 алхам
Видео: Coldest moon in our solar system 2024, Долдугаар сарын
Anonim
Roomba -гээ Ангараг гараг руу эргүүлж байна
Roomba -гээ Ангараг гараг руу эргүүлж байна

Алхам 1: Материалаа цуглуул

Энэхүү төслийг дуусгахын тулд та дараахь материалыг цуглуулах шаардлагатай болно.

1 Roomba робот

1 Raspberry Pi хэрэгсэл

1 видео камер

MATLAB руу нэвтрэх

Алхам 2: MATLAB -ийн Roomba хэрэгслийн хайрцгийг татаж аваарай

MATLAB -ийн Roomba хэрэгслийн хайрцгийг татаж аваарай
MATLAB -ийн Roomba хэрэгслийн хайрцгийг татаж аваарай
MATLAB -ийн Roomba хэрэгслийн хайрцгийг татаж аваарай
MATLAB -ийн Roomba хэрэгслийн хайрцгийг татаж аваарай

Энэ төслийг дуусгахад шаардлагатай багажны хайрцгийг суулгахын тулд дараах кодыг ажиллуулна уу.

roombaInstall функц

clc;

Суулгах файлуудын % жагсаалт

файлууд = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

-аас суулгах % байршил

сонголтууд = weboptions ('CertificateFilename', ''); % нь гэрчилгээний шаардлагыг үл тоомсорлохыг хэлдэг

сервер = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'Roomba суулгах/шинэчлэх';

% харуулах зорилго, баталгаажуулалтыг авна уу

шуурхай = {

'Энэ програм нь эдгээр EF 230 Roomba файлуудыг татаж авах болно.'

''

strjoin (файлууд, '')

''

'энэ фолдерт:'

''

cd

''

'Үргэлжлүүлэхийг хүсч байна уу? '

};

дуут дохио;

yn = questdlg (шуурхай, …

dlgTitle,…

'Тийм', 'Үгүй', 'Тийм');

if ~ strcmp (yn, 'Yes'), буцах; Төгсгөл

% нь одоо байгаа файлуудын жагсаалтыг авах болно

Mevcut_files = файлууд (cellfun (@exist, files)> 0);

if ~ хоосон (одоо байгаа_ файлууд)

% тэдгээрийг орлуулах нь үнэхээр зөв эсэхийг шалгаарай

prompt = {'Та эдгээр файлыг сольж байна:'

''

strjoin (байгаа файлууд, '')

''

'Орлуулах нь зүгээр үү?'

};

дуут дохио;

yn = questdlg (шуурхай, …

dlgTitle,…

'Тийм', 'Үгүй', 'Тийм');

if ~ strcmp (yn, 'Yes'), буцах; Төгсгөл

Төгсгөл

% файлуудыг татаж авах

cnt = 0;

i = 1 -ийн хувьд: урт (файлууд)

f = файлууд {i};

disp (['Татаж авах' f]);

оролдох

url = [сервер f];

websave (f, url, сонголтууд); Аюулгүй байдлын алдаанаас зайлсхийхийн тулд % сонголтыг нэмсэн

cnt = cnt + 1;

барих

disp (['Татаж авахад алдаа гарсан' f]);

дамми = [f '.html'];

хэрэв байгаа бол (дамми, 'файл') == 2

устгах (дамми)

Төгсгөл

Төгсгөл

Төгсгөл

хэрэв cnt == урт (файлууд)

msg = 'Суулгалт амжилттай боллоо';

хүлээх (msgbox (msg, dlgTitle));

өөр

msg = 'Суулгалтын алдаа - дэлгэрэнгүйг командын цонхноос үзнэ үү';

хүлээх (errordlg (msg, dlgTitle)));

Төгсгөл

төгсгөл %roombaInstall

Алхам 3: Roomba руугаа холбогдоно уу

Одоо WiFi ашиглан Roomba руугаа холбогдох цаг болжээ. 2 хуруугаараа Dock ба Spot товчлууруудыг нэгэн зэрэг дарж Roomba -г асаах буюу дахин тохируулна уу. Дараа нь роботтой холбогдохын тулд MATLAB -ийн командын цонхонд r = roomba кодыг ажиллуулна уу. Та энэ тушаалыг гүйцэтгэсний дараа таны Roomba явахад бэлэн байх ёстой.

Алхам 4: Roomba -г хэрхэн удирдахыг хүсч байгаагаа сонгоно уу

Roomba -г хэрхэн удирдахыг хүсч байгаагаа сонгоно уу
Roomba -г хэрхэн удирдахыг хүсч байгаагаа сонгоно уу
Roomba -г хэрхэн удирдахыг хүсч байгаагаа сонгоно уу
Roomba -г хэрхэн удирдахыг хүсч байгаагаа сонгоно уу

Та Roomba -г удирдах хоёр арга бий: бие даан эсвэл ухаалаг гар утсыг хянагч болгон ашиглах.

Хэрэв та Roomba-г бие даан жолоодохоор шийдсэн бол гурван мэдрэгчийг ашиглах шаардлагатай болно: хадан цохиур, овойлт, гэрэл мэдрэгч.

Ухаалаг гар утас ашиглахын тулд та доорх алхамуудыг дагаж ухаалаг гар утсаа компьютерт холбох хэрэгтэй.

ТАЙЛБАР: Зөв холбохын тулд таны компьютер болон ухаалаг гар утас нэг WiFi сүлжээнд холбогдсон байх ёстой!

1. Өөрийн төхөөрөмж дээрх апп дэлгүүрээс MATLAB програмыг татаж аваарай.

2. Командын цонхонд "Connector on" гэж бичээд хоёр төхөөрөмжид оруулах шаардлагатай нууц үгийг тохируулна уу.

3. Үүнийг хийсний дараа MATLAB танд компьютеруудын IP хаягийг өгөх болно. Та ухаалаг гар утасныхаа MATLAB програмын тохиргооны хуудас руу орж, өмнө нь оруулсан IP хаяг, нууц үгээ ашиглан компьютер нэмэх хэрэгтэй.

4. Компьютерийнхээ командын цонхонд m = mobiledev кодыг оруулна уу, энэ нь таны ухаалаг утсыг Roomba -ийн хянагч болгон эхлүүлэх ёстой.

5. Таны компьютер болон ухаалаг гар утас яг одоо явахад бэлэн байх ёстой.

Алхам 5: Roomba жолоодоорой

Mars Rover -ийг бүтээхэд шаардлагатай бүх хэрэгслүүд байгаа тул та өөрийн кодыг үүсгэхэд бэлэн байна. Бид бие даасан жолоодлогын болон ухаалаг гар утасны удирдлагатай жолоодлогын аль алинд нь жишээ кодыг хавсаргав.

Автономит жолоодлого

Explore_modified функц (r)

%оруулах аргумент: 1 roomba объект, r

%гаралтын аргумент: байхгүй

%тодорхойлолт:

%функц нь бие даасан байдлыг хангахын тулд хязгааргүй хугацааны хүрд ашигладаг

Ботын эргэн тойрон дахь %судалгаа.

%

%funciton нь Roomba -д юу хийх талаар зааварчилгаа өгдөг

%дараах нөхцөл байдал: Дугуй (ууд) газартай холбоо тасарч, а

%объектыг ботын урд эсвэл хоёр талд илрүүлсэн ба a

%гэнэтийн уналт нь ботын урд эсвэл хоёр талд илэрдэг.

%

%ердийн зааварчилгаанд хамгийн их байлгах зорилготой хөдөлгөөний командууд орно

%хайгуул хийх эсвэл илрүүлсэн аюулаас зайлсхийж, харилцахыг тушаана

Ботуудын нээлтүүдийн талаархи %мэдээлэл (зураг), байрлал (график), %ба хэрэглэгчидтэй matlab ба/эсвэл имэйлээр дамжуулан мэдэгдэнэ үү. Хэд хэдэн

Таашаал авахын тулд %дууны команд нэмж оруулсан болно.

%имэйлийн чадварыг тохируулах

шуудан = '[email protected]';

нууц үг = 'EF230Roomba';

setpref ('Интернет', 'SMTP_Server', 'smtp.gmail.com');

setpref ('Интернет', 'E_mail', имэйл);

setpref ('Интернет', 'SMTP_Username', имэйл);

setpref ('Интернет', 'SMTP_Password', нууц үг);

тулгуур = java.lang. System.getProperties;

props.setProperty ('mail.smtp.starttls.enable', 'үнэн');

props.setProperty ('mail.smtp.auth', 'үнэн');

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

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

% r = roomba (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;

reflect_datum = 2700; %цохио мэдрэгчийн лавлах утгыг тохируулна

lightBumper_datum = 200; %тохируулсан гэрэл Бампер мэдрэгчийн лавлах утга

pos = [0, 0]; Өгөгдлийг эхлүүлсэн байрлалыг хадгалах %хувьсагч

өнцөг = 0; %лавлагааны өнцгийг тохируулсан

торго = 0; %цэвэр өнцгийн шилжилт

би = 2; Байршлын хадгалах хувьсагчид мөр нэмэх %давталт

dist = 0;

r.setDriveVelocity (v, v); %roomba урагшилж эхэлнэ

үнэн байхад

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Гэрэл = r.getLightBampers;

RandAngle = randi ([20, 60], 1); %нь 20-60 градусын хооронд 1 санамсаргүй өнцөг үүсгэдэг. Ботыг гогцоонд гацахаас урьдчилан сэргийлэх зорилгоор ашигладаг

%Нэг буюу хэд хэдэн дугуйтай газар холбоо тасарвал юу хийх вэ:

%хөдөлгөөнийг зогсоох, хүрээлэн буй орчны зураг бүхий анхааруулах имэйл илгээх, %болон үргэлжлүүлэх эсвэл тусламж хүлээх эсэхийг хэрэглэгчээс асууна

хэрэв Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r. зогсоох

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координат авна

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координат авна

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 = 'гацсан.png';

байрлал = savepos (pos);

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

sendmail (имэйл, 'ТУСЛАМЖ!', 'Би хаданд боогдсон байна!', {imfile, байрлал})

list = {'Үргэлжлүүлэх', 'Зогсоох'};

idx = цэс ('Би юу хийх ёстой вэ?', жагсаалт);

idx == 2 бол

завсарлага

Төгсгөл

%Ботын өмнө объект илэрсэн бол яах вэ:

%зогсоох, буцах, зураг авах, нээлтийн талаар хэрэглэгчдэд анхааруулах

%имэйлээр, 90 градус эргэж, үргэлжлүүлэн судлаарай

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

r. зогсоох;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координат авна

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координат авна

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координат авна

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координат авна

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';

байрлал = savepos (pos);

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

sendmail (имэйл, 'Анхааруулга!', 'Би ямар нэг зүйл оллоо!', {imfile, байрлал})

өнцөг = 90;

netangle = netangle+өнцөг;

r.turnAngle (өнцөг);

r.setDriveVelocity (v, v);

%Ботын зүүн талд объект илэрсэн бол яах вэ:

%зогсох, объект руу эргэх, нөөцлөх, зураг авах, сэрэмжлүүлэх

Имэйлээр дамжуулан нээлт хийдэг хэрэглэгчдийн 90 %90 градус эргэж, үргэлжлүүлэн судлаарай

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

r. зогсоох;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координат авна

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координат авна

i = i+1;

өнцөг = 30;

netangle = netangle+өнцөг;

r.turnAngle (өнцөг);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координат авна

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координат авна

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';

байрлал = savepos (pos);

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

sendmail (имэйл, 'Анхааруулга!', 'Би ямар нэг зүйл оллоо!', {imfile, байрлал})

өнцөг = -90;

netangle = netangle+өнцөг;

r.turnAngle (өнцөг);

r.setDriveVelocity (v, v);

%Ботын баруун талд обьект илэрсэн бол яах вэ:

%зогсох, объект руу эргэх, нөөцлөх, зураг авах, сэрэмжлүүлэх

Имэйлээр дамжуулан нээлт хийдэг хэрэглэгчдийн 90 %, 90 градус эргэж, үргэлжлүүлэн судлаарай

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

r. зогсоох;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координат авна

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координат авна

i = i+1;

өнцөг = -30;

netangle = netangle+өнцөг;

r.turnAngle (өнцөг);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координат авна

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координат авна

i = i+1;

түр зогсоох (1.5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

байрлал = savepos (pos);

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

sendmail (имэйл, 'Анхааруулга!', 'Би ямар нэг зүйл олсон!', {imfile, байрлал});

өнцөг = 90;

netangle = netangle+өнцөг;

r.turnAngle (өнцөг);

r.setDriveVelocity (v, v);

Ботын зүүн талд хадан цохио илэрсэн бол яах вэ:

%зогс, хойшоо, баруун тийш эргэж, үргэлжлүүлэн судлаарай

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

r. зогсоох;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координат авна

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координат авна

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координат авна

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координат авна

i = i+1;

өнцөг = -RandAngle;

netangle = netangle+өнцөг;

r.turnAngle (өнцөг);

r.setDriveVelocity (v, v);

%Ботын баруун талд хадан цохио илэрсэн бол яах вэ:

%зогсох, ухрах, зүүн тийш эргэх, үргэлжлүүлэн судлах

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

r. зогсоох;

dist = r.getDistance;

pos (i, 1) = dist * sind (өнцөг); %x координат авна

pos (i, 2) = dist * cosd (өнцөг); %координат авна

i = i+1;

r.moveDistance (-. 125);

өнцөг = RandAngle;

netangle = netangle+өнцөг;

r.turnAngle (өнцөг);

r.setDriveVelocity (v, v);

Төгсгөл

Төгсгөл

Ухаалаг гар утасны хянагч

Сонголтууд = {'Автономит', 'Гарын авлагын хяналт'}

Prompt = цэс ('Та роверыг хэрхэн удирдахыг хүсч байна вэ?', Сонголтууд)

m = хөдөлгөөнт төхөөрөмж

r = roomba (19)

хэрэв Prompt == 1

Судлах (r)

өөр

үнэн байхад

түр зогсоох (.5)

Утасны өгөгдөл = м. Чиглэл;

Ази = PhoneData (1);

Давирхай = PhoneData (2);

Side = PhoneData (3);

хэрэв Side> 130 || Хэрэв утас нь доошоо эргүүлбэл өрөөний зогсолтыг зогсоож, давталтаас гарна уу <-130 %

r. зогсоох

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

завсарлага

elseif Side> 25 && Side <40 %, хэрэв утас 25-40 градусын хооронд хажуу тийш эргэвэл зүүн тийш 5 градус эргэ

r.turnAngle (-5);

elseif Side> 40 %нь утсыг 40 градусаас дээш эргүүлээд зүүн тийш 45 градус эргүүлнэ

r.turnAngle (-45)

elseif Side -40 %, хэрэв утас -25 -аас -40 хэм хүртэл хажуу тийш эргэвэл баруун тийш 5 градус эргэ

r.turnAngle (5);

elseif Side <-40 %, хэрэв утас -40 хэмээс доош эргэж байвал 45 градус зүүн тийш эргэ

r.turnAngle (45)

Төгсгөл

%Хэрэв утас нь толгойны ойролцоо байвал зураг аваад түүнийгээ зурна уу

хэрэв Pitch <-60 && image <= 9

r. beep

img = r.getImage;

дэд хэсэг (3, 3, зураг)

imshow (img)

Төгсгөл

%нь урд болон хойд чиглэлд тулгуурлан урагш, хойшоо хөдөлдөг

хэрэв Pitch> 15 && Pitch <35 %бол 15-35 градусын хоорондох алхам богино зайд урагшлах юм бол

%хөдлөхөөсөө өмнө хөнгөн бампер өгөгдлийг авдаг

litBump = r.getLightBumpers;

хэрэв litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> Roomba -ийн урд ямар нэгэн зүйл байвал 500 %, хэрэв урагшаа хөдөлвөл цохих болно.

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

өөр %хөдөлнө

r.moveDistance (.03);

%Шилжүүлсний дараа бампер өгөгдлийг авах

Bump = r.getBumpers;

хэрэв Bump.right == 1 || Bump.left == 1 || Bump.front == 1

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

r.moveDistance (-. 01)

Төгсгөл

%нь хадны мэдрэгчийн өгөгдлийг авдаг

Cliff = r.getCliffSensors;

хэрэв Cliff.зүүн> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %нь хадан цохионы мэдрэгчийг идэвхжүүлсэн тохиолдолд үүнийг лаав болон нөөцлөлт гэж үзнэ

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

r.moveDistance (-. 031)

Төгсгөл

Төгсгөл

elseif Pitch> 35 %, хэрвээ 35 -аас дээш градус илүү урт зайд урагшлах юм бол

%хөдлөхөөсөө өмнө хөнгөн бампер өгөгдлийг авдаг

litBump = r.getLightBumpers;

хэрэв litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %нь өрөөний урд ямар нэгэн зүйл байгаа бол урагшаа урагшлахад цохих болно.

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

өөр %хөдөлнө

r.moveDistance (.3)

%Шилжүүлсний дараа бампер өгөгдлийг авах

Bump = r.getBumpers;

хэрэв Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %Хэрэв та ямар нэгэн зүйл цохих юм бол дуу чимээ гаргах, мессеж харуулах, нөөцлөх

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

r.moveDistance (-. 01)

Төгсгөл

%нь хөдөлсний дараа хадны мэдрэгчийн мэдээллийг авдаг

Cliff = r.getCliffSensors;

хэрэв Cliff.зүүн> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %нь хадан цохионы мэдрэгчийг идэвхжүүлсэн тохиолдолд үүнийг лаав болон нөөцлөлт гэж үзнэ

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

r.moveDistance (-. 31)

Төгсгөл

Төгсгөл

elseif Pitch -35 %нь -15 -аас -35 градусын хоорондох зай богино зайд ухарвал

r.moveDistance (-. 03);

%нь хөдөлсний дараа хадны мэдрэгчийн мэдээллийг авдаг

Cliff = r.getCliffSensors;

хэрэв Cliff.зүүн> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %нь хадан цохионы мэдрэгчийг идэвхжүүлсэн тохиолдолд үүнийг лаав болон нөөцлөлт гэж үзнэ

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

r.moveDistance (.04)

Төгсгөл

elseif Pitch -60 %нь -35 ба -60 градусын хоорондох давирхай илүү хол зайд шилжих юм бол

r.moveDistance (-. 3)

%нь хөдөлсний дараа хадны мэдрэгчийн мэдээллийг авдаг

Cliff = r.getCliffSensors;

хэрэв Cliff.зүүн> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %нь хадан цохионы мэдрэгчийг идэвхжүүлсэн тохиолдолд үүнийг лаав болон нөөцлөлт гэж үзнэ

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

r.moveDistance (.31)

Төгсгөл

Төгсгөл

Төгсгөл

Төгсгөл

Зөвлөмж болгож буй: