• ROS 动态参数 事实调参方式


    前言:

               开发者常常需要动态调整参数以查看机器人在不同参数下的性能表现; 无论是通过YAML 文件配置参数还是通过节点句柄操作参数,都会面临一个问题,如果节点不主 动查询参数值,就无法获取参数是否已经进行了更新。   

    解决办法:

                           ROS 通过 dynamic_reconfigure 程序包提供了动态参数这一功能。

    动态参数步骤

    步骤1:写 参数配置文件
    步骤2: CMakeLists文件修改配置
    步骤3: package.xml文件修改配置
    步骤4: 编译生成头文件
    步骤5: 创建回调函数
    步骤6: 利用rqt_reconfigure 调参

    一、参数配置文件

    编写动态参数配置 Python 脚本 .cfg
    添加 ParameterGenerator() 参数生成器
    gen.add(name, type, level, description, default, min, max)
    gen.generate(PACKAGE,pkgname,cfgname)
     
    1. name:参数名,使用字符串描述;
    2. type:定义参数的类型,可以是int_t, double_t, str_t, 或者bool_t;
    3. level:需要传入参数动态配置回调函数中的掩码,在回调函数中会修改所有参数的掩码,表示参数已经进行修改;
    4. description:描述参数作用的字符串;
    5. default:设置参数的默认值;
    6. min:可选,设置参数的最小值,对于字符串和布尔类型值不生效;
    7. max:可选,设置参数的最大值,对于字符串和布尔类型值不生效;
    1. #!/usr/bin/env python3
    2. PACKAGE = "example_2" #声明当前的包名
    3. from dynamic_reconfigure.parameter_generator_catkin import *
    4. gen = ParameterGenerator() #参数生成器调用变量gen
    5. gen.add("speed",int_t,0,"speed of car",50,0,120) #gen中添加 int 速度 默认 50 最小 0 最大 120
    6. gen.add("pkg",str_t,0,"package name","example_2") # 追加包的名字是example2
    7. size_enum = gen.enum([gen.const("Low",int_t,0,"low is 0"), # 枚举 低
    8. gen.const("Medium",int_t,1,"Medium is 1"), # 枚举 中
    9. gen.const("High",int_t,2,"Hight is 2")], # 枚举 高
    10. "Select from the list")
    11. gen.add("size",int_t,0,"Select from the list",1,0,2,edit_method=size_enum)
    12. exit(gen.generate(PACKAGE,"example_2","Test")) # 生成包 test 文件 关联配置文件的.h动态文件 跨语言的头文件

    对应的.cpp文件

    1. #include
    2. #include
    3. #include "example_2/TestConfig.h"
    4. void callback(example_2::TestConfig &cfg,uint32_t level){
    5. ROS_INFO("Reconfigure Request: ths speed is %d,%s,the size is %d, the level is %d",
    6. cfg.speed,
    7. cfg.pkg.c_str(),
    8. cfg.size,
    9. level
    10. );
    11. }
    12. int main(int argc, char **argv)
    13. {
    14. ros::init(argc, argv, "param");
    15. dynamic_reconfigure::Server server; // 服务端动态类型
    16. dynamic_reconfigure::Server::CallbackType f; // 绑定回调函数掩码
    17. //_1,_2为占位符,表示用实际的第一个、第二个参数替换
    18. f = boost::bind(&callback,_1,_2);
    19. server.setCallback(f);
    20. ros::spin(); // 不断监听回调函数
    21. return 0;
    22. }

    二、CMakeLists文件修改配置

    添加依赖包
    1. find_package(catkin REQUIRED COMPONENTS
    2. roscpp
    3. rospy
    4. std_msgs
    5. message_generation
    6. dynamic_reconfigure
    7. )
    8. #加载配置文件
    9. generate_dynamic_reconfigure_options(
    10. cfg/Test.cfg
    11. )

    三、package.xml文件修改配置

    <build_depend>message_generation</build_depend>

    四、利用rqt_reconfigure调参

    rosrun rqt_reconfigure rqt_reconfigure

    五、实际操作 

  • 相关阅读:
    前端:下载文件(多种方法)
    主键约束!
    3.2文法与语言
    ts使用记录
    且看五年开发码农,如何备战仨月硬刚字节面试官,轻松拿offer
    逆置链表(原地逆置链表)
    vscode远程linux安装codelldb
    Java8(JDK1.8)新特性
    十进制小数转换为单双精度浮点数方法
    Taurus .Net Core 微服务开源框架:Admin 插件【3】 - 指标统计管理 -【API、Redis、MemCache】
  • 原文地址:https://blog.csdn.net/weixin_44025389/article/details/126456225