H ROS alapparadigmák - szenergy/szenergy-public-resources GitHub Wiki
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.