ROS本质上就是由一个又一个的package组成的,package可以说是ROS的细胞。
在catkin_make的时候它会一个一个的去找package然后生成目标文件。
一个package可以有多个节点。
判断是否为Package :一个文件夹要被ROS认为是package的话,必须包含以下两个文件:CMakeList.txt和package.xml。
CMakeLists.txt规定catkin编译的规则。(例如:源文件,依赖项,目标文件)。
package.xml文件定义了package的属性。(例如:包名,版本号,作者等等),相当于一个包的自我描述。
先了解一下ROS整体框架
以ego-planner-master/src/planner/path_searching/CMakeList.txt为例分析:
CMakeList.txt
1、制定cmake的最小版本
cmake_minimum_required(VERSION 2.8.3)
2、设置项目名称,该处项目名称为path_searching
project(path_searching)
3、设置编译类型为release,因为在发布时需要选择release
set(CMAKE_BUILD_TYPE "Release")
4、添加编译参数:按照C++2011或2014标准来进行编译
ADD_COMPILE_OPTIONS(-std=c++11 )
ADD_COMPILE_OPTIONS(-std=c++14 )
5、CMAKE_CXX_FLAGS为设置g++编译选项
-O3表示开始编译优化等级为3;
-Wall编译后显示所有警告;-g表示调试,即可执行程序中包含调试信息
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")
6、引用Eigen和PCL库
find_package(Eigen3 REQUIRED)
find_package(PCL 1.7 REQUIRED)
7、find_package查找指定的库文件,当前所需要构建的项目中依赖其它的Package。即用于加载 catkin 宏和指定对其他 ROS 功能包的依赖关系。
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
visualization_msgs
plan_env
cv_bridge
)
其中:
roscpp 为ROS的C++库,是目前最广泛应用的ROS客户端库,执行效率高
rospy ROS的Python库
std_msgs ROS中,节点之间通过发布话题和订阅话题来通信,
在程序中是通过消息发布器和订阅器来实现,数据流通过话题的发布和订阅在节点之间传播
而数据流的数据类型则称为消息,ROS消息传递——std_msgs。
visualization_msgs rviz(ROS visualization) 用于机器人、传感器和算法的通用3D可视化系统。rviz能够绘制多种类型的数据流。特别是三维的数据。在ROS中所有类型的数据都被关联到一个参考坐标系上。
cv_bridge cv_bridge是在ROS图像消息和OpenCV图像之间进行转换的一个功能包.
8、catkin_package
在add_library和add_exacutable前调用的.如果指定了INCLUDE_DIRS和LIBRARIES
则catkin_make产生对应xxxConfig.Cmake时会将此处的include目录和本库产生的库文件
加入到xxxConfig.Cmake的list中,然后别的包通过find_package就可以在那两个宏中得到所依赖库对应的头文件和库文件。给使用该包的包使用,使用于向其他包导出依赖。
catkin_package(
INCLUDE_DIRS include 导出包的include路径
LIBRARIES path_searching 导出项目path_searching的库
CATKIN_DEPENDS plan_env 该项目依赖的其它功能包
# DEPENDS system_lib
)
9、include_directories
设置包含的目录,当编译一个需要第三方库的项目时,为了让cmake知道在该项目中包含的外部头文件。相应文件中搜索头文件目录
include_directories(
SYSTEM 添加的头文件应按系统头文件处理
include
${catkin_INCLUDE_DIRS} 将引用每一个功能包的include目录的头文件
${Eigen3_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
)
10、add_library 制定编译包含的源文件
即制定编译的源文件为path_searching文件夹下的src目录下的dyn_a_star.cpp文件
add_library( path_searching
src/dyn_a_star.cpp
)
11、target_link_libraries
指定可执行文件需要链接的库,设置要链接的库文件的名称
target_link_libraries( path_searching
${catkin_LIBRARIES}
)
package.xml
package.xml文件定义了package的属性。(例如:包名,版本号,作者等等),相当于一个包的自我描述。
对应内容如下
<?xml version="1.0"?> xml版本号
<package format="2">根标签(起)
<name>path_searching</name>功能包名字
<version>0.0.0</version>版本号
<description>The path_searching package</description>功能包描述:该包为路径搜索功能包
<maintainer email="iszhouxin@zju.edu.cn">iszhouxin</maintainer> 维护者
<license>TODO</license>软件许可
<buildtool_depend>catkin</buildtool_depend>编译构建工具为catkin
<build_depend>roscpp</build_depend>编译依赖项为roscpp、rospy、std msgs、plan_env
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>plan_env</build_depend>
<build_export_depend>roscpp</build_export_depend>导出依赖项roscpp、rospy、std msgs
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>roscpp</exec_depend>运行依赖项roscpp、rospy、std msgs、plan_env
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>plan_env</exec_depend>
<export>
</export>