0 beğenilme 0 beğenilmeme
1 görüntülenme
Yapay Zeka kategorisinde Bilge (135k puan) tarafından
ros temel bilgiler
    

8 Cevaplar

0 beğenilme 0 beğenilmeme
Bilge (135k puan) tarafından

ROS bütün iletişimi topicsler aracılığı ile yapar.

Topics
roslaunch publisher_example move.launch
roslaunch publisher_example stop.launch

Services
Servis çağırmadan önce up ve run olduğuna emin olun. Aşağıdaki örnekte, servisi up ve run ediyoruz ki istemciler call edebilsin.

roslaunch service_demo service_launch.launch //servisi çalıştır
rosservice call /service_demo "{}"           //çağrı yap

Actions;
roslaunch action_demo action_launch.launch //action server start edildi.
roslaunch action_demo_client client_launch.launch //action verildi.

Action vs Services / Action ve servisler arasındaki fark şudur;
Servis çağrıldığında robot başka birşey yapmadan ilgili servis hizmetinin bitmesini bekler. Action çağılırsa, robot bu arada diğer yaptıklarını  yapmaya devam eder.

0 beğenilme 0 beğenilmeme
Bilge (135k puan) tarafından

package iç içe olmaz her package package.xml ve CMake.list dosyasına sahiptir.
my_package:
CMakeLists.txt
package.xml

Package create için;
#cd ~/catkin_ws/src
#catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

Package build için;
#cd ~/catkin_ws
#catkin_make

Workspace i ROS environment a eklemek için
#. ~/catkin_ws/devel/setup.bash

Building Package
catkin_make komutu birkaç komut kümesini bir arada çağıran üst komuttur.(mkdir build, cd build, make & install gibi)
#cd catkin_workspace
#catkin_make
#catkin_make install --source my_src // optional

ROS Nodes Genel Bilgi;
Nodes: Diğer nodelar ile iletişim kurabilen yütürülebilir programlardır.
Messages: Bir yayına abone olmak ya da yayın yapmak için kullanılan ROS'a özel data tipidir.

Topics: Node'lar bir topic'e mesaj yayınlayabilir ya da mesaj almak için abone olabilirler.
Master: ROS için name servisidir. Node'ların birbirini bulmasına yarar.
rosout: ROS için stdout/stderr'un eşdeğeri
roscore: Master+rosout+parameter server

Quick Overview of Graph Concepts

Nodes: A node is an executable that uses ROS to communicate with other nodes.
Messages: ROS data type used when subscribing or publishing to a topic.
Topics: Nodes can publish messages to a topic as well as subscribe to a topic to receive messages.
Master: Name service for ROS (i.e. helps nodes find each other)
rosout: ROS equivalent of stdout/stderr
roscore: Master + rosout + parameter server (parameter server will be introduced later)
Nodes: ROS package içindeki yürütülebilir dosyadır. ROS nodes diğer node'lar ile iletişim kurmak için ROS client kütüphanelerini kullanır.

Clients Library
rospy = python client library
roscpp = c++ client library

ROS NODELARI KULLANMA VE ROS KOMUTLARI

#roscore            // ROS start server
#rosnode list       // running nodeları gösterir
/rosout     // Log ve debug için kullanılan node
#rosnode info /rosout  // rosnode hakkında bilgi

----- Using rosrun

#rosrun package_name node_name //rosrun package pathe gerek kalmadan paket adı ile içindeki node'u çalıştırmanızı sağlar.

#rosrun turtlesim turtlesim_node  // paket adı ve node 
#rosrun turtlesim turtlesim_node __name:=my_turtle // çalıştırırken node için yeni bir ad verdik, rosnode list ile bakınca bu ad gözükecek.
#rosnode cleanup // durdurduğunuz node hala listte görünüyorsa temizlik için
#rosnode ping my_myturtle // node'un up olup olmadığını görebiliriz.

0 beğenilme 0 beğenilmeme
Bilge (135k puan) tarafından

Messages

msg: Basit text dosyalarıdır. ROS mesaj alanlarını tanımlar. 

srv: srv dosyası servis tanımlar. Request ve Response olmak üzere iki bölümden oluşur.

msg dosyaları msg dizinine srv dosyaları ise srv dizinine depolanır.

int8, int16,int32,int64,float32,float64,string,time,duration,other message files, variable-length array[] and fixed length array[] gibi tipler alır.

Ayrıca ROSa özel bir tür daha vardır. Header, header zaman damgası ve coordinate içerir. Bunlar ROS ta sık kontrol edilir. 

Tümü için genel bir örnek...;

Header header

  string child_frame_id

  geometry_msgs/PoseWithCovariance pose

  geometry_msgs/TwistWithCovariance twist

------------------------

srv dosyaları msg dosyalarına benzer. İki kısımdan oluşur, request ve response.  İki kısım birbirinden "---"  karekterleri ile ayrılır. Üstte request altta response bulunur.

Örnek;

int64 A    // request

int64 B    // request

---

int64 SUM  //response

1-

$ roscd beginner_tutorials

$ mkdir msg

$ echo "int64 num" > msg/Num.msg // Num.msg dosyası oluşturduk.

2-

beginner_tutorials içinde package.xml dosyasına aşağıdaki satırları ekledik.

 <build_depend>message_generation</build_depend>

  <exec_depend>message_runtime</exec_depend>

3-

CMakeLists.txt dosyasında aşağıda satırları düzenliyoruz.

find_package(catkin REQUIRED COMPONENTS

   roscpp

   rospy

   std_msgs

   message_generation

)

catkin_package(

  ...

  CATKIN_DEPENDS message_runtime ...

  ...)

add_message_files(

  FILES

  Num.msg

)

generate_messages(

  DEPENDENCIES

  std_msgs

)

Mesaj içeriğini görüntülemek için

#rosmsg show beginner_tutorials/Num

#rosmsg show Num

0 beğenilme 0 beğenilmeme
Bilge (135k puan) tarafından

Debug

rqt_console ve roslaunch

rqt_console ve rqt_logger_level debug için kullanılır.

roslaunch ise birçok nodu aynı anda başlatmak için kullanılır 

#rosrun rqt_console rqt_console 

#rosrun rqt_logger_level rqt_logger_level

#rosrun turtlesim turtlesim_node

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0,y: 0.0,z: 0.0}}'

0 beğenilme 0 beğenilmeme
Bilge (135k puan) tarafından

Service

ROS Service

Servisler node'ların biribiri ile haberleşmesini bir başka yoludur.

Servisler nodun istek yapmasına ve yanıt almasına izin verir.

rosservice komutu birçok parametre alarak servisler üzerinde çalışmanıza izin verir.

// Komutlar

rosservice list         aktif servisler hakkında bilgi verir.

rosservice call         desteklenen argumanlarla servis çağırır.

rosservice type         servis tiplerini gösterir

rosservice find         servis tipine göre servisi gösterir

rosservice uri          ROSRPC servis uri'sini gösterir.

#rossevice list // servisleri listeler

/clear

/kill

/reset

/rosout/get_loggers

/rosout/set_logger_level

/spawn

/teleop_turtle/get_loggers

/teleop_turtle/set_logger_level

/turtle1/set_pen

/turtle1/teleport_absolute

/turtle1/teleport_relative

/turtlesim/get_loggers

/turtlesim/set_logger_level

#rosservice type /clear  // empty demek servis arguman almaz anlamına gelir.

#rosservice call /clear  // ekranı siler

Yeni bir turtle eklemek istiyoruz, servis tipini ve parametrelerini inceleyerek ekliyoruz.

ah@ubuntu:~/Desktop$ rosservice type /spawn

turtlesim/Spawn

ah@ubuntu:~/Desktop$ rosservice type /spawn | rossrv show

float32 x

float32 y

float32 theta

string name

---

string name

ah@ubuntu:~/Desktop$ rosservice call /spawn 2 2 0.2 ""

name: "turtle2"

ah@ubuntu:~/Desktop$ 

ah@ubuntu:~$ rosparam set /background_b 0

ah@ubuntu:~$ rosparam set /background_g 0

ah@ubuntu:~$ rosparam set /background_r 0

ah@ubuntu:~$ rosservice call /clear 

ah@ubuntu:~$ 

ah@ubuntu:~$ rosparam get /background_g 

0

ah@ubuntu:~$ rosparam dump params.yml

ah@ubuntu:~$ cat params.yml 

background_b: 0

background_g: 0

background_r: 0

rosdistro: 'kinetic  '

roslaunch:

  uris: {host_ubuntu__40645: 'http://ubuntu:40645/'}

rosversion: '1.12.14'

run_id: 98a29e7e-2ef7-11e9-9f45-000c29xxx

0 beğenilme 0 beğenilmeme
Bilge (135k puan) tarafından
Service Kullanımı

$ roscd beginner_tutorials

$ mkdir srv

$roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv //Elimizdeki srv dosyasını kopyalıyoruz.

// Aşağıdaki satırları kontrol ediyoruz.

<build_depend>message_generation</build_depend>

  <exec_depend>message_runtime</exec_depend>

CMakeLists.txt içinde aşağıdaki kısmı düzenliyoruz.

add_service_files(

  FILES

  AddTwoInts.srv

)

Kullanım;

Görüntülemek için;

$ rossrv show beginner_tutorials/AddTwoInts

Paket adı vermezsek mevcutları paket adıyla  görüntüler

ah@ubuntu:~$ rossrv show AddTwoInts

[beginner_tutorials/AddTwoInts]:

int64 a

int64 b

---

int64 sum

[rospy_tutorials/AddTwoInts]:

int64 a

int64 b

---

int64 sum

ah@ubuntu:~$

Son olarak desteklenen diller için dosyamız compile edilecektir.

# In your catkin workspace

$ roscd beginner_tutorials

$ cd ../..

$ catkin_make install

$ cd -

Let's just list some of the commands we've used so far:

rospack = ros+pack(age) : provides information related to ROS packages

roscd = ros+cd : changes directory to a ROS package or stack

rosls = ros+ls : lists files in a ROS package

roscp = ros+cp : copies files from/to a ROS package

rosmsg = ros+msg : provides information related to ROS message definitions

rossrv = ros+srv : provides information related to ROS service definitions

catkin_make : makes (compiles) a ROS package

rosmake = ros+make : makes (compiles) a ROS package (if you're not using a catkin workspace)
0 beğenilme 0 beğenilmeme
Bilge (135k puan) tarafından

Publisher

------------ PUBLISHER ---------------

#!/usr/bin/env python // yürütülebilir python scripti olduğunu belirtiyoruz.

import rospy

from std_msgs.msg import String

// chatter topic'e string türünde yayın yapıyoruz.

// queue_size ile kuyruk sayısını sınırlıyoruz.

pub = rospy.Publisher('chatter', String, queue_size=10) 

// düğüm belirtiyoruz. eğer izlenmeyecek ve önemsiz bir düğümse böyle yapılabilir.

// Değilse benzersiz isim verilebilir. Mesela ROS graph iki aynı node isme rastlarsa eskisini kapatır.

rospy.init_node('talker', anonymous=True)

//sleep metodunu da kullanarak saniye de 10 kez tekrar edecek bir döngü oluşturur.

rate = rospy.Rate(10) # 10hz 

-------------

    while not rospy.is_shutdown():

        hello_str = "hello world %s" % rospy.get_time()

        rospy.loginfo(hello_str) // hello_str ekrana basılıyor.

        pub.publish(hello_str) // yayınlanıyor

        rate.sleep()

----------- LISTENER -----------------

#!/usr/bin/env python

import rospy

from std_msgs.msg import String

def callback(data):

    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)

def listener():

    # In ROS, nodes are uniquely named. If two nodes with the same

    # name are launched, the previous one is kicked off. The

    # anonymous=True flag means that rospy will choose a unique

    # name for our 'listener' node so that multiple listeners can

    # run simultaneously.

    rospy.init_node('listener', anonymous=True) // anonymous benzersiz çekilde çalışsın diye.

    rospy.Subscriber("chatter", String, callback)

    # spin() simply keeps python from exiting until this node is stopped

    rospy.spin()

if __name__ == '__main__':

    listener()

0 beğenilme 0 beğenilmeme
Bilge (135k puan) tarafından
# In your catkin workspace

$ cd ~/catkin_ws

$ source ./devel/setup.bash

$ rosrun beginner_tutorials talker.py

$ rosrun beginner_tutorials listener.py

Writing Service Node

roscore & rosrun gazebo_ros gazebo
...