3 Ocak 2017 Salı

Matlab Robotik Paketi ve ROS

Bir önceki yazımızda ROS ve kurulumu hakkında bilgi vermiştik. Bu yazımızda Matlab Robotik paketi kullanımı hakkında bilgi vereceğiz. Bunu yaparken de temel ROS komutlarına değinmiş olacağız.

Çalisma ortamimizda iki adet makina var. Bir adet windows 7 pc ve bir adet windows 10 dizüstü bilgisayar. Windows 7 pc de matlab R2015b kurulu. Dizüstü makina üzerinde vmware sanal makinada Ubuntu 14.4 kurulu. Ubuntu 14.4 isletim sistemini Osboxes sitesinden edinebilirsiniz.

Dizüstü makina mobil robotumuz olup, wifi üzerinden ağ ortamina bagli. Iki makinayi robotun özellesmis isler yapan parçalariymis gibi düsünecegiz. Hatirlarsaniz ROS ag ortaminda dagitik mimariyi desteklemektedir. Masaüstü makinaya ubuntu kurmadigima dikkat etmissinizdir. Matlab robotik paketi sayesinde windows üzerinde iken, Ubuntu üzerindeki bir ROS düğümü ve ROS master ile baglanti sağlayabilirsiniz.

Windows 7 makina başlangıçta türkçe dil desteği ile kuruluydu. Matlab kurulumu gerçekleştirdikten sonra ROS Master 'i matlab komut satırından çalıştırmak istediğimde komut hata verdi. Yegane çözüm olarak işletimin dilini ingilizceye çevirdim ve tekrar denediğimde hatanın ortadan kalktığını ve ROS Master'in çalıştığını gördüm. Bu zaman kurtaran bilgiden sonra ilk olarak Matlab robotik paketi üzerinde çalışmaya başlayalım.

Aşağıdaki komutu Matlab komut penceresine yazarak makinanızın ip bilgisini öğrenelim. Üzerinde çalıştığım, Matlab kurulu makinada bu değer 192.168.1.2 olarak gözüktü.

system('ipconfig')
Bir önceki yazida bahsedilen ROS sistem değişkenlerini kontrol edelim.

getenv('ROS_MASTER_URI')
getenv('ROS_IP')
Bu değerler varsayılan olarak boş gelecektir.  Bu şekilde ROS master modülünü çalıştıralım. (Matlab komut penceresi temizleme komutu clc, değişkenleri silme komutu clear dir.)

rosinit
Aşağıda komut cevabına baktığımda makina ismi "ev" olduğu için URI bilgiside aşağıdaki şekilde gözüktü. Sizde de kendi makina isminiz gözükecektir. Ayrıca Master URI port numarası siz değiştirmedikçe Ubuntu ve Matlab için varsayılan olarak aşağıda görüldüğü gibi 11311 değerindedir.

Initializing ROS master on http://ev:11311/.
Initializing global node /matlab_global_node_40973 with NodeURI http://ev:3988/

Network üzerinde haberleşme problemi oluşmaması için ROS_MASTER_URI ve ROS_IP değerlerini uygun değerleriyle değiştireceğim.

ROS Master, Matlab kurulu makinada olacak. ROS_MASTER_URI değerini de doğal olarak 192.168.1.2 olarak girmek istersem Matlab ROS master çalışmayacaktır. Ubuntu üzerindeki ROS platformundan bu yönüyle farklılık gösterir. Matlab, ROS_MASTER_URI 'ye yazdığınız ip bilgisini ağ üzerinde master makina olarak düşünüp bağlanmaya çalışır (Bu zaten benim ip değerim demez.). Halbuki siz o sırada Ros master'i çalıştırmaya çalışmaktasınız. Ubuntu üzerinde bu değişikliği yaparsanız sorunsuz çalışır. ROS_MASTER_URI değişkeninde değişiklik yapmayıp, varsayılan değer olarak boş bırakacağım. IP değerini ise aşağıdaki gibi değiştireceğim.

setenv('ROS_IP','192.168.1.2') 
Yeni değerlerin etkin olabilmesi için ROS platformunu kapatıp tekrar devreye alacağım.

rosshutdown
rosinit
Aşağıda komut geri dönüş mesajına baktığımızda yukarıda girilen değerler kullanılarak ROS platformunun master ve bir global düğümle başlatıldığını göreceksiniz.

Initializing ROS master on http://ev:11311/.
Initializing global node /matlab_global_node_94215 with NodeURI http://192.168.1.2:4050/
Bu aşamada ROS master çalışmaya başladı. Şimdi komut penceresinde ROS ortamında var olan düğümleri listelemek için rosnode komutunu çalıştıralım. Bu ve yazacağımız komutlar ROS platformu komut kümesine aittir, yani Ubuntu üzerinde kullanılır. Matlab robotik paketi bize ROS simülasyonunu sağladığı için bu komutları windows makina üzerinde kullanabilmekteyiz.

rosnode list

/matlab_global_node_94215 şeklinde bir sonuç geldi. Ubuntu makinada master açmak için roscore ile başlayıp bu komutu çalıştırsaydim matlab'den farklı olarak /rosout  diye bir düğüm ile karşılaşacaktım.

Düğümlerin koşturulabilir ve diğer düğümlerle mesajlar üzerinden haberleşebilir programlar olduğunu tekrar hatirlayalim. Haberleşebilmek için düğümlerin birbirlerine mesaj göndermesi (publisher) ve alabilmesi(subscriber) gerekir. ROS platformunda mesajın bir konusu (topic) ve tipi olmak zorundadır. Aradaki ilişkiyi böylede göstermek mümkündür; (Node<---->Topic---->Message)
Bir düğüm birden fazla topik yayınlayabilir ve birden fazla topiğe üye olabilir. Gerek düğüm ve gerekse topik isimleri sistem bazında tekil olmalıdır.

Sistemdeki tüm düğümler log, diagnostik mesajlarını /rosout topiği üzerinden yayabilir (Publisher).
/rosout düğümüde /rosout topiğine üye olduğu (Subscriber) için bu mesajları alabilir ve bunları bir log dosyasında saklar ve/veya  bu log mesajlarını diğer abone düğümlere /rosout_agg topiği üzerinden yayınlayabilir (Publisher). Aşağıda /rosout düğümünün bu bilgi ışığında Ubuntu üzerinde inceleyebilirsiniz.


Düğüm isimlendirmeye dikkat ettiğimizde C dili değişken isimlendirme standardı kullanılmakta olduğunu görmekteyiz (küçük harfle başla, küçük harf kullan, kelimeler arası alt çizgi kullan) .
Mesaj tipi isimlendirmesinde ise [C dili] / [PascalType] olduğunu görmekteyiz.

(/) işareti ise bize düğümün global isim uzayı (namespace) altında olduğunu gösterir. Isim uzayı, tıpkı diğer karmaşık ve birden fazla modülün iç içe kullanıldığı ve tekilliğin sağlanması gereken sistemlerde olduğu gibi ROS platformunda da önemli bir yer tutar. Bunu dosya sistemindeki dizin yapısına benzetebiliriz. /home/user1/readme.txt  ile /home/user2/readme.txt farklı dosyalardır. Isim çakışmasının önüne isim uzayı kullanılarak geçilir.

Düğüm hakkında detaylı bilgi almak için aşağıdaki komutu çalıştıralım.

rosnode info /matlab_global_node_94215

Cevap olarak gelen bilgi aşağıdadır.

Node: [/matlab_global_node_94215]
URI: [http://192.168.1.2:4050/]
 
Publications (1 Active Topics): 
 * /rosout
 
Subscriptions (0 Active Topics): 
 
Services (0 Active): 
Publications kısmında  düğümün yayınladığı topic /rosout olarak gözükmektedir. Matlab Global düğümümüz sanki Ubuntu daki /rosout düğümü gibi işlev görmektedir (Ubuntu'da roscore ile master çalışmaya başladığında oluşan loglama düğümü).

Topik hakkında detay bilgi almak için aşağıdaki komutu çalıştıralım.

rostopic info /rosout
Cevap olarak gelen bilgi aşağıdadır.

Type: rosgraph_msgs/Log
 
Publishers:
* /matlab_global_node_94215 (http://192.168.1.2:4050/)
 
Subscribers:

Topiğin mesaj tipi rosgraph_msgs/Log olarak verilmiş.
Topiği yayınlayan düğüm /matlab_global_node_94215  olarak verilmiş.
Topiğin ürettiği mesaja abone olan herhangi bir düğüm gözükmemekte.

Şimdide rosgraph_msg/Log mesaj tipi hakkında bilgi alalım.

rosmsg show rosgraph_msgs/Log

Cevap olarak gelen bilgi aşağıdadır. (% işareti Matlab için açıklama satırıdır. )

%%
%% Severity Level constants
%%
int8 DEBUG=1  %debug Level
int8 INFO=2   %general Level
int8 WARN=4   %warning Level
int8 ERROR=8  %error Level
int8 FATAL=16 %fatal/critical Level
%%
%% Fields
%%
std_msgs/Header Header
int8 Level
char Name     % Name of the node
char Msg      % message 
char File     % File the message came from
char Function % Function the message came from
uint32 Line   % Line the message came from
char[] Topics % topic names that the node publishes

Bu aşamaya kadar ROS üzerinde sıklıkla kullanılan komutları konu ile ilişkilendirerek anlattım.
Komutları Ubuntu üzerinde kullanabilir, parametreli kullanımlarini -h  yardım dosyaları ile öğrenebilirsiniz. Örnek : rosmsg -h

Matlab'de ise F1 ile yardım dosyaları açılacaktır.

Bundan sonraki yazımızda Ubuntu makinasini da devreye alip ağ ortamında haberleşme kısmına geçeceğiz.

1 yorum :