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
创建一个catkin工作空间
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace // 把当前目录初始化为一个ROS工作空间。
$ cd ~/catkin_ws/
$ catkin_make //
catkin_make之后,可以看到在devel目录下,有一些setup.*sh文件,读取这些文件中的任何一个都会将当前工作空间的环境变量置于所有环境变量的最上层。setup.sh文件中定义了catkin_ws空间所需要的环境变量。
读取setup.sh文件:
source devel/setup.sh
确认是否已经加载catkin工作空间环境变量:
echo $ROS_PACKAGE_PATH
出现以下情况表示加载环境变量成功
/home/pan/catkin_ws/src:/opt/ros/kinetic/share
初始化ROS的catkin工作空间: catkin_init_workspace
编译ROS的catkin工作空间: catkin_make
读取当前catkin工作空间的环境变量: source devel/setup.sh
验证ROS工作空间的环境变量加载成功: echo $ROS_PACKAGE_PATH
安装一个ROS学习包,
sudo apt-get install ros-kinetic-ros-tutorials
ROS的文件系统主要包含:
Package // ROS代码的软件组成单元,每个Package可以包含库文件,可执行文件,脚步等等
manifests (package.xml) // 对应package的描述文件,用来定义软件包之间的依赖关系,以及版本号,维护者等关键信息
1) rospack
rospack是一个命令行工具,用于检索有关文件系统上可用的ROS package的信息。 它实现包括:
rospack find 返回package的绝对路径
rospack depends : 返回package所有依赖项的列表
rospack depends-on 返回依赖于给定package的package列表
rospack export 返回对于建立(和链接) 一个指定package 的标记 (return flags necessary for building and linking against a package)
2) roscd
类似于linux中cd命令的作用,直接切换工作目录到某个软件包或者指定的目录中.用法:
$ roscd roscpp
/opt/ros/kinetic/share/roscpp$
pan@pan-Inspiron-7466:~/catkin_ws/src$ roscd roscpp/cmake
pan@pan-Inspiron-7466:/opt/ros/kinetic/share/roscpp/cmake$
通过roscd命令直接转跳至软件包roscpp所在目录,该目录和通过rospack find命令查找的目录一致。注意ROS工具只会操作在你ROS_PACKAGE_PATH目录中的ROS软件包。
3) rosls
rosls是rosbash命令的一部分,它允许我们列出对应package下的文件列表,通过软件包名称而不是绝对路径。
pan@pan-Inspiron-7466:~/catkin_ws/src$ rosls roscpp_tutorials
cmake launch package.xml srv
注意:由于rospack、roscd、rosls命令行工具都是针对ROS软件包进行的,所以一定要将要操作的软件包加入到ROS_PACKAGE_PATH的环境变量中。如果在使用这些命令的时候出现No such package/stack ‘beginner-tutorial’的警告,说明该软件包的位置并未加入到ROS_PACKAGE_PATH目录中来,无法找到该软件包,这时则需要读取该软件包所在工作空间的devel/setup.*sh文件。或者手动的:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:[指定的project目录]
一个package必须满足如下条件才能被称之为catkin的package:一个catkin编译文件package.xml(manifests文件) 和一个CMakeLists.txt文件。
最简单的可能的软件包可能有如下文件结构:
package_pg1/
CMakeLists.txt
package.xml
一个普通的catkin的workspace如下所示:
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
// 首次创建catkin的workspace的时候:
$ mkdir -p ~/catkin_ws/src/
以后建立,利用catkin_create_pkg命令创建一个新的catkin软件包。
$ cd ~/catkin/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
依赖于std_msgs、rospy、roscpp在src目录下创建一个名为beginner_tutorials的catkin软件包,这将会创建一个名称为beginner_tutorials的包含CMakeLists.txt和package.xml文件的文件夹。catkin_create_pkg命令要求提供软件包名称和可选择的一系列软件包的依赖。
注意:软件包命名惯例是—以小写字母开头,只能包含小写字母和数字以及下划线,不符合规则的软件包名称将不能编译通过。
pan@pan-Inspiron-7466:~/catkin_ws/src/beginner_tutorials$ tree
.
├── CMakeLists.txt
├── include
│ └── beginner_tutorials
├── package.xml
└── src
3 directories, 2 files
编译catkin工作空间
创建完成软件包之后,需要在工作空间中进行编译:
cd ~/catkin_ws
catkin_make
在编译完成工作空间之后,在devel文件夹中产生了一系列的和/opt/ros/indigo目录中结构相似的文件,通过读取devel文件夹中的.*sh文件来将软件包的工作空间添加到环境变量当中。
pan@pan-Inspiron-7466:~/catkin_ws$ . ~/catkin_ws/devel/setup.bash
1) 直接依赖
在前面利用catkin_create_pkg命令的时候,在选项中提供了一些依赖,利用rospack工具可以查看这些直接依赖。
pan@pan-Inspiron-7466:~/catkin_ws$ rospack depends1 beginner_tutorials
roscpp
rospy
std_msgs
注意上面的是depends1(是阿拉伯数字1)。可以看出rospack工具列出了在使用catkin_create_pkg命令的时候提供的依赖,这些信息存储在packa.xml文件中,可以 cat package.xml 查看。
2) 间接依赖
在很多情况下,我们会遇到依赖的依赖,即间接依赖。例如beginner_tutorials的依赖文件rospy也有其他依赖。
pan@pan-Inspiron-7466:~/catkin_ws$ rospack depends1 rospy
genpy
roscpp
rosgraph
rosgraph_msgs
roslib
std_msgs
如果我们使用rospack depends(没有阿拉伯数字1),则会列出catkin软件包的所有依赖文件。包括所有的直接依赖和间接依赖.
pan@pan-Inspiron-7466:~/catkin_ws$ rospack depends beginner_tutorials
cpp_common
rostime
roscpp_traits
roscpp_serialization
catkin
genmsg
genpy
message_runtime
gencpp
geneus
gennodejs
genlisp
message_generation
rosbuild
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
ros_environment
rospack
roslib
rospy
主要按照自己的需要更改package.xml文件和CMakeLists.txt文件。
描述部分description
<description>The beginner_tutorials packagedescription>
1) 维护者部分maintainer
<maintainer email="[email protected]">panmaintainer>
至少需要一个维护者的信息,但是也可以添加多个。维护者的名字在类别的内容之中,邮箱在类别的属性之中。
2) 许可证部分license
<license>TODOlicense>
一些常见的软件使用BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv等,在这里使用BSD,因为ROS的其他核心部件已经使用了BSD证书。
3) 依赖部分 dependencies
依赖在这里被分为build_depend, buildtool_depend, run_depend, test_depend, 如果我们想在编译和运行的时候都能够获得这些依赖,所以需要在run_depend中添加那些依赖
<buildtool_depend>catkinbuildtool_depend>
<build_depend>roscppbuild_depend>
<build_depend>rospybuild_depend>
<build_depend>std_msgsbuild_depend>
<build_export_depend>roscppbuild_export_depend>
<build_export_depend>rospybuild_export_depend>
<build_export_depend>std_msgsbuild_export_depend>
<exec_depend>roscppexec_depend>
<exec_depend>rospyexec_depend>
<exec_depend>std_msgsexec_depend>
整体结构
1) CMake 版本 (cmake_minimum_required)
2) Package的名字 (project())
3) 查找其他需要build的CMake/Catkin的package (find_package())
4) 使其支持Python模块 (catkin_python_setup())
5) Message/Service/Action的生成器 (add_message/service/action_files())
6) 调用Message/Service/Action的生成器 (generate_messages())
7) 指定package用于build信息的输出 (catkin_package())
8) 要构建的库/可执行文件 (add_library()/add_executable()/target_link_libraries())
9) 测试build (catkin_add_gtest())
10)安装规则 (install())
catkin软件包必要组成:package.xml和CMakeList.txt文件。
创建catkin软件包:catkin_create_pkg命令创建一个新的catkin软件包。
编译catkin工作空间:catkin_make命令编译catkin工作空间。
查看ROS软件包依赖:rospack depends1 查看直接依赖, rospack depends查看间接依赖。
定制catkin软件包:修改文件package.xml和CMakeLists.txt。
ROS主要分为三个级别:计算图级、文件系统级、社区级。
计算图是ROS处理数据的一种点对点的网络形式。程序运行时,所有进程以及他们所进行的数据处理,将会通过一种点对点的网络形式表现出来。这一级主要包括几个重要概念:节点(node)、消息(message)、主题(topic)、服务(service)。
节点(Node)就是一些直行运算任务的进程。ROS利用规模可增长的方式是代码模块化:一个系统就是典型的由很多Nodes组成的。在这里,Node也可以被称之为“软件模块”。
消息(Message)Node之间是通过传送消息进行通讯,每一个message都是一个严格的数据结构。
主题(Topic)message以一种发布/订阅(publish/subscribe)的方式传递。一个Node可以在一个给定的topic中发布消息。一个node针对某个topic,publish与subscribe特定类型的数据。可能同时有多个node publish或者subscribe同一个topic的message。总体上,publisher和subscriber不了解彼此的存在。
服务(Service) 指的就是基于topic的节点间的通信模式。
在上面概念的基础上,需要有一个控制器可以使所有节点有条不紊的执行,这就是一个ROS的控制器(Master)
ROS文件系统级指的是在硬盘上面查看的ROS源代码的组织形式。
ROS中有无数的node、message、service、tool和库文件,需要有效的结构去管理这些代码。在ROS的文件系统级,有以下几个重要概念:包(package)、堆(stack);
ROS的软件以package的方式组织起来。package包含node、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。package的目标是提供一种易于使用的结构以便于软件的重复使用。总得来说,ROS的包短小精干。而堆(stack)则是packages的集合。
首先需要安装一个简单的模拟器工具:
$ sudo apt get install ros-kinetic-tutorials