【ROS学习】(三)package.xml和CmakeList.txt文件的编写

  • Post author:
  • Post category:其他


package.xml和CmakeList.txt文件是生成程序包和节点的重要配置文件,在开始编写我们的程序之前,对这两个文件的编写需要有一定的了解。


1.package.xml。


package.xml实际上是一个程序包的描述文件,以下参考ros百科入门教程中的一个xml文件来解读。

<?xml version="1.0"?>
<package>
  <name>beginner_tutorials</name>
  <version>0.1.0</version>
  <description>The beginner_tutorials package</description>

  <maintainer email="you@yourdomain.tld">Your Name</maintainer>
  <license>BSD</license>
  <url type="website">http://wiki.ros.org/beginner_tutorials</url>
  <author email="you@yourdomain.tld">Jane Doe</author>

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>

  <run_depend>roscpp</run_depend>
  <run_depend>rospy</run_depend>
  <run_depend>std_msgs</run_depend>

</package>

在描述文件中,有几个重要的参数需要注意,出错将导致编译无法通过,一个是name,决定了编译出的程序包的名称,另外是build_depend和run_depend,它们指明了程序包编译和运行的依赖项,通常是所用到的库文件的名称。这三个参数需要根据自己的需要修改,其他的参数更多的是程序维护这的信息。

实际上,上面的xml文件是一种旧的书写格式,现在ros支持新的书写格式,与第一中格式的差别不大,并且ros对两种xml文件格式都是兼容的,新格式的xml文件可以参照下面的写法

<package format="2">
  <name>node_example</name>
  <version>0.0.1</version>
  <description>
    Example.
  </description>
  <author>Thomas Denewiler</author>
  <maintainer email="tdenewiler@gmail.com">Thomas Denewiler</maintainer>
  <license>BSD</license>
  <url>https://github.com/tdenewiler/node_example</url>

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>message_generation</build_depend>

  <depend>roscpp</depend>
  <depend>rospy</depend>
  <depend>std_msgs</depend>
</package>

可以看到,新版本相对旧版本的区别主要在于不区分build_depend和run_depend,更多的关于两种package.xml描述文件以及它们的区别,可以参考下面的网页


http://wiki.ros.org/catkin/package.xml



http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage


2.CmakeList.txt


下面来研究一下CmakeList.txt文件的编写方式,先预览一下一个完整的需要包括的内容

cmake_minimum_required()

要求的CMake最低版本

project()

程序包的名称

find_package()

编译依赖的程序包

add_message_files(), add_service_files(), add_action_files()

添加消息、服务或响应文件

generate_messages()

生成消息、服务或响应文件

catkin_package()

catkin程序包

add_library()/add_executable()/target_link_libraries()

添加库文件,可执行文件,链接库文件

catkin_add_gtest()

添加测试单元

install()

安装

前两个参数都很好理解,不再赘述。

find_package()作用是指定编译工程需要的其他程序包,这个函数的参数至少要包括catkin REQUIRED,我们来看一个典型的find_package()包含的内容。

find_package(catkin REQUIRED COMPONENTS     
             roscpp 
             std_msgs
             message_generation 
             sensor_msgs
)

catkin_package()是catkin提供的CMake宏,对生成的pkg和CMake文件进行配置,如果去掉编译也能通过,但是配置会发生变化,比如生成的可执行文件会在工作空间中的build文件夹中而不是devel/lib文件夹中,这样可能导致的一个后果是无法使用rosrun指令来运行可执行文件。

add_message_files()和generate_messages()是在使用用户自定义消息时需要添加,这部分可以在学习添加自定义消息时再深入学习。

add_executable()

指定要编译的可执行文件,例如

add_executable(myNode src/main.cpp src/file1.cpp src/file2.cpp)

上面的语句将调用src/main.cpp,src/file1.cpp和src/file2.cpp生成名为myNode的目标可执行文件,生成的可执行文件就是我们说的节点。

add_library()

生成库文件

target_link_libraries()

指定所生成的可执行文件所链接的库文件,通常写在add_executable()之后。一般来说,要生成一个ros节点,必须添加catkin_LIBRARIES,例如

target_link_libraries(myNode ${catkin_LIBRARIES})

install()

install()是一个可选项,通常在程序编译完后,目标可执行文件被放在工作空间的devel文件夹中,但通常我们希望把目标放在系统中,这样程序包就可以作为被其他人使用,作为其他程序的依赖项。具体做法可以参考ros wiki

http://wiki.ros.org/catkin/CMakeLists.txt



版权声明:本文为wengge987原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。