一、ROS 编译系统简介




1、ROS 编译需求


自动驾驶 场景下 , 为满足 定制化、性能、兼容性、安全合规 的刚性需求 , 需要 自动驾驶开发者 自行 编译 ROS 系统源码 ;

ROS 系统 源码 通过其提供的 Catkin 编译工具 进行 源码编译 ;

Catkin 是 ROS 的默认 编译系统 , 是 基于 CMake 的扩展 , 专为 ROS 包的 模块化构建 与 依赖管理 而设计 ;


2、ROS 编译层级


下图 展示了 ROS 编译系统 从 底层源代码编译上层工程化构建 的分层逻辑 ;

  • 最底层 : 源代码编译层 , 使用 make 工具进行构建 , 在 Makefile 中配置 C++ 源代码编译构建方式 , 使用 gcc/g++ 编译器编译程序 ;
    • gcc/g++ : 编译器 , 负责将 源代码 hello.cpp 编译为 目标文件 hello.o , 再进一步链接成可执行文件 hello ;
    • Makefile : 描述文件间的 依赖关 系和 编译规则 , 注意 不同平台的 Makefile 规则和格式是不同的 ;
    • Make : 读取 Makefile 构建脚本 , 并自动化执行 编译、链接 流程的工具 ;
  • 中间层 : 跨平台构建工具层 , 使用 Cmake 工具 生成 Makefile 构建文件 ;
    • CMakeLists.txt : 这是 CMake 编译的配置文件 , 定义项目的编译规则、依赖、生成目标等 , 该方式比直接写 Makefile 更简洁 , 支持跨平台 ;
    • Cmake : 读取 CMakeLists.txt , 生成对应平台的 构建文件 , 实现 " 一次配置 多平台编译 " ;
  • 上层 : ROS 构建系统层 , 使用 Catkin 工具根据配置生成 特定的 构建文件 ;
    • catkin_ws : Catkin 工作空间 , ROS 中组织功能包的目录结构 , 通常包含 src 功能包 、build 编译中间产物 、devel 开发版安装目录 等子目录 ;
    • ROS package : ROS 功能包 , 是 ROS 的基本单元 , 包含 CMakeLists.txt 编译规则 、package.xml 依赖声明 、源代码、配置文件等 ;
    • Catkin :基于 CMake 的 ROS 专属扩展工具 , 负责解析 功能包 的 依赖、批量编译多包、生成 ROS 特定的 构建产物 ;

在这里插入图片描述


3、ROS 对 CMake 扩展


Catkin 在 CMake 的基础上 , 针对 ROS 的 多包协作、节点化架构 做了关键扩展 :

  • 编译规则 : 编译 ROS 时 , 编译规则 定义在 功能包 中的 CMakeLists.txt 和 package.xml 配置文件 中 , 编译规则一旦写好 , 后续在不同环境或工作空间中可重复使用 ;
  • 依赖自动解析 : 通过 package.xml 声明包的依赖 , Catkin 会自动解析并按 依赖顺序 编译 , 大幅降低 多模块项目 的 编译管理 成本 ;
  • 多包批量编译 : 支持 在 Catkin 工作空间中 一次性 编译 多个功能包 , 无需手动管理 编译顺序 , 适合 大型 自动驾驶、机器人 项目 的 " 多节点、多模块 " 场景 ;
  • ROS 编译产物 : 自动处理 ROS 特有的流程 , 如 :
    • 生成代码 : 消息 ( *.msg ) 、服务 ( *.srv ) 的代码自动生成 ;
    • 配置节点 : 节点的安装路径配置 , 如 : 将可执行节点放到 " devel/lib/包名/ " 目录下 ;
    • 配置环境 : 环境变量自动配置 , 如 : setup.bash 脚本 , 让系统能找到 ROS 包和可执行文件 ;

4、ROS 编译系统相关文档


ROS 编译系统 相关文档 : Catkin 猫耳 ;


5、下载 Ubuntu 16.04.7 LTS ( Xenial Xerus )


编译 ROS 源码 一般是在 Ubuntu 16.04.7 LTS ( Xenial Xerus ) 系统上进行 ;

下载 16.04.7 LTS (Xenial Xerus) 版本的 Ubuntu 操作系统 , 官方下载地址 : https://releases.ubuntu.com/ , 进入该界面后 找到 " 16.04.7/ " 下载项 ;

在这里插入图片描述

乌班图 16.04.7 LTS (Xenial Xerus) 下载页面 https://releases.ubuntu.com/xenial/ ;
在这里插入图片描述

下载 ubuntu-16.04.7-desktop-amd64.iso 文件 , 下载链接 https://releases.ubuntu.com/xenial/ubuntu-16.04.7-desktop-amd64.iso ;
在这里插入图片描述


如果 官方页面 下载速度太慢 , 可以 到 国内镜像源 下载 :





二、ROS 编译相关概念




1、Package 包


Package 是 ROS 中 最基本、最核心 的 软件组织单元 , 所有 ROS 程序 如 : 节点、库、配置文件 等 , 都是以 Package 包 的形式组织的 ;


一个 Package 包 的 核心文件类型如下 :

  • 依赖声明 : package.xml 文件 , 声明了 依赖关系 , 定义了包的基本属性 包名、版本、描述、维护者、许可证 ;
  • 编译规则 : CMakeLists.txt 文件 , 告诉 Catkin 如何编译这个包 ;
  • 独立节点 : 是 可执行文件 , 一般是使用 C++ / Python 语言 编写 的 main 函数 可执行文件 ;
  • 工具库
  • 配置文件
  • 数据集资源

Package 包 层次 目录 示例 : package.xml 和 CMakeLists.txt 是两个必须包含的文件 , 其它文件或目录都是可选的 ;

my_package/                 # 包的根目录,名称即包名
    ├── CMakeLists.txt      # 包的编译规则(由 catkin 管理)
    ├── package.xml         # 包的“清单”或“说明书”(Manifest)
    ├── src/                # (可选)存放 C++ 源代码
    │   └── my_node.cpp
    ├── include/            # (可选)存放头文件
    │   └── my_package/
    │       └── my_class.h
    ├── scripts/            # (可选)存放可执行脚本(如 Python 节点)
    │   └── my_python_node.py
    ├── msg/                # (可选)存放自定义消息定义(.msg 文件)
    ├── srv/                # (可选)存放自定义服务定义(.srv 文件)
    ├── launch/             # (可选)存放启动文件(.launch 或 .xml 文件)
    └── ...                 # 其他自定义目录

2、package.xml 配置文件


package.xml 是 包清单 , 是 Package 包的 身份证 和 说明书 , 其中包含了 包名、版本、描述、维护者、许可证 ;


package.xml 中 声明的 包的依赖关系 :

  • <buildtool_depend> 标签 用于声明 Catkin 构建工具 的依赖 ;
  • <build_depend> 标签 用于声明 编译依赖 , 指定构建过程中使用的依赖 ;
  • <exec_depend> 或 <run_depend> 标签 用于声明 运行依赖 ;
  • <test_depend> 标签 用于声明 运行测试时需要的依赖 ;
  • <depend> 标签 用于声明 编译依赖 和 运行依赖 ;

package.xml 中 声明的 关键标签说明 :

  • <description> 标签 用于声明 对包功能的简要描述 ;
  • <maintainer> 标签 用于声明 包的主要维护者及联系方式 ;
  • <license> 标签 用于声明 包的软件许可证 ;

package.xml 代码示例 :

<?xml version="1.0"?> <!-- XML文档声明,指定版本为1.0 -->
<package format="2"> <!-- 定义ROS包,使用格式版本2 -->
  <!-- 包的基本信息 -->
  <name>choreonoid_ros_tank_tutorial</name> <!-- 包名称 -->
  <version>1.0.0</version> <!-- 版本号 -->
  <description> <!-- 包描述 -->
    Tutorial on how to implement a robot controller with I/O using ROS
    <!-- 教程描述:如何使用ROS实现带输入输出的机器人控制器 -->
  </description>
  
  <!-- 维护者信息 -->
  <maintainer email="nakaoka@choreonoid.co.jp">Shin'ichiro Nakaoka</maintainer>
  <!-- 维护者姓名和邮箱 -->
  
  <license>MIT</license> <!-- 软件许可证类型 -->
  
  <!-- 作者信息 -->
  <author email="nakaoka@choreonoid.co.jp">Shin'ichiro Nakaoka</author>
  <!-- 作者姓名和邮箱 -->
  
  <!-- 相关链接 -->
  <url type="website">http://choreonoid.org</url> <!-- 官方网站 -->
  <url type="repository">https://github.com/choreonoid/choreonoid_ros_tank_tutorial.git</url>
  <!-- 代码仓库地址 -->
  
  <!-- 构建工具依赖 -->
  <buildtool_depend>catkin</buildtool_depend>
  <!-- 指定使用catkin作为构建工具 -->
  
  <!-- 运行时依赖包列表 -->
  <depend>choreonoid</depend> <!-- Choreonoid机器人仿真平台 -->
  <depend>choreonoid_ros</depend> <!-- Choreonoid的ROS接口 -->
  <depend>choreonoid_joy</depend> <!-- 游戏手柄控制支持 -->
  <depend>std_msgs</depend> <!-- ROS标准消息类型 -->
  <depend>sensor_msgs</depend> <!-- 传感器消息类型 -->
  <depend>image_transport</depend> <!-- 图像传输工具 -->
  
  <!-- 导出配置 -->
  <export>
    <build_type>cmake</build_type> <!-- 指定使用CMake构建系统 -->
  </export>
</package>

3、CMakeLists.txt 配置文件


CMakeLists.txt 配置文件 是 包 的 构建指南 , 告诉 Catkin 如何 编译源代码、生成目标 ( 可执行文件、库 ) , 并定义 安装规则 ;

该配置文件 使用 CMake 语法 , 其中使用了部分 Catkin 编译工具 提供的 宏 ;


CMakeLists.txt 配置文件 关键指令 :

  • cmake_minimum_required : 指定需要的 CMake 最低版本 ;
  • project() : 定义项目名称 ;
  • find_package() : 查找构建时需要的其他 CMake/Catkin 包 , REQUIRED 关键字表示必须找到 ;
  • catkin_package() : Catkin 宏 , 用于声明 Catkin 相关的 构建和依赖 信息 ;
  • add_executable() / add_library() : 分别用于 声明构建 可执行文件和库 ;
  • target_link_libraries() : 将 目标 与 库 进行链接 ;
  • install() : 定义安装规则 , 指定 构建产物 在安装时的目标路径 ;

CMakeLists.txt 配置文件 示例代码 :

cmake_minimum_required(VERSION 3.0.2) # 所需CMake最低版本
project(your_package_name)            # 项目/包名,通常与package.xml中的<name>一致

# 查找构建所需的其它CMake/Catkin包
find_package(catkin REQUIRED)
find_package(roscpp REQUIRED)
find_package(std_msgs REQUIRED)

# Catkin特定配置,如声明此包提供的Catkin包
catkin_package()

# 指定头文件目录
include_directories(include ${catkin_INCLUDE_DIRS})

# 声明要构建的可执行文件及其源文件
add_executable(my_node src/my_node.cpp)

# 为可执行文件指定链接库
target_link_libraries(my_node ${catkin_LIBRARIES})

# 安装规则(可选但推荐)
install(TARGETS my_node
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

4、Catkin Workspace ( Catkin 工作空间 )


Catkin Workspace 是 ROS 项目的根目录 , 用于 组织、编译和管理多个相关的 ROS 包 , 是 ROS 软件开发的容器环境 ;


Catkin 工作空间 的 操作 可参考如下代码 :

# 创建工作空间目录结构
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src

# 初始化工作空间(生成顶层 CMakeLists.txt)
catkin_init_workspace

# 返回工作空间根目录并编译
cd ~/catkin_ws
catkin_make

# 设置环境变量
source devel/setup.bash
# 或将其添加到 ~/.bashrc
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

标准的 Catkin 工作空间 的 目录层级如下 :

catkin_ws/                 # 工作空间根目录
├── build/                 # 编译过程中生成的中间文件
├── devel/                 # 编译生成的目标文件(可执行文件、库等)
│   ├── setup.bash         # 环境设置脚本
│   └── lib/               # 编译生成的库文件
└── src/                   # 源代码空间(用户主要工作目录)
    ├── CMakeLists.txt     # 顶层 CMakeLists.txt(由 catkin_init_workspace 生成)
    ├── package_1/         # 第一个 ROS 包
    ├── package_2/         # 第二个 ROS 包
    └── ...




三、ROS 运行相关概念




1、ROS Node ( 节点 )


ROS Node 是 ROS 系统中的基本执行单元 , 是一个可执行程序 , 通常是 C++ 或 Python 程序 , 负责完成特定的计算任务 ;

每个 ROS 节点 都是一个 独立的进程 , 运行在 分布式系统 中的 不同计算机 上 ;


ROS 节点有如下特性 :

  • 功能单一 : 每个节点应专注于单一功能 , 如传感器数据处理、运动控制、路径规划等 ;
  • 通信机制 : 节点之间通过 ROS 提供的 发布 / 订阅 通信机制 进行交互 ;
  • 唯一标识 : 每个节点在运行时会被分配一个唯一的名称 ;
  • 主节点 : 节点通过 ROS Master 进行 通信管理 ;

ROS 节点 运行相关命令 :

# 直接运行节点
rosrun <package_name> <node_name>

# 通过 launch 文件启动多个节点
roslaunch <package_name> <launch_file.launch>

# 列出当前运行的所有节点
rosnode list

# 显示指定节点的详细信息
rosnode info

# 测试与指定节点的连接
rosnode ping

# 终止指定节点的运行
rosnode kill

# 列出在特定机器上运行的节点
rosnode machine

# 清理无法连接的节点注册信息
rosnode cleanup

2、ROS Parameter ( 参数 )


ROS Parameter 是 存储在参数服务器上的配置数据 , 以键值对的形式存在 , 这些参数用于存储节点的配置信息 , 可以在运行时动态修改 ;


ROS 参数 有如下特点 :

  • 全局存储 : 存储在 ROS Master 的参数服务器中 ;
  • 键值对形式 : 参数名 → 参数值 ;
  • 动态修改 : 运行时可以读取和修改 ;
  • 多种数据类型 : 支持整型、浮点型、字符串、列表等 ;
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐