2017-01-12 18 views
2

私は、各コールバック関数の後に特定の計算を実行するプログラムをROSで作成しています。私のコールバック関数は、基本的にトピックにサブスクライブし、特定の計算を実行するために使用される変数の値を設定します。私が購読しているトピックは、30Hzの周波数を持っています。だから、30Hzのレートで動作する私のプログラムにはwhileループがあります。ループは、次のコードに幾分類似している:ros :: spinOnce()が特定の数のコールバックをコールバックキューから呼び出す方法はありますか?

while (ros::ok()) 
{ 
    ros::spinOnce(); //this should set a certain variable "a" 
    perform_computation(); //this performs computation on the variable "a" 
    looprate.sleep(); //this runs at 30 Hz 
} 

答えて

2

ROS :: spinOnceは():: ROSと同様スピン()それはブロックしない差です。 ros :: spinOnce()の各呼び出しは、すべてのメッセージを最後の呼び出し以降に処理します。つまり、各メッセージのすべての加入者コールバック関数を呼び出します。コールバック関数を制御したい場合は、コールバック関数から受け取ったメッセージをバッファして、バッファされたメッセージを必要な速度と方法で処理します。これは、コールバックが時間のかかる計算を行う場合にも情報を処理する方法です。コールバック関数は非常に速くなければなりません。

関連する問題