声明:代码全部来源于https://github.com/ZJU-FAST-Lab/ego-planner-swarm,本人仅作解读学习交流使用,未有任何盈利,如有侵权,烦请联系笔者。
cmake_minimum_required(VERSION 2.8.3)
project(bspline_opt)
set(CMAKE_BUILD_TYPE "Release")
ADD_COMPILE_OPTIONS(-std=c++11 )
ADD_COMPILE_OPTIONS(-std=c++14 )
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")
find_package(Eigen3 REQUIRED)
find_package(PCL 1.7 REQUIRED)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
visualization_msgs
plan_env
cv_bridge
path_searching
)
catkin_package(
INCLUDE_DIRS include
LIBRARIES bspline_opt
CATKIN_DEPENDS plan_env
# DEPENDS system_lib
)
include_directories(
SYSTEM
include
${catkin_INCLUDE_DIRS}
${Eigen3_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
)
add_library( bspline_opt
src/uniform_bspline.cpp
src/bspline_optimizer.cpp
src/gradient_descent_optimizer.cpp
)
target_link_libraries( bspline_opt
${catkin_LIBRARIES}
)
cmake_minimum_required(VERSION 2.8.3)
project(bspline_opt)
这是一个 CMake 构建系统的项目声明,指定了项目名称为 bspline_opt。CMake 是一款跨平台的构建工具,用于管理 C++ 项目的编译、链接等操作。在这个项目中,CMake 的版本需求为 2.8.3 及以上。
set(CMAKE_BUILD_TYPE "Release")
ADD_COMPILE_OPTIONS(-std=c++11 )
ADD_COMPILE_OPTIONS(-std=c++14 )
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")
这段代码是用来设置 C++ 代码的编译选项和构建类型的。具体解释如下:
set(CMAKE_BUILD_TYPE "Release")
:设置构建类型为 Release,即编译器会优化代码以提高程序的运行效率。其他常见的构建类型还包括 Debug 和 RelWithDebInfo 等。ADD_COMPILE_OPTIONS(-std=c++11 )
:指定编译器使用 C++11 标准进行编译。C++11 是一种较新的 C++ 标准,引入了许多新的语言特性,使得程序编写更加方便和高效。ADD_COMPILE_OPTIONS(-std=c++14 )
:这一行与上一行类似,只是将编译器指定的 C++ 标准提高到了 C++14。C++14 是 C++11 的扩展版本,也引入了一些新的特性。set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")
:设置编译器编译 C++ 代码时的编译选项。-O3
表示使用最高级别的优化选项,即编译器会尽可能地优化代码;-Wall
表示启用所有警告信息;-g
表示生成调试信息,方便程序调试。
如果一个项目中使用了C++11和C++14的特性,需要同时使用 -std=c++11
和 -std=c++14
选项来保证代码的兼容性。如果只使用 -std=c++14
选项,可能会导致C++11中的某些特性不可用,从而导致编译错误。
find_package(Eigen3 REQUIRED)
find_package(PCL 1.7 REQUIRED)
这两行代码是在CMake中调用第三方库Eigen3和PCL,其中Eigen3是一个用于线性代数的C++模板库,而PCL是一个用于3D点云处理的C++库。
find_package
是CMake中的一个函数,用于查找和加载需要的软件包、库或依赖项。上面的代码中使用了find_package
函数来查找已经安装在系统中的Eigen3和PCL库,并将它们导入到CMake项目中,以便在项目中使用这些库的函数和类。需要注意的是,PCL库的版本号是1.7,因此需要使用find_package(PCL 1.7 REQUIRED)
来指定版本。
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
visualization_msgs
plan_env
cv_bridge
path_searching
)
这段代码使用了 find_package
函数来查找指定的 catkin 组件,具体查找的组件名称如下:
- roscpp
- rospy
- std_msgs
- visualization_msgs
- plan_env
- cv_bridge
- path_searching
这些组件名称对应的是 ROS 中的一些核心组件和一些自定义的 ROS 包。通过 find_package
函数,可以在系统中查找这些组件并获取相关的头文件、库文件等信息。找到这些组件后,可以将它们添加到后续的工程中,方便进行程序的编写和构建。
这些包的功能如下:
roscpp
:是ROS中C++客户端库,提供了用于ROS节点的API。rospy
:是ROS中Python客户端库,提供了用于ROS节点的API。std_msgs
:是ROS的标准消息包,包含了常见的消息类型,如整数、浮点数、字符串、布尔值等。visualization_msgs
:是ROS用于可视化的消息包,其中包含了与可视化相关的消息类型,如Marker、Image、PointCloud2等。plan_env
:是自动驾驶中用于路径规划的一个ROS包,提供了用于规划环境的接口和实现。cv_bridge
:是ROS中用于将ROS消息和OpenCV图像相互转换的库。path_searching
:是ROS中用于路径搜索的库,提供了A*、Dijkstra等算法的实现。
在 CMakeLists.txt 文件中,使用 find_package
命令可以找到和加载需要的依赖库,而 REQUIRED COMPONENTS
则用来指定所需要的组件。这样,在进行编译时,如果所需的组件没有安装,编译会失败,程序也无法正常运行。
例如,假设在 CMakeLists.txt 中使用了 find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)
命令,则在编译时会检查是否已经安装了 roscpp 和 std_msgs 组件。如果没有安装,编译将失败。通过这种方式,可以方便地确保所有需要的组件都已经安装了,避免运行时因为缺少依赖库而出现问题。
REQUIRED
表示这些组件是必需的,如果找不到,则会导致配置错误。如果省略COMPONENTS
,则find_package
将查找指定包的所有模块(包括其依赖项),而不是只查找特定组件。通常情况下,省略COMPONENTS
是没有问题的,因为如果要使用包的组件,你通常需要包的全部功能和依赖项。但是,指定组件可以缩小查找的范围,节省时间。
catkin_package(
INCLUDE_DIRS include
LIBRARIES bspline_opt
CATKIN_DEPENDS plan_env
# DEPENDS system_lib
)
Catkin是ROS的一个构建系统,用于构建ROS软件包。一个Catkin软件包是ROS软件包中常用的一种类型,它是一个具有一些特定目录结构的目录。Catkin使用CMake构建系统来编译ROS软件包。
在Catkin软件包的CMakeLists.txt文件中,可以使用catkin_package()函数来指定Catkin软件包的信息。这个函数会生成一些必要的信息,比如安装目录,导出的目录,运行时目录等,使得其他ROS软件包可以正确地依赖当前的软件包。这些信息可以被其他Catkin软件包使用,以便于正确地链接和使用当前软件包的功能。
在catkin_package()函数中,可以指定当前Catkin软件包的一些元数据,如包含的头文件目录(INCLUDE_DIRS)、需要链接的库(LIBRARIES)、运行时依赖的其他Catkin软件包(CATKIN_DEPENDS)等等。这些信息将被Catkin系统用来自动生成一些CMake和ROS配置文件,以便于其他软件包正确地使用和链接当前软件包。
catkin_package()
函数用于配置当前包的信息,包括其包含的目录、链接库、依赖关系等等。其中:
INCLUDE_DIRS
:用于指定当前包所包含的头文件的路径。LIBRARIES
:用于指定当前包要链接的库。CATKIN_DEPENDS
:用于指定当前包依赖的其他Catkin包。DEPENDS
:用于指定当前包依赖的非Catkin库。
在这段代码中,catkin_package()
函数指定了当前包的包含目录和链接库,以及其依赖关系,其中:
INCLUDE_DIRS
指定了包含目录为include
。LIBRARIES
指定了链接库为bspline_opt
。CATKIN_DEPENDS
指定了当前包依赖的Catkin包为plan_env
。
plan_env
是一个catkin组件,被列在了find_package(catkin REQUIRED COMPONENTS ...)
和CATKIN_DEPENDS ...
中。find_package
用于查找和配置catkin组件和系统库,CATKIN_DEPENDS
声明了当前包依赖的catkin组件。在这个例子中,当前包依赖于plan_env
组件,因此它在find_package(catkin REQUIRED COMPONENTS ...)
中列出,而在CATKIN_DEPENDS ...
中使用。
include_directories(
SYSTEM
include
${catkin_INCLUDE_DIRS}
${Eigen3_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
)
这段代码指定了包含文件的目录。具体来说,它使用include_directories()
函数将以下目录添加到编译器的包含路径中:
include
: 包含头文件的目录。${catkin_INCLUDE_DIRS}
: 其他 catkin 软件包提供的头文件的目录。${Eigen3_INCLUDE_DIRS}
: Eigen3 库提供的头文件的目录。${PCL_INCLUDE_DIRS}
: PCL 库提供的头文件的目录。
通过将这些目录添加到编译器的包含路径中,代码中就可以直接使用这些头文件中定义的类和函数。
SYSTEM
是include_directories
命令的一个选项,用于告诉CMake在包含头文件时不应该产生警告信息。这个选项通常用于包含系统库的头文件,这些库的头文件可能会产生一些警告信息,但通常情况下我们不需要理会这些警告。
include指定的路径是头文件(.h文件)所在的目录,可以是相对路径或绝对路径。如果在当前目录下有include文件夹,那么使用include_directories(include)
也可以指定该路径。
add_library( bspline_opt
src/uniform_bspline.cpp
src/bspline_optimizer.cpp
src/gradient_descent_optimizer.cpp
)
这段代码使用 add_library
命令定义了一个名为 bspline_opt
的库,并列出了需要编译的源代码文件。具体来说,这个库由三个源文件组成,分别是 uniform_bspline.cpp
、bspline_optimizer.cpp
和 gradient_descent_optimizer.cpp
,这些文件都在 src
目录下。
target_link_libraries( bspline_opt
${catkin_LIBRARIES}
)
target_link_libraries
函数用于将库与目标文件链接。在这里,bspline_opt
库将链接到${catkin_LIBRARIES}
中包含的所有库。${catkin_LIBRARIES}
是一个catkin
包中定义的变量,其中包含了所有在catkin_package()
函数中声明的库。
${catkin_LIBRARIES}
是一个 CMake 变量,它包含 catkin 工作空间中所有库的名称。这个变量在使用 find_package(catkin ...)
命令时自动生成,并且被用于在目标链接时指定库的名称。在这个例子中,${catkin_LIBRARIES}
被用于链接 bspline_opt
库。