티스토리 뷰
소스를 보다보니
launch 파일에 parameter를 넣는경우를 봤다.
launch 파일 정보에 parameter가 있는것은 확인했는데.
전체적으로 파라미터를 어떤식으로 다루는지 알고 싶어졌다.
내가 파라미터가 필요한곳은 c++ 파일에서이다.
그렇다면 C++ 파일에서 전달받은 파라미터를 어떻게 사용할 것인가?
위를 읽어보면 Param_Server를 C++에서 접근하는 방법은 크게 2가지 있다.
- handle 버젼 => NodeHandel을 통해서 접근하는 방법.
- 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
링크
TAG
- iptime 2000au
- 블로그 이야기
- ipTIME
- C# 책
- 디스크 쓰기 금지되어 있습니다
- Node
- 책 소개
- readonly
- 창숨김 프로그램
- robot
- c#
- C#입문
- 블로그
- ROS2
- USB
- 창숨기기
- ubuntu
- c#.net
- C# 속으루..
- C 책
- 2000au
- c#초보
- 창숨김
- 블로그 개설
- C#책
- 블로그 공지
- 창숨김 다운
- 창숨기기 프로그램
- c#ㄱㄱ
- ROS2 설치
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함