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)
 
name:参数名,使用字符串描述;

type:定义参数的类型,可以是int_t, double_t, str_t, 或者bool_t;

level:需要传入参数动态配置回调函数中的掩码,在回调函数中会修改所有参数的掩码,表示参数已经进行修改;

description:描述参数作用的字符串;

default:设置参数的默认值;

min:可选,设置参数的最小值,对于字符串和布尔类型值不生效;

max:可选,设置参数的最大值,对于字符串和布尔类型值不生效;
#!/usr/bin/env python3 
PACKAGE = "example_2"                                               #声明当前的包名
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()                                          #参数生成器调用变量gen
gen.add("speed",int_t,0,"speed of car",50,0,120)                    #gen中添加  int 速度   默认 50 最小 0 最大 120 
gen.add("pkg",str_t,0,"package name","example_2")                   # 追加包的名字是example2   
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,2,edit_method=size_enum)
exit(gen.generate(PACKAGE,"example_2","Test"))                     # 生成包 test 文件   关联配置文件的.h动态文件  跨语言的头文件

对应的.cpp文件

#include 
#include 
#include "example_2/TestConfig.h"

void callback(example_2::TestConfig &cfg,uint32_t level){
  ROS_INFO("Reconfigure Request: ths speed is %d,%s,the size is %d, the level is %d",
           cfg.speed,
           cfg.pkg.c_str(),
           cfg.size,
           level
           );
}
int main(int argc, char **argv)
{
  ros::init(argc, argv, "param");
  dynamic_reconfigure::Server server;          // 服务端动态类型
  dynamic_reconfigure::Server::CallbackType f; // 绑定回调函数掩码
  //_1,_2为占位符,表示用实际的第一个、第二个参数替换
  f = boost::bind(&callback,_1,_2);
  server.setCallback(f);
  ros::spin();                             // 不断监听回调函数
  return 0;
}

二、CMakeLists文件修改配置

添加依赖包
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
dynamic_reconfigure
)

#加载配置文件
generate_dynamic_reconfigure_options(
cfg/Test.cfg
)

三、package.xml文件修改配置

message_generation

四、利用rqt_reconfigure调参

rosrun rqt_reconfigure rqt_reconfigure

五、实际操作 

ROS 动态参数 实时调参方式_第1张图片

ROS 动态参数 实时调参方式_第2张图片

你可能感兴趣的:(Ros,基本操作理论基础,及,Vscode调试保姆级教程,vscode,学习,ide)