はじめまして。
("~")はROS Paramの相対パスです。
まず、おそらく質問での「パラメータを受け取らない」現象はrosrunかroslaunchの引数によるものではないでしょうか?ここからはその前提で話を進めていきます。
結論から申しますと、「ROSの仕様で勝手にヘッダーが付けられるため、"~"(相対パスの明示)がないと受け取れない」からです。
実験用のプログラムを作ってみました。
cpp
1#include <ros/ros.h>
2#include <string>
3
4class pub_int:public ros::NodeHandle
5{
6public:
7 test_param()
8 {
9 int number;
10 if(!ros::param::get("~get_number", number)){
11 std::cout << " '~' parameter not found" << std::endl;
12 }
13 if(!ros::param::get("get_number", number)) {
14 std::cout << " ' ' parameter not found" << std::endl;
15 }
16 ros::param::set("~set_number2str",std::to_string(number).c_str());
17 ros::param::set("set_number2str",std::to_string(number).c_str());
18
19 ROS_INFO(std::to_string(number).c_str());
20 ROS_INFO("exit");
21 // exit(0);
22 }
23};
24
25int main(int argc, char** argv)
26{
27 ros::init(argc,argv,"param");
28 pub_int pb;
29 ros::spin();
30 return 0;
31}
ここでは、ros::param::get
の行がpnh_.getParam
と同じ動きをする行です。紛らわしくてすみません…
このプログラムでは、ROSプログラムの初期化にあたるros::init(argc...)
で"param"という名前が与えられています。コレが、ROSのプログラムを識別するためのキーワードとなり、このプログラムで作られた相対パスのパラメータは全て、"/param"の下に置かれるようになります。
…で、ROS1の仕様として、引数にはデフォルトでそのキーワードを頭につける仕様があります。
例えば、このプログラムで
$ rosrun part3_2_example param_int2str _get_number:=10
というコマンドで実行したとしましょう。見かけ上は、プログラムにはget_nubmer=10
と代入されたように見えますが、実際には/param/get_number=2
と代入されています。
別タブを開いて$ rosparam list
コマンドを入力してトピックの一覧を見てみます。
/param/get_number
というパラメータが出現していました。仕様通り/param/get_number
を内部で受け取るようです。
**ちなみに、どうしても""なしでパラメータを受け取りたければ、$ rosparam set /get_number 2
などでプログラム実行前にパラメータを設定してしまえばいいです。**この場合はどちらの「... not found」という出力も現れません。そのため、""抜きのパラメータ設定は外部からのみの設定を受け入れることになります。
だったら、ros::param::get("param/get_number",number)
でもいいのか?と思われるかもしれませんが、そういうわけにもいけません。ネームスペースやリマップによるヘッダー変更の可能性があるからです。その点でも"~"は柔軟に対応できます。
いかがでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/11 21:10
2021/07/12 05:07