Selamat siang, para pembaca Habr!Saya melanjutkan serangkaian artikel tentang penggunaan praktis ROS pada Raspberry Pi ( artikel pertama , artikel kedua ).Pada artikel ini, kita akan menggunakan paket teleop_twist_keyboard dari tumpukan ros-teleop untuk mengontrol robot dengan menekan tombol pada keyboard. Tumpukan ros-teleop termasuk, di samping paket ini, beberapa paket untuk berbagai metode kontrol, misalnya, menggunakan joystick. Siapa yang siap untuk mulai belajar teleop_twist_keyboard, tolong, di bawah kucing.Multiterminal dengan tmux
Sementara itu, saya ingin memberi tahu Anda tentang satu trik yang memungkinkan Anda bekerja jarak jauh pada Raspberry Pi melalui SSH secara bersamaan di beberapa terminal. Untuk melakukan ini, instal utilitas tmux pada RPi.$ sudo apt-get install tmux
Setelah itu, jalankan utilitas:$ tmux
Bilah hijau akan muncul di bagian bawah jendela terminal dengan nomor jendela 0. 0.tmux adalah manajer jendela terminal yang sangat nyaman yang memungkinkan Anda membuat sejumlah jendela dalam satu jendela terminal dengan menempatkannya dalam beberapa cara berbeda (jendela terminal terpisah (jendela), panel jendela ( pane)) dan mudah untuk beralih di antara mereka.Tekan Ctrl + B dan C. Pada keyboard, jendela lain akan muncul dengan angka 1. Coba juga kombinasi Ctrl + B dan%. Jendela terminal saat ini akan dibagi di tengah oleh garis hijau vertikal menjadi dua jendela (panel). Jika Anda menekan kombinasi Ctrl + B,: dan masukkan "split window", jendela akan dibagi secara horizontal menjadi dua jendela yang identik. Untuk menghapus panel (panel) menggunakan kombinasi Ctrl + B, X dan kemudian tekan Y. Untuk beralih ke panel lain di jendela yang sama, gunakan kombinasi Ctrl + B, O. Untuk beralih antar terminal windows dengan nomor jendela, gunakan kombinasi Ctrl + B B, <nomor jendela>.Sekarang tambahkan peluncuran program ke file ~ / .bashrc untuk secara otomatis memulai ketika Anda membuka terminal baru. Tambahkan baris berikut ke file:[[ $TERM != "screen" ]] && exec tmux
Bekerja dengan teleop_twist_keyboard
Sekarang mari kita berkenalan dengan paket teleop_twist_keyboard.Jalankan skrip teleop_twist_keyboard.py dari paket teleop_twist_keyboard sebagai simpul ROS biasa:$ roscore
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py
Kami mendapatkan kesimpulan seperti ini:Reading from the keyboard and Publishing to Twist!
---------------------------
Moving around:
u i o
j k l
m , .
q/z : increase/decrease max speeds by 10%
w/x : increase/decrease only linear speed by 10%
e/c : increase/decrease only angular speed by 10%
anything else : stop
CTRL-C to quit
Mari kita daftar semua topik yang sedang aktif:$ rostopic list
Topik / cmd_vel akan muncul dalam daftar. Pada topik ini, simpul teleop_twist_keyboard menerbitkan pesan setiap kali tombol ditekan pada keyboard.Mari kita tunjukkan hasil pesan yang diterbitkan dalam topik / cmd_vel:$ rostopic echo cmd_vel
Jalankan rqt_graph untuk mewakili grafik yang dihitung ROS dalam bentuk grafis. Diagram grafik komputasi menunjukkan semua node aktif dan topik yang menghubungkannya.$ rosrun rqt_graph rqt_graph
Di sini kita melihat bahwa simpul teleop_twist_keyboard menerbitkan pesan ke topik / cmd_vel, dan simpul rostopik berlangganan ke topik ini (perintah gema rostopic).Mari kita cari tahu jenis pesan apa yang dipublikasikan pada topik / cmd_vel:$ rostopic type /cmd_vel
Perintah akan menampilkan baris:geometry_msgs/Twist
Ini berarti bahwa pesan bertipe Twist dari paket ROS standar, geometry_msgs.Kami juga dapat memperoleh informasi tentang struktur pesan dengan perintah rosmsg:$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
Bidang 'linier' bertanggung jawab atas kecepatan linier, 'sudut' adalah untuk kecepatan sudut.Tekan tombol 'i', hasilnya akan seperti ini (terkait dengan bergerak maju):linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
Tekan tombol 'k', hasilnya akan seperti ini (berhenti):linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
Tekan tombol 'u', hasilnya akan seperti ini (belok kiri):linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 1.0
---
Dan akhirnya, ketika Anda menekan tombol 'o', kami mendapatkan output berikut (belok kanan):linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -1.0
---
Tombol 'j' dan 'l' bertanggung jawab untuk berbelok ke kiri dan ke kanan di tempat (tanpa bergerak maju).Kontrol robot keyboard dengan teleop_twist_keyboard
Saya sudah menulis sketsa untuk mengendalikan robot dengan menekan tombol. Kami cukup berlangganan ke topik / cmd_vel dan, tergantung pada nilai yang diterima dari masing-masing kecepatan, berikan perintah yang diperlukan untuk pengontrol gerakan (bergerak maju, berhenti, belok kiri atau kanan). Sketsa dapat diunduh dari sini .Mari kita menganalisis kode sketsa dengan lebih detail.Di awal file, selain file header ros.h standar, kami menghubungkan dua file tambahan dengan tipe pesan geometry_msgs / Twist.h dan geometry_msgs / Vector3.h:#include <geometry_msgs/Twist.h>
#include <geometry_msgs/Vector3.h>
Kami mendeklarasikan node handler ros :: NodeHandle:ros::NodeHandle nh;
Nilai utama adalah metode messageCb:void messageCb(const geometry_msgs::Twist& message)
{
geometry_msgs::Vector3 linear = message.linear;
float forward_vel = float(linear.x);
if(forward_vel == 0) { stop(); return; }
geometry_msgs::Vector3 angular = message.angular;
float ang_vel = float(angular.z);
if(ang_vel > 0) { turnLeft(); }
else if(ang_vel < 0) { turnRight(); }
else { goForward(); }
}
Dalam metode ini, kami memproses pesan yang diterima dari topik cmd_vel. Dalam variabel forward_vel kita menjaga kecepatan linier, dalam variabel sudut - sudut. Kecepatan linier memungkinkan kita untuk melacak perintah berhenti (nilai 0). Kecepatan sudut menentukan arah rotasi (jika lebih besar dari 0, lalu belok kiri, kurang dari 0 - kanan, jika 0 - bergerak maju).Buat pelanggan untuk topik / cmd_vel:ros::Subscriber<geometry_msgs::Twist> sub("/cmd_vel", &messageCb);
dengan referensi ke metode pemrosesan pesan (messageCb) dan jenis pesan yang diterima - geometry_msgs :: Twist.Di akhir skrip, metode sketsa standar untuk rosserial_arduino ikuti:nh.initNode();
nh.subscribe(sub);
Serial.begin(57600);
Jalankan server rosserial_arduino:$ rosrun rosserial_python serial_node _port:=/dev/ttyACM0
dan unggah sketsa ke papan Arduino.Beralih ke terminal tempat simpul teleop_twist_keyboard berjalan, coba tekan tombol 'u', 'i', 'o' dan 'k' dan periksa output server server di terminal.Dengan demikian, menggunakan paket teleop_twist_keyboard, kita sekarang dapat melakukan remote control sederhana dari robot dengan mengirimkan perintah gerakan: bergerak maju, berhenti, belok kiri atau kanan. Di masa depan, kita akan belajar cara mengendalikan robot menggunakan joystick, yang jauh lebih nyaman menggunakan paket lain di ROS. Tetapi lebih lanjut tentang itu di artikel berikutnya.