ROS之 发布及订阅消息理论知识
大目标:学会使用ROS发布及订阅消息。
小目标:
(1)CMakeLists.txt的建立
(2)package.xml的建立
原因:在理解、实现 ROS中发布及订阅消息程序时,发现头文件单纯包含#include<ros/ros.h>是不可行的,通过查阅资料发现需要首先包含CMakeLists.txt及package.xml。
1. 安装和配置ROS环境
按照官网教程一步一步安装即可。
针对Linux16.04
Kinetic版本
2. ROS环境管理
2.1 确保环境变量被配置
在Linux终端输入:
$ printenv | grep ROS
此时显示:
ROS_ROOT=/opt/ros/kinetic/share/ros
ROS_PACKAGE_PATH=/opt/ros/kinetic/share
ROS_MASTER_URI=http://localhost:11311
ROS_VERSION=1
ROSLISP_PACKAGE_DIRECTORIES=
ROS_DISTRO=kinetic
ROS_ETC_DIR=/opt/ros/kinetic/etc/ros
通过该命令查看是否配置了ROS_ROOT和ROS_PACKAGE_PATH这样的环境变量。
2.2 创建一个catkin 工作空间:
在终端输入:
$ mkdir -p ~/catkin_ws/src #递归创建目录
$ cd ~/catkin_ws #切换至创建的工作空间中
$ catkin_make
查看当前目录可看到’build’和’devel’和‘src’三个文件夹。
在工作空间中首次运行catkin_make命令后, 它会在‘src’文件夹下创建一个CMakeLists.txt。在’devel’文件夹里可以看到setup.sh文件。
source这些文件中的任何一个都可以将当前工作空间设置在ROS工作环境的最顶层。此时source一下新生成的setup.sh文件:
$ source devel/setup.bash
要想保证工作空间已配置正确,需确保ROS_PACKAGE_PATH环境变量包含你的工作空间目录,采用以下命令查看:
$ echo $ROS_PACKAGE_PATH
可得输出:
/home/你的用户名/catkin_ws/src:/opt/ros/kinetic/share:/opt/ros/kinetic/stacks
此时,ros的工作环境已完全搭建完成。
A 基础知识(可略过)
A.1 安装ros-kinetic-ros-turorials
$ sudo apt-get install ros-kinetic-ros-tutorials(可将kinetic更换为自己的Ubuntu版本名称)
A.2 文件系统的基本概念
1.Packages: 软件包,是ROS中软件组织的单元,可以包含ROS运行的进程(节点)、配置文件、程序库、可执行文件、脚本或者其它手动创建的东西。
2.Manifest (package.xml): 清单,是对于’软件包’相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议等。
A.3 文件系统的基本工具
针对catkin方式
rospack = ros + package // $ rospack find [package_name] 获取packages软件包的信息。
roscd = ros + cd //roscd [本地包名称[/子目录]] 直接切换工作目录到某个软件包或软件包集中。
rosls = ros + ls // 允许直接按软件包的名称而不是绝对路径执行ls命令。
3. 创建ROS 程序包(Package)
针对catkin方式
主要介绍:
(1)如何使用roscreate-pkg或catkin创建一个新程序包;
(2)使用rospack查看程序包的依赖关系。
3.1 程序包的构成
(1)必须包含catkin兼容的package.xml文件,这个package.xml文件提供有关程序包的元信息。
(2)必须包含一个catkin 版本的CMakeLists.txt文件。
(3)每个目录下只能有一个程序包。
3.2 一个简单的程序包结构
一个普通的工作空间大致为:
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n
3.3 创建一个catkin程序包
目的:使用catkin_create_pkg命令创建一个新的catkin程序包;
关键程序:catkin_create_pkg <package_name> [depend1][depend2] [depend3]
步骤:
(1)创建工作空间。如2.2 所介绍方式。
(2)切换到所创建的工作空间中。
$ cd ~/catkin_ws/src
(3)创建一个名为“beginner_tutorials’的新程序包,其依赖于std_msgs、roscpp和rospy:
$ catkin_create_pkg beginner_tutorials std_msgs roscpp rospy
(4)以后将在beginner_tutorials/src文件夹下编写.cpp文件,在“beginner_tutorials’的文件夹下修改配置文件,才能编译Packages包。
3.4 查看依赖关系
(1)一级依赖
使用使用rospack命令工具来查看一级依赖包。这些依赖吧被保存在package.xml中。
$ rospack depends1 beginner_tutorials
(2)间接依赖
一般的,一个依赖包还依赖其他的包,可用下面的命令查找。
$ rospack depends1 rospy
但是,一个程序包还可以有好几个间接的依赖包,使用rospack可以递归检测出所有的依赖包。// 即:依赖包的其他依赖包。
$ rospack depends beginner_tutorials
4.编译ROS程序包
4.1 编译Packages
使用方法:
(1)如果源码在catkin工作空间下,在当前工作空间(如本文在~/catkin_ws/中)下输入:
$ catkin_make #catkin_make命令将编译src目录下的所有工程。
(2)如果源码不在catkin工作空间下,比如存放在了my_src中,那么可以这样来使用catkin_make:
$ catkin_make --source my_src #必须回到根目录下,source 源文件所在的目录
5.执行ROS程序包
(1)roscore
作用:roscore是在运行所有ROS程序前首先要运行的命令。
打开一个终端,输入:
$ roscore
(2)
source 工作空间/devel/setup.bash #必不可少
(3)rosrun
作用:允许使用包名直接运行一个包内的节点(不需要知道这个包的路径)。
打开一个终端,输入:
$ rosrun [package_name] [node_name] #将此处的第二三项分别换做包名、节点名
tips:改变节点名称
如:$ rosrun turtlesim turtlesim_node __name:=my_turtle
可将原来的节点名( turtlesim)改为my_turtle。
(3)可使用rosnode ping [node_name] 测试程序是否运行
总结:
roscore = ros+core : master (提供为名称服务) + rosout (stdout/stderr) + parameter server (参数服务器)
rosnode = ros+node : 获取节点信息的ROS工具
rosrun = ros+run : 运行节点工具
根据本文的提示,将其整理为:
建立好的工作空间: