zl程序教程

您现在的位置是:首页 >  工具

当前栏目

ROS入门21讲笔记(一)基本概念

笔记入门 21 基本概念 ros
2023-09-27 14:27:31 时间

一、核心概念

1.1 节点(Node)和节点管理器(ROS Master)

节点是什么?

  • 完成某个任务的进程
  • 节点名具有唯一性

节点管理器可以做什么?

  • 节点的注册和命名
  • 完成、记录节点之间的通信
  • 参数服务器(运行时参数)

1.2 话题通信和服务通信

话题最常见的地方就是微博了吧,它是关于某件事情的讨论、关注的一种信息交流方式。你可以随时发布新的帖子,但是订阅者什么时候接收不是你控制的,订阅者都是在恰当的时候点击刷新还是什么的获取到这个信息。话题(Topic)是异步通信,采用发布/订阅模型;消息(Message),话题通信的消息类型由语言无关的.msg文件定义,对于一些常见的数据,ROS提供标准类型(std_msgs),当然你也可以自定数据类型。
在这里插入图片描述

服务(Service)是同步通信,客户端/服务器(C/S)模型,服务通信的消息类型由语言无关的.srv文件定义,ROS提供标准类型(std_msgs),当然你也可以自定数据类型。

两种类型对比:

对比项话题服务
同步性异步同步
通信模型发布/订阅服务器/客户端
底层协议ROSTCP/ROSUDPROSTCP/ROSUDP
反馈机制
缓冲区
实时性
节点关系多对多一对多
适用场景数据传输逻辑处理

参数是全局共享字典,由ROS Master上的参数服务器管理,节点可通过网络访问参数服务器,从而存储和检索运行时参数。参数适合存储静态、非二进制配置参数,不适合动态参数。
在这里插入图片描述

1.3 常用命令行工具

下面列举了21讲出现的所有命令行工具

命令含义
roscore启动ROS Master、参数服务器和rosout记录节点
rostopic打印ROS话题信息
rosservice打印ROS服务信息
rosnode打印ROS节点信息
rosparam获取设置和删除ROS参数服务器参数
rosrun启动某个功能包中的某个节点(应用)
rosmsg显示ROS消息类型
rossrv显示ROS服务类型
ros_bag记录、重放和操作bag文件(一种文件格式记录ROS消息类型)
rqt_graph启动一个QT程序显示系统通信情况
catkin_make编译功能包
catkin_create_pkg创建功能包

其他没有出现但是很有用的命令:

命令含义
roscd跳转到目标package

例子:运行一个海龟仿真器

Step1:roscore 启动ROS Master
Step2:rosrun turtlesim turtlesim_node 启动turtlesim功能包中的turtlesim_node节点
Step3:rosrun turtlesim turtle_teleop_key 启动turtlesim中的turtle_teleop_key节点

其中,第一步是为了启动节点管理器(ROS Master),有了它节点之间才有可能相互通信;第二步是为了启动海龟可视化应用;第三步是为了启动键盘操作海龟的应用,用于控制我们海龟。

海龟可视化应用:
在这里插入图片描述
键盘操作海龟应用,没有GUI界面。
在这里插入图片描述
rqt_graph(ros qt graph) 查看节点及其通信方式。
在这里插入图片描述
从图上可以看出节点有名为/teleop_turtle/turtlesim两个节点,这里有几点需要注意:

  • 应用名不等于节点名,如海龟可视化应用,节点名为turtlesim_node而在graph中显示的是turtlesim
  • 无论是节点还是数据,都采用了文件夹形式的命名,如/turtle1/cmd_vel

rosnode list /rostopic list:列出所有节点/服务

rosnode info /turtlesim:查看某个节点详细信息

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist “linear”:以每秒10次的速度发送 话题类型为/turtle1/cmd_vel的数据,这个数据是后面的内容,一般用tab进行辅助。

junwu@Room:~$ rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 1.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0" 

rosmsg show + 信息类型:可以查看某个信息的数据结构

rosservice list:查看服务列表

rosservice call +服务:启动某个服务,如可以多弄一个海龟。在这里插入图片描述
话题记录:rosbag record -a -O cmd_record 记录所有动作,目标文件为cmd_record。其实文件名字为cmd_record_2022-03-26-16-52-39.bag

话题复现:rosbag play +cmd_record_2022-03-26-16-52-39.bag

rosrun 功能包 节点 启动功能包中的某个节点。

二、ROS工作空间和功能包创建

工作空间是一个用来存放工程相关文件的文件夹,功能包则是最小的功能单元。

2.1 利用catkin_make 创建工作空间

在创建工作空间之前,我们先来看看工作空间都可能会有哪些内容。它主要包含以下几个部分:

  • src 代码空间
  • build 编译空间
  • devel 开发空间
  • install 安装空间

工作空间像是满足一定要求的文件布局,catkin_make是用来创建catkin工作空间布局并且调用cmake和make命令的,其基本格式如下:

usage: catkin_make [-h] [-C DIRECTORY] [--source SOURCE] [--build BUILD] [--use-ninja] [--use-nmake] [--use-gmake] [--force-cmake] [--no-color]
                   [--pkg PKG [PKG ...]] [--only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...]] [--cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]]]
                   [--make-args [MAKE_ARGS [MAKE_ARGS ...]]] [--override-build-tool-check]

默认情况下,catkin_make将会在当前文件夹寻找一个存放源文件代码的src的文件夹,如果没有找到这个文件夹,将会出现这样的错误:

junwu@Room:~/catkin_ws/DemoWorkSpace$ catkin_make
Base path: /home/junwu/catkin_ws/DemoWorkSpace
The specified source space "/home/junwu/catkin_ws/DemoWorkSpace/src" does not exist

使用catkin_make可以帮助你构建工作空间

mkdir src
catkin_make

工作空间结构变成了以下形式[1]:

junwu@Room:~/catkin_ws/DemoWorkSpace$ tree -L 1
.
├── build
├── devel
└── src

3 directories, 0 files

在工作空间下src文件夹里有一个CMakeLists.txt,它用来指导整个工作空间文件的编译(也就是所有package的源代码编译),在CMake中叫做根CMakeLists.txt,表示编译的起点。

如果你需要安装install空间,手动调用catkin_make install即可。创建之后文件夹devel的内容如下:

.
├── cmake.lock
├── env.sh
├── lib
├── local_setup.bash
├── local_setup.sh
├── local_setup.zsh
├── setup.bash
├── setup.sh
├── _setup_util.py
└── setup.zsh

1 directory, 9 files

其中setup.bash这个文件会将这个包纳入ROS管理,在使用这个功能包之前需要手动调用source setup.sh,如果你不想每次都输入的话,你可以考虑将这个命令写进放进~/.bashrc中:

source /home/junwu/catkin_ws/DemoWorkspace/devel/setup.bash

Tips:echo $ROS_PACKAGE_PATH可以查看当前环境变量都有哪些工作空间。

2.2 创建功能包

有了工作空间之后,我们就能够创建自己的功能包了。为了创建自己的功能包,需要用到以下命令:

usage: catkin_create_pkg [-h] [--meta] [-s [SYS_DEPS [SYS_DEPS ...]]] [-b [BOOST_COMPS [BOOST_COMPS ...]]] [-V PKG_VERSION] [-D DESCRIPTION] [-l LICENSE]
                         [-a AUTHOR] [-m MAINTAINER] [--rosdistro ROSDISTRO]
                         name [dependencies [dependencies ...]]

这个命令使用来创建一个新的catkin包的。现阶段我们只关心必须的选项:

catkin_create_pkg name [dependencies [dependencies ...]]

其中name是这个包名字,后面是依赖项(如std_msg roscpp rospy之类的)

catkin_create_pkg test_pkg std_msgs rospy roscpp

执行之后可以看到工作空间src文件夹下多了一个名为test_pkg的文件夹,其结构如下:

.
├── CMakeLists.txt
├── include
├── package.xml
└── src

2 directories, 2 files

在功能包文件夹中的CMakeLists.txt是子CMakeLists.txt,功能是指导如何编译这个文件夹下的源文件。Tips:包名字等于文件夹名字,这个非常重要,你rosrun的时候可以直接看这个名字来启动包。

2.3 catkin_make 编译功能包

编译的时候我们返回到工作空间根目录,执行catkin_make即可进行编译。整个过程,CMake首先进入src调用整个工程的CMakeLists.txt,然后在进入每个功能包中的CMakeLists.txt,完成编译任务,最终的可执行文件将会存放在工作空间/devel/lib/XXXpackage下。注意:同一个工作空间功能包必须唯一,不同工作空间则可以不唯一。


[1] 当然你也可以指定某个源文件夹名称用来创建工作空间:

catkin_make --source sss #源文件为sss创建一个工作空间