【ROS】同一节点发布订阅话题,并动态配置参数

直接定义发布者和订阅者,将回调函数指明清楚就行。

class Detect_Color
    image_sub_ = it_.subscribe("/zed/rgb/image_rect_color", 1,&Detect_Color::updateImage, this);
    image_pub_ = it_.advertise("/image_converter/output_raw", 1);
    threshold_pub_ = it_.advertise("/image_convert/output_threshold",1)

动态配置参数时,根据网络上的众多转发教程,写配置文件,代码中添加boost,重点是cmakelist与package.xml的编写
http://wiki.ros.org/dynamic_reconfigure/Tutorials/SettingUpDynamicReconfigureForANode(cpp)


看一下教程内的代码

#include 

#include 
#include 

void callback(dynamic_tutorials::TutorialsConfig &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, "dynamic_tutorials");
  
 //<  >中是自己的package_name::node_name
  dynamic_reconfigure::Server server; 
  dynamic_reconfigure::Server::CallbackType f;

  f = boost::bind(&callback, _1, _2);
  server.setCallback(f);

  ROS_INFO("Spinning node");
  ros::spin();
  return 0;
}

这段代码是写在主函数中的,我写在自定义的类中,所以f = boost::bind(&callback, _1, _2);中的callback需要加上类名解析。
我的callback是直接修改类中的一个成员的

nh_.getParam("H1",range_hsv[0]); 

所以在callback中我直接使用nodehandle调取修改过的参数“H1”赋值给一个成员变量。
由于我们同时订阅与发布话题,所以主循环中使用ros::spinOnce()
还有一点,include中的dynamic_tutorials/TutorialsConfig.h,后面是在config文件中最后自己设置的名称

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

from dynamic_reconfigure.parameter_generator_catkin import *

gen = ParameterGenerator()

gen.add("H1",    int_t,    0, "An Integer parameter", 0, 0, 180)
gen.add("S1",    int_t,    0, "An Integer parameter", 0, 0, 255)
gen.add("V1",    int_t,    0, "An Integer parameter", 0, 0, 255)
gen.add("H2",    int_t,    0, "An Integer parameter", 0, 0, 180)
gen.add("S2",    int_t,    0, "An Integer parameter", 0, 0, 255)
gen.add("V2",    int_t,    0, "An Integer parameter", 0, 0, 255)


exit(gen.generate(PACKAGE, "ros_cutball", "hsv_"))

我使用这个的原因是图像调整hsv的阈值用于颜色检测。我这里改成"hsv_",最后就是 #include
最后最好自己写个launch文件,把自己的参数yaml文件加入进去,方便调参


还有个问题,当编译后,运行节点,运行zed相机的launch文件,打开$rosrun rqt_reconfigure rqt_reconfigure
发现;里面没有我的节点的动态修改文件界面,查阅zed相机功能包的节点动态参数源代码的编写,将动态参数配置的代码改为

	//boost::shared_ptr> mDynRecServer;
    mDynRecServer = boost::make_shared>();
    dynamic_reconfigure::Server::CallbackType f;
    
    f = boost::bind(&Detect_Color::hsv_update,this, _1, _2);
    mDynRecServer->setCallback(f);

然后就ok了,具体为什么我也不太清楚。
【ROS】同一节点发布订阅话题,并动态配置参数_第1张图片


备注一下问题,第一次动态参数的bind中的回调函数没有指明正确,出现了有关boost一类的报错,最终查明。由于指针类型的原因,回调函数的参数格式一定要是教程中的类型。


还有一些cmakelist和package.xml的问题

find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  roscpp
  rospy
  sensor_msgs
  std_msgs
  dynamic_reconfigure
  image_transport
)
generate_dynamic_reconfigure_options(
  cfg/Tutorials.cfg
)

这个要写在紧随findpackage之后

  dynamic_reconfigure
  dynamic_reconfigure

加在xml里
还有有关ros的一些注意事项,用到的msg和package都记得加在这两个文件中,否则编译时会出现找不到引用一类的错误,那么就是有些用到的东西没有添加进去。


记录一下,希望对大家有所帮助。

你可能感兴趣的:(问题记录,ROS)