Verständnis von ros::Rate und ros::spin() in ros

1. Über die Verwendung und das Verständnis von ros::Rate rate() und rate.sleep()

Diese beiden Funktionen werden zur Steuerung der Veröffentlichungshäufigkeit verwendet, die die Zyklusfrequenz und nicht die Veröffentlichungsfrequenz von Nachrichten und Diensten steuert. Durch Steuerung der Zyklusfrequenz kann die Veröffentlichungsfrequenz gesteuert werden

ros::Rate rate(50) //Eine Häufigkeit definieren

rate.sleep() //sleep

Häufig wird ros::Rate rate(50) außerhalb der Schleife geschrieben, während sich rate.sleep() innerhalb der Schleife befindet, um die Häufigkeit der Themenveröffentlichung zu steuern.

Diese Häufigkeit bezieht sich auf die Zeit zwischen der Ausführung des letzten loop.sleep() und dem nächsten loop.sleep() . Normalerweise wird der Code schneller als die eingestellte Häufigkeit ausgeführt. Wenn Sie also zum nächsten laufen, wird loop.sleep nicht erreicht 0,02 s (1/50 Hz) nach () beginnt der Ruhezustand und führt dann nach 0,02 s das nächste Programm aus.

2. Über die Verwendung und das Verständnis von ros::spin() und ros::spinonce()

Der Gesamteffekt besteht darin, alle Rückruffunktionen in diesem Knoten zentral zu verarbeiten

Wenn wir ein Thema abonnieren und subscribe verwenden möchten, müssen wir ros::spin() oder ros::spinonce() verwenden, um die Rückruffunktion aufzurufen. Wenn in der Themenabonnementkommunikation Publish ein Thema veröffentlicht, abonniert sub dasselbe Thema. Gleichzeitig gibt es in der Abonnementfunktion einen queue_size-Parameter, der die Länge der Rückruffunktionsliste angibt. Jede Veröffentlichung und jedes Abonnement haben seine entsprechende Veröffentlichung Der Cache-Bereich und der Abonnement-Cache-Bereich verfügen ebenso wie die Herausgeber- und Abonnentenfunktionen über Parameter für die Anzahl der Caches (Warteschlangenlänge). Warum gibt es diesen Parameter?

Dies liegt daran, dass beim Veröffentlichen und Abonnieren die Veröffentlichungsfrequenz zu schnell ist und die Verarbeitungszeit in der Rückruffunktion sehr lang ist. Der Rückruf des später veröffentlichten Themas wird in die Warteschlange gestellt. Diese Warteschlange ist der Abonnementpuffer und wartet bis zum letzten Rückruf Nach dem Ende findet das Abonnement denjenigen mit dem frühesten Zeitstempel in der Warteschlange der Rückruffunktion, um zurückzurufen, wodurch ein Fehlen verhindert werden kann

Wenn Sie normalerweise hohe Anforderungen an die Echtzeitleistung haben und jedes Mal nur die veröffentlichten Informationen zu diesem Zeitpunkt verarbeiten möchten, ist es am besten, queue_size auf 1 zu setzen, damit jede Rückruffunktion das aktuell veröffentlichte Thema zurückruft.

Wenn Sie nicht alle veröffentlichten Themen verpassen möchten, können Sie queue_size etwas größer einstellen

Wenn queue_size 0 ist, bedeutet dies, dass die Warteschlange der Rückruffunktion unendlich ist und der Rückruf des später kommenden Themas jederzeit gefüllt werden kann

Beispiel: rospy.Subscriber('usb_cam/image_raw', Image, callback,queue_size=1)

Wenn im Knoten ein Abonnementthema vorhanden ist, müssen die Funktionen ros::spin() und ros::spinonce() verwendet werden. Im Allgemeinen befinden sich diese beiden Funktionen in der Weckruffunktion.

Was ist also der Unterschied zwischen diesen beiden Funktionen?

ros::spin():

Wenn ros::spin() verarbeitet wird, geht es immer zum Themenabonnementpuffer, um zu prüfen, ob eine Rückruffunktion vorhanden ist. Wenn ja, wird die Rückruffunktion verarbeitet. Wenn nicht, fahren Sie mit der Prüfung fort und warten Sie, damit es funktioniert wird verarbeitet zu ros::spin() Führt nichts anderes als die Rückruffunktion aus, der Knoten wartet zu diesem Zeitpunkt nur und verarbeitet die Rückruffunktion

Lob::spinonce():

Wenn ros::spinonce() verarbeitet wird, geht es zum Themenabonnementpuffer, um zu prüfen, ob eine Rückruffunktion vorhanden ist. Wenn dies der Fall ist, wird die Rückruffunktion verarbeitet. Wenn nicht, wird die Ausführung fortgesetzt. Es gibt eine Der Unterschied besteht darin, dass Spinonce nicht immer bei der Rückruffunktion hängen bleibt, sondern nur prüft, ob sich eine Rückruffunktion im Puffer befindet, anstatt auf das Eintreffen der Rückruffunktion zu warten

Acho que você gosta

Origin blog.csdn.net/weixin_62705892/article/details/127678310
Recomendado
Clasificación