• 工作空间、功能包和节点

  • 概念

工作空间(Workspace)是开发者进行ROS 2工程管理的基本环境,它通常由源码目录、编译生成目录以及安装目录等组成。工作空间的意义在于为开发者提供一个统一的开发与运行平台,使得多个功能包能够在同一环境下组织与协作。因此,可以将工作空间视为整个工程的外层容器,为功能模块的集成和扩展奠定了基础。

其次,功能包(Package)是ROS 2中功能实现的核心单元。每一个功能包都包含必要的代码文件、依赖声明、配置文件以及启动文件等,它是系统功能划分与复用的基本模块。功能包的设计理念在于高内聚与低耦合,即一个功能包通常专注于某一类功能实现,例如机器人导航、传感器数据采集或运动控制等。通过功能包的封装,开发者能够更方便地共享与部署功能,从而提升整个系统的模块化程度。下图是典型python功能包

最后,节点(Node)是ROS 2中最小的运行单元,它以独立进程的形式存在,并承担具体的功能任务。节点之间通过话题(Topic)、服务(Service)与动作(Action)进行通信,从而构建起复杂的分布式系统。一个功能包中通常可以包含一个或多个节点,这些节点相互协作,共同实现功能包所设定的目标。例如,一个导航功能包可能同时包含负责地图构建的节点、路径规划的节点以及运动控制的节点。

举例,我们做一个机器人,工作空间的结构可能是这样:

robot_ws/                             ← 工作空间

    src/

        ├── motor_control_pkg/        ← 功能包:电机控制

        │   ├── nodes/

        │   │   ├── motor_driver.py   ← 节点:控制电机

        │   │   └── encoder_reader.py ← 节点:读取编码器

        │   └── package.xml

        │

        ├── sensor_pkg/               ← 功能包:传感器

        │   ├── nodes/

        │   │   ├── lidar_node.py     ← 节点:激光雷达

        │   │   └── camera_node.py    ← 节点:摄像头

        │   └── package.xml

        │

        └── navigation_pkg/           ← 功能包:导航

            ├── nodes/

            │   ├── path_planner.py   ← 节点:路径规划

            │   └── localization.py   ← 节点:定位

            └── package.xml
  • 开发工具链详解

  • 构建系统:colcon

colcon是ROS 2的官方构建工具,继承自catkin工具链并进行了功能扩展。

核心命令序列:

# 基础构建操作
colcon build

colcon build --packages-select package_name

colcon build --packages-up-to package_name
# 开发调试配置
colcon build --symlink-install

colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug

构建系统管理整个工作空间的编译、链接和安装过程,确保依赖关系正确解析。

依赖管理:rosdep

rosdep负责系统级依赖的自动安装和管理,确保开发环境一致性。

关键工作流程:

# 依赖检查和安装

rosdep install -i --from-path src --ros-distro $ROS_DISTRO -y

rosdep check --from-paths src --ignore-src
# 国内镜像加速

rosdepc update

rosdepc install -i --from-path src --ros-distro $ROS_DISTRO -y
  1. 关键配置文件

    包清单文件:package.xml

package.xml定义功能包的元数据和依赖关系,采用XML格式:


<package format="3">

  <name>package_name</name>

  <version>1.0.0</version>

  <description>功能描述</description>

 

  <depend>rclpy</depend>

  <build_depend>ament_cmake</build_depend>

  <exec_depend>std_msgs</exec_depend>

  <test_depend>ament_lint_auto</test_depend>

</package>

依赖声明分为构建依赖、执行依赖和测试依赖三个层级。

构建配置文件

Python功能包使用setup.py配置构建参数:

python

setup(

    name=package_name,

    version='1.0.0',

    packages=[package_name],

    install_requires=['setuptools'],

    entry_points={

        'console_scripts': [

            'node_name = package_name.module_name:main_function',

        ],

    },

)

entry_points节将Python模块注册为可执行节点,是功能包与节点关联的关键配置。

标准开发流程

 项目初始化阶段

mkdir -p ~/ros2_ws/src

cd ~/ros2_ws

功能包创建阶段

# Python功能包
ros2 pkg create package_name --build-type ament_python --dependencies rclpy std_msgs
# C++功能包 
ros2 pkg create package_name --build-type ament_cmake --dependencies rclcpp std_msgs

 依赖解析阶段

rosdep install -i --from-path src --ros-distro $ROS_DISTRO -y

构建测试阶段

colcon build --packages-select package_name --symlink-install

source install/setup.bash

ros2 run package_name node_name

--symlink-install参数在开发阶段特别重要,它创建符号链接而非文件拷贝,支持代码修改后的实时测试。

开发注意事项

1 环境配置

将环境初始化命令加入shell配置文件:

echo "source /opt/ros/$ROS_DISTRO/setup.bash" >> ~/.bashrc

echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
2 依赖管理规范

准确声明package.xml中的依赖项

定期执行rosdep检查确保环境一致性

区分构建依赖、执行依赖和测试依赖

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐