Isi kandungan:

Mengubah Roomba Anda menjadi Mars Rover: 5 Langkah
Mengubah Roomba Anda menjadi Mars Rover: 5 Langkah

Video: Mengubah Roomba Anda menjadi Mars Rover: 5 Langkah

Video: Mengubah Roomba Anda menjadi Mars Rover: 5 Langkah
Video: INILAH CARA NASA MENGENDALIKAN ROBOT YANG ADA DI MARS SEJAUH 50 JUTA KM DARI BUMI 2024, November
Anonim
Mengubah Roomba Anda menjadi Mars Rover
Mengubah Roomba Anda menjadi Mars Rover

Langkah 1: Kumpulkan Bahan Anda

Untuk menyelesaikan projek ini, anda perlu mengumpulkan bahan berikut:

1 Robot Roomba

1 Kit Pi Raspberry

1 Kamera Video

Akses ke MATLAB

Langkah 2: Muat turun Kotak Alat Roomba untuk MATLAB

Muat turun Kotak Alat Roomba untuk MATLAB
Muat turun Kotak Alat Roomba untuk MATLAB
Muat turun Kotak Alat Roomba untuk MATLAB
Muat turun Kotak Alat Roomba untuk MATLAB

Jalankan kod berikut untuk memasang kotak alat yang diperlukan untuk menyelesaikan projek ini.

fungsi roombaInstall

clc;

% senarai fail untuk dipasang

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

% lokasi untuk dipasang dari

pilihan = weboptions ('CertificateFilename', ''); % memberitahu bahawa untuk mengabaikan keperluan sijil

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

dlgTitle = 'Roomba Install / Update';

% tujuan paparan dan dapatkan pengesahan

gesaan = {

'Program ini akan memuat turun fail EF 230 Roomba ini:'

''

strjoin (fail, )

''

'ke folder ini:'

''

cd

''

'Adakah anda mahu meneruskan? '

};

bip;

yn = questdlg (prompt,…

dlgTitle,…

'Ya', 'Tidak', 'Ya');

jika ~ strcmp (yn, 'Ya'), kembali; akhir

% dapatkan senarai fail yang ada

sedia ada_files = fail (cellfun (@ ada, fail)> 0);

jika ~ isempty (sedia ada_files)

% pastikan betul-betul menggantikannya

prompt = {'Anda mengganti fail ini:'

''

strjoin (ada_files yang ada, '')

''

'OK untuk ganti?'

};

bip;

yn = questdlg (prompt,…

dlgTitle,…

'Ya', 'Tidak', 'Ya');

jika ~ strcmp (yn, 'Ya'), kembali; akhir

akhir

% memuat turun fail

cnt = 0;

untuk i = 1: panjang (fail)

f = fail {i};

disp (['Memuat turun' f]);

cuba

url = [pelayan f];

penyimpanan laman web (f, url, pilihan); % menambahkan pilihan untuk mengelakkan kesalahan keselamatan

cnt = cnt + 1;

tangkap

disp (['Kesalahan memuat turun' f]);

dummy = [f '.html'];

jika ada (dummy, 'file') == 2

padam (dummy)

akhir

akhir

akhir

jika cnt == panjang (fail)

msg = 'Pemasangan Berjaya';

tunggu (msgbox (msg, dlgTitle));

yang lain

msg = 'Ralat Pemasangan - lihat tetingkap arahan untuk perincian';

tunggu (errordlg (msg, dlgTitle));

akhir

akhir% roombaInstall

Langkah 3: Sambungkan ke Roomba Anda

Kini tiba masanya untuk menyambung ke Roomba anda menggunakan WiFi. Dengan menggunakan 2 jari, tekan butang Dock dan Spot secara serentak untuk menghidupkan atau menetapkan semula Roomba anda. Seterusnya, Jalankan kod r = roomba (# Roomba anda) di tetingkap arahan MATLAB untuk menyambung ke robot anda. Setelah anda melaksanakan perintah ini, Roomba anda harus siap untuk pergi.

Langkah 4: Pilih Bagaimana Anda Ingin Mengendalikan Roomba Anda

Pilih Bagaimana Anda Mahu Mengendalikan Roomba Anda
Pilih Bagaimana Anda Mahu Mengendalikan Roomba Anda
Pilih Bagaimana Anda Ingin Mengendalikan Roomba Anda
Pilih Bagaimana Anda Ingin Mengendalikan Roomba Anda

Terdapat dua cara untuk mengawal Roomba anda: secara autonomi atau menggunakan telefon pintar sebagai pengawal.

Sekiranya anda memilih untuk mengendarai Roomba secara autonomi, anda perlu menggunakan tiga sensor terbina dalam: sensor tebing, sensor bump, dan sensor cahaya.

Untuk menggunakan telefon pintar, pertama-tama anda perlu menyambungkan telefon pintar ke komputer anda dengan mengikuti langkah-langkah di bawah.

CATATAN: Komputer dan telefon pintar anda mesti berada di rangkaian WiFi yang sama untuk berhubung dengan betul!

1. Muat turun aplikasi MATLAB dari app store pada peranti anda.

2. Ketik "penyambung hidup" ke tetingkap arahan anda dan tetapkan kata laluan yang perlu dimasukkan ke dalam kedua-dua peranti.

3. Setelah melakukannya, MATLAB akan memberi anda alamat IP komputer anda. Anda perlu masuk ke halaman tetapan di aplikasi MATLAB pada telefon pintar anda dan tambahkan komputer menggunakan alamat IP dan kata laluan yang anda masukkan sebelumnya.

4. Di tetingkap arahan di komputer anda, ketikkan kod m = mobiledev dan ini harus menginisialisasi telefon pintar anda sebagai pengawal untuk Roomba anda.

5. Komputer dan telefon pintar anda harus siap digunakan sekarang.

Langkah 5: Pandu Roomba Anda

Setelah anda mempunyai semua alat yang diperlukan untuk membuat Mars Rover anda, anda sudah bersedia untuk membuat kod anda sendiri. Kami telah melampirkan kod contoh di bawah untuk pemanduan autonomi dan pemanduan yang dikendalikan oleh telefon pintar.

Memandu Autonomi

fungsi Explore_modified (r)

% argumen input: 1 objek roomba, r

% argumen output: tidak ada

% keterangan:

% fungsi menggunakan loop sementara yang tidak terhingga untuk membenarkan autonomi

% penerokaan persekitaran bot.

%

% funciton juga memberikan arahan kepada roomba untuk melakukan apa

Situasi berikut: Roda kehilangan hubungan dengan tanah, dan

Objek% dikesan di hadapan atau di kedua sisi bot, dan a

% penurunan mendadak dikesan di hadapan atau di kedua-dua belah bot.

%

% petunjuk khas merangkumi arahan pergerakan yang bertujuan untuk memaksimumkan

% penerokaan atau mengelakkan bahaya yang dikesan dan arahan untuk berkomunikasi

% maklumat mengenai penemuan bot (gambar), kedudukan (grafik), % dan nyatakan (amaran terdampar) dengan pengguna melalui matlab dan / atau e-mel. Beberapa

% perintah suara ditambahkan untuk kesenangan.

% keupayaan e-mel persediaan

mel = '[email protected]';

kata laluan = 'EF230Roomba';

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

setpref ('Internet', 'E_mail', mel);

setpref ('Internet', 'SMTP_Username', mel);

setpref ('Internet', 'SMTP_Password', kata laluan);

alat peraga = java.lang. System.getProperties;

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

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

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; % menetapkan nilai rujukan sensor tebing

lightBumper_datum = 200; % menetapkan nilai rujukan sensor Bumper cahaya

pos = [0, 0]; % pemboleh ubah untuk penyimpanan kedudukan dengan dataum diinisialisasi

sudut = 0; % menetapkan sudut rujukan

jaring = 0; % anjakan sudut bersih

i = 2; % iterator untuk menambahkan baris ke pemboleh ubah penyimpanan kedudukan

dist = 0;

r.setDriveVelocity (v, v); % mula roomba bergerak ke hadapan

walaupun benar

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Light = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); % menghasilkan 1 sudut rawak antara 20 hingga 60 darjah. Digunakan untuk mengelakkan bot terjebak dalam gelung

Apa yang perlu dilakukan sekiranya satu atau lebih roda terputus dengan tanah:

% berhenti bergerak, hantarkan e-mel amaran dengan gambar persekitaran, % dan tanya pengguna sama ada untuk meneruskan atau menunggu pertolongan

jika Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.berhenti

dist = r.getDistance;

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

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

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, 'tersekat.png');

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

imfile = 'tersekat.png';

kedudukan = savepos (pos);

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

sendmail (mel, 'BANTUAN!', 'Saya terdampar di tebing!', {imfile, position})

list = {'Teruskan', 'Berhenti'};

idx = menu ('Apa yang harus saya lakukan?', senaraikan);

jika idx == 2

rehat

akhir

% Apa yang harus dilakukan jika objek dikesan di depan bot:

% berhenti, bergerak kembali, mengambil gambar, memberi amaran kepada pengguna mengenai penemuan

% melalui e-mel, belok 90 darjah, dan terus meneroka

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

r.berhenti;

dist = r.getDistance;

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

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

i = i + 1;

r.moveDistance (-. 125);

dist = r.getDistance;

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

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

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

kedudukan = savepos (pos);

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

sendmail (mel, 'Makluman!', 'Saya menjumpai sesuatu!', {imfile, position})

sudut = 90;

netangle = netangle + sudut;

r.turnAngle (sudut);

r.setDriveVelocity (v, v);

% Apa yang harus dilakukan jika objek dikesan di sebelah kiri bot:

% berhenti, pusing ke arah objek, sandarkan, ambil gambar, berjaga-jaga

% pengguna penemuan melalui e-mel, belok 90 darjah dan terus meneroka

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

r.berhenti;

dist = r.getDistance;

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

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

i = i + 1;

sudut = 30;

netangle = netangle + sudut;

r.turnAngle (sudut);

r.moveDistance (-. 125);

dist = r.getDistance;

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

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

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

kedudukan = savepos (pos);

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

sendmail (mel, 'Makluman!', 'Saya menjumpai sesuatu!', {imfile, position})

sudut = -90;

netangle = netangle + sudut;

r.turnAngle (sudut);

r.setDriveVelocity (v, v);

% Apa yang harus dilakukan jika objek dikesan di sebelah kanan bot:

% berhenti, pusing ke arah objek, sandarkan, ambil gambar, berjaga-jaga

% pengguna penemuan melalui e-mel, belok 90 darjah dan terus meneroka

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

r.berhenti;

dist = r.getDistance;

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

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

i = i + 1;

sudut = -30;

netangle = netangle + sudut;

r.turnAngle (sudut);

r.moveDistance (-. 125);

dist = r.getDistance;

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

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

i = i + 1;

berhenti seketika (1.5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

kedudukan = savepos (pos);

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

sendmail (mel, 'Makluman!', 'Saya menjumpai sesuatu!', {imfile, position});

sudut = 90;

netangle = netangle + sudut;

r.turnAngle (sudut);

r.setDriveVelocity (v, v);

Apa yang perlu dilakukan jika tebing dikesan di sebelah kiri bot:

% berhenti, bergerak ke belakang, belok kanan, terus meneroka

otherif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum

r.berhenti;

dist = r.getDistance;

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

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

i = i + 1;

r.moveDistance (-. 125);

dist = r.getDistance;

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

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

i = i + 1;

sudut = -RandAngle;

netangle = netangle + sudut;

r.turnAngle (sudut);

r.setDriveVelocity (v, v);

Apa yang perlu dilakukan jika tebing dikesan di sebelah kanan bot:

% berhenti, bergerak ke belakang, belok kiri, terus meneroka

otherif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum

r.berhenti;

dist = r.getDistance;

pos (i, 1) = dist * sind (sudut); % mendapat x koordinat

pos (i, 2) = dist * cosd (sudut); % dapatkan koordinat y

i = i + 1;

r.moveDistance (-. 125);

sudut = RandAngle;

netangle = netangle + sudut;

r.turnAngle (sudut);

r.setDriveVelocity (v, v);

akhir

akhir

Pengawal Telefon Pintar

Pilihan = {'Autonomous', 'Manual Control'}

Prompt = menu ('Bagaimana anda mahu mengawal rover?', Pilihan)

m = mobiledev

r = roomba (19)

jika Prompt == 1

Terokai (r)

yang lain

walaupun benar

jeda (.5)

PhoneData = m. Orientasi;

Azi = DataData (1);

Pitch = DataData (2);

Sebelah = DataData (3);

jika Sebelah> 130 || Sebelah <-130% jika telefon dibalik menghadap ke bawah hentikan roomba dan keluar gelung

r.berhenti

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

rehat

otherif Side> 25 && Side <40% jika telefon dipusing ke samping antara 25 dan 40 deg belok kiri 5 darjah

r.turnAngle (-5);

Lain-lain> Sebelah> 40% jika telefon dipusing ke samping lebih dari 40 darjah belok kiri 45 darjah

r.turnAngle (-45)

otherif Side-40% jika telefon dipusing ke samping antara -25 dan -40 deg belok kanan 5 deg

r.turnAngle (5);

otherif Sisi <-40% jika telefon dipusing ke samping kurang dari -40 deg belok kiri 45 darjah

r.turnAngle (45)

akhir

Sekiranya telefon dipegang berhampiran vertikal, ambil gambar dan plot

jika Pitch <-60 && image <= 9

r.beep

img = r.getImage;

subplot (3, 3, gambar)

imshow (img)

akhir

% bergerak ke hadapan dan ke belakang berdasarkan orientasi depan dan belakang

jika Pitch> 15 && Pitch <35% jika pitch antara 15 dan 35 deg bergerak ke hadapan jarak pendek

% dapatkan data bumper ringan sebelum bergerak

litBump = r.getLightBumpers;

jika litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500% jika ada sesuatu di hadapan roomba dan akan memukul jika bergerak ke hadapan membuat bunyi dan memaparkan mesej

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

lain% bergerak

r.moveDistance (.03);

% Dapatkan data bumper setelah bergerak

Bump = r.getBumpers;

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

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

r.moveDistance (-. 01)

akhir

% dapatkan data sensor tebing

Cliff = r.getCliffSensors;

jika Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% jika sesuatu mencetuskan sensor tebing menganggapnya sebagai lava dan membuat sandaran

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

r.moveDistance (-. 031)

akhir

akhir

Lain-lain jika Pitch> 35% jika nada lebih besar 35 deg bergerak ke hadapan dengan jarak yang lebih jauh

% dapatkan data bumper ringan sebelum bergerak

litBump = r.getLightBumpers;

jika litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15% jika ada sesuatu di hadapan roomba dan akan memukul jika bergerak ke hadapan membuat bunyi dan memaparkan mesej

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

lain% bergerak

r.moveDistance (.3)

% Dapatkan data bumper setelah bergerak

Bump = r.getBumpers;

jika Bump.right == 1 || Bump.left == 1 || Bump.front == 1% jika anda memukul sesuatu membuat bising, memaparkan mesej, dan membuat sandaran

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

r.moveDistance (-. 01)

akhir

% dapatkan data sensor tebing setelah bergerak

Cliff = r.getCliffSensors;

jika Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% jika sesuatu mencetuskan sensor tebing menganggapnya sebagai lava dan membuat sandaran

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

r.moveDistance (-. 31)

akhir

akhir

elseif Pitch-35% jika jarak antara -15 dan -35 deg bergerak kembali jarak pendek

r.moveDistance (-. 03);

% dapatkan data sensor tebing setelah bergerak

Cliff = r.getCliffSensors;

jika Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% jika sesuatu yang mencetuskan sensor tebing menganggapnya sebagai lava dan membuat sandaran

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

r.moveDistance (.04)

akhir

elseif Pitch-60% jika jarak antara -35 dan -60 deg bergerak ke belakang dengan jarak yang lebih jauh

r.moveDistance (-. 3)

% dapatkan data sensor tebing setelah bergerak

Cliff = r.getCliffSensors;

jika Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% jika sesuatu yang mencetuskan sensor tebing menganggapnya sebagai lava dan membuat sandaran

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

r.moveDistance (.31)

akhir

akhir

akhir

akhir

Disyorkan: