Isi kandungan:
- Langkah 1: Kumpulkan Bahan Anda
- Langkah 2: Muat turun Kotak Alat Roomba untuk MATLAB
- Langkah 3: Sambungkan ke Roomba Anda
- Langkah 4: Pilih Bagaimana Anda Ingin Mengendalikan Roomba Anda
- Langkah 5: Pandu Roomba Anda
Video: Mengubah Roomba Anda menjadi Mars Rover: 5 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:07
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
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
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:
Mudah Mudah Mengubah Warna Mengubah Lampu Kiub Rubik Tanpa Wayar: 10 Langkah (dengan Gambar)
Mudah Mudah Mengubah Warna Mengubah Lampu Kubus Rubik Tanpa Wayar: Hari ini kita akan membina lampu Rubik Cube-esque yang hebat ini yang berubah warna berdasarkan sisi mana yang naik. Kubus ini menggunakan bateri LiPo kecil, yang dicas oleh kabel mikro-usb standard, dan, dalam ujian saya, jangka hayat bateri selama beberapa hari. Ini
Cara Mengubah Pemacu Keras Anda pada PC Notebook Asus Anda: 4 Langkah
Bagaimana Mengubah Pemacu Keras Anda di PC Notebook Asus Anda: Pernahkah cakera keras anda berhenti berfungsi atau kehabisan ruang pada cakera keras anda? Saya ada jalan penyelesaian untuk anda. Saya akan menunjukkan cara menukar cakera keras anda pada PC Notebook Asus anda
Cara Mengubah Telefon bimbit Anda menjadi Kad Kredit / debit: 5 Langkah
Cara Mengubah Telefon bimbit Anda menjadi Kad Kredit / debit: Mod yang mudah dilakukan untuk kad kredit / debit tambahan dengan cip RFID (iaitu Paypass). Dengan menggunakan kaedah ini, anda akan dapat mencari dan mengeluarkan cip RFID di kad kemampuan Paypass ganti anda dan meletakkannya di telefon bimbit anda. Ini akan membolehkan anda mempersembahkan
Cara Mengubah Teks yang Muncul Semasa Anda Menggerakkan Tetikus Anda Pada Butang Mula: 4 Langkah
Cara Mengubah Teks yang Muncul Semasa Anda Menggerakkan Tetikus Anda Pada Butang Mula: Tajuk mengatakan semuanya
Cara Mengubah Pasu IKEA Menjadi Stesen Pengecasan untuk Alat Anda: 4 Langkah (dengan Gambar)
Cara Mengubah Vas IKEA Menjadi Stesen Pengecasan untuk Alat Anda: … idea mudah dengan pendekatan yang lebih mudah … ~ CERITA ~ Saya tinggal di sebuah pangsapuri kecil dan saya memiliki beberapa alat kecil yang tamak tenaga. Pada masa lalu saya mencuba untuk mendedikasikan beberapa ruang berhampiran palam dinding, untuk mengecasnya