ROS工作空间目录结构和CMakeLists.txt的相关理解
一.工作空间
本质上是一个大的文件夹,用来存放与工程开发相关的文件。ROS默认使用catkin_make对工作空间进行编译。
工作空间一般包含四个目录空间:
1.src:代码空间,用来存放源码文件。
2.build: 编译空间,用来储存工作空间编译过程中产生的中间文件。
3.devel: 开发空间,放置编译生生成的可执行文件。
4.install:安装空间,非必须,可以将可执行文件安装到这个文件。
创建工作空间:
mkdir -p ~/name/scr
cd ~/name/
catkin_make 工作空间也有CMakeLists.txt,因此也给出了编译规则,说明需要catkin编译来生成该CM文件。
然后将工作空间的环境变量设置语句放入ros的.bashrc文件中,即加入source devel/name/setup.bash
这样每次打开终端时都会自动设置环境变量了。
包(package):在工作空间中创建一个包,用来实现一项功能。
创建一个包:
cd ~/workspace_name/src/
catkin_create_pkg package_name dependence1 dependence2 dependence3(一般有rospy roscpp std_msgs 自定义类型消息需要message_generation)
然后在CMakeLists.txt中添加和修改必要的一些内容。
修改完成后开始编译改包。
catkin_make --pkg package_name 此时可以重新编译整个工作空间,但只需要编译这个单独的包就了。
source ~/.bashrc
二.对CMakeLists.txt的重要语句的理解。
CMakeLists.txt 文件中规定了功能包的**编译规则**,包括**指定功能包名称**,**指定编译依赖项**,指定**要编译的源文件**,**指定要添加的消息格式文件/服务格式文件/动作格式文件**,指定生成的消息/服务/动作,指定头文件搜索目录,指定链接库搜索目录,指定生成的静态链接库文件,指定需要链接的库文件,**指定编译生成的可执行文件**以及路径等等。
catkin_make是将cmake与make的编译方式做了一个封装的指令工具, 规范了工作路径与生成文件路径,而且在新建个工作空间时就帮我们创建了一个顶层的CMakeLists.txt文件,它会递归的寻找到当前工作空间下的所有软件包内的CMakeLists.txt依次来编译每一个软件包。(src的每个包里都有CmakeLists.txt的)
package.xml 文件定义了功能包的属性信息,包括包名,版本号,作者,编译依赖和运行依赖等。
include 和 src 分别存放头文件(.h)和源程序文件(.c/.cpp等);
scripts 存放脚本文件(比如Python文件 *.py,shell文件 *.sh);
launch 存放 launch文件(*.launch),用于批量运行多个可执行文件;
config 存放配置文件(*.yaml等);
还有自定义的通信格式文件,包括消息(.msg)、服务(.srv)以及动作(*.action)
package.xml
一部分就是功能包的依赖信息,比如说roscpp rospy std_msgs
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
**<build_depend>std_msgs</build_depend>**
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
**<exec_depend>std_msgs</exec_depend>**
如果在当初创建功能包时没有写全,也可以随时在这里修改手动扩展依赖,主要是编译依赖build和运行依赖exec。
1.整体结构和框架
Required CMake Version (cmake_minimum_required)
Package Name (project())
Find other CMake/Catkin packages needed for build (find_package())
Enable Python module support (catkin_python_setup())
Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files())
Invoke message/service/action generation (generate_messages())
Specify package build info export (catkin_package())
Libraries/Executables to build (add_library()/add_executable()/target_link_libraries())
1.添加依赖项
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
2.看情况对消息/服务/动作修改
##Generate messages in the ‘msg’ folder
#add_message_files(
FILES
Message1.msg
Message2.msg
)
Generate services in the ‘srv’ folder
add_service_files(
FILES
Service1.srv
Service2.srv
)
Generate actions in the ‘action’ folder
add_action_files(
FILES
Action1.action
Action2.action
)
Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
#INCLUDE_DIRS include
#LIBRARIES begin_tutorials
#CATKIN_DEPENDS roscpp rospy std_msgs
#DEPENDS system_lib
)
#add_executable(${PROJECT_NAME}_node src/begin_tutorials_node.cpp)
这是添加可执行文件,第一项为生成的可执行的名字,第二项为src/cpp文件。
#add_dependencies(${PROJECT_NAME}_node KaTeX parse error: Expected '}', got 'EOF' at end of input: {{PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
6.链接到库
#target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})