ROS2 中的节点是一个通过 ROS2 和其它节点通信的实体。

Python 实现节点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- coding: utf-8 -*-

import rclpy
from rclpy.node import Node


def main():
    # 环境初始化
    rclpy.init()

    # 创建一个新节点
    node = Node("python_node")

    # 调度节点运行
    rclpy.spin(node)

    # 环境去初始化
    rclpy.shutdown()


if __name__ == '__main__':
    main()

C++ 实现节点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include "rclcpp/node.hpp"
#include "rclcpp/executors.hpp"

int main(int argc, char* argv[]) {
    rclcpp::init(argc, argv);

    auto node = std::make_shared<rclcpp::Node>("cpp_node");

    RCLCPP_INFO(node->get_logger(), "Hello, C++ Node");

    rclcpp::spin(node);

    rclcpp::shutdown();

    return 0;
}

节点包管理

一个机器人程序一般会有很多节点,ROS2 使用功能包管理节点,功能包的优点:

  • 方便管理运行
  • 功能节点复用

Python 节点包

  1. 创建 python 节点包

    1
    
    ros2 pkg create python_pkg_demo --build-type ament_python --license Apache-2.0

    创建后包的目录结构:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    ​- LICENSE
    ​- package.xml
    ​- python_pkg_demo
    ​ - __init__.py
    ​- resource
    ​  - python_pkg_demo
    ​- setup.cfg
    ​- setup.py
    ​- test
    ​  - test_copyright.py
    ​  - test_flake8.py
    ​  - test_pep257.py
    
    4 directories, 9 files
  2. 在 python_pkg_demo 目录下新建 python_node.py ,写入上面节点创建的代码

  3. 在 setup.py 里加上可执行入口点

    1
    2
    3
    4
    
    entry_points={
        'console_scripts': [
            'python_node = python_pkg_demo.python_node:main'
        ],
  4. package.xml 中声明依赖

    1
    
    <depend>rclpy</depend>
  5. 使用 colcon build 构建

  6. 运行

    1
    2
    
    source install/setup.bash
    ros2 run python_pkg_demo python_node

CPP 节点包

  1. 创建 cpp 包

    1
    
    ros2 pkg create cpp_pkg_demo --build-type ament_cmake --license Apache-2.0

    创建后的文件目录:

    1
    2
    3
    4
    5
    6
    
    ​- CMakeLists.txt
    ​- include
    ​    - cpp_pkg_demo
    ​- LICENSE
    ​- package.xml
    ​- src
  2. 将源码文件放到 src 目录下

  3. 修改 CMakeLists.txt ,添加下面几行

    1
    2
    3
    4
    5
    6
    7
    
    find_package(rclcpp REQUIRED)
    
    add_executable(cpp_node src/cpp_node)
    
    ament_target_dependencies(cpp_node rclcpp)
    
    install(TARGETS cpp_node DESTINATION lib/${PROJECT_NAME})
  4. 在 package.xml 添加依赖信息

    1
    
    <depend>rclcpp</depend>
  5. colcon build 命令构建包

  6. 运行

    1
    2
    
    source install/setup.bash
    ros2 run cpp_pkg_demo cpp_node

工作空间

完整的机器人项目由许多不同的功能模块组成,ROS2 使用工作空间(Workspace)这个概率来组织不同的功能包

创建工作空间

一个工作空间实际上是一个目录,创建一个工作空间就是新建一个目录

创建一个 ros2-code-recipes 存放学习 ros2 的代码

1
mkdir ros2-code-recipes

创建包

功能包的代码一般放到工作空间的 src 目录下 ,可以将前面两个包放到 src 目录下

构建包

运行 colcon build 构建所有包

运行 colcon build --packages-select cpp_pkg_demo 构建指定的包

运行包

和单个包运行一样

1
2
source install/setup.bash
ros2 run python_pkg_demo python_node