gggggraziegrazie

graizegrazieさんのやったこと、学んだことを記録する雑記帳です

コマンドライン中で指定したパラメータ名をノード中で取得する方法(C++)

結論から言うと、2種類の方法があります。

  1. ros::names::remap : 返り値としてremapされたパラメータ名が取得できます。
  2. resolveName : 返り値としてremapされたパラメータ名が取得できます。第二引数でremapが成功したかをboolで取得できます。
ros::names::remap

remapされた名前は返り値として返されます。また返された名前は、絶対パスで返されます。つまり、

std::string remapped_name = ros::names::remap("hoge")
std::cout << remapped_name << std::endl;

というコードがノード中に書いてあり、さらに

rosrun node node hoge:=fuga

を実行すると、

/fuga

が表示されます。これはros::names::remapがノードハンドルのメンバ関数ではないためと考えれます。

resolveName

remapされた値は、ノードハンドルのNameSpaceによって変化します。例えば
コード中に

ros::Nodehandle n;
bool resolve_result;
std::string remap = n.resolveName("hoge", resolve_result);
std::cout << remap << std::endl;

と書いてあり、

rosrun node node hoge:=fuga

を実行すると、

/fuga

が表示されます。また

ros::init(argc, argv, "node_name");
ros::Nodehandle n(~);
bool resolve_result;
std::string remap = n.resolveName("hoge", resolve_result);
std::cout << remap << std::endl;

と記載がある状態で

rosrun node node hoge:=fuga

を実行すると、

/node_name/fuga

が表示されます。こちらはノードハンドルのメンバ関数のため、ノードハンドルの持つNameSpaceの影響を受けることがわかります。

ご参考になりましたら幸いです。