ROS Workshop 2016: parsing tugas kontrol robot yang aman

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.

gambar

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)
{
  /**
   * The ros::init() function needs to see argc and argv so that it can perform
   * any ROS arguments and name remapping that were provided at the command line.
   * For programmatic remappings you can use a different version of init() which takes
   * remappings directly, but for most command-line programs, passing argc and argv is
   * the easiest way to do it.  The third argument to init() is the name of the node.
   *
   * You must call one of the versions of ros::init() before using any other
   * part of the ROS system.
   */
  ros::init(argc, argv, "safety_control_cloud");

  /**
   * NodeHandle is the main access point to communications with the ROS system.
   * The first NodeHandle constructed will fully initialize this node, and the last
   * NodeHandle destructed will close down the node.
   */
  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:

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:

gambar

Dan klik itu. Kita akan melihat sesuatu seperti ini.

gambar

Putar robot dengan mengklik dan menarik busur biru. Kami mendapatkan gambar berikut:

gambar

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:

gambar

Untuk tampilan PointCloud2, pilih RGB8 untuk bidang Color Transformer. Kami mendapatkan cloud point berwarna:

gambar

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:

gambar

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

gambar

pindahkan robot lebih jauh, ke jarak yang aman dari rintangan. Untuk melakukan ini, klik ikon kedua di atas:

gambar

dan pindahkan robot dengan menyeretnya dengan kursor:

gambar

Di rviz kita akan melihat yang berikut:

gambar

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!

Source: https://habr.com/ru/post/id399151/


All Articles