Skip to main content

ROS 目录结构

info

如果你使用 ROS 2,那么请你严格遵守 ROS 2 的目录结构规则。

工作空间(Workspace)

工作空间是创建、修改、编译软件包的目录。工作空间,直观的形容就是一个仓库,里面装载着 ROS 的各种项目工程,便于系统组织管理调用。在可视化图形界面里是一个文件夹。

ROS2 工作空间的文件结构由四个目录组成,分别是 build/install/src/log/,其中 src/ 目录下存放功能包 package。

  • src:代码空间,编写的代码、脚本,都需要人为的放置到这里
  • build:编译空间,保存编译过程中产生的中间文件
  • install:安装空间,放置编译得到的可执行文件和脚本
  • log:日志空间,编译和运行过程中,保存各种警告、错误、信息等日志

总体来讲,我们绝大部分操作都是在 src 中进行的,编译成功后,执行 install 里边的结果,buildlog 两个文件夹不需要我们操作。

初始化工作空间

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.pyxxx.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 工具里保存,下次运行时直接读取。