一、Cmake文件
阅读工程,首先点开CMakeLists 文件,会定义一些库和可执行文件。首先看可执行文件,rosrun的就是这个节点navigator
add_executable(navigator src/navigator.cpp src/RobotNavigator.cpp)
launch文件中写的也是这个节点,比如以下。name是自己取的,pkg是包的名字,type是cmake里可执行文件的名字(node的名字)
1 <node name="Navigator" pkg="csc_nav2d_navigator" type="navigator" output="screen"> 2 <rosparam file="$(find csc_nav2d_working)/param/navigator.yaml"/> 3 <rosparam file="$(find csc_nav2d_working)/param/global_costmap_params_scan.yaml" command="load" /> 4 </node>
比如点开navigator这个可执行文件,发现是一个main函数文件,编译后会变成可执行文件。
1 #include <ros/ros.h> 2 #include <csc_nav2d_navigator/RobotNavigator.h> 3 using namespace ros; 4 int main(int argc, char **argv) 5 { 6 ros::init(argc, argv, "Navigator"); 7 ros::NodeHandle n; 8 9 RobotNavigator robNav; 10 11 ros::spin(); 12 13 14 return 0; 15 }
二、cfg文件
官方文档见http://wiki.ros.org/dynamic_reconfigure/Tutorials
以下程序转载自https://blog.csdn.net/qq_31356389/article/details/79131175
1 #!/usr/bin/env python 2 PACKAGE = "ROS_Test1" 3 4 from dynamic_reconfigure.parameter_generator_catkin import * 5 6 gen = ParameterGenerator() 7 8 gen.add("int_param", int_t, 0, "int parameter", 1, 0, 10); 9 gen.add("double_param", double_t, 0, "double parameter", .1, 0.0, 1.0); 10 gen.add("bool_param", bool_t, 0, "bool parameter", True); 11 gen.add("str_param", str_t, 0, "string parameter", "ROS_Test1"); 12 13 size_enum = gen.enum([ gen.const("Low", int_t, 0, "Low is 0"), 14 gen.const("Medium", int_t, 1, "Medium is 1"), 15 gen.const("High", int_t, 2, "Hight is 2")], 16 "Select from the list") 17 18 gen.add("size", int_t, 0, "Select from the list", 1, 0, 3, edit_method=size_enum) 19 20 exit(gen.generate(PACKAGE, "ROS_Test1", "Test1_"))
解读:
第2行 :ROS_Test1 为要配置动态参数的包的名字
第4、6行:导入参数生成器。
第8-18行:添加动态参数:
gen.add(name, type, level, description, default, min, max)
name: 参数的名称
type: 参数类型
level:一个传递给回调的位掩码
description: 一个描述参数
default: 节点启动的初始值
min: 参数最小值
max: 参数最大值
第13行:定义一个整数,其值由枚举设置。为此,调用gen.enum并将其传递给常量列表,后跟该枚举的描述。定义完成后可以将参数设置为“Low”或“Medium”,而不是0或1。
第20行:生成必要的文件并退出。第二个是可以运行的节点的名称(仅用于生成文档),就是改成自己的包的名字。第三个参数是生成的文件将获得的名称前缀,例如<name>Config.h或者<name>Config.py 。
再举个例子:转载至https://blog.csdn.net/u010945141/article/details/81225087
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 # 指定包名 5 PACKAGE = "dynamic_tutorials" 6 7 from dynamic_reconfigure.parameter_generator_catkin import * 8 9 # 生成参数配置实例 10 gen = ParameterGenerator() 11 12 # 设置参数 13 # add(self, name, paramtype, level, description, default=None, min=None, max=None, edit_method='') 14 # @paramtype: 支持4类 int_t, double_t, str_t, bool_t 15 # @level: 还不太清楚这个参数的用法 16 gen.add("int_param", int_t, 0, "An Integer parameter", 50, 0, 100) 17 gen.add("double_param", double_t, 0, "A double parameter", .5, 0, 1) 18 gen.add("str_param", str_t, 0, "A string parameter", "Hello World") 19 gen.add("bool_param", bool_t, 0, "A Boolean parameter", True) 20 21 # 通过enum设置枚举型参数 22 size_enum = gen.enum([ gen.const("Small", int_t, 0, "A small constant"), 23 gen.const("Medium", int_t, 1, "A medium constant"), 24 gen.const("Large", int_t, 2, "A large constant"), 25 gen.const("ExtraLarge", int_t, 3, "An extra large constant")], 26 "An enum to set size") 27 28 gen.add("size", int_t, 0, "A size parameter which is edited via an enum", 1, 0, 3, edit_method=size_enum) 29 30 # 生成必要文件并退出程序 31 # generate(pkgname, nodename, name) 32 # 第二个参数是使用这个配置文件的节点名(只是用来生成文档) 33 # 第三个参数必须与配置文件同名 34 exit(gen.generate(PACKAGE, "dynamic_tutorials", "Tutorials"))
注意:看到这里,突然想到功能包编译过程中经常报cfg的错误,这个时候就需要给cfg文件加权限,格式如下:
chmod +x 包含路径的文件名
ok