ROS: GMapping ve Hector Metotları ile Haritalama (OmniRobot)
Yeni gelinlerin instagramda paylaştıkları robot süpürgelerinin hünerlerini hepimiz biliyoruz. Robot süpürgelerin önce bulundukları alanı haritalaması ve sonra bu alanda kendi konumunu güncelleyerek temizlik yapması oldukça teorik bir temele dayanmaktadır. Bu yazımda ROS çatısında çalışan bir robotun GMapping ve Hector metodu ile Gazebo simülasyon ortamında haritalama uygulamasını yapacağız. Hadi başlayalım…
Robot bilinmeyen bir ortamda çalışıyorsa haritalama oldukça önemli bir gereksinimdir. Askeri arama ve tarama çalışmaları, doğal afet arama ve tarama çalışmaları, farklı gezenlerde keşif ve tarama çalışmaları buna örnek olarak verilebilir. Esasen otonom bir mobil robotun işi sandığımızdan daha zordur. Bulunduğu ortamı tanımasını, bu ortamın haritasını oluşturmasını aynı zamanda statik ve dinamik engelleri tanımasını beklemekteyiz. Bu da arkaplanda dönen işlemleri arttırmaktadır.
Mobil robot bulunduğu ortamın haritasına sahip değilse aynı anda hem kendi konumunu belirlemeli hem de ortamın haritasını çıkarmalıdır. Fakat ortamın haritasının çıkarılabilmesi için konum bilgisine, konum bilgisinin elde edilebilmesi için de ortamın haritasına ihtiyaç vardır. İşte bu paradoks SLAM (Eş zamanlı konum belirleme ve haritalama) problemini ortaya çıkarmakta ve çözümünü oldukça zorlaştırmaktadır.
Mobil robotlar üzerinde bulundurduğu çeşitli sensörler yardımıyla (Lidar, IMU (Inertial Measurement Unit), Kamera, vb.) ortamdan veri toplarlar. Bu sensör verileri robotun kendi konumunu belirlemesi ve çevresi tanıması için kullanılır. Bu sensör verileri ile gerçek dünya arasında çoğu zaman sapmalar olabilmektedir. SLAM, bu sapmaların en aza indirgenmesi için anlık konum güncellemeleri yapmaktadır. Hector SLAM, Gmapping, Karto ve Frontier Exploration farklı SLAM problemini çözen farklı algoritmalara örnek olarak verilebilmektedir.
GMAPPING ile HARİTALAMA
Bu çalışmada ilk örnek olarak Gmapping metodu tercih edilmiştir. Bu metodun testi için kullanılan robot aşağıdaki şekilde gösterilmiştir. Robot oluştururken ilk olarak şasisini 3 boyutlu ortamda çizilerek .stl formatına dönüştürüldü ve .xacro dosyasında çağırımıştır.
Tekerlekleri hazır olarak github’daki bu linkten alındı ve birleştirildi. Daha sonra lidar ve IMU sensor de ekleyerek robot gazebo ortamına çekildi.
Lidar sensörden alınan veriler haritalama için kullanılmıştır. slam_gmapping düğümü haritayı oluştururken lidardan gelen verileri okumak için /scan topic’ine, ve transfer fonksiyonlara ulaşabilmek için de /tf topic’ine abone olmaktadır. Bu düğüm doygunluk ızgara haritasını oluştururken bu topiclerden gelen verileri ve dönüşümleri okumaktadır. Doygunluk ızgara haritasında 0–100 arası bir değerlendirme metriği bulunmaktadır. 0 değeri robotun önünde herhangi bir şey olmadığını, 100 değeri ise engelleri temsil etmektedir. Ayrıca özel bir değer olarak atanan -1 değeri bilinmeyen bölgeleri temsil etmek için kullanılmaktadır.
Haritalama için launch dosyamızı aşağıdaki gibi oluşturabiliriz (gmapping.launch).
<launch><param name="robot_description" textfile="$(find diff)/urdf/main.urdf.xacro" /> <!-- Robotumuzu ekliyoruz. --><include file="$(find gazebo_ros)/launch/empty_world.launch"/> <!-- Gazeboda dünyamızı çağırıyoruz --><node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model diff" /> <!-- Robotu gazeboda spawn ediyoruz. --><node name="Rsp" pkg="robot_state_publisher" type="robot_state_publisher" output="screen"/> <!-- Robot state publisher düğümü açılır.--><node name="rviz" pkg="rviz" type="rviz" output="screen" args="-d $(find explorer_bot)/config/map.rviz"/> <!-- Rviz açılır --><node pkg="gmapping" type="slam_gmapping" name="maping_node"> <param name="base_frame" value="base_footprint" />
<param name="odom_frame" value="odom" />
<param name="delta" value="0.1" /></node> <!-- gmapping düğümü açılır. base_frame ve odom_frame'leri kendi robotunuza göre uyarlamalısınız. --></launch>
önce roscoru’u daha sonra launch dosyamızı çalıştırıyoruz.
roslaunch <paket_adi> gmapping.launch
Başka bir terminalde teleop_twist_keyboard paketini çağırarak haritalamaya başlayabilirsiniz.
Hector SLAM
Hector SLAM metodu, Gmapping metoduna göre daha temel bir yaklaşım olduğunu söyleyebilirim. Hector SLAM’de odometri verisine ihtiyaç yoktur. Lidar kendi frame’ini robotun base_frame’i alarak okur ve haritalamayı sadece kendi konumunu referans alarak yapar.
Hector ile haritalama yapmak için github’tan hector_slam paketini indirmeliyiz. İlk olarak robotun gazebo ortamına spawn edilmesi, dünyanın oluşturulması için bir launch dosyası çalıştırmalıyız. Ben bu dosyaya gazebo.launch adını verdim ve aşağıdaki gibi düzenledim.
<?xml version='1.0'?>
<launch>
<include file="$(find gazebo_ros)/launch/empty_world.launch" /><param name="robot_description" textfile="$(find diff)/urdf/main.urdf.xacro" /><node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model diff" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="Rsp" output="screen" />
</launch>
Daha sonra hector_slam paketi ile gelen tutorial.launch dosyasını çalıştırıyoruz.
roslaunch hector_slam_launch tutorial.launch
Bu işlemlerin ardından teleop_twist_keyboard paketini çağırarak haritalamaya başlayabiliriz.
Bu iki metodu karşılaştırmak için simülasyon ortamında robotu değiştirmeden iki farklı haritalama işlemi yaptım. Şekilde sol tarafta görülen harita GMapping çıktısı, sağ tarafta görülen harita ise Hector çıktısıdır. GMapping yönteminde haritada bazı yerlerde boşluklar gözlemlenmiş, Hector daha net bir harita oluşturmuştur.
Ayrıca Hector yöntemini gerçek hayatta kendi yaptığım bir robot ile de deneme ve verileri kaydettiğim bir çalışmanın sonuçlarını da paylaşmak isterim. Haritalama yaptığım robot aşağıdaki şekilde gösterilmiştir. 3 tekerlekli çok yönlü(omnidirectional) harekete sahip olan bu robot ROS ile çalışmakta haritalama ve otonom hareket yapabilmektedir.(Merak edenler için, bu robotu kontrol ettiğim kendi yazdığım web arayüzünü de bir sonraki yazılarımda paylaşacağım:))
İlk başta bahsettiğim temizlik robotları gibi evin bir bölümünü manuel kontrolle hector metodunu kullanarak haritaladım. Gerçek ölçüm sonuçlarını ve RVIZ üzerinden aldığım ölçüm sonuçlarını aşağıdaki tabloda görebilirsiniz.
Bu yazımda bahsettiğim robotun paketlerinin bulunduğu github linkini aşağıya bırakıyorum :)