티스토리 뷰

소스를 보다보니 
launch 파일에 parameter를 넣는경우를 봤다. 
launch 파일 정보에 parameter가 있는것은 확인했는데. 


전체적으로 파라미터를 어떤식으로 다루는지 알고 싶어졌다.


내가 파라미터가 필요한곳은 c++ 파일에서이다. 

그렇다면 C++ 파일에서 전달받은 파라미터를 어떻게 사용할 것인가?


위를 읽어보면 Param_Server를 C++에서 접근하는 방법은 크게 2가지 있다. 
  1. handle 버젼 => NodeHandel을 통해서 접근하는 방법.
  2. bare 버젼 => ros::param을 통해 바로 접근하는 방법.

handle 버전에선 


읽을 때
ros::NodeHandle nh;
std::string a;
if (nh.getParam("/global_name", a))
{
  ...
}

if (nh.getParam("relative_name", a))
{
  ...
}

// Default value version
nh.param<std::string>("default_param", a, "default_value");
쓸 때
ros::NodeHandle nh;
nh.setParam("/global_param", 5);
nh.setParam("relative_param", "my_string");
nh.setParam("bool_param", false);

bare 버전에선

읽을 때
std::string a;
if (ros::param::get("/global_name", a))
{
  ...
}

if (ros::param::get("relative_name", a))
{
  ...
}

// Default value version
ros::param::param<std::string>("default_param", a, "default_value");
쓸 때
ros::param::set("/global_param", 5);
ros::param::set("relative_param", "my_string");
ros::param::set("bool_param", false);

global_name, relative_name 은 우리가 정한 파라미터 데이터에 들어가있는 파라미터 key값이다.
a 는 값을 받을 변수 ( 여기서 중요한점은 바로 a 의 타입에 따라서 값이 안받아 질 수도 있다는 것이다. )
즉) a 와 파라미터에 들어가있는 값의 형태가 다르면 n.getParam이 False를 반환하고 a 에도 제대로 된 값이 들어가지 않는다. 이걸로 테스팅해보는데 값이 안나와서 엄청 고생했다.

n.getParam와 ros::param::get의 return 값은  파라미터에 값이 있고 a에다가 값을 잘 저장하였을 때 True를 리턴하고 값이 없거나 a에 저장을 하지 못했을 경우 False를 리턴한다.



global_name과 relative_name 의 차이는. 

global_name은 Parameter Server에 global하게 접속하는 데이터고
relative_name은 NodeHandle의 namespace에 relative 하다. 

즉 Nodehandle nh(“project”);
project 라고 namespace를 지정할경우

nh.getParam(“test”,a) 를 접근하게되면 Parameter Server에 /test로 접근한느 것이 아니라 /project/test 로 접근하게 되고, 
/test로 접근하고 싶다면 nh.getParam(“/test”,a); 로 하여야한다.


Private Parameters로 접근할때 

(private parameters로 전달되는경우는 rosrun 에서 파라미터로 보내는 경우를 포함하고, 다른경우는 잘 모르겠다.)

ros::NodeHandle nh("~");
std::string param;
nh.getParam("private_name", param);

로 접근하거나 .
std::string param;
ros::param::get("~private_name", param);
로 하면된다.


Parameter 검색
std::string key;
if (nh.searchParam("bar", key))
{
  std::string val;
  nh.getParam(key, val);
}
이런 방법과
std::string key;
if (ros::param::search("bar", key))
{
  std::string val;
  ros::param::get(key, val);
}

읽어보면 searchParam은 가장 가까운 namespace로 부터 (private namespace부터) 다른 위쪽 namespace까지 돌면서 매칭되는 파라미터가 있는지 없는지 확인한다.


파라미터가 있는지 없는지 Checking. 
ros::NodeHandle nh;
if (nh.hasParam("my_param"))
{
  ...
}
if (ros::param::has("my_param"))
{
  ...
}

파라미터 삭제
ros::NodeHandle nh;
nh.deleteParam("my_param);
ros::param::del("my_param");

리스트를 저장하고 불러오기 (Groovy 버전 이후부터)

bool ,int ,float ,double ,string 로 이루어진 std::vector나 std::map을 저장할 수 있다.

get, set 할 수 있다. 그냥 쓰던대로 쓰면됨 ㅎㅎ.
굉장히 유용할것 같다. (다양한 데이터를 쉽게 파라미터 서버에 저장하고 파라미터로 넘길 수 있어서)
ros::NodeHandle nh;
// 맵을 만듬
std::map<std::string,std::string> map_s, map_s2;
map_s["a"] = "foo";
map_s["b"] = "bar";
map_s["c"] = "baz";

// 맵을 set Get함
nh.setParam("my_string_map", map_s);
nh.getParam("my_string_map", map_s2);

// double 형태의 list들을 파라미터 서버에서 받아와서 합을 구하는 코딩
std::vector<double> my_double_list;
double sum = 0;
nh.getParam("my_double_list", my_double_list);
for(unsigned i=0; i < my_double_list.size(); i++) {
  sum += my_double_list[i];
}



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함