Cov txheej txheem:

Tig koj lub Roomba rau hauv Mars Rover: 5 Kauj Ruam
Tig koj lub Roomba rau hauv Mars Rover: 5 Kauj Ruam

Video: Tig koj lub Roomba rau hauv Mars Rover: 5 Kauj Ruam

Video: Tig koj lub Roomba rau hauv Mars Rover: 5 Kauj Ruam
Video: Mang Vang - pom koj lub neej zoo ( Official Audio ) 2024, Kaum ib hlis
Anonim
Tig koj lub Roomba rau hauv Mars Rover
Tig koj lub Roomba rau hauv Mars Rover

Kauj Ruam 1: Sau Koj Cov Khoom

Txhawm rau ua kom tiav txoj haujlwm no, koj yuav tsum tau sau cov ntaub ntawv hauv qab no:

1 Roomba Neeg Hlau

1 Raspberry Pi Cov Khoom

1 Lub Koob Yees Duab Yees Duab

Nkag mus rau MATLAB

Kauj Ruam 2: Rub tawm Roomba Toolboxes rau MATLAB

Rub tawm Roomba Toolboxes rau MATLAB
Rub tawm Roomba Toolboxes rau MATLAB
Rub tawm Roomba Toolboxes rau MATLAB
Rub tawm Roomba Toolboxes rau MATLAB

Khiav cov cai hauv qab no txhawm rau txhim kho cov cuab yeej tsim nyog kom ua tiav txoj haujlwm no.

muaj nuj nqi roombaInstall

clc;

% daim ntawv teev cov ntaub ntawv rau nruab

cov ntaub ntawv = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% qhov chaw rau nruab los ntawm

xaiv = weboptions ('CertificateFilename', ''); % qhia nws kom tsis quav ntsej daim ntawv pov thawj xav tau

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

dlgTitle = 'Roomba Nruab/Hloov Kho';

% qhia lub hom phiaj thiab tau txais kev pom zoo

lus = {

'Qhov haujlwm no yuav rub tawm cov ntaub ntawv EF 230 Roomba:'

''

strjoin (cov ntaub ntawv, '')

''

'rau daim nplaub tshev no:'

''

ua cd

''

'Koj puas xav mus ntxiv? '

};

beep;

yn = questdlg (sai,…

dlgTitle,… nyeem ntxiv

'Yog', 'Tsis yog', 'Yog');

yog ~ strcmp (yn, 'Yog'), rov qab; kawg

% tau txais cov npe cov ntaub ntawv uas muaj

cov_ cov ntaub ntawv = cov ntaub ntawv (cellfun (@exist, cov ntaub ntawv)> 0);

yog ~ isempty (uas twb muaj lawm_files)

% ua kom ntseeg tau tias nws zoo tiag tiag los hloov lawv

prompt = {'Koj tab tom hloov cov ntaub ntawv no:'

''

strjoin (uas twb muaj lawm_files, '')

''

'OK los hloov?'

};

beep;

yn = questdlg (sai,…

dlgTitle,… nyeem ntxiv

'Yog', 'Tsis yog', 'Yog');

yog ~ strcmp (yn, 'Yog'), rov qab; kawg

kawg

% rub tawm cov ntawv

nc = 0;

rau kuv = 1: ntev (cov ntaub ntawv)

f = cov ntaub ntawv {i};

disp (['Rub tawm' f]);

sim

url = [neeg rau zaub mov f];

websave (f, url, xaiv); % ntxiv cov kev xaiv kom tsis txhob muaj teeb meem kev nyab xeeb

nc = cnt + 1;

ntes

disp (['Yuam kev rub tawm' f]);

dummy = [f '.html'];

yog tias muaj (dummy, 'file') == 2

rho tawm (dummy)

kawg

kawg

kawg

yog cnt == ntev (cov ntaub ntawv)

msg = 'Kev teeb tsa ua tiav';

tos rau (msgbox (msg, dlgTitle));

lwm tus

msg = 'Kev teeb tsa yuam kev - saib qhov rai hais kom ua kom paub meej';

tos rau (errordlg (msg, dlgTitle));

kawg

kawg %roombaInstall

Kauj ruam 3: Txuas rau Koj Roomba

Tam sim no nws yog lub sijhawm los txuas rau koj Roomba siv WiFi. Siv 2 tus ntiv tes, nias lub pob ntsaws thiab Hnov cov nyees khawm ib txhij kom qhib lossis rov pib dua koj lub Roomba. Tom ntej no, Khiav cov cai r = roomba (# ntawm koj Roomba) hauv qhov hais kom ua qhov rai ntawm MATLAB txuas rau koj tus neeg hlau. Thaum koj tau ua tiav cov lus txib no, koj Roomba yuav tsum npaj mus.

Kauj Ruam 4: Xaiv Li Cas Koj Xav Tswj Koj Lub Roomba

Xaiv Li Cas Koj Xav Tswj Koj Lub Roomba
Xaiv Li Cas Koj Xav Tswj Koj Lub Roomba
Xaiv Li Cas Koj Xav Tswj Koj Lub Roomba
Xaiv Li Cas Koj Xav Tswj Koj Lub Roomba

Muaj ob txoj hauv kev uas koj tuaj yeem tswj hwm koj lub Roomba: tsis siv neeg lossis siv lub xov tooj smartphone ua tus tswj hwm.

Yog tias koj xaiv tsav lub Roomba tus kheej, koj yuav tsum tau siv peb lub teeb tsa ua ke: lub ntsej muag lub ntsej muag, lub ntsej muag lub ntsej muag, thiab lub teeb pom kev zoo.

Txhawm rau siv lub xov tooj smartphone, koj yuav tsum xub txuas koj lub xov tooj smartphone rau koj lub khoos phis tawj los ntawm ua raws cov theem hauv qab no.

NCO TSEG: Koj lub khoos phis tawj thiab lub xov tooj smartphone yuav tsum nyob hauv tib lub network WiFi thiaj li txuas tau zoo!

1. Rub tawm MATLAB app los ntawm lub khw app ntawm koj lub cuab yeej.

2. Ntaus "txuas rau" rau hauv koj lub qhov rai hais kom ua thiab teeb tus password uas yuav xav tau nkag mus rau ob qho khoom siv.

3. Tom qab ua li ntawd, MATLAB yuav muab koj lub computer IP chaw nyob rau koj. Koj yuav tsum nkag mus rau nplooj ntawv teeb tsa hauv MATLAB app ntawm koj lub xov tooj ntawm tes thiab ntxiv lub khoos phis tawj siv tus IP chaw nyob thiab tus password uas koj tau nkag ua ntej.

4. Hauv qhov hais kom ua qhov rai ntawm koj lub khoos phis tawj, ntaus tus lej m = mobiledev thiab qhov no yuav tsum pib ua koj lub smartphone ua tus tswj hwm rau koj Roomba.

5. Koj lub khoos phis tawj thiab smartphone yuav tsum tau npaj mus tam sim no.

Kauj Ruam 5: Tsav Koj Lub Roomba

Tam sim no koj muaj txhua yam ntawm cov cuab yeej tsim nyog los tsim koj Mars Rover, koj tau npaj los tsim koj tus lej. Peb tau txuas ib qho piv txwv tus lej hauv qab no rau ob qho tib si kev tsav tsheb tsis siv neeg thiab kev tsav lub xov tooj ntawm tes.

Tsav Tsheb

muaj nuj nqi Explore_modified (r)

%cov lus tawm tswv yim: 1 qhov khoom siv hauv chav, r

%cov lus sib cav: tsis muaj

%piav qhia:

%ua haujlwm siv qhov tsis muaj qhov kawg thaum lub voj los tso cai rau tus kheej

%kev tshawb fawb ntawm tus bot nyob ib puag ncig.

%

%funciton tseem muab cov lus qhia rau chav nyob rau qhov yuav ua dab tsi hauv

%cov xwm txheej hauv qab no: Log (cov) poob (s) kev sib cuag nrog hauv av, ib

%cov khoom raug kuaj pom ua ntej lossis mus rau ob sab ntawm tus bot, thiab a

%poob sai yog pom nyob rau hauv pem hauv ntej lossis mus rau ob sab ntawm tus bot.

%

%cov lus qhia tshwj xeeb suav nrog cov lus txib txav los ua kom ntau ntxiv

%kev tshawb fawb lossis zam kev kuaj pom muaj kev phom sij thiab hais kom sib tham

%cov ntaub ntawv hais txog kev tshawb pom bots (duab), txoj haujlwm (teeb duab), %thiab lub xeev (tso tseg ceeb toom) nrog tus neeg siv ntawm matlab thiab/lossis email. Ob peb

%suab lus txib tau ntxiv rau kev lom zem.

%teeb tsa email muaj peev xwm

xa = '[email protected]';

lo lus zais = 'EF230Roomba';

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

setpref ('Internet', 'E_mail', xa ntawv);

setpref ('Internet', 'SMTP_Username', xa ntawv);

setpref ('Internet', 'SMTP_Password', password);

cov khoom = java.lang. System.getProperties;

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

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

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

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

% r = chav nyob (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; %teeb tsa pob zeb sensors siv tus nqi

lightBumper_datum = 200; %teeb lub teeb Bumper sensors siv tus nqi

pos = [0, 0]; %sib txawv rau txoj haujlwm cia nrog cov ntaub ntawv pib ua ntej

kaum sab xis = 0; %teeb lub kaum sab xis

netangle = 0; %net kaum kev txav chaw

kuv = 2; %iterator rau ntxiv kab rau txoj haujlwm cia sib txawv

cov = 0;

r.setDriveVelocity (v, v); %pib roomba txav mus rau tom ntej

thaum muaj tseeb

Cliff = r.getCliffSensors;

Pob = r.getBumpers;

Teeb = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %tsim 1 lub kaum ntse ntse tsis sib xws ntawm 20 thiab 60 degrees. Siv los tiv thaiv bot los ntawm kev nyam hauv lub voj

Yuav ua li cas yog tias ib lossis ntau lub log poob kev sib cuag nrog hauv av:

%nres kev txav chaw, xa email ceeb toom nrog duab ib puag ncig, %thiab nug tus neeg siv seb yuav mus txuas ntxiv lossis tos kev pab

yog Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

deb = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %tau x koom tes

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

kuv = kuv+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, 'daig.png');

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

imfile = 'tsau.png';

txoj hauj lwm = savepos (pos);

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

xa ntawv xa ntawv (xa ntawv, 'HELP!', 'Kuv nyob ntawm lub pob tsuas!', {imfile, txoj haujlwm})

list = {'Txuas ntxiv', 'Nres'};

idx = ntawv qhia zaub mov ('Kuv yuav ua li cas?', sau);

yog idx == 2

so

kawg

Yuav ua li cas yog tias ib yam khoom raug kuaj pom ua ntej bot:

%nres, txav rov qab, thaij duab, ceeb toom cov neeg siv pom

%ntawm email, tig 90 degrees, thiab tshawb nrhiav txuas ntxiv

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

r. nres;

deb = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %tau x koom tes

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

kuv = kuv+1;

r.moveDistance (-. 125);

deb = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %tau x koom tes

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

kuv = kuv+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';

txoj hauj lwm = savepos (pos);

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

xa ntawv (xa ntawv, 'ceeb toom!', 'Kuv pom qee yam!', {imfile, txoj haujlwm})

kaum sab xis = 90;

netangle = netangle+lub kaum sab xis;

r.turnAngle (kaum sab xis);

r.setDriveVelocity (v, v);

Yuav ua li cas yog tias pom cov khoom nyob rau sab laug ntawm bot:

%nres, tig mus rau yam khoom, thim rov qab, thaij duab, ceeb toom

%cov neeg siv pom ntawm email, tig 90 degrees thiab tshawb nrhiav txuas ntxiv

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

r. nres;

deb = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %tau x koom tes

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

kuv = kuv+1;

kaum sab xis = 30;

netangle = netangle+lub kaum ntse ntse;

r.turnAngle (kaum sab xis);

r.moveDistance (-. 125);

deb = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %tau x koom tes

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

kuv = kuv+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';

txoj hauj lwm = savepos (pos);

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

xa ntawv (xa ntawv, 'ceeb toom!', 'Kuv pom qee yam!', {imfile, txoj haujlwm})

kaum sab xis = -90;

netangle = netangle+lub kaum ntse ntse;

r.turnAngle (kaum sab xis);

r.setDriveVelocity (v, v);

Yuav ua li cas yog tias cov khoom raug tshawb pom rau sab xis ntawm bot:

%nres, tig mus rau yam khoom, thim rov qab, thaij duab, ceeb toom

%cov neeg siv pom ntawm email, tig 90 degrees thiab tshawb nrhiav txuas ntxiv

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

r. nres;

deb = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %tau x koom tes

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

kuv = kuv+1;

kaum sab xis = -30;

netangle = netangle+lub kaum sab xis;

r.turnAngle (kaum sab xis);

r.moveDistance (-. 125);

deb = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %tau x koom tes

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

kuv = kuv+1;

ncua (1.5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

txoj hauj lwm = savepos (pos);

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

xa ntawv (xa ntawv, 'ceeb toom!', 'Kuv pom qee yam!', {imfile, txoj haujlwm});

kaum sab xis = 90;

netangle = netangle+lub kaum ntse ntse;

r.turnAngle (kaum sab xis);

r.setDriveVelocity (v, v);

Yuav ua li cas yog tias pob zeb tau pom rau sab laug ntawm bot:

%nres, txav rov qab, tig sab xis, tshawb nrhiav txuas ntxiv

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

r. nres;

deb = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %tau x koom tes

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

kuv = kuv+1;

r.moveDistance (-. 125);

deb = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %tau x koom tes

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

kuv = kuv+1;

kaum = -RandAngle;

netangle = netangle+lub kaum ntse ntse;

r.turnAngle (kaum sab xis);

r.setDriveVelocity (v, v);

Yuav ua li cas yog tias pob zeb tau pom rau sab xis ntawm bot:

%nres, txav rov qab, lem sab laug, tshawb nrhiav txuas ntxiv

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

r. nres;

deb = r.getDistance;

pos (i, 1) = dist * sind (angle); %tau x koom tes

pos (i, 2) = dist * cosd (angle); %tau y coordinate

kuv = kuv+1;

r.moveDistance (-. 125);

kaum = RandAngle;

netangle = netangle+lub kaum ntse ntse;

r.turnAngle (kaum sab xis);

r.setDriveVelocity (v, v);

kawg

kawg

Smartphone maub los

Cov kev xaiv = {'Autonomous', 'Manual Control'}

Hais kom sai = ntawv qhia zaub mov ('Koj xav tswj lub rover li cas?', Xaiv)

m = mobilesev

r = Roomba (19)

yog hais kom == 1

Tshawb nrhiav (r)

lwm tus

thaum muaj tseeb

ncua (.5)

PhoneData = m. Orientation;

Azi = PhoneData (1);

Suab = PhoneData (2);

Sab = PhoneData (3);

yog Sab> 130 || Sab <-130 %yog tias lub xov tooj tig rov qab lub ntsej muag nres lub roomba thiab tawm lub voj

r.stop

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

so

elseif Sab> 25 && Sab <40 %yog tias lub xov tooj tig ib sab ntawm 25 thiab 40 deg tig sab laug 5 deg

r.turnAngle (-5);

elseif Sab> 40 %yog tias lub xov tooj tig ib sab dhau 40 deg tig sab laug 45 deg

r.turnAngle (-45)

elseif Sab -40 %yog tias lub xov tooj tig ib sab ntawm -25 thiab -40 deg tig sab xis 5 deg

r.turnAngle (5);

elseif Sab <-40 %yog tias lub xov tooj tig ib sab tsawg dua -40 deg tig sab laug 45 deg

r.turnAngle (45)

kawg

%Yog tias lub xov tooj nyob ze ntawm lub kaum ntse ntse coj cov duab thiab npaj nws

yog Suab <-60 && duab <= 9

r.y pib

img = r.getImage;

subplot (3, 3, duab)

imshow (img)

kawg

%txav mus tom ntej thiab thim rov qab raws li kev taw qhia pem hauv ntej thiab sab nraub qaum

yog Suab> 15 && Suab <35 %yog lub suab nruab nrab ntawm 15 thiab 35 deg txav mus tom ntej luv luv

%tau txais cov ntaub ntawv teeb lub teeb ua ntej txav mus

litBump = r.getLightBumpers;

yog litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %yog tias muaj ib yam dab tsi nyob ntawm xub ntiag ntawm chav tsev thiab yuav ntaus yog tias nws txav mus rau tom ntej ua suab nrov thiab tso saib cov lus

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

lwm %txav mus

r.moveDistance (.03);

%Tau txais cov ntaub ntawv bumper tom qab txav mus

Pob = r.getBumpers;

yog tias Bump.right == 1 || Bump.left == 1 || Bump.front == 1

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

r.moveDistance (-. 01)

kawg

%tau cliff sensor cov ntaub ntawv

Cliff = r.getCliffSensors;

yog Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %yog tias qee yam ua rau lub pob zeb sensor kho nws li lava thiab thim rov qab

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

r.moveDistance (-. 031)

kawg

kawg

elseif Suab> 35 %yog lub suab ntau dua 35 deg txav mus tom ntej ntev dua

%tau txais cov ntaub ntawv teeb lub teeb ua ntej txav mus

litBump = r.getLightBumpers;

yog litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %yog tias muaj ib yam dab tsi nyob ntawm xub ntiag ntawm chav tsev thiab yuav ntaus yog tias nws txav mus rau tom ntej ua suab nrov thiab tso tawm cov lus

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

lwm %txav mus

r.moveDistance (.3)

%Tau txais cov ntaub ntawv bumper tom qab txav mus

Pob = r.getBumpers;

yog tias Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %yog tias koj tsoo qee yam ua suab nrov, tso tawm cov lus, thiab thaub qab

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

r.moveDistance (-. 01)

kawg

%tau cliff sensor cov ntaub ntawv tom qab txav mus

Cliff = r.getCliffSensors;

yog Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %yog tias qee yam ua rau lub pob zeb sensor kho nws li lava thiab thim rov qab

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

r.moveDistance (-. 31)

kawg

kawg

elseif Suab -35 %yog lub suab nruab nrab ntawm -15 thiab -35 deg txav rov qab luv luv

r.moveDistance (-. 03);

%tau cliff sensor cov ntaub ntawv tom qab txav mus

Cliff = r.getCliffSensors;

yog Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %yog tias qee yam ua rau lub pob zeb sensor kho nws li lava thiab thim rov qab

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

r.moveDistance (.04)

kawg

elseif Suab -60 %yog lub suab nruab nrab ntawm -35 thiab -60 deg txav rov qab nrug deb dua

r.moveDistance (-. 3)

%tau cliff sensor cov ntaub ntawv tom qab txav mus

Cliff = r.getCliffSensors;

yog Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %yog tias qee yam ua rau lub pob zeb sensor kho nws li lava thiab thim rov qab

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

r.moveDistance (.31)

kawg

kawg

kawg

kawg

Pom zoo: