直接定义发布者和订阅者,将回调函数指明清楚就行。
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);
备注一下问题,第一次动态参数的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都记得加在这两个文件中,否则编译时会出现找不到引用一类的错误,那么就是有些用到的东西没有添加进去。
记录一下,希望对大家有所帮助。