(6)ROS-CMakeList.txt-自定义的ROS功能包怎么添加依赖

自定义的ROS功能包怎么添加依赖

  • 1 CMakeLists.txt
    • 1.1 cmake_minimum_required(VERSION 2.8.3)
    • 1.2 project(beginner_tutorials)
    • 1.3 find_package
    • 1.4 message/service/action
    • 1.5 catkin_package
    • 1.6 指定编译的target
      • 1)target的命名:
      • 2)设置输出路径:
      • 3)头文件路径和库文件路径:
      • 4)可执行target:
      • 5)库target:
      • 6)链接库:
  • 2 package.xml

1 CMakeLists.txt

参考文章:ROS中的CMakeLists.txt

CMakeLists.txt主要包括下面几个部分

  • Required CMake Version(cmake_minimum_required)

  • Package Name(project())

  • Find other CMake/Catkinpackages needed for build (find_package())

  • Message/Service/ActionGenerators(add_message_files(), add_service_files(), add_action_files())

  • Invokemessage/service/action generation(generate_messages())

  • Specify package buildinfo export (catkin_package())

  • Libraries/Executablesto build(add_library()/add_executable()/target_link_libraries())

  • Tests to build(catkin_add_gtest())

  • Install rules(install())

1.1 cmake_minimum_required(VERSION 2.8.3)

catkinCMakeLists.txt都要以此开始,catkin编译需要2.8.3版本以上的cmake。

1.2 project(beginner_tutorials)

通过project()这个函数指定包的名字,在CMake中指定后,你可在其他地方通过使用变量${PROJECT_NAME}来引用它

1.3 find_package

在这里点题:自定义的ROS功能包怎么添加依赖?

搜索find_package加入依赖的功能包

参考(ROS-5)功能包之间的互相调用

这里指明构建这个package需要依赖的package,我们使用catkin_make的编译方式,至少需要catkin这个包。

find_package(catkin REQUIRED)会产生环境变量catkin_INCLUDE_DIRS

同理,find_package(roscpp REQUIRED)会产生环境变量roscpp_INCLUDE_DIRS

因此,如果是写成:

find_package(roscpp REQUIRED)
find_package(rospy REQUIRED)
find_package(std_msgs REQUIRED)

将会产生3个环境变量,而如果写成下面这样,就只产生一个环境变量catkin_INCLUDE_DIRS

find_package(catkin REQUIRED COMPONENTS
               roscpp
               rospy
               std_msgs
               message_generation
) 

注意
这里提到的环境变量catkin_INCLUDE_DIRS,在CMakeList.txt中将会被include_directories加入

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

1.4 message/service/action

当我们自定义message/service/action时:(ROS-4)通信demo

需要使用add_message_files, add_service_files,add_action_files来导入相应的文件.msg .srv .action

接着使用generate_messages来将这些文件转化为cpppy文件

最后是使用catkin_package产生pkg-config和CMake文件,必须要依赖message_runtime

catkin_package(
 ...
 CATKIN_DEPENDS message_runtime ...
 ...)

总体流程

 find_package(...)
 add_message_files(...)
 add_service_files(...)
 add_action_files(...)
 generate_messages(...)
 catkin_package(...)

我们要确保msg文件被转换成为C++,Python和其他语言的源代码:
确保package.xml它包含两条语句:
message_generation
message_runtime

1.5 catkin_package

这是一个catkin提供的cmake宏,当我们要给构建系统指定catkin的特定的信息时就需要了,或者反过来利用他产生pkg-config和CMake文件。

这个函数必须在声明add_library()或者 add_executable()生成target之前使用。

1.6 指定编译的target

编译产生的target有多种形式,通常有两种:程序可以运行的可执行文件以及在可执行文件编译和运行时要用到的

1)target的命名:

target的命名很重要,在catkin中target的名字必须是唯一的,和你之前构建产生的和安装的都不能相同。这只是cmake内部的需要。可以利用set_target_properties()函数将以个target进行重命名。例如:

set_target_properties(rviz_image_view
                      PROPERTIES OUTPUT_NAME image_view
                      PREFIX "")

rviz_image_view 改为image_view

2)设置输出路径:

ROS中的输出路径时默认的,但是也可通过下面进行修改:

set_target_properties(python_module_library
  PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})

3)头文件路径和库文件路径:

在我们指定target之前,我们需要指明对target而言,在哪里找源文件,特别是在哪里找头文件,在哪里找库文件。

Include Paths:指明编译代码时在哪里寻找头文件;

Library Paths:指明可执行文件需要的库文件在哪里。

函数:include_directories

的参数是通过find_package产生的*_INCLUDE_DIRS变量和其他所有额外的头文件路径。例如:

include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})

这里"include"表示你的pacakge里面的include这个路径也包含在里面。可注意上文的1.3小节

link_directories():这个函数用来添加额外的库的路径,然而,这并不鼓励使用,因为所有的catkin和cmake的package在使用find_package时就已经自动的有他们的链接信息。简单的连接可以通过target_link_libraries()来进行。

4)可执行target:

例如:

add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)

5)库target:

add_library() 用来指定编译输出的库。默认的catkin编译产生共享库:

add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})

6)链接库:

使用target_link_libraries函数来指定可执行文件链接的。这个要用在add_executable()后面。

形如:

target_link_libraries(<executableTargetName>, <lib1>, <lib2>, ... <libN>)

比如:

add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo)

这就是生成可执行文件foo,生成共享库moo,再将可执行文件foo链接到库文件libmoo.so

2 package.xml

<package format="2">
  
  <name>foo_corename>
  
  <version>1.2.4version>
  
  <description>
    This package provides foo capability.
  description>
  
  <maintainer email="[email protected]">Ivana Bildbotzmaintainer>
  
  <license>BSDlicense>
  <url>http://ros.org/wiki/foo_coreurl>
  <author>Ivana Bildbotzauthor>
  
  <buildtool_depend>catkinbuildtool_depend>
  
  <depend>roscppdepend>
  <depend>std_msgsdepend>
  
  <build_depend>message_generationbuild_depend>
  
  <exec_depend>message_runtimeexec_depend>
  <exec_depend>rospyexec_depend>
  
  <test_depend>python-mocktest_depend>
  
  <doc_depend>doxygendoc_depend>
package>

在这里点题:自定义的ROS功能包怎么添加依赖?

找到depend,添加依赖即可

<depend>std_msgsdepend>

你可能感兴趣的:(ROS)