Robot İşletim Sistemine Giriş: Nihai Robot Uygulama Çerçevesi
Yayınlanan: 2022-03-11Robot İşletim Sistemi (ROS) gerçek bir işletim sistemi değil, heterojen bir bilgisayar kümesinde bir işletim sisteminin işlevselliğini sağlayan bir çerçeve ve araçlar kümesidir. Kullanışlılığı robotlarla sınırlı değildir, ancak sağlanan araçların çoğu çevresel donanımlarla çalışmaya odaklanmıştır.
ROS, her biri özel işlevsellik sağlayan 2000'den fazla pakete bölünmüştür. Çerçeveye bağlı araçların sayısı muhtemelen en büyük gücüdür.
Neden Robot OS Kullanmalıyım?
ROS, donanım soyutlaması, aygıt sürücüleri, birden çok makine üzerinden süreçler arasında iletişim, test etme ve görselleştirme araçları ve çok daha fazlası için işlevsellik sağlar.
ROS'un temel özelliği, yazılımın çalışma şekli ve iletişim şekli olup, belirli donanımların nasıl çalıştığını bilmeden karmaşık yazılımlar tasarlamanıza olanak tanır. ROS, bir işlemler ağını (düğümleri) merkezi bir merkeze bağlamanın bir yolunu sağlar. Düğümler birden fazla cihazda çalıştırılabilir ve bu hub'a çeşitli şekillerde bağlanırlar.
Ağ oluşturmanın ana yolları, talep edilebilir hizmetler sağlamak veya diğer düğümlerle yayıncı/abone bağlantılarını tanımlamaktır. Her iki yöntem de belirtilen mesaj türleri aracılığıyla iletişim kurar. Bazı türler çekirdek paketler tarafından sağlanır, ancak mesaj türleri ayrı paketler tarafından tanımlanabilir.
Geliştiriciler, küçük problemler için mevcut çözümleri bağlayarak karmaşık bir sistem kurabilirler. Sistemin uygulanma şekli, bize şunları sağlar:
Bileşenleri anında benzer arayüzlerle değiştirin, çeşitli değişiklikler için sistemi durdurma ihtiyacını ortadan kaldırın
Birden çok bileşenin çıktılarını başka bir bileşen için bir girdiye çoğullama, çeşitli sorunların paralel olarak çözülmesine izin verme
Sadece uygun bağlayıcıları mesajlaşma sistemine uygulayarak çeşitli programlama dillerinde yapılmış bileşenleri bağlayın, çeşitli geliştiricilerin mevcut modüllerini bağlayarak yazılım geliştirmeyi kolaylaştırın
Kodun nerede çalıştırılacağı konusunda endişelenmeden ve İşlemler Arası iletişim (IPC) ve Uzaktan Yordam Çağrısı (RPC) sistemlerini uygulamadan bir aygıt ağı üzerinden düğümler oluşturun
Önceki iki madde işaretini kullanarak, herhangi bir ekstra kod yazmadan uzak donanımdan talep üzerine beslemelere doğrudan bağlanın
Yinelemeli olarak basit bir çözüm geliştirerek bunun ne kadar yararlı olduğunu göstermeyi planlıyoruz. Diğer yaklaşımlara kıyasla birkaç önemli avantajı vardır. ROS, çoklu platform desteğine sahiptir ve sahne arkasında gerçekleştirilen eşler arası bağlantılar aracılığıyla birden çok cihaz üzerinden süreçler arasında bağlantılara izin verir. Tasarım, C++ iletişim sınıflarını sararak veya dil arabirimi için manuel olarak sınıflar geliştirerek herhangi bir dil için destek sağlar.
ROS, kendi topluluğu tarafından, kendi topluluğu için yapılmıştır. Birkaç yıl sonra, sistemin mimarisi sayesinde entegrasyonu kolay olan çok sayıda yeniden kullanılabilir paket elde edildi.
MRPT, CARMEN, LCM, Player, Microsoft RDS ve diğerleri gibi alternatif yaklaşımlar bu özelliklerden bazılarını sağlar, ancak hepsini sağlamaz. Çoğu zaman, tasarımdaki düşüşler, dil desteği sınırlamaları, süreçler arasında optimize edilmemiş iletişim veya muhtemelen düzeltilmesi en zor sorun olan çeşitli cihazlar için destek eksikliğidir.
Ne İnşa Edeceğiz?
Odak noktamız belirli problemler için gerçek algoritmalar değil çerçeve olduğundan, verilen problem oldukça basit olacaktır. Amacımız, Wi-Fi üzerinden bize bağlı bir robotu, bilgisayarımızdaki bir gamepad ve robota monte edilmiş kameradan bir besleme kullanarak uzaktan kontrol etmemizi ve izlememizi sağlayan bir yerleşik bilgisayar için yazılım geliştirmek.
Her şeyden önce, sadece ROS'un temel ilkelerini göstermek için basit bir programı basit bir simülasyona bağlayacağız. Bir bilgisayara bir gamepad bağlayacağız ve gamepad girişini bir robot için kontrol sinyallerine dönüştürmek için iyi bir kontrol şeması tasarlamaya çalışacağız.
ROS kodu yazmak için ana diller C++ ve Python'dur, daha iyi performans nedeniyle C++ tercih edilir. Örneklerimizi Python'da açıklayacağız çünkü kodda daha az kalıp plakası var ve açık bir yapıya gerek yok.
Kurulum ve Yapılandırma
ROS sürümleri adıyla anılır. Bu tarih itibariyle en son sürüm Jade Turtle ve en son LTS sürümü Indigo Igloo'dur . LTS sürümüne geçmek tercih edilir ve ROS'ta geriye dönük uyumluluk garanti edilmez, bu nedenle tüm örnekler Indigo için yazılacaktır.
ROS, çeşitli *NIX platformlarında mevcuttur. Resmi olarak desteklenen sürüm Ubuntu'da. OS X, Arch Linux, Debian, Raspbian ve Android sürümleri topluluk tarafından desteklenmektedir.
Ubuntu 14.04 için masaüstünde kurulum sürecinden geçeceğiz. Desteklenen tüm sürümler ve platformlar için işlemler resmi web sitesinde mevcuttur. ROS yüklü sanal makineler de mevcuttur.
Kurulum platforma bağlıdır (ve çoğu platformda sağlanan paketler vardır), ancak çalışma alanı yapılandırması tüm platformlar için aynıdır.
Ubuntu'da Kurulum
ROS kendi depolarını sağlar. İlk adım onları eklemektir.
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116 sudo apt-get update
Bundan sonra, Ubuntu sürümünüz için tüm ROS sürümleri için barındırılan tüm paketlere sahip olacaksınız. Örneğin, Ubuntu 14.04 indigo
ve jade
destekler.
Temel paketleri masaüstüne kurmak için üç seçenekten biri vardır:
minimum kurulum için
sudo apt-get install ros-indigo-ros-base
temel ek GUI araçlarına sahip olmak için
sudo apt-get install ros-indigo-desktop
sudo apt-get install ros-indigo-desktop-full
, çeşitli simülatörler ve navigasyon ve algı için kitaplıklar dahil olmak üzere tüm resmi özelliklere sahiptir
En iyi çalışma deneyimi için tam seçenek önerilir. Yalnızca düğümleri çalıştırmak için kullanılacak cihazlara kurulum için temel sürüm yeterlidir. Hangi seçeneği seçerseniz seçin, aşağıdakileri çalıştırarak package_name
adlı gerekli herhangi bir paketi yükleyebilirsiniz:
sudo apt-get install ros-indigo-<package-name>
Alt çizgiler, son addaki kısa çizgilerle değiştirilir, bu nedenle stage_ros
ros-indigo-stage-ros
paketinde olacaktır.
Bir sonraki adım rosdep
başlatmaktır. ROS'taki paketler, hangi bileşenlere bağlı olduklarını bildirebilir. rosdep
, bu paketleri çok fazla manuel bağımlılık yönetimi olmadan derlemenize olanak tanır. Başlatmak için arayın:
sudo rosdep init rosdep update
ROS, araçları tarafından kullanılan birkaç ortam değişkenine sahiptir. Varsayılan kurulumda, bunları başlatmak için bash betiği /opt/ros/indigo/setup.bash
içinde bulunur. Değişkenlerin her bash oturumunda başlatılması gerekir, bu nedenle en iyi çözüm onları ~/.bashrc
öğesine eklemektir.
echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc source ~/.bashrc
Bazı paketler, paket olarak mevcut olan ve sudo apt-get install python-rosinstall
aracılığıyla rosinstall
aracılığıyla harici bağımlılıkları kurar.
Bu, Ubuntu'daki kurulumun sonu. Aşağıda, çalışma alanlarını kurmaya yönelik kısa bir giriş yer almaktadır.
Yapılandırma
Groovy Galapagos'tan beri, ROS çalışma alanları catkin
aracılığıyla yönetilmektedir. Barındırdığımız tüm paketler için bir dizin tanımlamamız gerekiyor. Dizin içinde bir src
klasörü oluşturuyoruz ve içindeki catkin_init_workspace
formunu çağırıyoruz. Bu, şu anda kaynaklı ROS sürümüne çeşitli sembolik bağlantılar oluşturacaktır. Bir sonraki adım, bu çalışma alanını ortam değişkenlerine de eklemektir.
Bu çalışma alanı yapılandırmasının tamamını gerçekleştirmek için boş bir dizin seçin ve aşağıdaki komutları yürütün:
mkdir src cd src catkin_init_workspace cd .. catkin_make echo "source $(pwd)/devel/setup.bash" >> ~/.bashrc source ~/.bashrc
Artık kendi ROS paketlerinizi oluşturabileceğiniz bir çalışma alanı oluşturdunuz.
Araçları Tanımak
Herhangi bir kod oluşturmak büyük bir sıçramadır. Önce sahne arkasında çalışan bazı sistemlere aşina olalım. İlk adımımız temel GUI'yi çalıştırmak ve hangi mesajları oluşturduğunu görmek olacaktır.
ROS'ta herhangi bir şeyi çalıştırmak için bir çekirdek sürecin başlatılması gerekir. Yeni bir terminal penceresi açıp şunu yazmak kadar kolay:
roscore
Tüm bağlı cihaz ağınızda, iletişim gönderimi için merkezi hub'ı barındıracak cihazda roscore
yalnızca bir kez başlatılması gerekir.
roscore
ana rolü, düğümlere hangi diğer düğümlere bağlanmaları gerektiğini ve hangi yolla (bir ağ bağlantı noktası veya paylaşılan bellek aracılığıyla) söylemektir. Amaç, düğümlerin hangi düğüme bağlanmak istediklerinden ziyade yalnızca bilmek istedikleri verileri önemsemelerine izin verirken, tüm iletişimi gerçekleştirmek için gereken süreyi ve bant genişliğini en aza indirmektir.
rqt
roscore
çalıştırdıktan sonra, ROS için ana GUI aracını başlatabiliriz: rqt
. Gördüklerimiz çok iç karartıcı - boş bir pencere. rqt
, herhangi bir görsel konfigürasyonda ve herhangi bir sayıda önceden tanımlanmış görünümde yapılandırılabilen çok çeşitli eklentileri barındırır.
Başlangıç için, Plugins > Robot Tools > Robot Steering
seçerek Robot Steering eklentisini çalıştıralım. Elde ettiğimiz şey, robotumuzun sahip olmasını istediğimiz doğrusal ve dönme hareketini temsil eden iki kaydırıcıdır. Eklentinin üst kısmında, içinde /cmd_vel
olan bir metin kutusu görüyoruz. İstediğimiz herhangi bir şeye yeniden adlandırabiliriz. Yönlendirmenin yayınladığı konunun adını temsil eder. Terminal araçları, arka planda neler olup bittiğini görmek için en iyi yerdir.
Terminal Araçları
ROS, sistemde neler olduğunu denetlemek için birkaç güçlü araca sahiptir. Tanıtacağımız ilk araç rostopic
. Düğümlerin abone olabileceği ve yayınlayabileceği konuları incelememize olanak tanır. Çalışan rostopic list
şunları sağlayacaktır:
/cmd_vel /rosout /rosout_agg
Son 2 konu her zaman çalışır ve merkezi ROS sistemleri ile ilgilidir. /cmd_vel
konusu, yönlendirmemiz tarafından yayınlanmaktadır. Yönlendirmede konuyu yeniden adlandırmak, konuyu burada da yeniden adlandıracaktır. Şimdi, konunun içinde neler olup bittiğiyle ilgileniyoruz. rostopic echo /cmd_vel
çalıştırmak bize hiçbir şey göstermez (kaydırıcılarla oynamadığınız sürece). Süreç biz iptal edene kadar devam eder. Şimdi dikey kaydırıcıyı 20 m/sn'ye hareket ettirelim. Yankıya baktığımızda, aşağıdakilerin tekrar tekrar tekrarlandığını görebiliriz:
linear: x: 0.2 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0
Bu iletiyi ne sıklıkla spam yapar? rostopic hz /cmd_vel
ortalama 10 Hz hızında diyor. Yavaş Wi-Fi bağlantımdan bunun gibi kaç tane konu açabilirim? rostopic bw /cmd_vel
ortalama 480 B/s algılar.
Şimdi her şey yolunda ve güzel, ama mesaj türlerinden bahsettik. Bu veriler bir insan için iyidir, ancak bir uygulamanın ham verilere ihtiyacı olacaktır ve verileri yorumlayabilmesi için mesaj türünü bilmesi gerekecektir. Tür, bize bunun bir geometry_msgs/Twist
olduğunu söyleyen rostopic type /cmd_vel
ile belirlenebilir. Herhangi bir argüman olmadan çağrılan tüm ROS terminal araçları standart bir yardım mesajı döndürür.
ROS Wiki, bu dize için bir web araması yapmak için yeterince iyidir ve bunun ne içerdiğine ve nasıl yapılandırıldığına ilişkin bir Wiki açıklamasıyla sonuçlanır. Ama buna güvenmek zorunda değiliz. rosmsg
, mesaj türleri için genel araçtır. rosmsg show geometry_msgs/Twist
çalıştırmak şu sonucu döndürür:
geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z
Mesaj, 3B uzayda doğrusal ve açısal hızı temsil eden iki 3B vektörden oluşur.
Bir düğümün hangi konulara bağlı olduğunu istiyorsak, rosnode info <node-name>
bize düğüm hakkında ayrıntılı bilgi verecektir. rostopic
, rosmsg
ve rosnode
araçları, ham ROS işlevselliğini denetlemek için ana araçlardır. ROS'ta çok daha fazla GUI ve uçbirim aracı vardır, ancak bunlar bu girişin kapsamı dışındadır.
ROS düğümlerini çalıştırmak için ana araçlar rusrun
ve roslaunch
. rosrun
, rosrun <package_name> <node_name>
aracılığıyla düğümleri çalıştırabilir ve roslaunch
, ROS otomasyonunun en karmaşık öğesi oldukları için çok az aşina olduğumuz başlatma dosyalarına dayalı düğümleri çalıştırır.
İlk kodumuz üzerinde çalışmaya başlamak için koştuğumuz her şeyi kapatabiliriz. Gelecekte referans olması açısından, ROS ile ilgili herhangi bir şeyi çalıştırmanın aktif bir roscore
örneği gerektirdiğini söylemeye gerek yok. Karşılaştığınız birçok sorun, içinde roscore
çalıştığı terminal penceresini kapatarak ve yeniden başlatmak için yenisini açarak çözülebilir. Bu, hem bash
hem de roscore
yeniden yüklenmesi gereken tüm bağımlılıkları günceller.
Gamepad Teleoperasyonu Oluşturma
İlk hedefimiz, gamepad girdisine dayalı olarak geometry_msgs/Twist
verilerini /cmd_vel
yayınlayan bir düğüm oluşturarak Robot Steering
işlevselliğini taklit etmektir. İlk durağımız joy
paketi.
joy
Paketi
joy
paketi, oyun çubukları ve oyun kumandaları için genel ROS sürücüleri sağlar. Varsayılan yüklemeye dahil değildir, bu nedenle şu yollarla yüklenmesi gerekir:

sudo apt-get install ros-indigo-joy
Kurulumdan sonra rosrun joy joy_node
çalıştırabiliriz. Bu bizi varsayılan joystick veya gamepad'e bağlayacaktır. rostopic list
çalıştırmak bize /joy
adında bir başlığımız olduğunu gösteriyor. rostopic echo
yoluyla dinlemek bize aşağıdaki formattaki mesajları gösterir (mesajların yayınlanması için gamepad veya joystick ile etkileşime girmeniz gerektiğini unutmayın).
header: seq: 4156 stamp: secs: 1450707466 nsecs: 204517084 frame_id: '' axes: [0.0, 0.0, 0.0, -0.0, 0.0, 0.0, 0.0, 0.0] buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Şimdilik başlıkları görmezden gelebilirsiniz. Bunun dışında neyi temsil ettiklerini güzelce açıklayan axes
ve buttons
var. Eksenleri hareket ettirmek ve kontrolör üzerindeki butonlara basmak bu sayıların değişmesine neden olacaktır. Araçlarımızı kullanarak, mesaj tipinin sensor_msgs/Joy
olduğunu ve formatın şu şekilde olduğunu belirleyebiliriz:
std_msgs/Header header uint32 seq time stamp string frame_id float32[] axes int32[] buttons
Teleoperasyonumuzu Oluşturmak
Kod yazmanın ilk adımı bir paket yapmaktır. Çalışma alanının src
klasörü içinde şunu çalıştırın:
catkin_create_pkg toptal_tutorial rospy joy geometry_msgs sensor_msgs
Burada oluşturduğumuz paketin adını ve ardından bağımlı olmayı planladığımız paketleri belirtiyoruz. Endişeye gerek yok, bağımlılıklar daha sonra manuel olarak güncellenebilir.
Artık bir toptal_tutorial
klasörümüz var. Klasör içinde, tüm Python betiklerimizi barındıracak bir scripts
klasörü oluşturun.
teleop.py
adında bir dosya oluşturalım ve içinde şunları ayarlayacağız:
#!/usr/bin/env python import rospy from sensor_msgs.msg import Joy def joy_callback(data): print data def main(): rospy.init_node('teleop') rospy.Subscriber('joy', Joy, joy_callback) while not rospy.is_shutdown(): pass if __name__ == '__main__': main()
Komut dosyasının çalıştırılabilir hale gelmesi için chmod +x teleop.py
de ayarlamamız gerekecek. Bir terminalde rosrun joy joy_node
ve rosrun toptal_tutorial teleop.py
teleop.py
çıktısının Joy mesajları ile doldurulmasına neden olur.
Kodun ne işe yaradığını inceleyelim.
İlk olarak, ROS çerçevesiyle etkileşim için kitaplığı barındıran rospy'yi içe aktarıyoruz. Mesajları tanımlayan her paket, içinde mesaj tanımları bulunan bir msg
alt paketine sahiptir. Girişi işlemek için Joy
içe aktarıyoruz. Açıkça bahsetmek istemediğimiz sürece, gömülü mesaj türlerini ( Joy
mesajındaki std_msgs.msg
Header
gibi) içe aktarmaya gerek yoktur.
İlk adımımız belirli bir ada sahip bir düğümü başlatmaktır (bu durumda buna “teleop” diyoruz). Bundan sonra, sensor_msgs.msg.Joy
“sevinç” konusuna abone olan ve her mesajı joy_callback
işlevini çağırarak işleyen bir abone oluşturuyoruz. Geri aramalar, mesajdaki verileri içeren bir parametre alır. Verilerin üyelerine erişmek basittir. İlk eksenin durumunu yazdırmak isteseydik, mesaj tipini hatırlarsak print data.axes[0]
ve bir kayan nokta olur. Sondaki döngü, ROS kapanana kadar döngü yapar.
Bir sonraki adımımız verilerimizi bir şekilde ele almak olacaktır. Girdiye göre değişen bir Twist mesajı oluşturmalıyız ve ardından onu cmd_vel
konusuna yayınlayacağız.
#!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist # new from functools import partial # new def joy_callback(pub, data): # modified cmd_vel = Twist() # new cmd_vel.linear.x = data.axes[1] # new cmd_vel.angular.z = data.axes[0] # new pub.publish(cmd_vel) # new def main(): rospy.init_node('teleop') pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000) # new rospy.Subscriber('joy', Joy, partial(joy_callback, pub)) # modified while not rospy.is_shutdown(): pass if __name__ == '__main__': main()
İlk olarak, Twist
mesajını ekliyoruz ve functools.partial
aracılığıyla fonksiyon argümanlarını bağlama desteği ekliyoruz. Twist
türünde bir iletiyi cmd_vel
yayınlayan bir yayıncı, pub
oluşturuyoruz. Bu yayıncıyı geri aramaya bağlarız ve ilk iki eksen tarafından temsil edilen hızlarla her girişte bir Twist mesajı yayınlamasını sağlarız. Bu kod beklediğimiz şeyi yapar ve ortaya çıkan çıktıyı rostopic echo /cmd_vel
aracılığıyla görebiliriz.
Hala bir sorunumuz var. /joy
konusu harika oranlarda yayınlayabilir. rostopic hz /cmd_vel
ve analog çubuğu daireler halinde hareket ettirirsek, çok sayıda mesaj görebiliriz. Bu sadece büyük miktarda iletişimle sonuçlanmakla kalmaz, aynı zamanda bu mesajları alan süreçlerin her birini işlemesi gerekir. Bu verileri bu kadar sık yayınlamaya gerek yok ve sadece 10 Hz'lik sabit bir hızda yayınlamamız daha iyi. Bunu aşağıdaki kod ile gerçekleştirebiliriz.
#!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist from functools import partial def joy_callback(cmd_vel, data): # modified cmd_vel.linear.x = data.axes[1] cmd_vel.angular.z = data.axes[0] # moved pub.publish(cmd_vel) to main loop def main(): rospy.init_node('teleop') cmd_vel = Twist() # new pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000) rospy.Subscriber('joy', Joy, partial(joy_callback, cmd_vel)) # modified rate = rospy.Rate(10) # new while not rospy.is_shutdown(): pub.publish(cmd_vel) # new rate.sleep() # new if __name__ == '__main__': main()
Değişken Twist
nesnesini almak ve döngü içinde değiştirmek için geri aramayı değiştirdik. rospy.Rate
sleep
işlevi, sabit bir çıkış frekansını korur.
Son kod, /cmd_vel
konusunun Robot Steering rqt
eklentisinin çıktısını taklit ederek 10 Hz'de hız komutları almasıyla sonuçlanacaktır.
Simüle Edilmiş Bir Sistemi Çalıştırma
Dünyayı Simüle Etme
İlk hedefimiz, ulaşmak istediğimiz bir senaryoyu simüle edebileceğimiz bir ortam yaratmaktır. stageros
paketindeki stage_ros
aşamaları, bir görüntü aracılığıyla tanımlanan 2B aşama içinde bir robotu çalıştırmamızı sağlar. Dünya dosyaları ve bunların nasıl oluşturulacağı için stage_ros
paketinde açıklanan tam bir sözdizimi vardır. Oldukça basit, ancak kapsamımızın dışında. Neyse ki, paket birkaç demo dünyası ile birlikte geliyor. İlk olarak, şunu çalıştırarak dosyaların dizinine gidelim:
roscd stage_ros cd world
Klasörün içinde birkaç dosya var. Birini çalıştıralım.
rosrun stage_ros stageros willow-erratic.world
Bu birkaç konu oluşturdu. Her birinin anlamı da paketle birlikte belgelenmiştir. Önemli olan, cmd_vel
sahip olmasıdır.
Görüntülenen aşamada, kontrol ettiğiniz robotu temsil eden mavi bir kare vardır. Kodumuzu veya Robot Steering'i kullanarak bu robotu kontrol edebiliriz. Denemek.
Başlatma dosyaları aracılığıyla sistemimizi kurma
paketimiz içinde bir launch
klasörü oluşturalım ve bunun içinde teleop.launch
adlı bir dosya oluşturalım. Son klasör yapısı şöyle görünmelidir:
toptal_tutorial/ ├── CMakeLists.txt ├── launch │ └── teleop.launch ├── package.xml ├── scripts │ └── teleop.py └── src
teleop.launch
dosyası içinde bir dizi düğüm ve bunların ara bağlantılarını tanımlayacağız.
<launch> <arg name="world_file" default="$(find stage_ros)/world/willow-four-erratics-multisensor.world" /> <node pkg="stage_ros" type="stageros" name="simulated_world" args="$(arg world_file)"></node> <group ns="robot_0"> <node pkg="joy" type="joy_node" name="joy_input"></node> <node pkg="toptal_tutorial" type="teleop.py" name="joy_convert"></node> </group> </launch>
Yeni dünya dört robottan oluşuyor ve konularının her birinin ön eki robot_<n>
. Dolayısıyla, 0 numaralı robotun robot_0/cmd_vel
adlı bir hız komut konusu vardır. Bu nedenle, adlarını yeni forma göre ayarlamak için kontrolümüzü robot_0
adlı bir ad alanına yerleştirdik. Bu anlamda konu adlarını bir dosya sistemindeki klasörler olarak düşünebilirsiniz.
Başlatma dosyalarını çalıştırmak için roscore
gerekmez. Bir anlamda, roscore
hiçbir şey yapmayan bir başlatma dosyasının özel bir durumudur. Bir roscore
eksikse, yalnızca başlatılan ilk başlatma dosyası bir çekirdeği çalıştıracak, geri kalanı ona bağlanacaktır. Şimdi, lansmanı şununla çalıştırıyoruz:
roslaunch toptal_tutorial teleop.launch
Her şey doğruysa, bu, biri gamepad veya joystick ile kontrol edilen 4 robotlu bir simülatör ile sonuçlanacaktır. Bu dünyanın kaputunun altında öncekinden çok daha fazlası var. Dört robotun her birinde şunlar bulunur:
/robot_<n>/base_pose_ground_truth /robot_<n>/base_scan_0 /robot_<n>/base_scan_1 /robot_<n>/camera_info_0 /robot_<n>/camera_info_1 /robot_<n>/cmd_vel /robot_<n>/depth_0 /robot_<n>/depth_1 /robot_<n>/image_0 /robot_<n>/image_1 /robot_<n>/odom
<n>
yerine 0, 1, 2 veya 3 koyuyoruz. Bu bizi son konumuza getiriyor.
Verilerimizi rqt
ile Görüntülemek
rqt konusunda çok derine rqt
, ancak daha karmaşık verileri görüntülemek için mükemmel bir araçtır. Tüm konuları deneyebilirsiniz, ancak biz image_0
, image_1
, depth_0
ve depth_1
konularına odaklanacağız.
Şimdi rqt
ve açık olan tüm eklentileri kaldıralım. Şimdi 4 görüntü görselleştirici açacağız ( Plugins > Visualization > Image View
) ve bunları 2x2 ızgara oluşumuna yerleştireceğiz. Son olarak, görünümlerin her birinin sol üst köşesinde, robot_0
için belirtilen dört konudan birini seçelim.
Elde ettiğimiz şey, düşük çözünürlüklü kameralarla derinlik algısı olan stereo görüş. Bu sonucu girdi sistemimiz olmadan da elde edebileceğimizi unutmayın. Bunu çalıştırırsak ( stage_ros/world
klasöründen):
rosrun stage_ros stageros willow-four-erratics-multisensor.world
ve Robot Steering eklentisini /robot_0/cmd_vel
adlı bir konuyla ekleyin, kontroller ekrandaki kaydırıcılarla aynı sonuçları alırdık.
Sonuçları Gerçek Bir Sisteme Uygulamak
Çoğu donanımın ROS için tam desteği vardır ve çoğu zaman üçüncü taraf gönüllüler tarafından sağlanır. Birçok robot platformunda bu tür mesajları üreten sürücüler bulunur ve ROS, bir web kamerası alan ve bir görüntü akışı yayınlayan düğümlere sahiptir.
Son sonuç, elde etmek istediğimiz şeyin bir simülasyonu olsa da, aynısı aşağıdaki değişikliklerle de elde edilebilir:
- Robotunuzun yerleşik bilgisayarına ROS yükleyin
- ROS'u temel platforma ve kameralar, lazer mesafe bulucular ve diğerleri gibi tüm yüksek seviyeli sensörlere bağlayan yerleşik bilgisayar için bir başlatma dosyası oluşturun. Gerekli düğümler zaten mevcut olabilir veya bir tarafta ROS'a bir yayıncı/abone oluşturularak ve diğer tarafta seri iletişim için bir sürücü oluşturularak uygulanabilir.
- Başlatma dosyasının başlangıçta çalışmasını sağlayın
- Uzak bilgisayarınızda, bash başlangıcınıza
export ROS_MASTER_URI=http://<robot_hostname>:11311/
ekleyin ve uzak bilgisayarın verilen ana bilgisayar adı ve bağlantı noktasındaroscore
- Robotu izlemek ve kontrol etmek için
rqt
ve/veya herhangi bir komut dosyasını başlatın
Bunun asıl amacı, uzak cihazdaki uygun ortam değişkenini dışa aktarmaktır ve gerisi kendi kendine halledilir. ROS'u bir bilgisayar kümesinde çalıştırmak, her makine için yalnızca bir adımın yapılmasını gerektirir.
Çözüm
Çok az kodlamayla, istediğiniz gibi değiştirebileceğiniz karmaşık bir değişkenler sistemine nasıl sahip olabileceğinizi gösterdik. Basit yayıncı/abone sistemi, belirli öğelerin altında yatan uygulama hakkında endişelenmeden, bir bilgisayar kümesindeki verileri işleyen yazılım boru hattını hızlı bir şekilde geliştirmenize olanak tanır.
Biz basit bir simülatör kullanırken, gazebo
gibi daha karmaşık simülatörler (tam masaüstü sürümüne de dahildir), fizik ve karmaşık sensörlerle 3B dünyalar oluşturmanıza olanak tanır ve size nihai sonuçlar ve ürün geliştirilmeden çok önce bir deneyim verebilir.
Bu giriş çok basitti, ancak umarız bu çok yönlü çerçeveyle çalışmaya daha fazla ilgi duymaya başlarsınız.