Bir önceki
yazımızda Matlab Ros paketine giriş yapmış ve temel ROS komutlarıyla çalışmıştık. Bu yazımızda ilk robot simülasyon programı olan Turtlesim ile Matlab üzerinden çalışacağız ve ağ üzerinden ROS düğümleriyle haberleşeceğiz. Gereken ağ yapılandırmaları önceki yazılarda anlatıldığı için o kısma tekrar girilmeyecek.
Matlab üzerinde rosinit ile ROS platformunu başlatalım.
Ubuntu makinaya geçelim ve makinalar birbirini görüyor mu kontrolünü aşağıdaki komutu terminal üzerinde çalıştırarak yapalım.
rosnode list
Gelen cevap aşağıdaki gibidir. Matlab global düğümü listelenmiştir.
/matlab_global_node_74764
dikkat ederseniz Ubuntu üzerinde ROS komutlarını roscore komutunu çağırmadan çalıştırdım. Ubuntu makinada ROS_MASTER_URI değerini Matlab makina verdiğim için Ubuntu üzerindeki ROS platformu, Matlab makinadaki master 'a bağlanarak düğüm listesini çekti. Bu bilgiyi alamasaydım komut askıda bekleyecek ve bir müddet sonra hata bildirecekti. Bağlantı kontrolünü düğüme ping atarak da yapabilirdim.
rosnode ping /matlab_global_node_74764
Bağlantı kontrolünden sonra Turtlesim simülatör programımızı aşağıdaki komutla çalıştıralım. Bu simülasyon her seferinde farklı ROS sürümlerine ait turtle1 isimli bir deniz kaplumbağası ve düğümü oluşturur. Dilerseniz ismini aşağıdaki komuta parametre geçerek değiştirebilirsiniz.Bu durumda düğüm ismi turtle1 değil verdiğiniz isim olacaktır.
Bu kaplumbağa bizim robotumuzdur. ROS platformunda robot demek ise düğümler, topikler, mesajlar, servisler (daha önce hiç bahsedilmedi.) demektir.
rosrun turtlesim turtlesim_node
rosrun turtlesim turtlesim_node __name:=minik
rosrun [paket ismi] [koşturulabilir dosya ismi ] komutu turtlesim paketinin lokasyonuna gitmeden (cd/rosrun kullanmadan) paket ismi üzerinden bize programın çalıştırılmasını sağladı.
Paketin bulunduğu dizine roscd komutu ile gidebilirsiniz. roscd paket ismini verdiğimizde ilgili klasöre gitmemizi sağlayan bir ROS komutudur.
komut cevabı olarak /opt/ros/indigo/share/turtlesim dizinine gideriz.
rosnode list komutunu çalıştırıp robot kaplumbağanın sunduğu düğümler nelerdir diye baktığımızda /turtlesim düğümü ile karşılaşıyoruz.
Bu düğüm hakkında bilgi almak için aşağıdaki komutunu koşturalım.
Ekran görüntüsü aşağıdaki gibidir.
ROS Grafik gösterimi ile düğümler ve birbirleriyle ilişkilerini görsel olarak görmek için aşağıdaki komutu koşturuyorum.
Ekran görüntüsü aşağıdaki gibidir.
Yukarıdaki grafikte turtlesim isim uzayi altında /turtlesim düğümünü görmekteyiz. Oklara dikkat edersek, Bu düğüm turtle1 isim uzayı altında /turtle1/color_sensor topiğini yayınlıyor,
/turtle1/cmd_vel topiğine abone ve /turtle1/pose düğümünü yayınlıyor. rqt_gui_ öneki ile başlayanlar ise rqt_graph komutu ile çalışan uygulamanın oluşturduğu düğüme ait grafiklerdir.Onları dikkate almanıza gerek yoktur.
Robot kaplumbağayı ilk gördüğümde acaba rengini değiştirebilir miyim gelmişti aklıma. Şu ana kadar verilen bilgiler ışığında yukarıdaki bilgilere bakarak buna nasıl bir cevap verebiliriz ?
Robotumuz /turtle1/color_sensor topiği üzerinden turtlesim/Color tipinde mesaj yayınlıyor. Yayınladığı bilginin içeriğine bakalım.
rostopic echo /turtle1/color_sensor
robotumuz renk bilgisini sürekli yayınlamakta, bu yüzden akan bir veri gelmektedir.
echo komutundan sonra ROS grafiğine bir daha bakalım.
rostopic echo komutu /turtle1/color_sensor topiğini dinlemek için anlık bir düğüm oluşturup bu düğüm üzerinden topiğe abone olmuştur. (/rostopic_4913_1483531062271)
Topikden gelen değerler {r:69 g:86,b:255} gözüküyor. Bu rengi görüntülemek için
rapidtables sitesine giderek renk tablosunda değerleri yerine koyduğumda rengin robota ait değil simülasyon arka plan rengine ait olduğunu gözlemledim. Yukarıdaki robot renk bilgisi yayınlıyor cümlesini artık simülasyon renk bilgisi yayınlıyor diye değiştirmem gerekiyor. Bu düğümler simülasyona ait ve onunla robot üzerinde işlem yapabiliyoruz demem gerekir.
Bu durumda soruyu güncelleyelim; Acaba simülasyon arka plan rengini /turtle1/color_sensor topiği üzerinden turtlesim/Color tipinde mesaj göndererek değiştirebilir miyim.? Cevabı aşağıdaki adımları izlemeden direk rosnode info komutu çıktısına veya ROS grafiğine bakarak verebilirsiniz.
Mesaj tipini inceleyelim. Bunun için yeni bir terminal açıyorum ve aşağıdaki komutu koşturuyorum.
rosmsg show turtlesim/Color
Gelen cevap aşağıdaki gibidir.
Var olan terminali kapatmadan yeni bir terminal açıyorum ve aşağıdaki komutla topiğe arka plan rengini {r:255,g:0,b:0} kırmızı yapmasını söyleyen mesajı saniyede 10 (100 ms de bir kere.) kere gönderecek şekilde koşturuyorum. (10Hz)
rostopic pub -r 10 /turtle1/color_sensor turtlesim/Color '{r:255,g:0,b:0}'
Simülasyon programına bakıyorum ve arka plan renginin değişmediğini görüyorum.
rosnode echo komutunu çalıştırdığım terminale gidiyorum ve (r,g,b) değerinin değişmediğini görüyorum. rqt_graph komutunu tekrar çalıştırıyorum. Ekran görüntüsü aşağıdaki gibidir.
Önce ROS grafik bilgilerine bakalım. rostopic pub komutu ile birlikte yeni bir düğümümüz oluşmuş (kırmızı renkli düğüm) ve /turtlesim/color_sensor topiği yayınlamaktadır. Yayına abone olan bir düğüm gözükmemektedir.
rosnode info terminalindeki bilgilere bakıyorum. /turtle1/color_sensor topiği /turtle1 düğümü tarafından yayınlanıyor ama abone değil. Abone olmadığı için bizim gönderdiğimiz topik mesajını almamış ve arka plan rengi değiştirilmemiş oluyor.
Biraz önceki sorunun cevabı da böylelikle açıklık kazanıyor. Rengi bu şekilde değiştiremeyiz.
Robotumuzu hareket ettirebilir miyiz.? Evet. ROS grafiğe, yahut rosnode info geri dönüşüne baktığımda /turtlesim düğümünün, turtle1/cmd_vel topiğine abone olduğunu görmekteyiz.
Simülasyon hariç tüm terminalleri kapatalım ve rostopic pub komutuna kadar tüm adımları turtle1/cmd_vel topiği için tekrarlayalım. rostopic echo komutunu koşturduğunuzda robot durduğu için gelen bir bilginin olmadığını, ayrıca mesaj tipinin de geometry_msgs/Twist olduğunu göreceksiniz. Hız bilgisini düzlemsel ve açısal olmak üzere iki parça şeklinde vermektedir. Bunlar uzaydaki (x,y,z) doğrusal hızı (m/sn) ve (r,p,y)
açısal hızı (radyan/sn) şeklindedir.
rostopic pub komutunu aşağıdaki gibi düzenleyip koşturalım.
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}'
ROS SI (International System of Units) ölçü birimlerini kullanmaktadır. Doğrusal uzunluk birimi metre ve açısal uzunluk birimi radyan olarak geçmektedir. ROS ölçü birimleri ve dönüşümleri ile ilgili bilgiyi bu
linkten edinebilirsiniz.
Yukarıdaki komutta girdiğimiz parametre ifadesi
YAML formatındadır.
'{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}'
Dogrusal x bilgisi dışında bir bilgi kullanmadığım için bu parametre ifadesini aşağıdaki gibi yazabilirim.
'{linear: {x: 0.1}}'
Yukarıdaki komut ile mesajı 10 Hz ile yayınlamaktayız. Bu robotumuza x ekseni boyunca 1 sn de 10* (0.1) = 1 metre lineer hızla git demek anlamına gelmemektedir. Robota 1 sn'de 10 kere (100 ms de bir) 0.1 m/sn hızla git demekteyiz. Simülatörümüz bir fizik motoru içermez ve robotu hareket ettirmek için sürekli komut göndermek durumundayız.
Komut çalışmaya başladığında, echo komutunu çalıştırdığımız terminalde bilgilerin aktığını göreceksiniz. Simülatör uygulamasında ise robotumuzun x ekseni boyunca hareket etmeye başladığını göreceksiniz. Kaplumbağa robotumuz kum üzerinde hareket ediyormuş gibi iz bırakmaktadır. Robotumuz bir müddet sonra simülatörün sınırlarına gelecek ve daha ileri gidemeyecektir. rostopic echo komutunu koşturduğumuz terminalde "Oh no ! I hit the wall!" mesajını alacaksınız.

robotumuza geometry_msg/Twist mesajı göndermeyi durduralım.
Robotumuzu başlangıç noktasına tekrar getirmek için yukarıda rosnode info komutunun çıktısında yer alan servis bilgilerine bakacağız. (Dilerseniz x = -0.1 vererekte robotunuzu geri döndürebilirsiniz.)
/turtlesim düğümünün sunduğu servislerden biri /reset olarak gözükmektedir. Aşağıdaki komutu bu bilgiye göre koşturuyorum.
rosservice call /reset
Turtlesim simülatörüne baktığımızda yeni bir kaplumbağanın geldiğini ve başlangıç noktasına konumlandığını göreceksiniz.
Düğümler birbirleriyle topikler üzerinden mesaj üye/yayıncı ilişkisi içerisinde haberleşmekte idi.
Bu haberleşme yöntemi tek taraflıdır. Sadece mesaj alabilirsiniz yahut yayabilirsiniz. Servis kavramı düğümlerin birbirlerine talep göndermelerine ve cevap almalarına imkan verir.
Kaplumbağanın iz rengini değiştirmek için /turtle1/set_pen servisini parametreleri ile çağıralım.Önce servis hakkında bilgi alalım.
rosservice info /turtle1/set_pen
Ekran görüntüsü aşağıdaki gibidir.
Servisin parametre tipi turtlesim/SetPen olduğu görülmektedir.
Servisin parametreleri (r, g, b, width, off) şeklindedir.
width : kalınlık, off: görünülürlük şeklinde açıklanabilir.
Dilerseniz aşağıdaki komut ile de servisin parametresi hakkında bilgi alabilirsiniz.
rossrv show turtlesim/SetPen
Ekran görüntüsü aşağıdaki gibidir.
Aşağıdaki komutu yukarıda elde ettiğimiz bilgiler ışığında çağıralım.
rosservice call /turtle1/set_pen 255 0 0 3 1
rostopic pub ile tekrar robotu hareket ettirdiğinizde izin kırmızı olduğunu göreceksiniz. /reset servisini çağırırsanız izin rengi varsayılan haline gelecektir.
robotumuza ait hız bilgilerini grafik olarak görmek için aşağıdaki komutu koşturuyoruz.
rqt_plot
Aşağıdaki gibi bir ekran açılacaktır. Ek bilgi; karşılaştığımız rqt_plot ve rqt_graph komutlarında geçen r= ros qt=
QT (Platform bağımsız yazılım geliştirme platformu) şeklinde okunabilir.
Topik kısmına /turtle1 yazdığımda abone olabileceğim topikler listelenecektir. Bunlardan /turtle1/pose topiğini seçiyorum ve (+) butonuna basıyorum (/turtle1/cmd_vel topiği neden çıkmıyor diye soracak olursanız yanıtı size bırakıyorum. ). Topik turtlesim/Pose tipinde mesaj yayınlamaktadır. Bu mesaj içeriği {x,y,theta,linear_velocity, angular_velocity} şeklindedir. Bunlardan şu aşamada sadece linear_velocity ile ilgileniyorum. (-) butonuna tıklayarak ilgilenmediğim diğer bilgileri çıkarıyorum. Robotu hareket ettirmeye başlattıktan sonra rqt_plot uygulamasında başlat butonuna basarsanız 10 Hz lik örnekleme ile grafik bilgilerini göreceksiniz.
Son olarak simülatörümüzün arka plan rengini değiştirelim. Hatırlarsanız ilk aklımıza gelen fikir buydu. Bunu değiştirebileceğimiz bir servis yada topik mesajı bulunmamaktadır. Burada ROS parametre servisinden yararlanacağız. Parametre servisini sistem bazında konfigürasyon servisi gibi düşünebiliriz. Çalışma anında erişime açık olan servis parametrelerine, düğümler erişebilir ve değiştirebilir. Aşağıdaki komutu koşturarak parametre servisinin bize sunduğu parametreleri keşfedelim.
rosparam list
Ekran görüntüsü aşağıdaki gibidir.
Arka planı güneşli bir gündeki kumsal rengine büründürmek için (r, g, b) = (238, 236, 201) renk bilgisini verelim.
rosparam set /background_r 238
rosparam set /background_g 236
rosparam set /background_b 201
Değişikliklerin etkin olabilmesi için aşağıdaki komutu koşturalım.
rosservice call /clear
Ekran görüntüsü aşağıdaki gibidir.
ROS temel komutları ile simülatör uygulamasında çalıştık. Bu komutlar ile sistem üzerinde test ve diagnostik işlemler yapabilir hale gelmiş olduk.
Son bir bilgi olarak şunu ekleyelim; ros pub komutuyla o an bir topik oluşturabilir ve ros echo ile dinleyebilirsiniz.
rostopic pub -r 10 /test_topic std_msgs/String 'merhaba ros'
rostopic echo /test_topic
Yukarıdaki komutları çalıştırdıktan sonra rqt_graph ile analiz edebilirsiniz.
Bir sonraki yazıda, kaplumbağa robotu, matlab ortamında komutla hareket ettireceğiz.