Skip to content

H ROS alapparadigmák

horverno edited this page Mar 19, 2021 · 1 revision

ROS alapparadigmák

A következő wiki oldal pár ötletet ad, hogyan érdemes ROS-es programot fejleszteni.

Üzenetek

Az ROS egyik jellemzője, hogy a topikok típusosak, vagyis a topikon továbbított üzenetek egy rögzített definíciónak felelnek meg. A típust egy üzenetleíró fájlban definiáljuk (*.msg fájlok). Például, a következő üzenetleírás egy jármű sebességét és kormányszögét adja vissza:

float64 linear_velocity
float64 wheel_angle

Időbélyegek

Kimondottan elosztott rendszerekben előnyös, ha ismerjük az üzenet keletkezésének az időpontját. Ezzel szűrhetők, szinkronizálhatók az egyes topikokon bejövő üzenetek. Gyakrolatban ez egy tetszőleges üzenet fejléccel (std_msgs/Header) való kiegészítését jelenti (bemutatva a fenti példán):

std_msgs/Header header
float64 linear_velocity
float64 wheel_angle

Az időbélyegre a generált üzenetben a header.stamp mezővel hivatkozhatunk a programkódban. Az időbélyeg megválasztása esettől függően különböző módon alakulhat:

  • Az időbélyeg a bejövő szenzoradathoz köthető időbélyeg (pl. a LIDAR által visszaadott üzenet időbélyege). Ezzel visszakövethető mikor keletkezett a feldolgozandó adat, de szenzorfúzió esetén meg kell választani a referencia forrást.
  • Legkényelmesebb nyilván a feldolgozás időpontját megadni, de ez csökkenti a nyomonkövethetőségét a feldolgozásnak.

Timer használata

ROS programoknál visszatérő mintázat, hogy amikor ROS-el dolgozunk a folytonos feldolgozást a következőképpen oldjuk meg:

...

ros::Rate loop_rate(10);
while(!ros::ok())
{
   ...
   // Elvégezni az adott munkát
   ...
   ros::spinOnce();
   loop_rate.sleep(); 
   ...
}

...

Tipikus alkalmazásokban sokkal elegánsabb az ROS timerek használata (http://wiki.ros.org/roscpp/Overview/Timers), ami az ROS órájához igazítva indukál eseményvezérelt végrehajtást. Előny ráadásul, hogy callback-ként osztálymetódus is használható, így az adott Timer tartozhat egy osztály hatáskörébe is.

Clone this wiki locally