ROS学习(五):构建系统

     ROS的构建系统默认使用CMake(Cross Platform Make),其构建环境在功能 包目录中的CMakeLists.txt文件中描述。在ROS中,CMake被修改为适合于ROS的 “catkin” 构建系统。

     在ROS中使用CMake的是为了在多个平台上构建 ROS功能包。因为不同于只支持 Unix系列的Make,CMake支持Unix类的Linux、BSD和OS X以外,还支持Windows 系列。并且,它还支持Microsoft Visual Studio,也还可以轻松应用于Qt开发。此外, catkin 构建系统可以轻松使用与ROS相关的构建、功能包管理和功能包之间的依赖关系。

一.创建功能包

     创建ROS功能包的命令如下。

“catkin_create_pkg”命令在创建用户功能包时会生成catkin 构建系统所需的 CMakeLists.txt和package.xml文件的包目录。让我们来创建一个简单的功能包,以巩 固理解。首先打开一个新的终端窗口(Ctrl + Alt + t)并运行以下命令移至工作目录。 

 

 

要创建的功能包名称是“my_first_ros_pkg”。ROS中的功能包名称全部是小写字 母,不能包含空格。格式规则是将每个单词用下划线(_)而不是短划线( - )连接起 来。有关ROS编程,请参阅相关页面的编码风格47 48和命名约定。那么下面使用以下命令 创建一个名为my_first_ros_pkg的功能包:

     上面用“std_msgs”和“roscpp”作为前面命令格式中的依赖功能包的选项。这 意味着为了使用ROS的标准消息包std_msgs和客户端库roscpp(为了在ROS中使用C/ C++),在创建功能包之前先进行这些选项安装。这些相关的功能包的设置可以在创建功 能包时指定,但是用户也可以在创建之后直接在package.xml中输入。

     如果已经创建了功能包,“~/catkin_ws/src”会创建“my_first_ros_pkg”功能 包目录、ROS功能包应有的内部目录以及CMakeLists.txt和package.xml文件。用户 可以用下面的“ls”命令来检查内容,并使用类似Windows资源管理器的基于GUI的 Nautilus来检查功能包的内部。

 ROS学习(五):构建系统_第1张图片

 ROS学习(五):构建系统_第2张图片

 二.修改功能包配置文件(package.xml)

     必要的ROS配置文件之一的package.xml是一个包含功能包信息的XML文件,包括 功能包名称、作者、许可证和依赖功能包。最初没有做任何修改的原始文件如下:

ROS学习(五):构建系统_第3张图片

 ROS学习(五):构建系统_第4张图片

 下面是对每个语句的说明。

ROS学习(五):构建系统_第5张图片

 ROS学习(五):构建系统_第6张图片

 

修改了功能包配置文件(package.xml),如下所示。也可以根据自己的 环境进行修改。如果还不熟悉,可以键入以下内容:

ROS学习(五):构建系统_第7张图片

 三.修改构建配置文件(CMakeLists.txt)

ROS的构建系统catkin基本上使用CMake,并在功能包目录中的CMakeLists.txt 文件中描述构建环境。在这个文件中设置可执行文件的创建、依赖包优先构建、连接器 (linker)的创建等等。

ROS学习(五):构建系统_第8张图片

 ROS学习(五):构建系统_第9张图片

 ROS学习(五):构建系统_第10张图片

 ROS学习(五):构建系统_第11张图片

 ROS学习(五):构建系统_第12张图片

  构建配置文件(CMakeLists.txt)中的每一项如下所示。第一条是操作系统中安 装的cmake的最低版本。由于它目前被指定为版本2.8.3,所以如果使用低于此版本的 cmake,则必须更新版本。

cmake_minimum_required(VERSION 2.8.3)

project项是功能包的名称。只需使用用户在package.xml中输入的功能包名即可。 请注意,如果功能包名称与package.xml中的标记中描述的功能包名称不同,则 在构建时会发生错误,因此需要注意。

project(my_first_ros_pkg)

find_package项是进行构建所需的组件包。目前,roscpp和std_msgs被添加为依赖 包。如果此处没有输入功能包名称,则在构建时会向用户报错。换句话说,这是让用户先 创建依赖包的选项。

find_package(catkin REQUIRED COMPONENTS 

          roscpp 

          std_msgs

)

    以下是使用ROS以外的功能包时使用的方法。例如,使用Boost时,必须安装system 功能包。功能如前面的说明,是让用户先创建依赖功能包的选项。

find_package(Boost REQUIRED COMPONENTS system)

    catkin_python_setup( )选项是在使用Python,也就是使用rospy时的配置选项。其 功能是调用Python安装过程setup.py。 catkin_python_setup()

    add_message_files是添加消息文件的选项。FILES将引用当前功能包目录的msg目 录中的*.msg文件,自动生成一个头文件(*.h)。在这个例子中,我们将使用消息文件 Message1.msg和Message2.msg。

add_message_files(

FILES

Message1.msg

Message2.msg

)

add_service_files是添加要使用的服务文件的选项。使用FILES会引用功能包目录 中的srv目录中的*.srv文件。在这个例子中,用户可以选择使用服务文件Service1.srv和 Service2.srv。

add_service_files(

FILES

Service1.srv

Service2.srv )

    generate_messages是设置依赖的消息的选项。此示例是将DEPENDENCIES选项设 置为使用std_msgs消息包。

generate_messages( 

DEPENDENCIES 

std_msgs

)

generate_dynamic_reconfigure_options是使用dynamic_reconfigure时加载要 引用的配置文件的设置。

generate_dynamic_reconfigure_options( 

cfg/DynReconf1.cfg 

cfg/DynReconf2.cfg

)

    以下是catkin 构建选项。INCLUDE_DIRS表示将使用INCLUDE_DIRS后面的内部 目录include的头文件。LIBRARIES表示将使用随后而来的功能包的库。

   CATKIN_DEPENDS后面指定如roscpp或std_msgs等依赖包。目前的设置是表示依 赖于roscpp和std_msgs。DEPENDS是一个描述系统依赖包的设置。

catkin_package(

INCLUDE_DIRS include

LIBRARIES my_first_ros_pkg

CATKIN_DEPENDS roscpp std_msgs

DEPENDS system_lib

)

    include_directories是可以指定包含目录的选项。目前设定为${catkin_INCLUDE_ DIRS},这意味着将引用每个功能包中的include目录中的头文件。当用户想指定一个额 外的include目录时,写在${catkin_INCLUDE_DIRS}的下一行即可。

include_directories( 

${catkin_INCLUDE_DIRS}

)

    add_library声明构建之后需要创建的库。以下是引用位于my_first_ros_pkg功能包 的src目录中的my_first_ros_pkg.cpp文件来创建my_first_ros_pkg库的命令。

add_library(my_first_ros_pkg 

     src/${PROJECT_NAME}/my_first_ros_pkg.cpp )

    add_dependencies是在构建该库和可执行文件之前,如果有需要预先生成的有依赖 性的消息或dynamic_reconfigure,则要先执行。以下内容是优先生成my_first_ros_ pkg库依赖的消息及dynamic reconfigure的设置。

add_dependencies(my_first_ros_pkg ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

     add_executable是对于构建之后要创建的可执行文件的选项。以下内容是引用src/ my_first_ros_pkg_node.cpp文件生成my_first_ros_pkg_node可执行文件。如果有多 个要引用的*.cpp文件,将其写入my_first_ros_pkg_node.cpp之后。如果要创建两个以 上的可执行文件,需追加add_executable项目。

add_executable(my_first_ros_pkg_node src/my_first_ros_pkg_node.cpp)

    如前面描述的add_dependencies一样,add_dependencies是一个首选项,是在构 建库和可执行文件之前创建依赖消息和dynamic reconfigure的设置。下面介绍名为my_ first_ros_pkg_node的可执行文件的依赖关系,而不是上面提到的库。在建立可执行文 件之前,先创建消息文件的情况下会经常用到。

add_dependencies(my_first_ros_pkg_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

    target_link_libraries是在创建特定的可执行文件之前将库和可执行文件进行链接的 选项。

target_link_libraries(my_first_ros_pkg_node

    ${catkin_LIBRARIES}

)

    此外,还提供了创建官方发行版ROS功能包时使用的Install项目和用于单元测试的 Testing项目。 笔者如下修改了构建配置文件(CMakeLists.txt)。可以根据情况进行修 改。有关如何使用它的更多信息,请参阅https://github.com/ROBOTIS-GIT上发布的 TurtleBot3和OP3功能包,相信会对大家有用。
 ROS学习(五):构建系统_第13张图片

 四.编写源代码

    在上述CMakelists.txt文件的可执行文件创建部分(add_executable)中,进行了以 下设置。

 add_executable(hello_world_node src/hello_world_node.cpp)

 换句话说,是引用功能包的src目录中的hello_world_node.cpp源代码来生成hello_ world_node可执行文件。由于这里没有hello_world_node.cpp源代码,我们来写一个 简单的例子。

首先,用cd命令转到功能包目录中包含源代码的目录(src),并创建hello_world_ node.cpp文件。这个例子使用gedit编辑器,但是您可以使用自己的编辑器,比如vi、 gedit、qtcreator、vim或者emacs。

$ cd ~/catkin_ws/src/my_first_ros_pkg/src/

$ gedit hello_world_node.cpp

之后如下修改代码。

ROS学习(五):构建系统_第14张图片

 五.构建功能包

    所有构建功能包的准备工作都已完成。在构建之前,使用以下命令更新ROS功能包的 配置文件。这是一个将之前创建的功能包反映在ROS功能包列表的命令,这并不是必选操 作,但在创建新功能包后更新的话使用时会比较方便。

$ rospack profile

下面是catkin构建。移动到catkin工作目录后进行catkin构建。

$ cd ~/catkin_ws && catkin_make

 六.运行节点

    如果构建无误,那么将在“~/catkin_ws/devel/lib/my_first_ros_pkg”中生成 “hello_world_node”文件。

    下一步是运行该节点,打开一个终端窗口(Ctrl + Alt + t)并在运行该节点之前先运 行roscore。请注意,运行roscore后,ROS中的所有节点都可用,除非退出了roscore, 否则只需运行一次。

$ roscore

    最后,打开一个新的终端窗口(Ctrl + Alt + t)并使用以下命令运行节点。这是在名 为my_first_ros_pkg的功能包中运行名为hello_world_node的节点的命令。

$ rosrun my_first_ros_pkg hello_world_node

ROS学习(五):构建系统_第15张图片

   运行这个节点的时候,可以在终端窗口中看到以hello world!0,1,2,3 ... 作为 字符串发送的消息。这不是一个实际的消息传递,但可以看作是讨论的构建系统的结 果。由于旨在说明ROS的构建系统,因此对于消息和节点的源代码将在后面的博客中 将更详细地讨论。

你可能感兴趣的:(ROS)