前言:在节点外部改变参数的方式有:参数服务器、服务、主题以及动态参数。

1.新建cfg文件

在chapter2_tutorials包下新建cfg文件夹,在cfg文件夹下新建chapter2.cfg文件,添加如下代码:

#!/usr/bin/env python
PACKAGE = "chapter2_tutorials"

from dynamic_reconfigure.parameter_generator_catkin import *

gen = ParameterGenerator()  

gen.add("int_param", int_t, 0, "int parameter", 1, 0, 10)
gen.add("double_param", double_t, 0, "double parameter", .1, 0.0, 1.0)
gen.add("bool_param", bool_t, 0, "bool parameter", True)
gen.add("str_param", str_t, 0, "string parameter", "chapter2_tutorials")

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, "Hight is 2")],
                     "Select from the list")

gen.add("size", int_t, 0, "Select from the list", 1, 0, 3, edit_method=size_enum)

exit(gen.generate(PACKAGE, "chapter2_tutorials", "chapter2"))    

--------------------------------

其中:

gen = ParameterGenerator()  #创建一个动态参数生成器,后面就可以往该变量中添加可以动态配置的参数;
gen.add("int_param", int_t, 0, "int parameter", 1, 0, 10)  # (参数名,数据类型,回调函数掩码,参数说明,默认值,最小值,最大值);
exit(gen.generate(PACKAGE, "chapter2_tutorials", "chapter2"))    #用于生成头文件并退出程序(?,包名,头文件名称)。

吐槽:

不得不吐槽,《ROS机器人高效编程(原书第3版)》在最后一行“chapter2_”这里多了个"_",导致编译时总是找不到头文件!

2.获取权限

因为文件由ros自动执行,所以需要使用chmod命令使文件可由任何用户执行

chmod a+x cfg/chapter2.cfg

3.修改Cmakelist.txt文件

find_package(catkin REQUIRED COMPONENTS
 message_generation
 roscpp
 std_msgs
 dynamic_reconfigure)

 generate_dynamic_reconfigure_options(
   cfg/chapter2.cfg
      )

4.新建.cpp文件

在chapter2_tutorials包下新建example4.cpp文件,添加如下代码:

#include "ros/ros.h"
#include <dynamic_reconfigure/server.h>
#include <chapter2_tutorials/chapter2Config.h>

void callback(chapter2_tutorials::chapter2Config &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, "examole5_dynamic_reconfigure");
    dynamic_reconfigure::Server<chapter2_tutorials::chapter2Config> server;
    dynamic_reconfigure::Server<chapter2_tutorials::chapter2Config>::CallbackType f;
    f = boost::bind(&callback, _1, _2);
    server.setCallback(f);
    ros::spin();
    ;
}

5.修改cmake文件

add_executable(example41 src/example4.cpp)
target_link_libraries(example41 ${catkin_LIBRARIES})

6.运行

roscore
rosrun chapter2_tutorials example41
rosrun rqt_reconfigure rqt_reconfigure

--------------------------------

显示如下:

当调节滑动条后,显示显示如下:

马赛克$ rosrun chapter2_tutorials example41
[ INFO] [1546338804.944767450]: Reconfigure Request: 1 0.100000 chapter2_tutorials True 1
[ INFO] [1546338822.578500410]: Reconfigure Request: 1 0.370000 chapter2_tutorials True 1
[ INFO] [1546338824.890332107]: Reconfigure Request: 2 0.370000 chapter2_tutorials True 1

-END-

ROS-动态参数的更多相关文章

  1. vue-router2.0 组件之间传参及获取动态参数

    <li v-for=" el in hotLins" > <router-link :to="{path:'details',query: {id:el ...

  2. PYTHON 函数的动态参数

    #普通参数示例 def func(args): print(args) func(123456) #执行结果为123456 如果给多个参数,就会报错 #动态参数示例 def func(*args): ...

  3. 浅谈在静态页面上使用动态参数,会造成spider多次和重复抓取的解决方案

    原因: 早期由于搜索引擎蜘蛛的不完善,蜘蛛在爬行动态的url的时候很容易由于网站程序的不合理等原因造成蜘蛛迷路死循环. 所以蜘蛛为了避免之前现象就不读取动态的url,特别是带?的url 解决方案: 1 ...

  4. 函数动态参数实现format

    变量赋值一种是字符串格式化,一种是通过format的方式 1.字符串格式化 s="i am %s,age %d"%('Jasper',23)print(s) 打印输出:i am J ...

  5. python函数动态参数详解

    Python的动态参数: 1,参数前一个"*":在函数中会把传的参数转成一个元组. def func (*args): print(args) func(123,1,2,'a') ...

  6. Dynamic CRM 2013学习笔记(二十六)报表设计:Reporting Service报表 动态参数、参数多选全选、动态列、动态显示行字体颜色

    上次介绍过CRM里开始报表的一些注意事项:Dynamic CRM 2013学习笔记(十五)报表入门.开发工具及注意事项,本文继续介绍报表里的一些动态效果:动态显示参数,参数是从数据库里查询出来的:参数 ...

  7. Java vararg(动态参数)的应用

    可变参数在JDK 1.5添加,刚才知道的. 以下来自<Java泛型和集合>一书. 将参数打包成一个数组传入方法中是一件让人讨厌的事,在jdk1.5中加入了一个新的功能称为vararg(动态 ...

  8. javaScript动态参数

    javaScript是动态语言,那么动态参数的话也是与生俱来的, 在去取javaScript得参数用的是Arguments这个属性,去取 <script type="text/java ...

  9. python(3)-函数动态参数

    先来看一段代码 def show(*arg): print(arg, type(arg)) if __name__ == "__main__": show(1) show(1,2, ...

  10. 理解ROS的参数

    记住每次操作之前都要在一个单独的终端中运行ros的核心. roscore rosparam命令允许你在ROS的参数服务器上操作和存储数据,参数服务器可以存储整数,浮点数,布尔类型,字典,列表.ROS使 ...

随机推荐

  1. cropper+pillow处理上传图片剪裁(二)

    上次说到处理上传头像的方法是临时保存在本地,其实这样做并不妥,而且修改后的头像重新上传到model中也很麻烦,差了很多资料,解决了这个问题 大致思路:用户上传原图和修改数据—PIL修改后将图片保存为内 ...

  2. WordPress瀑布流主题PinThis中文版v1.6.8

    PinThis主题来源于英语网站http://pinthis.pixelbeautify.com/的汉化(语言文件+控制面板),中文版采用的是翻译器手工核对,并不完美,只对主题中文化,其他没做任何更改 ...

  3. 解决启动httpd报: apr_sockaddr_info_get() failed for错误

    我测试库里 service httpd start 时报 下面错误 httpd: apr_sockaddr_info_get() failed for fengxin.wzjzt.centoshttp ...

  4. winform右键菜单

    public partial class Form1 : Form { ContextMenuStrip cms; Bitmap bm ; public Form1() { InitializeCom ...

  5. jQuery访问json文件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 点击之后上传图片到页面 input type="file" 样式

    <!DOCTYPE html><head> <meta http-equiv="Content-Type" content="text/ht ...

  7. 【BZOJ3600】没有人的算术 - 替罪羊树+线段树

    题意: 题解: Orz vfleaking……真·神题 做法大概是先把题意中定义的“数”都赋一个实数权值,用平衡树来维护整个从大到小排序过的序列,再用线段树查询最值: 这样做为什么是对的?考虑插入一个 ...

  8. vue中数组变动更新检测

    Vue 包含两种观察数组的方法分别如下 1.变异方法 顾名思义,变异方法会改变被这些方法调用的原始数组,它们也将会触发视图更新,这些方法如下 push() pop() shift() unshift( ...

  9. Ubuntu中的Docker搭建Tensorflow环境

    一.docker环境安装 1)更新.安装依赖包 sudo apt-get update sudo apt-get install apt-transport-https ca-certificates ...

  10. js cookie 设置

    (function () { function getCookie(name) { var start = document.cookie.indexOf(name + "="); ...