turtlebot之ROS動態參數設置 dynamic reconfigure

動態參數設置(dynamic reconfigure):就是動態地調整、設置正在運行的節點的參數值,通過動態重配置,可以更加高效地開發和測試節點,特別是機器人硬件調試的時候,使用動態重配置參數是一個很不錯的選擇.
設置動態參數的語句:

rosrun rqt_reconfigure rqt_reconfigure

但是打開之後是空白的,其中裏面的點需要自己設計,設計步驟如下:
1、創建工作空間

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ..
catkin_make

初始化工作空間其實就是生成一個CMakeLists.txt 文件,會出現
Creating symlink “/home/cez/catkin_ws/src/CMakeLists.txt” pointing to “/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake”
正常現象
2、創建功能包

cd ~/catkin_ws/src
catkin_create_pkg custom_dynamic_reconfigure roscpp rospy std_msgs dynamic_reconfigure
cd ..
catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

3、在功能包添加動態重配置文件(.cfg)

roscd custom_dynamic_reconfigure
mkdir cfg && cd cfg
gedit Tutorials.cfg

在文件中添加一下代碼

#!/usr/bin/env python
# coding=UTF-8
PACKAGE = "dynamic_reconfigure"

from dynamic_reconfigure.parameter_generator_catkin import *

gen = ParameterGenerator() #創建一個參數生成器對象

#gen.add(參數名稱,         參數類型,  位掩碼,   參數描述,               默認值,   最小值,   最大值)
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, "custom_dynamic", "Tutorials")) 
#first parameter is namespace's name
#second parameter is node's name
#third parameter is the current file's name

然後對Tutorials.cfg添加權限操作

chmod a+x Tutorials.cfg

4、修改CMakeLists.txt文件
將CMakeLists.txt文件的內容修改爲如下所示:

cmake_minimum_required(VERSION 2.8.3)
project(custom_dynamic_reconfigure)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  dynamic_reconfigure
  roscpp
  rospy
  std_msgs
)

generate_dynamic_reconfigure_options(
  cfg/Tutorials.cfg
)
catkin_package(
  LIBRARIES custom_dynamic_reconfigure
  CATKIN_DEPENDS roscpp rospy std_msgs dynamic_reconfigure
)
include_directories(${catkin_INCLUDE_DIRS})

5、構建功能包,生成相關頭文件

cd ~/catkin_ws
catkin_make

6、在custom_dynamic_reconfigure/src/server.cpp中添加動態重配置節點

#include <ros/ros.h>
#include <dynamic_reconfigure/server.h>
#include "custom_dynamic_reconfigure/TutorialsConfig.h"

void callback(dynamic_reconfigure::TutorialsConfig &config)
{
  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, "custom_dynamic_server");

  dynamic_reconfigure::Server<dynamic_reconfigure::TutorialsConfig> server;
  dynamic_reconfigure::Server<dynamic_reconfigure::TutorialsConfig>::CallbackType f;

  f = boost::bind(&callback, _1); 
  server.setCallback(f);

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

添加權限

chmod a+x server.cpp

7、修改CMakeLists.txt文件
將CMakeLists.txt文件的內容修改爲如下:

cmake_minimum_required(VERSION 2.8.3)
project(custom_dynamic_reconfigure)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  dynamic_reconfigure
  roscpp
  rospy
  std_msgs
)

generate_dynamic_reconfigure_options(
  cfg/Tutorials.cfg
)
catkin_package(
  LIBRARIES custom_dynamic_reconfigure
  CATKIN_DEPENDS roscpp rospy std_msgs dynamic_reconfigure
)
include_directories(${catkin_INCLUDE_DIRS})
add_executable(custom_dynamic_server src/server.cpp)
add_dependencies(custom_dynamic_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(custom_dynamic_server ${catkin_LIBRARIES})

然後catkin_make編譯
上述代碼親測是沒有問題的,都是改過的,這裏記錄一下出現的問題
在這裏插入圖片描述
這個問題是在CMakeLists.txt中少了rospy

catkin_package(
  LIBRARIES custom_dynamic_reconfigure
  CATKIN_DEPENDS roscpp rospy std_msgs dynamic_reconfigure
)

在這裏插入圖片描述
這個錯誤是沒有發現server.cpp文件,但是確實在文件夾下,所以先對這個文件添加權限,然後把所有的包都關了重新catkin_make一下。
在這裏插入圖片描述
這個錯誤是沒有給Tutorials.cfg文件加權限
需要注意的是如果代碼中出現了中文,一定的加#coding=UTF-8

8、構建功能包,運行動態重配置服務器節點程序(每一次修改程序之後都需要catkin_make一下才會起作用)
一共需要打開三個終端
第一個

roscore

第二個

rosrun custom_dynamic_reconfigure custom_dynamic_server

第三個

rosrun rqt_reconfigure rqt_reconfigure

打開之後的界面如下:
滑動窗口數值會變
在這裏插入圖片描述
如果要改變gui界面,先改變Tutorials.cfg文件,例如

gen.add( "speed",    double_t,     0,     "A double parameter", 0.15,      0,       0.4)
gen.add( "a", double_t,  0,     "A double parameter",   1.0,      0,       2)
gen.add( "tolerance", double_t,  0,     "A double parameter",   0.01,      0,       0.1)
gen.add( "b", double_t,  0,  "A double parameter",   1.0,   0,  3)
gen.add( "str_param",    str_t,     0,     "A string parameter",   "success")
gen.add( "start_test",   bool_t,    0,     "A Boolean parameter",  True)

然後在server.cpp中回調它

ROS_INFO("Reconfigure Request: %f %f %f %f %s %s %d",
           config.speed,
           config.a,
           config.tolerance,
           config.b,
           config.str_param.c_str(),
           config.start_test?"True":"False",
           config.size);

不回調會出現這個錯誤:
在這裏插入圖片描述

感謝這位博主:https://blog.csdn.net/l1216766050/article/details/79575423

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