ROS 이해 : 매개 변수 서버 및 동적 매개 변수

하나, 프로그램의 getparam 및 param

1. getparam (기본값 없음)

bool getParam (const std::string& key, parameter_type& output_value)//返回值判断是否获取参数成功

그들 중 :

  • 핵심은 매개 변수 이름 (인터페이스와 동일, 주제와 유사), 이름 지정 방법 참조 : ros 이름 지정 (후속 학습 참조)
  • output_value는
    매개 변수 의 값을 저장하는 데 사용됩니다 . parameter_type 유형에는 bool, int, double, string 또는 특정 XmlRpcValue 유형이 포함됩니다. XmlRpcValue 유형에는 모든 유형 (목록 / 맵 포함)이 포함됩니다.

예를 들면 :

std::string s;
n.getParam("my_param", s);

2. 매개 변수 (기본값 있음)

int i;
n.param("my_num", i, 42);//默认参数为42

3. 매개 변수 삭제

n.deleteParam("my_param");

4. 프로그램에서 매개 변수 설정

n.setParam("my_param", "hello there");

5. 매개 변수 확인

이 단계는 필요하지 않습니다.

 if (!n.hasParam("my_param"))
 {
    
    
    ROS_INFO("No param named 'my_param'");
 }

6. 검색 매개 변수

예 : 매개 변수 서버의 매개 변수가 / a / b이고 NodeHandle이 / a / c 작업 공간에있는 경우, searchParam ()은 b를 검색 할 때 / a / b를 가져옵니다. / a / c /의 매개 변수 인 경우 b가 증가하면 검색은 / a / c / b 매개 변수를 얻습니다. 예는 다음과 같습니다.

 std::string param_name;
 if (n.searchParam("b", param_name))   {
    
         
 // Found parameter, can now query it using param_name     
 int i = 0;     
 n.getParam(param_name, i);   
 }   
 else   {
    
         
 ROS_INFO("No param 'b' found in an upward search");   
 }

2. 시작시 매개 변수 설정 방법

세 가지 유형이 있습니다 : param, rosparam, arg

Param

시작 파일에서 매개 변수를 설정합니다.

기본 위치 :
<node name =“node_keyboard_control”pkg =“keyboardControl”type =“node_keyboard_control”output =“screen”>
<param name =“linear_min”value =“0.3”/>
</ node>

全局 :
<param name =“use_gui”value = "$ (arg gui)"/>

으르렁 거리다

시작 파일에서 매개 변수를 설정합니다.

<rosparam file =“param.yaml”command =“load”/>

arg

launch의 구문과 유사하게 시작시 내부적으로 사용됩니다.

시작 파일에서 매개 변수를 설정합니다.

<arg name =“gui”default =“false”/>
<param name =“use_gui”value = "$ (arg gui)"/>
// 一起 使用

세 가지, 동적 매개 변수

때때로 ros의 파라미터만으로는 우리의 작업 요구 사항을 충족 할 수없는 경우가 있습니다. 예를 들어 로봇의 파라미터를 디버깅 할 때 파라미터를 동적으로 변경하여 로봇의 해당 응답을 관찰하기를 바랍니다. 그래서 다음으로 ros의 동적 매개 변수를 소개합니다.
ros의 동적 매개 변수는 토픽 게시 및 구독 양식과 유사하며 동적 매개 변수 파일이 구성되면 프로그램의 해당 매개 변수 만 구독하면됩니다.

구성 매개 변수 생성

  • ros 패키지 만들기

catkin_create_pkg dynamic_tutorials rospy roscpp dynamic_reconfigure

기능 패키지가 이미있는 경우 CmakeList.txt 및 package.xml에 dynamic_reconfigure 만 추가하면됩니다.

  • cfg 구성 파일
    만들기 함수 패키지의 src와 동일한 수준의 디렉터리에 cfg 폴더를 만들고 cfg에 my_cfg.cfg라는 파일을 추가합니다. 내용은 다음과 같습니다.
#!/usr/bin/env python
PACKAGE = "dynamic_tutorials"

from dynamic_reconfigure.parameter_generator_catkin import *

gen = ParameterGenerator()

gen.add("int_param",    int_t,    0, "An Integer parameter", 50,  0, 100)
gen.add("double_param", double_t, 0, "A double parameter",    .5, 0,   1)
gen.add("str_param",    str_t,    0, "A string parameter",  "Hello World")
gen.add("bool_param",   bool_t,   0, "A Boolean parameter",  True)

size_enum = gen.enum([ gen.const("Small",      int_t, 0, "A small constant"),
                      gen.const("Medium",     int_t, 1, "A medium constant"),
                      gen.const("Large",      int_t, 2, "A large constant"),
                      gen.const("ExtraLarge", int_t, 3, "An extra large constant")], "An enum to set size")

gen.add("size", int_t, 0, "A size parameter which is edited via an enum", 1, 0, 3, edit_method=size_enum)

exit(gen.generate(PACKAGE, "dynamic_tutorials", "my_cfg"))

파이썬 형태로 구현되어 있음을 알 수 있으며 구성 내용은 아래에서 간략하게 소개합니다.

매개 변수 생성기를 만듭니다.

gen = ParameterGenerator()

동적 구성 매개 변수 :

gen.add("int_param", int_t, 0, "An Integer parameter", 50, 0, 100)
gen.add("double_param", double_t, 0, "A double parameter", .5, 0, 1)
gen.add("str_param", str_t, 0, "A string parameter", "Hello World")
gen.add("bool_param",bool_t,0, "A Boolean parameter",  True)

동적 매개 변수의 실현 형태 : add (이름, 유형, 수준, 설명, 기본값, 최소, 최대).

  • name : 문자열로 설명되는 매개 변수 이름.
  • type : 매개 변수의 유형을 정의하며 int_t, double_t, str_t 또는 bool_t가 될 수 있습니다.
  • level : 콜백 함수에서 마스크를 동적으로 구성하려면 매개 변수를 전달해야합니다. 모든 매개 변수의 마스크는 콜백 함수에서 수정되어 매개 변수가 수정되었음을 나타냅니다.
  • 설명 : 매개 변수의 역할을 설명하는 문자열.
  • 기본값 : 매개 변수의 기본값을 설정합니다.
  • min : 선택 사항, 매개 변수의 최소값을 설정합니다. 문자열 및 부울 값에는 적용되지 않습니다.
  • max : 선택 사항, 매개 변수의 최대 값을 설정합니다. 문자열 및 부울 값에는 적용되지 않습니다.

열거 형의 동적 매개 변수 실현 형태 : size_enum = gen.enum ([gen.const ( "Small", int_t, 0, "A small constant"),
gen.const ( "Medium", int_t, 1, "A medium constant "),
gen.const ("Large ", int_t, 2,"A large constant "),
gen.const ("ExtraLarge ", int_t, 3,"An extra large constant ")],"크기를 설정할 열거 형 ")

gen.add ( "size", int_t, 0, "enum을 통해 편집되는 크기 매개 변수", 1, 0, 3, edit_method = size_enum)

C ++ 및 Python 관련 파일을 생성하고 프로그램을 종료합니다.

exit(gen.generate(PACKAGE, "dynamic_tutorials", "my_cfg"))
  • dynamic_tutorials : 패키지 이름
  • my_cfg : 생성 된 구성 파일의 이름 (구성 파일의 이름이 아닐 수 있지만 프로그램과 일치해야 함), 프로그램에 포함되어야하는 헤더 파일

서버 노드 생성

서버 노드, 즉 구독 노드, 코드는 다음과 같이 구현됩니다. 자세한 내용은 참고 사항을 참조하십시오.

#include <ros/ros.h>
#include <dynamic_reconfigure/server.h>//实现动态参数的头文件
#include <dynamic_tutorials/TutorialsConfig.h>//cfg生成的头文件

/****回调函数****/
void callback(dynamic_tutorials::TutorialsConfig &config, uint32_t level) {
    
    
  ROS_INFO("Reconfigure Request: %d %f %s %s %d", 
            config.int_param, config.double_param, 
            config.str_param.c_str(), 
            config.bool_param?"True":"False", 
            config.size);
}

int main(int argc, char **argv) 
{
    
    
    ros::init(argc, argv, "node_dy_param");

    dynamic_reconfigure::Server<dynamic_tutorials::TutorialsConfig> server;//创建了一个参数动态配置的服务端
    dynamic_reconfigure::Server<dynamic_tutorials::TutorialsConfig>::CallbackType f;
    f = boost::bind(&callback, _1, _2);//绑定回调
    server.setCallback(f);

    ROS_INFO("Spinning node");
    ros::spin();
    return 0;
}

CmakeList.txt의 내용을 늘리십시오.

add_executable(node_dy_param src/main.cpp)
target_link_libraries(node_dy_param ${
    
    catkin_LIBRARIES})
add_dependencies(node_dy_param ${
    
    ${
    
    PROJECT_NAME}_EXPORTED_TARGETS} ${
    
    catkin_EXPORTED_TARGETS})
add_dependencies(node_dy_param ${
    
    PROJECT_NAME}_gencfg)

운영

구독자 노드를 시작합니다.

$ roscore
$ rosrun dynamic_tutorials node_dy_param

게시 끝 노드를 실행합니다.

 rosrun rqt_reconfigure rqt_reconfigure

추천

출처blog.csdn.net/QLeelq/article/details/111060091