Selamat siang, habratchiteli sayang! Jumat lalu di laboratorium kami ada lokakarya praktis tentang platform ROS - lokakarya ROS. Lokakarya ini diselenggarakan untuk mahasiswa Fakultas Teknologi Informasi Universitas Teknik Brno yang ingin berkenalan dengan platform ini. Tidak seperti tahun-tahun sebelumnya (lokakarya telah diadakan selama 4 tahun), kali ini lokakarya ROS difokuskan pada kerja praktek independen. Dalam artikel ini saya akan berbicara tentang tugas yang ditetapkan untuk para peserta lokakarya. Siapa yang peduli, tolong, di bawah kucing.
Pernyataan masalah
Para peserta ditugaskan untuk menerapkan kontrol robot yang aman dengan berhenti di depan rintangan. Tujuan dari tugas ini adalah untuk mengontrol kecepatan robot ke arah depan. Robot menerima data dari sensor kedalaman (dalam kasus kami, ASUS Xtion di simulator turtlebot_gazebo), menemukan penghalang terdekat dalam arah gerakan dan menentukan tiga zona:- Aman - robot pada jarak aman, bergerak tanpa perlambatan
- Peringatan - robot mendekati penghalang, mengeluarkan sinyal peringatan (misalnya, sinyal audio) dan melambat
- Bahaya - kendala sangat dekat, robot berhenti
Implementasi
Saya segera mencatat bahwa di bengkel, ROS Indigo di Ubuntu 14,04 digunakan untuk menyelesaikan tugas. Saya juga menggunakan ROS Indigo untuk percobaan.Jadi mari kita mulai! Buat paket dengan dependensi roscpp, pcl_ros, pcl_conversions, sensor_msgs, dan geometry_msgs:cd ~/catkin_ws/src
catkin_create_pkg safety_control_cloud roscpp pcl_ros pcl_conversions sensor_msgs geometry_msgs
cd ~/catkin_ws
Tambahkan pustaka PCL ke package.xml tergantung pada:<build_depend>libpcll-all-dev</build_depend>
...
<run_depend>libpcl-all</run_depend>
dan di CMakeLists.txt:find_package(PCL REQUIRED)
...
include_directories(${PCL_INCLUDE_DIRS})
Tambahkan skrip safety_control.cpp ke folder src:safety_control.cpp#include "ros/ros.h"
#include "pcl_conversions/pcl_conversions.h"
#include <pcl/pcl_base.h>
#include <sstream>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/filters/passthrough.h>
#include <pcl/common/common.h>
#include <geometry_msgs/Twist.h>
typedef pcl::PointXYZ PointType;
typedef pcl::PointCloud<PointType> PointCloud;
typedef PointCloud::Ptr PointCloudPtr;
ros::Publisher pcd_pub_, cmd_vel_pub_;
void pcd_cb(const sensor_msgs::PointCloud2ConstPtr& pcd) {
ROS_INFO_STREAM_ONCE("Point cloud arrived");
PointCloudPtr pcd_pcl = PointCloudPtr(new PointCloud), pcd_filtered = PointCloudPtr(new PointCloud);
PointType pt_min, pt_max;
pcl::fromROSMsg(*pcd, *pcd_pcl);
pcl::PassThrough<PointType> pass;
pass.setInputCloud(pcd_pcl);
pass.setFilterFieldName("y");
pass.setFilterLimits(-0.25,0.20);
pass.filter(*pcd_filtered);
pass.setInputCloud(pcd_filtered);
pass.setFilterFieldName("x");
pass.setFilterLimits(-0.3,0.3);
pass.filter(*pcd_pcl);
pcl::getMinMax3D(*pcd_pcl, pt_min, pt_max);
geometry_msgs::Twist vel;
if (pt_min.z > 1.0) {
vel.linear.x = 0.2;
ROS_INFO_STREAM("Safe zone");
} else if (pt_min.z > 0.5) {
vel.linear.x = 0.1;
ROS_INFO_STREAM("Warning zone");
} else {
vel.linear.x = 0.0;
ROS_INFO_STREAM("Danger zone");
}
cmd_vel_pub_.publish(vel);
sensor_msgs::PointCloud2 pcd_out;
pcl::toROSMsg(*pcd_pcl, pcd_out);
pcd_pub_.publish(pcd_out);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "safety_control_cloud");
ros::NodeHandle n;
ros::Subscriber pcd_sub = n.subscribe("/camera/depth/points", 1, pcd_cb);
pcd_pub_ = n.advertise<sensor_msgs::PointCloud2>("/output", 1);
cmd_vel_pub_ = n.advertise<geometry_msgs::Twist>("/cmd_vel_mux/input/teleop", 1);
ros::spin();
return 0;
}
Tambahkan skrip safety_control.cpp ke CMakeLists.txt:add_executable(safety_control_node src/safety_control.cpp)
target_link_libraries(safety_control_node ${catkin_LIBRARIES} ${PCL_LIBRARIES})
Dalam logika simpul, kami berlangganan data dari topik / kamera / kedalaman / titik, mendapatkan cloud titik, menghitung koordinat titik terdekat ke sensor kedalaman di awan titik dan, tergantung pada situasinya, menerbitkan kecepatan linier seperti geometry_msgs / Twister ke topik / cmd_vel_mux / input / teleop .Kita juga perlu memotong titik awan dalam beberapa sumbu dalam rentang tertentu untuk pemrosesan yang lebih efisien. Di baris berikut:
pcl::PassThrough<PointType> pass;
pass.setInputCloud(pcd_pcl);
pass.setFilterFieldName("y");
pass.setFilterLimits(-0.25,0.20);
pass.filter(*pcd_filtered);
krop awan menggunakan metode PassThrough 25 cm ke bawah dan 20 cm ke atas dari asal sistem koordinat sensor kedalaman (di sepanjang sumbu y).Dalam barisan:
pass.setInputCloud(pcd_filtered);
pass.setFilterFieldName("x");
pass.setFilterLimits(-0.3,0.3);
pass.filter(*pcd_pcl);
Kami memangkas awan 0,3 m (30 cm) ke kiri dan ke kanan asal sistem koordinat sensor (sumbu z). Kemudian kita mencari titik terdekat di awan titik di sepanjang sumbu z (sumbu dari pusat sensor kedalaman ke arah tampilan) - ini akan menjadi titik objek terdekat:
pcl::getMinMax3D(*pcd_pcl, pt_min, pt_max);
Kecepatan juga akan dipublikasikan pada topik / mobile_base / perintah / kecepatan. Kompilasi paket:cd ~/catkin_ws
catkin_make
source devel/setup.bash
Menguji dalam simulator Turtle Bot di Gazebo
Tugas kedua adalah menguji logika kontrol robot dengan simulator TurtleBot di Gazebo. Untuk melakukan ini, atur turtlebot_gazebo menggunakan apt-get:sudo apt-get install ros-indigo-turtlebot*
Di sini Anda dapat menemukan beberapa tutorial bermanfaat tentang penggunaan simulator. Simulator dapat menjadi solusi yang baik ketika Anda ingin mempelajari paket navigasi di ROS dan tidak ada robot yang sebenarnya. Jalankan simulator:roslaunch turtlebot_gazebo turtlebot_world.launch
Jendela Gazebo akan terbuka seperti pada gambar:
Kita dapat memperbesar dan memperkecil gambar dengan roda mouse. Dengan menggunakan tombol kiri mouse dan kursor kita dapat memindahkan gambar ke kiri, kanan, atas dan bawah. Dengan menggunakan roda dan kursor yang dijepit, Anda dapat mengubah sudut pandang vertikal. Sekarang putar robot sehingga terlihat langsung di kabinet. Di baris atas alat di atas jendela tampilan simulasi, pilih ikon ketiga:Dan klik itu. Kita akan melihat sesuatu seperti ini.
Putar robot dengan mengklik dan menarik busur biru. Kami mendapatkan gambar berikut:
Jalankan rviz:rosrun rviz rviz
Tambahkan tampilan RobotModel, seperti yang sudah dijelaskan dalam artikel . Tambahkan tampilan PointCloud2 dan pilih topik / kamera / kedalaman / poin. Hasilnya, kami mendapatkan gambar berikut:
Untuk tampilan PointCloud2, pilih RGB8 untuk bidang Color Transformer. Kami mendapatkan cloud point berwarna:
Jalankan node safety_control_node kami:rosrun safety_control_cloud safety_control_node
Output di terminal akan seperti ini:[ INFO] [1479229421.537897080, 2653.960000000]: Point cloud arrived
[ INFO] [1479229421.572338588, 2654.000000000]: Warning zone
[ INFO] [1479229421.641967924, 2654.070000000]: Warning zone
Mari daftar topik:rostopic list
Di antara topik yang akan kita lihat:/cmd_vel_mux/input/teleop
...
/mobile_base/commands/velocity
Tampilkan pesan dalam topik / mobile_base / perintah / kecepatan:rostopic echo /mobile_base/commands/velocity
Dapatkan kecepatan robot:linear:
x: 0.1
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
Robot akan bergerak menuju kabinet dan akhirnya berhenti di sebelah kabinet di zona Bahaya. Di Gazebo, kita akan melihat pemberhentian lengkap dari robot:
Di output untuk node safety_control_node, kita akan melihat pesan:[ INFO] [1479229426.604300460, 2658.980000000]: Danger zone
[ INFO] [1479229426.717093096, 2659.100000000]: Danger zone
Dan dalam topik / mobile_base / perintah / kecepatan pesan dengan kecepatan nol sekarang akan diterbitkan:linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
Tambahkan tampilan tipe PointCloud2 dengan topik / output ke rviz. Untuk tampilan Transformer Warna, pilih FlatColor dan hijau di bidang Warna. Ini akan menjadi bagian kami dari cloud titik dari node safety_control_node: Mari kita
pindahkan robot lebih jauh, ke jarak yang aman dari rintangan. Untuk melakukan ini, klik ikon kedua di atas:dan pindahkan robot dengan menyeretnya dengan kursor:
Di rviz kita akan melihat yang berikut:
Kami akan menerima pesan seperti itu dari simpul kami:[ INFO] [1479230429.902116395, 3658.000000000]: Safe zone
[ INFO] [1479230429.992468971, 3658.090000000]: Safe zone
Kecepatan robot akan seperti ini:---
linear:
x: 0.2
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
Selanjutnya, semua yang dijelaskan di atas akan diulang: perlambatan di zona peringatan dan berhenti di dekat kabinet.Sekarang TurtleBot kami dapat berhenti di depan kendala apa pun yang dapat dideteksi oleh sensor kedalaman (ASUS Xtion dalam kasus ROS Indigo). Anda dapat mencoba program kontrol pada robot sungguhan yang dilengkapi dengan sensor seperti Microsoft Kinect.Itu saja. Kami menulis sebuah program sederhana untuk mengontrol kecepatan robot maju menggunakan data dari sensor kedalaman - awan titik - dan mengujinya pada simulator robot TurtleBot di Gazebo.Semoga berhasil dalam percobaan dan sampai jumpa lagi!