ROS 下動態參數 .cfg 的配置與實現

功能簡介

動態配置文件 (dynamic_reconfigure) 提供了一種將 ros 節點內的參數暴露出來的方式。該接口可以讓用戶在節點運行時通過客戶端動態的調整參數,實時的觀察特定參數參數對節點內算法的影響。

常用命令

rqt_reconfigure

rosrun rqt_reconfigure rqt_reconfigure

命令行工具

$ rosrun dynamic_reconfigure dynparam list  # list configureable nodes 
$ rosrun dynamic_reconfigure dynparam get # get node configuration
$ rosrun dynamic_reconfigure dynparam set # configure node
$ rosrun dynamic_reconfigure dynparam set_from_parameters # copy configuration from parameter server
$ rosrun dynamic_reconfigure dynparam sdynparam dump # dump configuration to file
$ rosrun dynamic_reconfigure dynparam sdynparam load # load configuration from file

詳細介紹可以參考:【鏈接【教程 tutorial】

code 實現

創建 .cfg 文件

catkin_create_pkg --rosdistro ROSDISTRO dynamic_tutorials rospy roscpp dynamic_reconfigure
mkdir 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", "Tutorials"))

增加可執行權限

chmod a+x cfg/Tutorials.cfg

修改 cmakelist.txt

#add dynamic reconfigure api
#find_package(catkin REQUIRED dynamic_reconfigure)
generate_dynamic_reconfigure_options(
  cfg/Tutorials.cfg
  #...
)

# make sure configure headers are built before any node using them
add_dependencies(example_node ${PROJECT_NAME}_gencfg)

原文鏈接

c++ node 調用

#include <ros/ros.h>

#include <dynamic_reconfigure/server.h>
#include <dynamic_tutorials/TutorialsConfig.h>

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, "dynamic_tutorials");

  dynamic_reconfigure::Server<dynamic_tutorials::TutorialsConfig> server;
  dynamic_reconfigure::Server<dynamic_tutorials::TutorialsConfig>::CallbackType f;
   
  // bind 是一組重載的函數模板.用來向一個函數(或函數對象)綁定某些參數.bind的返回值是一個函數對象.
  f = boost::bind(&callback, _1, _2);
  server.setCallback(f);

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

boost::bind用法
原文鏈接

------------ 2020 .2 .12 ------------

----------- Turku . Finland -----------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章