ROS动态参数设置

目录

编程平台和ROS版本:

Ubuntu16.04     ROS-Kinetic

1.为什么进行动态参数设置?

动态参数设置相当于在运行的ROS节点中添加了一个服务端,使用者可以通过客户端动态的对服务端进行请求,从而修改ROS节点中相关变量的参数值。

2.如何进行动态参数设置

2.1前期配置

ROS的动态配置脚本是用python编写的,因此在新建功能包的时候需要依赖rospy包。即在package的CmakeLists.txt中添加如下代码:

find_package(catkin REQUIRED COMPONENTS
…
rospy
)
catkin_package(
…
CATKIN_DEPENDS ro

同时在XML中添加如下代码:

<build_depend>rospy</build_depend>
<build_export_depend>rospy</build_export_depend>
<exec_depend>rospy</exec_depend>

接下来需要编写配置文件脚本,配置文件负责确定需要动态设置参数的数量、类型以及取值范围。

2.2编写脚本

在ROS的package包中新建一个文件夹命名为cfg,该文件用于放置配置文件脚本。配置文件以.cfg为扩展名。下面以名为car_param.cfg的配置文件进行介绍说明,文件源码如下:

#!/usr/bin/env python
PACKAGE = "internet_test"
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()
gen.add("double_param",double_t,0,"A double parameter",0.1,0,1)
gen.add("str_param",str_t,0,"A string parameter","internet_test")
gen.add("int_param",int_t,0,"An int parameter",1,0,100)
gen.add("bool_param",bool_t,0,"A bool parameter",True)
size_enum = gen.enum([gen.const("Low",int_t,0,"Low is 0"), gen.const(" Medium ", int_t,1 , " Medium is 1 "), gen.const("High",int_t,2,"High is 2")],"Select from the list")
gen.add("size",int_t,0,"Select from the list",1,0,2,edit_method=size_enum)
exit(gen.generate(PACKAGE,"internet_test","Test1_"))

修改cfg文件的权限

chmod a+x car_param.cfg(或 chmod 777 car_param.cfg)

下面对代码进行分段说明:

#!/usr/bin/env python

该行代码表明该配置文件是用python编写的脚本

PACKAGE = “internet_test”

该行代码表示该动态配置文件所属的包的名称.

from dynamic_reconfigure.parameter_generator_catkin import *

该行代码用来引入动态参数配置的功能包
gen = ParameterGenerator()
定义参数生成器

gen.add("double_param",double_t,0,"A double parameter",0.1,0,1)
gen.add("str_param",str_t,0,"A string parameter","internet_test")
gen.add("int_param",int_t,0,"An int parameter",1,0,100)
gen.add("bool_param",bool_t,0,"A bool parameter",True)
size_enum = gen.enum([gen.const("Low",int_t,0,"Low is 0"), gen.const(" Medium ", int_t,1 , " Medium is 1 "), gen.const("High",int_t,2,"High is 2")],"Select from the list")
gen.add("size",int_t,0,"Select from the list",1,0,2,edit_method=size_enum)

该段代码定义了double,str,int,bool,enum类型动态变量的添加方法。下面对add函数的原型进行介绍:
gen.add(name, type, level, description, default, min, max)

  • name: 表示变量的名称
  • type: 表示变量的类型
  • level:在回调函数中的掩码,用于区别不同的变量,默认写0
  • description: 对变量的简短描述
  • default: 变量的默认取值
  • min: 变量的最小值
  • max: 变量的最大值

需要注意的是字符串类型和bool类型的变量没有最大值和最小值这一项。同时在添加枚举变量的时候,需要在最后添加edit_method=size_enum这一项,size_enum表示枚举变量的名称。
exit(gen.generate(PACKAGE,”internet_test”,”Test1_”))
该行代码表示退出动态参数配置脚本,第三个参数Test1_表示生成的头文件的前缀。

2.3文件预编译

脚本编写完成之后需要对CmakeLists.txt进行配置
在功能包中添加对应依赖项:

find_package(catkin REQUIRED COMPONENTS
....
dynamic_reconfigure
)

配置动态参数文件的位置:

generate_dynamic_reconfigure_options(
cfg/car_param.cfg
)

通过过上述配置之后进行catkin_make编译,参数配置文件会生成对应的头文件:
Test1_Config.h

2.4编写节点程序

节点文件名称为:dynamic.cpp

#include <ros/ros.h>
#include <internet_test/Test1_Config.h>
#include <dynamic_reconfigure/server.h>
void callback(internet_test::Test1_Config &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, "reconfigure_test");
    dynamic_reconfigure::Server<internet_test::Test1_Config> server;
    dynamic_reconfigure::Server<internet_test::Test1_Config>::CallbackType f;
    f = boost::bind(&callback,_1,_2);
    server.setCallback(f);
    ros::spin();
    return 0;
}

节点文件的原理就是通过给动态参数的服务器绑定对应的回调函数,从而实现对参数的动态设置。(动态参数的服务器端,及回调函数的参数意义有待进一步深入研究。)

2.5节点文件的配置及运行

在CmakeLists.txt中添加对应的节点配置:

add_executable(dynamic src/dynamic.cpp)
add_dependencies(dynamic internet_test_gencfg ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(dynamic
${catkin_LIBRARIES}
)

运行动态配置节点,首先运行roscore,然后运行rosrun internet_test dynamic
最后运行rqt 或者rosrun rqt_console rqt_console
动态配置参数的rqt界面如下图所示。

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2022年5月23日 下午12:18
下一篇 2022年5月23日

相关推荐