動態參數設置(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