大佬们早就不用catkin_make编译节点了,快来瞅瞅他们使用的啥
https://zhuanlan.zhihu.com/p/399753815
https://catkin-tools.readthedocs.io/en/latest/index.html#
ROS 编译系统 catkin 详解
https://www.jianshu.com/p/7fccfe18d7d3
ROS学习笔记(六)–catkin_make编译(这篇写得实在是太好了!!!!)
https://blog.csdn.net/sinat_16643223/article/details/113935412
2.1 Catkin编译系统
https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/chapter2/2.1.html
https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/chapter2/
https://blog.csdn.net/zyh821351004/article/details/50388429
https://www.bilibili.com/video/BV12E411W74i/?spm_id_from=333.337.search-card.all.click&vd_source=e7d12c9f66ab8294c87125a95510dac9
catkin_make基于cmake封装,使ros的编译工具。
kill -9 的理解
https://unix.stackexchange.com/questions/254463/what-does-the-option-9-mean-for-killall
目录
…/ 父级目录
杀死了所有进程
查找日志中所有make信息,在build子目录中拷贝运行相应命令
一共两条running command,即两条命令
分别为cmake 和 make -j8 -l8
跑完第一条后在相应目录跑第二条
Linux pwd(英文全拼:print work directory) 命令用于显示工作目录。
执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。
catkin_make -h 查看相关参数
其基于以上开发,融合了两条命令,使用更加便捷
早期的 gcc/g++方式效率低下,到后面即使是makefile也不能满足需求
一个Catkin的软件包(package)必须要包括两个文件:
package.xml: 包括了package的描述信息
CMakeLists.txt: 构建package所需的CMake文件
catkin编译的工作流程如下:
首先在工作空间catkin_ws/src/下递归的查找其中每一个ROS的package。
package中会有package.xml和CMakeLists.txt文件,Catkin(CMake)编译系统依据CMakeLists.txt文件,从而生成makefiles(放在catkin_ws/build/)。
然后make刚刚生成的makefiles等文件,编译链接生成可执行文件(放在catkin_ws/devel)。
也就是说,Catkin就是将cmake与make指令做了一个封装从而完成整个编译过程的工具。catkin有比较突出的优点,主要是:
操作更加简单
一次配置,多次使用
跨依赖项目编译
后两个路径由catkin系统自动生成、管理,我们日常的开发一般不会去涉及,而主要用到的是src文件夹,我们写的ROS程序、网上下载的ROS源代码包都存放在这里。
在编译时,catkin编译系统会递归的查找和编译src/下的每一个源代码包。因此你也可以把几个源代码包放到同一个文件夹下,如下图所示:
二进制包里面包括了已经编译完成,可以直接运行的程序。你通过sudo apt-get install来进行下载和解包(安装),执行完该指令后就可以马上使用了。因此这种方式简单快捷,适合比较固定、无需改动的程序。
而源代码包里是程序的原始代码,在你的计算机上必须经过编译,生成了可执行的二进制文件,方可运行。一些个人开发的程序、第三方修改或者你希望修改的程序都应当通过源代码包的来编译安装。
一个package下常见的文件、路径有:
├── CMakeLists.txt #package的编译规则(必须)
├── package.xml #package的描述信息(必须)
├── src/ #源代码文件
├── include/ #C++头文件
├── scripts/ #可执行脚本
├── msg/ #自定义消息
├── srv/ #自定义服务
├── models/ #3D模型文件
├── urdf/ #urdf文件
├── launch/ #launch文件
其中定义package的是CMakeLists.txt和package.xml,这两个文件是package中必不可少的。catkin编译系统在编译前,首先就要解析这两个文件。这两个文件就定义了一个package。
CMakeLists.txt: 定义package的包名、依赖、源文件、目标文件等编译规则,是package不可少的成分
package.xml: 描述package的包名、版本号、作者、依赖等信息,是package不可少的成分
src/: 存放ROS的源代码,包括C++的源码和(.cpp)以及Python的module(.py)
include/: 存放C++源码对应的头文件
scripts/: 存放可执行脚本,例如shell脚本(.sh)、Python脚本(.py)
msg/: 存放自定义格式的消息(.msg)
srv/: 存放自定义格式的服务(.srv)
models/: 存放机器人或仿真场景的3D模型(.sda, .stl, .dae等)
urdf/: 存放机器人的模型描述(.urdf或.xacro)
launch/: 存放launch文件(.launch或.xml)
通常ROS文件组织都是按照以上的形式,这是约定俗成的命名习惯,建议遵守。以上路径中,只有CMakeLists.txt和package.xml是必须的,其余路径根据软件包是否需要来决定。
https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/chapter2/2.5.html
CMakeLists.txt原本是Cmake编译系统的规则文件,而Catkin编译系统基本沿用了CMake的编译风格,只是针对ROS工程添加了一些宏定义。所以在写法上,catkin的CMakeLists.txt与CMake的基本一致。
这个文件直接规定了这个package要依赖哪些package,要编译生成哪些目标,如何编译等等流程。所以CMakeLists.txt非常重要,它指定了由源码到目标文件的规则,catkin编译系统在工作时首先会找到每个package下的CMakeLists.txt,然后按照规则来编译构建。
cmake_minimum_required() #CMake的版本号
project() #项目名称
find_package() #找到编译需要的其他CMake/Catkin package
catkin_python_setup() #catkin新加宏,打开catkin的Python Module的支持
add_message_files() #catkin新加宏,添加自定义Message/Service/Action文件
add_service_files()
add_action_files()
generate_message() #catkin新加宏,生成不同语言版本的msg/srv/action接口
catkin_package() #catkin新加宏,生成当前package的cmake配置,供依赖本包的其他软件包调用
add_library() #生成库
add_executable() #生成可执行二进制文件
add_dependencies() #定义目标文件依赖于其他目标文件,确保其他目标已被构建
target_link_libraries() #链接
catkin_add_gtest() #catkin新加宏,生成测试
install() #安装至本机
小海龟例子
cmake_minimum_required(VERSION 2.8.3)
#CMake至少为2.8.3版
project(turtlesim)
#项目(package)名称为turtlesim,在后续文件中可使用变量${PROJECT_NAME}来引用项目名称turltesim
find_package(catkin REQUIRED COMPONENTS geometry_msgs message_generation rosconsole roscpp roscpp_serialization roslib rostime std_msgs std_srvs)
#cmake宏,指定依赖的其他pacakge,实际是生成了一些环境变量,如<NAME>_FOUND, <NAME>_INCLUDE_DIRS, <NAME>_LIBRARYIS
#此处catkin是必备依赖 其余的geometry_msgs...为组件
find_package(Qt5Widgets REQUIRED)
find_package(Boost REQUIRED COMPONENTS thread)
include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
#指定C++的头文件路径
link_directories(${catkin_LIBRARY_DIRS})
#指定链接库的路径
add_message_files(DIRECTORY msg FILES
Color.msg Pose.msg)
#自定义msg文件
add_service_files(DIRECTORY srv FILES
Kill.srv
SetPen.srv
Spawn.srv
TeleportAbsolute.srv
TeleportRelative.srv)
#自定义srv文件
generate_messages(DEPENDENCIES geometry_msgs std_msgs std_srvs)
#在add_message_files、add_service_files宏之后必须加上这句话,用于生成srv msg头文件/module,生成的文件位于devel/include中
catkin_package(CATKIN_DEPENDS geometry_msgs message_runtime std_msgs std_srvs)
# catkin宏命令,用于配置ROS的package配置文件和CMake文件
# 这个命令必须在add_library()或者add_executable()之前调用,该函数有5个可选参数:
# (1) INCLUDE_DIRS - 导出包的include路径
# (2) LIBRARIES - 导出项目中的库
# (3) CATKIN_DEPENDS - 该项目依赖的其他catkin项目
# (4) DEPENDS - 该项目所依赖的非catkin CMake项目。
# (5) CFG_EXTRAS - 其他配置选项
set(turtlesim_node_SRCS
src/turtlesim.cpp
src/turtle.cpp
src/turtle_frame.cpp
)
set(turtlesim_node_HDRS
include/turtlesim/turtle_frame.h
)
#指定turtlesim_node_SRCS、turtlesim_node_HDRS变量
qt5_wrap_cpp(turtlesim_node_MOCS ${turtlesim_node_HDRS})
add_executable(turtlesim_node ${turtlesim_node_SRCS} ${turtlesim_node_MOCS})
# 指定可执行文件目标turtlesim_node
target_link_libraries(turtlesim_node Qt5::Widgets ${catkin_LIBRARIES} ${Boost_LIBRARIES})
# 指定链接可执行文件
add_dependencies(turtlesim_node turtlesim_gencpp)
add_executable(turtle_teleop_key tutorials/teleop_turtle_key.cpp)
target_link_libraries(turtle_teleop_key ${catkin_LIBRARIES})
add_dependencies(turtle_teleop_key turtlesim_gencpp)
add_executable(draw_square tutorials/draw_square.cpp)
target_link_libraries(draw_square ${catkin_LIBRARIES} ${Boost_LIBRARIES})
add_dependencies(draw_square turtlesim_gencpp)
add_executable(mimic tutorials/mimic.cpp)
target_link_libraries(mimic ${catkin_LIBRARIES})
add_dependencies(mimic turtlesim_gencpp)
# 同样指定可执行目标、链接、依赖
install(TARGETS turtlesim_node turtle_teleop_key draw_square mimic
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
# 安装目标文件到本地系统
install(DIRECTORY images
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
FILES_MATCHING PATTERN "*.png" PATTERN "*.svg")
package.xml也是一个catkin的package必备文件,它是这个软件包的描述文件,在较早的ROS版本(rosbuild编译系统)中,这个文件叫做manifest.xml,用于描述pacakge的基本信息。如果你在网上看到一些ROS项目里包含着manifest.xml,那么它多半是hydro版本之前的项目了。
pacakge.xml包含了package的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。
实际上rospack find、rosdep等命令之所以能快速定位和分析出package的依赖项信息,就是直接读取了每一个pacakge中的package.xml文件。它为用户提供了快速了解一个pacakge的渠道。
pacakge.xml遵循xml标签文本的写法,由于版本更迭原因,现在有两种格式并存(format1与format2),不过区别不大。老版本(format1)的pacakge.xml通常包含以下标签:
<pacakge> 根标记文件
<name> 包名
<version> 版本号
<description> 内容描述
<maintainer> 维护者
<license> 软件许可证
<buildtool_depend> 编译构建工具,通常为catkin
<build_depend> 编译依赖项,与Catkin中的
<run_depend> 运行依赖项
说明:其中1-6为必备标签,1是根标签,嵌套了其余的所有标签,2-6为包的各种属性,7-9为编译相关信息。
在新版本(format2)中,包含的标签为:
<pacakge> 根标记文件
<name> 包名
<version> 版本号
<description> 内容描述
<maintainer> 维护者
<license> 软件许可证
<buildtool_depend> 编译构建工具,通常为catkin
<depend> 指定依赖项为编译、导出、运行需要的依赖,最常用
<build_depend> 编译依赖项
<build_export_depend> 导出依赖项
<exec_depend> 运行依赖项
<test_depend> 测试用例依赖项
<doc_depend> 文档依赖项
由此看见新版本的pacakge.xml格式上增加了 、、、 ,相当于将之前的build和run依赖项描述进行了细分。
目前Indigo、Kinetic、Lunar等版本的ROS都同时支持两种版本的package.xml,所以无论选哪种格式都可以。
为了说明pacakge.xml写法,还是以turtlesim软件包为例,其pacakge.xml文件内容如下,我们添加了相关的注释:
<?xml version="1.0"?> <!--本示例为老版本的pacakge.xml-->
<package> <!--pacakge为根标签,写在最外面-->
<name>turtlesim</name>
<version>0.8.1</version>
<description>
turtlesim is a tool made for teaching ROS and ROS packages.
</description>
<maintainer email="[email protected]">Dirk Thomas</maintainer>
<license>BSD</license>
<url type="website">http://www.ros.org/wiki/turtlesim
<url type="bugtracker">https://github.com/ros/ros_tutorials/issues
<url type="repository">https://github.com/ros/ros_tutorials
<author>Josh Faust</author>
<!--编译工具为catkin-->
<buildtool_depend>catkin</buildtool_depend>
<!--编译时需要依赖以下包-->
<build_depend>geometry_msgs</build_depend>
<build_depend>qtbase5-dev</build_depend>
<build_depend>message_generation</build_depend>
<build_depend>qt5-qmake</build_depend>
<build_depend>rosconsole</build_depend>
<build_depend>roscpp</build_depend>
<build_depend>roscpp_serialization</build_depend>
<build_depend>roslib</build_depend>
<build_depend>rostime</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>std_srvs</build_depend>
<!--运行时需要依赖以下包-->
<run_depend>geometry_msgs</run_depend>
<run_depend>libqt5-core</run_depend>
<run_depend>libqt5-gui</run_depend>
<run_depend>message_runtime</run_depend>
<run_depend>rosconsole</run_depend>
<run_depend>roscpp</run_depend>
<run_depend>roscpp_serialization</run_depend>
<run_depend>roslib</run_depend>
<run_depend>rostime</run_depend>
<run_depend>std_msgs</run_depend>
<run_depend>std_srvs</run_depend>
</package>
以上内容是老版本(format1)的写法,如果要写成新版本(format2)则可以改为:
<?xml version="1.0"?>
<package format="2"> <!--在声明pacakge时指定format2,为新版格式-->
<name>turtlesim</name>
<version>0.8.1</version>
<description>
turtlesim is a tool made for teaching ROS and ROS packages.
</description>
<maintainer email="[email protected]">Dirk Thomas</maintainer>
<license>BSD</license>
<url type="website">http://www.ros.org/wiki/turtlesim
<url type="bugtracker">https://github.com/ros/ros_tutorials/issues
<url type="repository">https://github.com/ros/ros_tutorials
<author>Josh Faust</author>
<!--编译工具为catkin-->
<buildtool_depend>catkin</buildtool_depend>
<!--用depend来整合build_depend和run_depend-->
<depend>geometry_msgs</depend>
<depend>rosconsole</depend>
<depend>roscpp</depend>
<depend>roscpp_serialization</depend>
<depend>roslib</depend>
<depend>rostime</depend>
<depend>std_msgs</depend>
<depend>std_srvs</depend>
<!--build_depend标签未变-->
<build_depend>qtbase5-dev</build_depend>
<build_depend>message_generation</build_depend>
<build_depend>qt5-qmake</build_depend>
<!--run_depend要改为exec_depend-->
<exec_depend>libqt5-core</exec_depend>
<exec_depend>libqt5-gui</exec_depend>
<exec_depend>message_runtime</exec_depend>
</package>
package.xml
和 CMakeLists.txt
是 ROS (Robot Operating System) 系统中的两个重要文件,用于描述 ROS 软件包的依赖关系和构建过程。它们在 ROS 软件包的构建过程中都起着非常重要的作用,但它们的作用流程是不同的。
package.xml
文件在 ROS 中,一个软件包通常会依赖其他的软件包,这些依赖关系需要在 package.xml
文件中进行声明。package.xml
是 ROS 软件包的描述文件,用于记录软件包的基本信息、作者、许可证等元数据以及软件包的依赖关系。
当一个 ROS 软件包被安装或者编译时,ROS 会自动检查软件包的依赖关系,并安装或编译缺失的依赖项。因此,package.xml
文件对于 ROS 软件包的构建和安装具有非常重要的作用。
CMakeLists.txt
文件CMakeLists.txt
是 ROS 软件包的构建配置文件,用于定义软件包的构建规则以及依赖项的链接方式等。它是使用 CMake 构建系统进行构建的必需文件。
CMakeLists.txt
文件中通过添加 find_package()
、 catkin_package()
等指令,来定义软件包的依赖关系和链接方式。此外,CMakeLists.txt
还会定义软件包中所包含的可执行文件、库文件、头文件等构建规则。
在 ROS 中,使用 catkin_make
命令来自动构建软件包的过程实际上是调用了 CMakeLists.txt
文件中定义的编译规则。因此,CMakeLists.txt
文件对于 ROS 软件包的构建过程具有非常重要的作用。
综上所述,package.xml
文件和 CMakeLists.txt
文件在 ROS 软件包的构建过程中起着不同的作用。前者用于描述软件包的元数据和依赖关系,在软件包的安装和编译过程中起到关键的作用;后者则用于定义软件包的构建规则和链接方式,在 ROS 的自动构建过程中发挥重要作用。
是的,通常情况下,在使用CMake构建ROS项目时,需要在catkin_ws/src
目录下创建一个新的ROS包,然后在该包内编写源代码和配置文件(例如CMakeLists.txt
等),并将其与其他ROS包进行依赖关系的管理。在完成了ROS包的编写后,需要在catkin_ws/
目录下执行catkin_make
命令进行编译和构建,生成可执行文件和库文件等二进制文件。
在执行catkin_make
命令时,CMake会自动将所有ROS包的源代码和编译结果存放在catkin_ws/build
和catkin_ws/devel
目录下。其中,build
目录用于存放编译过程中生成的中间文件和构建工件,而devel
目录则用于存放最终生成的可执行文件、库文件、ROS节点和消息等内容。
因此,在使用CMake进行ROS项目构建时,你必须确保使用正确的目录结构,即将源代码和配置文件存放在catkin_ws/src
内,而在构建过程中会自动在catkin_ws/build
和catkin_ws/devel
目录下生成所需的编译文件和可执行文件等内容。如果你需要直接修改或查看具体的编译文件,可以到catkin_ws/build
目录下查找,但一般来说在大多数情况下,你只需要在catkin_ws/devel
目录下找到最终的可执行文件、库文件和ROS节点等内容即可。