ROS 目录结构
如果你使用 ROS 2,那么请你严格遵守 ROS 2 的目录结构规则。
工作空间(Workspace)
工作空间是创建、修改、编译软件包的目录。工作空间,直观的形容就是一个仓库,里面装载着 ROS 的各种项目工程,便于系统组织管理调用。在可视化图形界面里是一个文件夹。
ROS2 工作空间的文件 结构由四个目录组成,分别是 build/
、install/
、src/
、log/
,其中 src/
目录下存放功能包 package。
- src:代码空间,编写的代码、脚本,都需要人为的放置到这里
- build:编译空间,保存编译过程中产生的中间文件
- install:安装空间,放置编译得到的可执行文件和脚本
- log:日志空间,编译和运行过程中,保存各种警告、错误、信息等日志
总体来讲,我们绝大部分操作都是在 src
中进行的,编译成功后,执行 install
里边的结果,build
和 log
两个文件夹不需要我们操作。
初始化工作空间
mkdir -p ~/dev_ws/src
编译操作要在工作空间下进行!!!
build、install、log 这三个目录在编译后才会出现。
软件包(Package)
任何 ROS2 的代码无论是 C++ 还是 Python 都要放到 package 中才能正常的编译和运行。
一个 package 可以编译出来多个目标文件(可执行程序、动态静态库、头文件等等)。
package 结构
一个 package 下常见的文件目录:
pkg
├── CMakeLists.txt # package 的编译规则(必须)
├── package.xml # package 的描述信息(必须)
├── config/ # 配置文件
├── include/ # 头文件
├── launch/ # launch 文件
├── src/ # 源代 码文件
├── scripts/ # 可执行脚本
├── meshes/ # 模型文件
├── urdf/ # urdf 文件
├── world/ # world 文件
├── rviz/ # rviz 配置文件
其中 CMakeLists.txt和 package.xml 这两个文件是 package 中必不可少的。这两个文件定义了 package。colcon 编译系统在编译前,首先要解析这两个文件。
创建 package
首先进入你的工作空间
cd ~/dev_ws
然后使用 ros2 pkg 命令
ros2 pkg create <package-name> --build-type {cmake,ament_cmake,ament_python} --dependencies <dependencies -name>
这些请在 ROS 2 的学习过程中了解,这里不多赘述。
CMakeLists.txt
CMakeLists.txt 是 CMake 编译系统的规则文件,而 colcon 编译系统基本沿用了 CMake 的编译风格,只是针对 ROS2 工程添加了一些宏定义。所以在写法上,colcon 的 CMakeLists.txt 与 CMake 的基本一致。
cmake_minimum_required() # CMake的版本号
project() # 项目名称
find_package() # 找到编译需要的第三方库或其他 package
add_message_files() # 添加自定义 msg/srv 文件
add_service_files()
add_action_files()
generate_message() # 生成不同语言版本的 msg/srv 接口
add_library() # 生成库
add_executable() # 生成可执行二进制文件
add_dependencies() # 定义目标文件依赖于其他目标文件,确保其他目标已被构建
ament_target_dependencies() # 使依赖项的库、头文件和自身的依赖项被正常找到
target_link_libraries() # 链接
install() # 安装至本机
ament_package() # 安装项目,在 CMakeLists.txt 文件中最后一个调用
package.xml
pacakge.xml 包含了 package 的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。
实际上 ros2 pkg find、rosdep 等命令之所以能快速定位和分析出 package 的依赖项信息,就是直接读取了每一个 pacakge 中的 package.xml 文件。它为用户提供了快速了解一个 pacakge 的渠道。
<pacakge> # 根标记文件
<name> # 包名
<version> # 版本号
<description> # 内容描述
<maintainer> # 维护者
<license> # 软件许可证
<buildtool_depend> # 编译构建工具
<depend> # 指定依赖项为编译、导出、运行需要的依赖,最常用,相当于以下三个加在一起
<build_depend> # 编译依赖项
<build_export_depend> # 导出依赖项
<exec_depend> # 运行依赖项
<test_depend> # 测试用例依赖项
<doc_depend> # 文档依赖项
其他常见文件类型
launch
ROS2 的 launch 文件通常为 python 编写的,一般叫做 xxx_launch.py
或 xxx.launch.py
。
它对一个或多个 ROS 运行程序进行了打包,使其可以通过一句命令来启动全部。
msg/srv/action
ROS2 程序中有可能有一些自定义的消息/服务/动作文件,为程序开发者所设计的数据结构,这类的文件以 .msg
, .srv
, .action
结尾,通常放在 package 的 msg/
, srv/
, action/
路径下。
yaml
yaml 文件一般存储了 ROS2 需要加载的参数信息。通常在 launch 文件或程序中读取 .yaml
文件,把参数加载到参数服务器上。通常我们会把 yaml 文件存放在 package 的config/
或 param/
路径下。
urdf/xacro
urdf/xacro 文件是机器人模型的描述文件,以 .urdf
或 .xacro
结尾。它定义了机器人的连杆和关节的信息,以及它们之间的位置、角度等信息,通过 urdf 文件可以将机器人的物理信息表示出来,并在可视化调试和仿真中显示。
rviz
rviz 文件本质上是固定格式的文本文件,其中存储了 rviz2 窗口的配置(显示哪些控件、视角、参数)。通常 rviz 文件不需要我们去手动修改,而是直接在 rviz2 工具里保存,下次运行时直接读取。