节点是什么?
- 完成某个任务的进程
- 节点名具有唯一性
节点管理器可以做什么?
- 节点的注册和命名
- 完成、记录节点之间的通信
- 参数服务器(运行时参数)
话题最常见的地方就是微博了吧,它是关于某件事情的讨论、关注的一种信息交流方式。你可以随时发布新的帖子,但是订阅者什么时候接收不是你控制的,订阅者都是在恰当的时候点击刷新还是什么的获取到这个信息。话题(Topic)是异步通信,采用发布/订阅模型;消息(Message),话题通信的消息类型由语言无关的.msg文件定义,对于一些常见的数据,ROS提供标准类型(std_msgs
),当然你也可以自定数据类型。
服务(Service)是同步通信,客户端/服务器(C/S)模型,服务通信的消息类型由语言无关的.srv文件定义,ROS提供标准类型(std_msgs
),当然你也可以自定数据类型。
两种类型对比:
对比项话题服务同步性异步同步通信模型发布/订阅服务器/客户端底层协议ROSTCP/ROSUDPROSTCP/ROSUDP反馈机制无有缓冲区有无实时性弱强节点关系多对多一对多适用场景数据传输逻辑处理参数是全局共享字典,由ROS Master上的参数服务器管理,节点可通过网络访问参数服务器,从而存储和检索运行时参数。参数适合存储静态、非二进制配置参数,不适合动态参数。
下面列举了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 功能包 节点
启动功能包中的某个节点。
工作空间是一个用来存放工程相关文件的文件夹,功能包则是最小的功能单元。
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
可以查看当前环境变量都有哪些工作空间。
有了工作空间之后,我们就能够创建自己的功能包了。为了创建自己的功能包,需要用到以下命令:
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创建一个工作空间