ROS大型工程学习(一) 必须了解的基本文件

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

博文主要是总结自己的学习,因此有很多知识点没有提到,仅仅提了个人比较容易遗忘的或者非常重要的知识点。很多资料来源于网络和对一些课程的整理,侵权删。格式没花精力调整,望谅解。
原文地址:https://www.cnblogs.com/JuiceCat/p/12049454.html