一、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