Posting dalam seri:
8. Kami mengontrol dari ponsel-ROS Control, GPS-node7. Lokalisasi robot: gmapping, AMCL, titik referensi pada peta kamar6. Odometri dengan enkoder roda, peta ruang, lidar5. Kami bekerja di rviz dan gazebo: xacro, sensor baru.4. Buat simulasi robot menggunakan editor rviz dan gazebo.3. Mempercepat, mengganti kamera, memperbaiki gaya berjalan2. Perangkat Lunak1. BesiPindah ke senyum
Setelah menyusun "burger" sesuai dengan skema dari
pos terakhir, kami melanjutkan ke konten perangkat lunak.
Karena kami mengumpulkan untuk proyek yang sudah selesai, adalah logis untuk memberikan instruksi yang ditunjukkan di dalamnya. Mereka
disini .
Semuanya sangat nyaman dan di tempat yang sama Anda dapat mengunduh gambar yang sudah jadi dari Raspbian Stretch + ROS + OpenCV, menulisnya ke kartu sd untuk raspberry. (ROS Kinetic, OpenCV 3.4.1. Ya, ada yang lebih baru, tetapi kadang-kadang lebih baik untuk mengambil dan pergi daripada mengumpulkan segala sesuatu dari sumber).
Namun demikian, meskipun nyaman, saya masih harus sedikit memperbaiki gambar. Karena ternyata beberapa detail tidak nyaman dari gambar asli:
- tidak ada GUI (antarmuka grafis). Ini tidak kritis, terutama untuk ROS, tetapi untuk naik jalur Anda perlu mengkalibrasi kamera pada raspberry itu sendiri, dan melihat bagaimana (kamera) menyampaikan warna (lebih lanjut tentang itu di bawah);
- Rakitan OpenCV tidak menampilkan gambar di layar, bahkan jika Anda menginstal GUI sendiri. Jelas, dalam proyek rosbots, opencv dibangun tanpa opsi ini.
- tidak ada kruk kecil (VNC, editor teks untuk catatan, mc).
- Oleh karena itu, OpenCV dibangun kembali dengan dukungan untuk output gambar di GUI (dikompilasi oleh openCV 3.4.3), GUI dipasang, kruk kecil.
Gambar yang sudah selesai ada di
sini , dan pekerjaan lebih lanjut akan dibangun atas dasar itu.
Konfigurasikan jaringan (wi-fi) dan ROS-master di raspberry pi
.
Saya sangat menyarankan eksperimen untuk menggunakan router terpisah dengan wi-fi Anda. Anda cukup membuat titik akses di ponsel Anda untuk tujuan ini. Ini disebabkan oleh fakta bahwa banyak paket akan terbang melalui wi-fi dan, lebih disukai, mereka tidak tenggelam dalam lalu lintas umum.
Setelah mengunggah gambar ke kartu sd raspberry, konfigurasikan jaringan. Pengaturan jaringan awal adalah sebagai berikut:
interface wlan0 static ip_address=192.168.43.174/24 static routers=192.168.43.1 static domain_name_servers=192.168.43.1
Terkandung dalam /etc/dhcpcd.conf
Oleh karena itu, Anda tidak dapat menghubungkan selang ke raspberry untuk mengubah segalanya, tetapi cukup membuat titik akses dengan bos nama kata sandi dan kata sandi 1234554321. Alamat raspberry adalah 192.168.43.174. Selain ssh, Anda juga dapat mengakses alamat ini melalui VNC: login - pi, kata sandi - 123qweasdzxcV.
Mari kita mengkonfigurasi master ROSSebuah komentar kecil untuk mereka yang belum menemukan ROS (sistem operasi robot). Master ROS adalah perantara di mana node yang berbeda berkomunikasi dalam ros (node, layanan, dll.) Jika master ros tidak berjalan atau berjalan di alamat yang salah, node tidak akan saling bertemu.
Dalam sistem ROS kami, wizard dimulai secara otomatis dengan memuat OS dan semua yang diperlukan dari kami adalah menentukan alamat IP untuk wizard ROS dalam file sistem yang sesuai.
Jika Anda belum mengubah pengaturan jaringan yang tercantum di atas, maka Anda tidak perlu mengkonfigurasi apa pun.
Jika tidak, edit bashrc:
nano ~/.bashrc
Di akhir file, perbaiki alamat ip (keduanya) untuk kasus Anda:
export ROS_MASTER_URI=http://192.168.43.174:11311 export ROS_HOSTNAME=192.168.43.174
Mulai ulang.
Sekarang, ketika memulai terminal di troli, hasilnya akan seperti ini (atau apa pun yang Anda tentukan dalam pengaturan):
For all slaves, "export ROS_MASTER_URI=http://192.168.43.174:11311"
Ini berarti bahwa master ROS bekerja pada alamat ip yang ditentukan.
Kami mengontrol troli di wi-fi
Kami akan memeriksa dari awal bahwa node berfungsi untuk kita.
Di terminal:
rosnode list
Outputnya akan seperti ini:
/ rosout
/ uno_serial_node
Jika tidak ada yang keluar, maka periksa apakah Anda mendaftarkan ROS-master dalam pengaturan seperti dijelaskan di atas, apakah Anda menghubungkan selang usb ke arduino, reboot.
Setelah memeriksa, jalankan simpul pertama yang bertanggung jawab untuk pergerakan:
rosrun rosbots_driver part2_cmr.py
* perintah ros khusus meluncurkan file part2_cmr.py dari paket python rosbots_driver
Sistem akan menginformasikan bahwa node sedang berjalan:

Di sini Anda dapat melihat bahwa jari-jari roda dan jarak di antara keduanya ditentukan. Anda bisa memperbaiki nilai-nilai ini, serta yang lainnya yang terkait dengan pergerakan file robot.py di sepanjang jalur
/home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/examples/coursera_control_of_mobile_robots/part2/full/controller
karena part2_cmr.py sendiri tidak memiliki parameter ini. Buka terminal kedua dan masukkan daftar rostopik:

Di sini Anda dapat melihat bahwa topik / part2_cmr / cmd_vel telah muncul. Dalam topik ini, / part2_cmr "mendengarkan" apa yang akan dikatakan node lain padanya, dan tergantung pada apa yang mereka katakan, akan mengontrol pergerakan. Apa yang sebenarnya "mendengarkan", tetapi tidak "berbicara" dapat dipahami menggunakan perintah.
rostopic info /part2_cmr/cmd_vel

Di sini Anda dapat melihat bahwa / part2_cmr pelanggan (berlangganan) ke topik dan mendengarkan.
* Anda dapat "mengatakan" sesuatu pada topik sendiri, tanpa node.
Sebagai contoh:
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 1.0}'
putar ke depan dengan roda kiri
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 0.0}'
berhenti roda kiri
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -1.0}'
Putar kembali ke belakang dengan roda
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -0.5}'
Putar kembali dengan roda kiri lebih lambat.
Sintaksnya adalah: pub rostopic - keinginan untuk berbicara dalam topik, -1 - keinginan satu kali, / wheel_power_left - topik di mana kita mengatakan, std_msgs / Float32 - bahasa (format pesan), '{data: -0.5}' - apa yang kita katakan.
Sekarang jalankan orang yang akan berbicara dalam topik / part2_cmr / cmd_vel. Ini akan menjadi simpul pengiriman perintah keyboard.
Tanpa menutup terminal sebelumnya dengan node yang berfungsi, jalankan yang lain dan masukkan:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
* Karena publikasi secara default di topik / cmd_vel, kami mengarahkan ulang menggunakan
/ cmd_vel: = / part2_cmr / cmd_vel sehingga pesan dituangkan ke / part2_cmr / cmd_vel.
Node kontrol dimulai dan Anda dapat naik dengan menekan tombol pada keyboard:

Jika tidak mungkin untuk mengemudi, atau ada mencicit halus dari bawah roda, Anda perlu meningkatkan kecepatan dengan mengklik "w" di terminal dengan simpul berjalan. Hal yang sama (naik atau turun) dapat dilakukan dengan kecepatan rotasi - tombol "e". Penting juga untuk berada di terminal dengan simpul yang berjalan jika tombol kontrol tidak berfungsi jika Anda beralih ke terminal lain. Tombol "k" di terminal kontrol berhenti.
Di terminal terpisah, lihat topik / part2_cmr / cmd_vel:

Sekarang di topik / part2_cmr / cmd_vel ada pembicara dan pendengar.
Mengendarai telepon di OpenCV
Sebelum Anda pergi ke suatu tempat, Anda perlu memastikan bahwa robot tersebut bepergian dengan kontrol keyboard. Komentar penting diperlukan di sini. Saat mengendalikan dari keyboard pada contoh di atas, berbelok ke kiri harus sesuai dengan menekan tombol j, ke kanan l (Latin l), maju i, kembali, (koma). Jika ini tidak terjadi dalam kasus Anda, maka mungkin ada masalah dengan perjalanan. Untuk mengembalikan semuanya ke normal, perlu untuk mengubah pasangan kawat yang datang dari driver mesin ke kaki di Arduino di burger kami 4,5,6,7 Arduino: 4,5 untuk bertukar dengan 6,7 atau 4 dan 5,6 dan 7 masing-masing dengan lain tergantung di mana roda akan berputar. Anda juga dapat melakukan ini secara terprogram dengan menyesuaikan kode untuk arduino di sepanjang jalan - /home/pi/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver/src/main.cpp
dan memuatnya kembali pada Arduino dengan perintah:
upload_firmware ~/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver
Mari kita bekerja dengan bungaPengalaman berkebun kami akan menyoroti garis di lantai yang akan dilalui robot, untuk menentukan warnanya. Secara default, robot tidak melihatnya. Sebagai garis, Anda bisa menggunakan pita perekat (kuning) atau pita, atau yang lainnya dengan warna yang khas dan cukup lebar. * Pita perekat transparan tidak mungkin berfungsi, karena akan sulit dibedakan dari latar belakang.
Mari kita masuk ke folder dan menjalankan skrip:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python bgr-to-hsv.py
* Perhatian! Jika Anda menggunakan gambar asli dari rosbots, dan bukan milik saya, program ini tidak ada di sana.
Dua jendela akan terbuka:

Berikut adalah rentang warna dalam HSV. Apa itu hsv dan mengapa tidak rgb, silakan cari di google sendiri.
h1, s1, v1 - lebih rendah dan h2, s2, v2 - masing-masing, kisaran atas.
Sekarang Anda perlu memilih garis dengan pita listrik (mungkin bukan pita tetapi pita) di lantai dengan menggerakkan bilah geser di jendela. Hanya garis pita listrik yang tetap berada di jendela hasil:

Garis pita listrik berwarna putih luar biasa, yang lainnya hitam. Hasil ini diperlukan.
Rekam, ingat angka-angka rentang HSV. Kasus saya adalah 56.155.40 dan 136.255.255. Rentang HSV akan berbeda dalam kondisi pencahayaan berbeda di dekat kamera robot.
Tutup windows dengan memasukkan ctrl + c di terminal dan tambahkan rentang HSV ke file follow_line_step_hsv.py:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver nano follow_line_step_hsv.py
Dalam barisan:
lower_yellow = np.array([21,80,160]) upper_yellow = np.array([255,255,255])
Kami menempatkan jumlah rentang HSV kami.
Waktunya untuk naik garisKami memulai simpul motor di terminal 1:
rosrun rosbots_driver part2_cmr.py
Luncurkan node kamera di terminal kedua:
sudo modprobe bcm2835-v4l2 roslaunch usb_cam usb_cam-test.launch
Jalankan opencv node di terminal ketiga:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python follow_line_step_hsv.py
Jika semuanya berjalan dengan baik, maka robot akan berjalan di sepanjang garis, dan jendela tambahan akan muncul:

Di jendela ini, pita listrik akan ditandai dengan lingkaran merah.
Arti umum dari kode adalah untuk menyorot segmen warna pada jarak tertentu dari kamera, menggambar lingkaran merah dan pergi ke lingkaran ini, mencoba untuk tetap di tengah.
Akhirnya, tentang yang penting - tentang kucing dan senyum
Karena tujuan kita adalah pergi ke kucing atau ke orang yang tersenyum, kita harus menggunakan sesuatu yang lebih rumit dalam kode kita. Kita juga akan membutuhkan kucing dan orang-orang yang tersenyum. Yang kedua sekarang lebih sulit: beberapa orang tersenyum dalam waktu yang sulit dan mengkhawatirkan ini. Jadi mari kita mulai dengan kucing.
Untuk percobaan, foto kucing di wajah cocok.
Jalankan node kamera di terminal 1:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python pi_camera_driver.py
Di terminal ke-2, simpul motor:
rosrun rosbots_driver part2_cmr.py
Di terminal ke-3 dari simpul pencarian kucing:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python follow_cat2.py
Gerobak secara bertahap akan pindah ke kucing:

Sekarang Anda membutuhkan sukarelawan yang tahu cara tersenyum. Potret seorang tokoh masyarakat yang sedikit dikenal di sebuah negara kecil.
Di terminal ke-3 dari simpul pencarian kucing, Anda dapat menutup - ctrl + c dan alih-alih mulai mencari senyum di wajah orang umum yang kurang dikenal:
python follow_smile.py
Gerobak harus perlahan-lahan, tanpa percaya diri mengarah ke senyum orang yang kurang dikenal:

Seperti yang mungkin sudah banyak ditebak, skrip yang kami jalankan menggunakan kaskade Haar. Dengan prinsip yang sama seperti dengan perjalanan sepanjang garis, kotak area yang diinginkan disorot dan program mencoba untuk tetap di tengah dengan menggerakkan robot.
Sayangnya, kinerja pada raspberry 3b meninggalkan banyak yang harus diinginkan, meskipun pengaturan kamera 320x240 dan 15 Fps. Penundaan terlihat dengan meningkatnya waktu. Tidak semua kucing bisa tahan.
Bagaimana ini bisa diperbaiki?
Cobalah membangun kembali opencv yang dioptimalkan, seperti yang disarankan Adrian (https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/)? Gunakan sumber daya PC eksternal untuk pemrosesan gambar? Cobalah untuk tidak mengompres gambar dalam jpeg yang terbang ke penangan Haar? Dan satu lagi minus besar - kucing harus besar dan di depan. Jarak 15 cm pada lembar A4. Saat menjauh dari kamera, kucing sudah tidak dapat dikenali dan kebal. Pasang monocle raspberry pada kamera dengan pembesaran 8x?
PS: Jika Anda mendapatkan percobaan dengan gambar yang diberikan dalam artikel, maka Anda masih bisa naik untuk bagian tubuh yang berbeda, dengan demikian meluncurkan bukan simpul kucing:
python follow_fullbody.py python follow_upperbody.py python follow_lowerbody.py
wajah atau mata:
python follow_face.py python follow_right_eye.py
Jika Anda tertarik pada cara bergerak dengan lancar sehingga robot tidak menumpahkan teh, serta cara mengoperasikannya bukan dengan raspberry itu sendiri, tulis.