目录

1、ROS的结构和通信机制
ROS结构
ROS常用命令
ROS工作空间文件结构
工作空间


1、ROS的结构和通信机制

ROS结构

ROS中有一些很重要的概念,节点,节点管理器、工作空间、功能包

节点(node)

在机器人系统中,需要同时实现多个功能,例如我想让机器人实现跟踪射击,那么可以拆分成,镜头跟踪,调整枪的位置,开枪射击。那么这里需要实现三个节点,每一个节点实现一个功能,每个节点对应功能包中的一个可执行文件。

节点管理器

节点通过节点管理器报告注册信息,只有通过节点管理器,节点和节点之间才能建立起联系,只有通过节点管理器注册,才能实现后续的节点间的通信。

工作空间

简单来说,工作空间就是一个文件夹,用于是存放工程开发的相关文件,类似用Keil整个IDE开发STM32时,会有一个工程文件,文件下包含头文件,编译过程生成的文件,源码等等。关于工作空间的详细结构可以看后面的详细介绍。

功能包

功能包时放置源码的最小单元。源码(.cpp文件或者.py文件)必须放在功能包里面,功能包的路径一定要在src的路径下。除了源码文件,功能包还可以放置.cpp的.h文件launch文件、param参数文件,map地图文件。关于功能包的详细介绍可以看下面。

ROS常用命令

roscore:启动ROS

使用ROS的第一件事就是运行roscore命令,roscore启动master,master负责ros的节点注册,参数服务器、话题通信管理等等。

rosnode:是用于获取节点信息的命令

rosnode ping   测试到节点的连接状态

rosnode list     列出活动节点

rosnode info  打印节点信息

rosnode machine        列出指定设备上的节点

rosnode kill                 杀死某个节点

rosnode cleanup                清除不可连接的节点

清除无用节点,启动乌龟节点,然后 ctrl + c 关闭,该节点并没被彻底清除,可以使用 cleanup 清除节点

rostopic:包含rostopic命令行工具,用于显示有关ROS主题的调试信息,包括发布者、订阅者、发布频率和ROS消息,它还包含一个实验性Python库,用于动态获取有关主题的信息并交互。

rostopic bw                 显示主题使用的带宽

rostopic delay             显示带有header的主题延迟

rostopic echo              打印消息到屏幕

rostopic find                根据类型查找主题

rostopic hz                  显示主题的发布频率

rostopic info                显示主题有关的信息

rostopic list                 显示所有活动状态下的主题

rostopic pub                将数据发布到主题

rostopic type               打印主题类型

rosmsg:是用于显示有关ROS消息类型的信息的命令行工具

rosmsg  show                        显示消息描述

rosmsg  info                        显示消息信息

rosmsg list                         列出所有消息

rosmsg md5                        显示md5加密后的消息

rosmsg package                显示某个功能包下的所有消息

rosmsg packages                列出包含消息的功能包 

rosservice:包含用于列出和查询ROSService的rosservice的命令行工具

rosservice args                 打印服务参数

rosservice  call                使用提供的参数调用服务

rosservice  find                按照服务类型查找服务

rosservice  info                打印有关服务的信息

rosservice  list                        列出所有活动的有关服务

rosservice  type                打印服务类型

rosservice  uri                打印服务的ROSRPC URI

rossrv:是用于显示有关ROS服务类型的信息的命令行工具,与rosmsg使用语法高度相似

rossrv show                        显示服务消息详情

rossrv info                         显示服务消息相关信息

rossrv list                        列出所有服务信息

rossrv md5                        显示md5加密后的服务消息

rossrv package                显示某个包下所有服务消息

rossrv packages                显示包含服务消息的所有包

rosparam:包含rosparam命令行工具,用于使用YAML编码文件在参数服务器上获取和设置ROS参数

rosparam set                 设置参数

rosparam get                 获取参数

rosparam load                从外部文件加载参数

roaparam dump                将参数写出到外部文件

rosparam delete                删除参数

rosparam list                 列出所有参数

 这里我对回调函数的理解不够深入,这里再说明一下。

订阅话题:订阅者接收话题信息的过程类似于STM32的外部中断。当接收到数据时,进入回调函数,在回调函数中对接收到的数据进行处理。

例如

void chatterCallback(const topic::type &my_msg)
{
int grade;
ROS_INFO_STREAM(“I got new msg”);
grade=my_msg.grade;
}

ROS工作空间文件结构

工作空间


ROS需要在工作空间的环境下运行,工作空间简单来说是一个文件夹,里面装载了ROS的工程项目,其中包含3个文件夹:src、devel、build。在工作空间下的三个文件夹中,src文件夹是我们重点需要去理解的,其中功能包就是放在src路径下的,如下图所示

这里顺便提下,使用C++开发ROS需要在工作空间下编译源码生成可执行文件,编译的指令是在工作空间路径下执行:catkin_make

功能包

为了更好的区分实现不同代码的空间,可以将实现不同功能的文件独立成每一个功能包,这样可以方便管理哦

下面我们以“turn_on_wheeltec_robot”这个功能包讲解下功能包的结构,可以看到这个功能包的路径下包含多个文件夹。

include文件夹

include路径下包含的是cpp文件的头文件,类似于C语言里面的.h文件,如下图所示

launch文件夹

launch路径下包含的是.launch文件,launch文件里面封装好了要运行的节点,写入的参数,加载的参数文件等。rosrun 命令每次只能运行一个节点,当运行一个机器人时要同 第 11 页 共 13 页 时运行多个节点就需要用到 roslaunch 了,roslaunch 命令运行一个 launch 文件, 一个 luanch 文件可以包多个节点。 如果需要运行下面的 navigation_top_diff.launch 文件,如图 2-2-4 所示,用的 指令是“roslaunch turn_on_wheeltec_robot navigation_top_diff.launch”。运行 launch 文件的指令的结构是:[roslaunch][空格][功能包名][空格][launch 文件名] 

运行roslaunch 命令不需要运行roscore,运行roslaunch命令时,会自动检测是否开启了roscore,如果没有开启则自动开启roscore。

launch文件的语法如下:

XML文件必须要包含一个根元素,launch文件中的根元素采用<launch>标签定义,文件中的其他内容都必须包含在这个标签之中“

<launch>

...

</launch>

启动 ROS 系统的核心是启动 ROS 节点,采用标签定义,语法如下: 启动一个节点至少需要三个属性:name、pkg 和 type。 name:属性定义节点运行的名称,可自定义; pkg:属性定义节点所在的功能包名称; type:属性定义节点的可执行文件名称,也可以是.py 文件; 关于参数设置的标签元素有两个:、分别代表 parameter 和 argument。param 和 arg 的作用都是写入参数,但是 param 是 ROS 系统运行中的 参数,存储在参数服务器中。在 launch 文件中可以通过标签加载 param 

launch 文件执行后,param 就加载到 ROS 的参数服务器上了。 arg 标签用来在 launch 文件中定义参数,arg 和 param 在 ROS 里有根本性的 区别,就像局部变量和全局变量的区别一样。arg 不储存在参数服务器中,不能 提供给节点使用,只能在 launch 文件中使用。param 则是储存在参数服务器中, 可以被节点使用。 我们注意到,launch 文件夹里面还有一个 inculde 文件夹,这个文件夹主要 是 存 放 一 些 被 其 他 launch 文 件 调 用 的 launch 文 件 。 如 图 2-2-5 所 示 是 navigation_4wheel_diff.launch 文件的内容。

map文件夹

map 路径下放的是激光雷达建好的地图文件,一个地图包含一个.pgm 和一 个.yaml 文件。其中.pgm 是图片文件,图片的内容就是地图,yaml 是参数文件, 记录一些坐标参数以及跟.pgm 文件进行绑定。如果直接以文本的形式打开.pgm 文件会显示成乱码,用图片编辑器打开就可以看到一张建好的地图,如图 2--2-6 所示。

param文件夹

param路径下存放的是.yaml的参数文件,对于一个机器人系统而言,会有很多参数,如果每个参数都是在CPP文件中,更改起来会很麻烦,因为这些文件修改之后需要编译。因此会有参数集中放置的文件,运行时只需要加载参数文件就可以了。如果修改也只需要保存之后,即可重新运行。

costmap_common_params:机器人外形、导航参数; dwa_local_planner_params:局部路径规划器参数,有一些机器人里面使用 tel_local_planner_params; Global_costmap_params:建图得到的地图文件调用参数; Local_costmap_params:机器人导航时的实时地图参数; Move_base_params:机器人导航路径规划相关参数; Wheeltec_smoother:机器人平滑控制参数,主要是对速度、加速度进限制。

src

src路径下的是该功能包的.cpp文件,CPP文件里面的内容是该功能包需要实现的功能

scripts文件夹

放置可能直接运行的python文件

CMakeLists.txt文件

编译器编译功能包的规则和功能包清单。

Wheeltec_udev.sh文件按

串口号固定脚本文件,用于给USB外设创建固定的别名。