Bir önceki yazımızda ROS ile Turtlesim simülatörü üzerinden çalışma gerçekleştirmiştik. Bu yazımızda Matlab üzerinde kalp şekli için gereken (x,y) noktalarını hesaplayacağız ve robotumuzun bu noktalar üzerinde hareket etmesini sağlayacağız. Ilgili kodları yazının en altındaki link üzerinden indirebilirsiniz. Kalp şekli için gereken formül HeartCurve linki üzerinden görülebilir. Formülün Matlab'e fonksiyon olarak aktarılması aşağıdaki gibidir.
Fonksiyonun Matlab komut satırında koşturulması ile elde edilen grafik aşağıdaki gibidir.
Bu çalışmada birden fazla terminal üzerinde çalışma söz konusu olacak. Basitlik olması için terminalleri tek bir pencerede kulakçıklar(tab) şeklinde açmak isteyebilirsiniz. Aşağıdaki komutu terminal üzerinde koşturduktan sonra terminal içerik menüsünde "new tab" seçeneği çıkacaktır.
sudo apt-get install xdotoolAğ üzerinde iki makina ile çalışacağımızdan gerekli ayarların yapıldığından emin olduktan sonra Ubuntu makinamızda (192.168.1.5) ROS master başlatalım.
roscoreDiğer bir terminal açalım ve orada da simülatörümüzü çalıştıralım.Robotumuz simülatörün merkezinde belirecektir.
rosrun turtlesim turtlesim_nodeDilediğiniz zaman aşağıdaki komutu çalıştırarak robotumuzu simülatör üzerinde ilk konumuna getirebilirsiniz.
rosservice call /resetUbuntu üzerinde simülatörü çalıştırdığımızda oluşan /turtle1/cmd_vel topiği ile robotumuza hız bilgisi göndereceğiz. /turtle1/pose topiği ile de konum bilgisini alacağız.
Matlab makinamıza (192.168.1.2) gidelim ve matlab üzerinde çalışmaya başlayalım. Matlab üzerinde nesne yönelimli programlamaya yakın kodlama gerçekleştirebiliyorsunuz.
Ilk olarak temel ROS işlemlerini yapmak adına ROSBase isimli bir sınıfı tasarlayacağız.
Matlab üzerinde new file ->class menüsünü seçerek oluşturacağınız .m dosyasına ROSBase.m diyerek aşağıdaki kodu içine kopyalayalım.
Hatırlarsanız fonksiyonlar sınıftan bağımsız yazılabilir. Metodlar ise sınıfa ait fonksiyonlardır. Sözgelimi C# da sınıftan bağımsız fonksiyon yazilamadığı için orada metod ifadesini sözel olarak kullanırız. Metod diye bir anahtar kelime ise zaten yoktur. Matlab'de ise hem sözel hem de anahtar kelime olarak fonksiyon ve metod ifadesini kullanırız. Matlab'de sınıf içinde yazılan fonksiyonlar birer metod olarak tanımlanır.
Parametreli yapılandırıcının yanına bir tane varsayılan yapılandırıcı neden koyulmadığı aklınıza gelebilir. Matlab yapılandırıcı metodlarda aşırı yüklemeyi desteklememektedir.
function rb = ROSBase(masterIP) varken, function rb = ROSBase() yapılandırıcı metodunu ekleyememekteyiz
function rb = ROSBase(masterIP) yapılandırıcı metod imzasında görülen rb (başka bir değişken ismi de verebilirsiniz.) geri dönüş değişkenine, sınıfın this göstericisinin değeri atanır. Sınıfa ait statik olmayan metodlara aşağıda görüldüğü gibi bu değişkeni parametre olarak vermeniz gerekir.
function CreateNode(rb, nodeName)
Sınıfın yok edici metodu function delete(rb) özel metodudur ve bu şekilde yazılmalıdır.
Kodlamada kullanılan temel Matlab ROS komutları;
ROSBase sınıfının CreateNode metodu ROS üzerinde bir düğüm oluşturmanıza olanak verir.
DeleteNode(rb) metodu düğümü silmenize olanak verir.
Bu metodlarda kullanılan ve Matlab ROS Robotik paketine ait olan komutlar;
rosinit : Matlab global düğümünü oluşturur. Bu komutu ilk olarak çalıştırmadan diğer ROS komutlarını çalıştıramayız.
rosshutdown: Matlab global düğümünü ve kendi düğümlerinizi kapatmanızı sağlar. Matlab üzerinde rosnode kill komutu desteği bulunmamaktadır. Gerçi Ubuntu üzerinde rosnode kill komutunu çalıştırmak düğümün kapanacağını garanti etmez.
robotics.ros.Node: ROS üzerinde bir düğüm oluşturmanızı ve bunu ROS Master'a kaydetmenizi sağlar.
Turtlesim ile ilgili işlemlerimizi gerçekleştireceğimiz Turtlesim sınıfı aşağıdaki gibidir.
Sınıfa ait CreateNode metodu temel sınıfın CreateNode metodunu çağırır. Ayrıca /turtle1/cmd_vel topiğini (hız bilgisi göndereceğiz) yayınlamak için bir yayıncı ve /turtle1/pose topiği (konum bilgisi alacağız) içinse bir abone nesnesi oluşturur.
Aklımıza temel sınıfın CreateNode metodunun neden protected yapılmadığı gelebilir. Temel sınıfta protected olan bir metod türeyen sınıfta public bir metodun içinde çağrılamamaktadır. Matlab'de böyle bir tasarım kısıtlaması mevcut.
Sınıfa ait MoveInHeartPath metodu ise robotun hesaplanmış kalp şekli noktaları üzerinde hareketini sağlar. Bu metodlarda kullanılan ve Matlab ROS Robotik paketine ait olan komutlar;
robotics.ros.Publisher: Düğüm üzerindeki topiğe mesaj gönderebilmek için bir yayıncı nesnesi oluşturur.
robotics.ros.Subscriber: Düğüm üzerindeki topiğe abone olur ve bir abone nesnesi geri döndürür. Gelen mesajların alımı parametre olarak girilen callback metodu/fonksiyonu üzerinden olur.
rosmessage: yayıncı veya abone nesnelerinin mesaj tipine ait mesaj nesnesi oluşturur.
send: Topiğe mesaj göndermek için kullanılır.
Turtlesim sınıfını kullanarak hazırlanan test kodu aşağıdaki gibidir.
TestHeartShape('192.168.1.5') yazarak matlab komut satırından çalıştırdığınızda robot kalp şeklindeki rotasında hareket edecektir. Buradaki ip adresi ROS master (roscore komutunun çalıştırıldığı yer.) ip adresi olup örnek amaçlı verilmiştir. İşlem sonunda clear komutunu koşturursanız sınıflara ait yokedici metodlar çağrılacak ve Matlab global düğümü ile birlikte bizim açtığımız düğüm ve diğer nesneler kapatılacaktır.
Sınıflara ilişkin kodları buradan indirebilirsiniz.

