@danren-aa120
2020-09-21T02:26:59.000000Z
字数 4633
阅读 342
ROS
一、package.xml 文件
在package中,存在package.xml文件,此文件主要是描述当前package的一些信息。
1、基本结构
package
/package
2、标签
name -功能包的名字
version -功能包的版本
description - 功能包内容的描述
maintainer - 功能包的创建于维护者
license - 软件发行版通行证 (例如: GPL, BSD, ASL)
3、依赖
一共有四种依赖包
buildtool_depend - 指定编译此功能包的编译系统工具
build_depend - 指定编译此功能包需要的其他功能包,可以是功能包中的头文件、链接库、其他源文件。
run_depend或exec_depend - 指定运行此功能包代码需要的其他功能包。
test_depend - 指定单元测试需要的其他功能包
4、Metapackages
当一个功能包中包含好几个子功能包时使用。
在 package.xml中有如下代码:
export
metapackage /
/export
5、那么,对应的CMakelist.txt 内容如下:
cmake_minimum_required(VERSION 2.8.3)
project()
find_package(catkin REQUIRED)
catkin_metapackage()
二、launch文件
在规模比较大的程序中,常常有几个或者几十个节点(可执行程序),这些节点之间彼此互有联系,协同达到软件正确执行的目的。这时候再使用rosrun命令的话,就会比较麻烦。此时,roslaunch命令闪亮登场了,它可以运行多个节点。并且roslaunch命令在运行节点时,还可以附加一些ROS命令选项,比如修改参数或节点的名称,设置节点的命名空间,设置ROS_ROOT及ROS_PACKAGE_PATH,以及环境变量修改等选项的ROS命令。
roslaunch命令的使用,需要先创建一个XML格式的xxx.launch文件,将要运行的节点以及系统中相关参数设置信息写在这个launch文件中,然后执行这个launch文件就可以了。【这里可以理解为launch文件就是一个脚本文件,要执行的操作都写在脚本文件中,执行脚本文件就OK了。】
roslaunch命令执行格式:
roslaunch 功能包名称 launch文件 [参数设置]
在launch标签中,描述了使用roslaunch命令运行节点所需的标签。arg描述了系统运行中所需要的参数。node描述了roslaunch运行的节点,选项包括pkg、type和name。
arg中的name表示参数的名称,default表示参数默认的值。如果需要设置别的值,可以在roslaunch命令中加入节点名。
node中pkg、type、name字段(这3个字段必须有)含义如下:
pkg 功能包名称。
type 实际运行的节点的名称(程序文件节点名)。
name 与上述type对应的节点被运行时,起的名称(运行名)。一般情况下使用与type相同的名称,但可以根据需要,在运行时更改名称。
launch文件中其他
launch 指roslaunch语句的开始和结束。
node 这是对于节点运行的标签。您可以更改功能包、节点名称和执行名称。
machine 可以设置运行该节点的PC的名称、address、ros-root和ros-package-path。
include 您可以加载属于同一个功能包或不同的功能包的另一个launch,并将其作为一个launch文件来运行。
remap> 可以更改节点名称、话题名称等等,在节点中用到的ROS变量的名称。例如:
env> 设置环境变量,如路径和IP(很少使用)。
param> 设置参数名称、类型、值等。
rosparam> 可以像rosparam命令一样,查看和修改load、dump和delete等参数信息。
group> 用于分组正在运行的节点。
test> 用于测试节点。类似于,但是有可以用于测试的选项。
arg> 可以在launch文件中定义一个变量,以便在像下面这样运行时更改参数。
三、CMakeLists.txt
1 CMakeLists.txt是在创建Package时自动生成的,不需要我们去写。
2 阅读工程,首先点开CMakeLists文件,会定义一些库和可执行文件。首先看可执行文件,rosrun的就是这个navigator节点:
3 add_executable(navigator src/navigator.cpp src/RobotNavigator.cpp)
4 launch文件中写的也是这个节点,比如以下。name是自己取的,pkg是包的名字,type是cmake里可执行文件的名字(node的名字)
node name="Navigator" pkg="csc_nav2d_navigator" type="navigator" output="screen"
rosparam file="$(find csc_nav2d_working)/param/navigator.yaml"
rosparam file="$(find csc_nav2d_working)/param/global_costmap_params_scan.yaml" command="load" /
/node>
5 比如点开navigator这个可执行文件,发现是一个main函数文件,编译后会变成可执行文件。
四、yaml
.yaml是参数配置文件。
1如果想要载入参数,可以通过编写yaml文件,然后在launch文件中加入
2示例:yaml文件里的内容为:
bool_param: true
int_param: 2
double_param: 0.5
str_param: "123"
简单的yaml文件读写操作示例看https://blog.csdn.net/u014610460/article/details/79508869
五、cfg文件
是动态参数配置文件。
初始参数设置
有两种方法设置初始参数:
一个通过launch文件来设置
一个通过命令行来设置
例如:
roslaunch aruco_ros single.launch markerId:=26 markerSize:=0.08 eye:="right"
参数动态配置
动态重配置参数:就是动态地调整、设置正在运行的节点的参数值(它们允许用户不仅在启动时修改变量,还能在运行过程中修改变量。我们已经创建了一个文件中指定的变量可动态重新配置服务器。),通过动态重配置,可以更加高效地开发和测试节点,特别是机器人硬件调试的时候,使用动态重配置参数是一个很不错的选择.
cfg示例:
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: 参数类型,支持4类 int_t, double_t, str_t, bool_t
level:一个传递给回调的位掩码
description: 一个描述参数
default: 节点启动的初始值
min: 参数最小值
max: 参数最大值
第13行:定义一个整数,其值由枚举设置。为此,调用gen.enum并将其传递给常量列表,后跟该枚举的描述。定义完成后可以将参数设置为“Low”或“Medium”,而不是0或1。
第20行:生成必要的文件并退出。第二个是可以运行的节点的名称(仅用于生成文档),就是改成自己的包的名字。第三个参数是生成的文件将获得的名称前缀,例如Config.h或者Config.py 。
2.编辑CMakeLists.txt文件
加入以下代码
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
dynamic_reconfigure
)
generate_dynamic_reconfigure_options(
cfg/ROS_Test1_cfg.cfg
)
3.编辑cpp文件
roscd ROS_Test1
vim node_e.cpp
编辑内容如下所示
。# include "ros/ros.h"
。#include
。#include
void callback(ROS_Test1::Test1_Config &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, "node_e_dynamic_reconfigure");
dynamic_reconfigure::Server server;
dynamic_reconfigure::Server::CallbackType f;
f = boost::bind(&callback, _1, _2);
server.setCallback(f);
ros::spin();
return 0;
}
4 编译运行
cd ~/catkin_ws
catkin_make
roscore
新开终端执行:
cd ~/catkin_ws
source devel/setup.bash
roslaunch ROS_Test1 Test1_node_e
新开终端执行:
rosrun rqt_console rqt_console
运行结果如下所示: