ラベル ROS_Indigo の投稿を表示しています。 すべての投稿を表示
ラベル ROS_Indigo の投稿を表示しています。 すべての投稿を表示

2014/12/22

ROSのトピックにおける送受信間のバッファ数について

ちょっとトピックの送受信間の通信で、バッファみたいなのがあるならその数を調整したいです。

調べた所、やっぱりあるみたいですね。
ROSのチュートリアルにも書いてありました。

C++のチュートリアルではこの行ですね。
ros::Publisher chatter_pub = n.advertise<std_msgs::string>("chatter", 1000);
Pythonではこの行です。
pub = rospy.Publisher('chatter', String, queue_size=10)

ROSではqueue_sizeという引数の名前になっているらしく、
上記ではC++は1000、Pythonでは10に設定されていますね。

要するにバッファの数なので、どんなときに大きくするといいのか、小さくするといいのかは解ると思いますが、以下のURLの" Choosing a good queue_size "ってところに書いてますね。
rospy/Overview/Publishers and Subscribers - ROS Wiki
http://wiki.ros.org/rospy/Overview/Publishers%20and%20Subscribers

加えて、Hydro以降はqueue_sizeが入力されていないと、以下のようなWarningが出るようになっているそうです。

SyntaxWarning: The publisher should be created with an explicit keyword argument 'queue_size'. Please see
http://wiki.ros.org/rospy/Overview/Publishers%20and%20Subscribers
 for more information.

参考にしたサイト
roscpp: ros::NodeHandle Class Reference
http://docs.ros.org/indigo/api/roscpp/html/classros_1_1NodeHandle.html

catkinでは import roslib や roslib.load_manifest() はいらない

最近ではcatkinが主流になりましたが、ネットではまだまだrosbuildを使った記事によく当たります。

Pythonで書く時に、rosbuildでは

import roslib
roslib.load_manifest( ... )

が必要でしたが、catkinではいらないのでコメントアウトでおkです。
それだけです。

参考にしたサイト
what does roslib.load_manifest() do? - ROS Answers: Open Source Q&A Forum
http://answers.ros.org/question/115346/what-does-roslibload_manifest-do/

catkin/migrating_from_rosbuild - ROS Wiki
http://wiki.ros.org/catkin/migrating_from_rosbuild

roslib.load_manifest error - Python - ROS Answers: Open Source Q&A Forum
http://answers.ros.org/question/107261/roslibload_manifest-error-python/

ROSで " ROSException: ROS node has not been initialized yet. Please call init_node() first " というエラーが出たら

ここを参考にして画像処理のサンプルプログラムを書いたのですが、( 参考というかただのコピペ )

cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython - ROS Wiki
http://wiki.ros.org/cv_bridge/Tutorial/ConvertingBetweenROSImagesAndOpenCVImagesPython

catkin_makeしたら次のようなエラーになってしまいました。

ROSException: ROS node has not been initialized yet. Please call init_node() first

まあ、書いてあるとおり「初めにinit_node()をしろ」ってことなので、
main関数のすぐ後にinit_node()を実行するようにした所、エラーが無くなりました。

init_node()なので初めに実行するようにするのはわかりやすいしいいのですが、
TutorialのPythonのサンプルプログラムでも" rospy.Publish() "の方が先に来てるんだよね。

まあ、このエラーになったらinit_node()が初めに実行されているか確認しましょう。