在 ROS 2 中创建一个节点的过程

在这里插入图片描述
在 ROS 2 中创建一个节点的过程包括几个关键步骤。以下是一般的步骤流程,使用 C++ 和 ament_cmake 构建系统为例:

步骤 1: 创建工作空间

如果还没有工作空间,首先创建一个:

mkdir -p ~/my_ros2_ws/src
cd ~/my_ros2_ws
colcon build --symlink-install
source install/local_setup.bash

步骤 2: 创建包

在工作空间的 src 目录下创建一个新的包:

cd ~/my_ros2_ws/src
ros2 pkg create --build-type ament_cmake my_node_package

步骤 3: 编写节点代码

my_node_packagesrc 目录下创建一个 .cpp 文件,例如 my_node.cpp,并编写节点代码。一个基本的节点代码如下所示:

#include "rclcpp/rclcpp.hpp"

using namespace std::chrono_literals;

class MyNode : public rclcpp::Node {
public:
  MyNode() : Node("my_node") {
    RCLCPP_INFO(this->get_logger(), "Node is running!");
    timer_ = this->create_wall_timer(
      500ms, std::bind(&MyNode::timer_callback, this));
  }

private:
  void timer_callback() {
    RCLCPP_INFO(this->get_logger(), "Hello, world! %d", count_++);
  }

  rclcpp::TimerBase::SharedPtr timer_;
  int count_ = 0;
};

int main(int argc, char * argv[]) {
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<MyNode>());
  rclcpp::shutdown();
  return 0;
}

步骤 4: 更新 CMakeLists.txt

my_node_package/CMakeLists.txt 文件中添加必要的依赖项和构建指令:

cmake_minimum_required(VERSION 3.5)
project(my_node_package)

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)

add_executable(my_node src/my_node.cpp)
ament_target_dependencies(my_node rclcpp)

install(TARGETS
  my_node
  DESTINATION lib/${PROJECT_NAME})

ament_package()

步骤 5: 构建和安装包

回到工作空间的根目录,重新构建包:

cd ~/my_ros2_ws
colcon build --symlink-install

步骤 6: 运行节点

在终端中运行节点:

source install/local_setup.bash
ros2 run my_node_package my_node

步骤 7: 测试和调试

使用 ros2 topic list, ros2 topic echo, ros2 service listros2 service call 等命令来测试你的节点与其他节点的交互情况。

步骤 8: 扩展节点功能

根据需要,你可以添加订阅者、发布者、服务、客户端、定时器、状态机等特性到你的节点中。

步骤 9: 文档和测试

为你的代码添加文档注释,并考虑编写单元测试和集成测试。

以上步骤提供了一个创建 ROS 2 节点的基本框架。你可以根据你的需求和项目规模进行调整和扩展。

<think> 我们正在Ubuntu系统下使用ROS2(假设为Humble版本)创建工作空间和C++功能包。根据用户需求,我们将逐步展示如何创建ROS2工作空间、创建C++功能包、编写节点代码、编译和运行。 步骤概述: 1. 创建工作空间目录结构 2. 创建C++功能包 3. 编写C++节点代码 4. 修改CMakeLists.txt和package.xml(但ros2 pkg create命令已自动处理了部分) 5. 编译工作空间 6. 运行节点 详细步骤: ### 1. 创建工作空间 在终端中执行以下命令: ```bash # 创建目录结构 mkdir -p ~/ros2_ws/src cd ~/ros2_ws ``` ### 2. 创建C++功能包 进入`src`目录,使用`ros2 pkg create`命令创建功能包: ```bash cd src ros2 pkg create my_cpp_pkg --build-type ament_cmake --dependencies rclcpp --node-name my_node ``` 这里: - `--build-type ament_cmake`:指定构建类型为CMake。 - `--dependencies rclcpp`:添加对rclcpp的依赖,它会自动在`package.xml`和`CMakeLists.txt`中添加。 - `--node-name my_node`:创建一个名为`my_node`的节点,并生成一个简单的模板源文件。 ### 3. 编写C++节点代码 上一步已经自动生成了节点文件`src/my_cpp_pkg/src/my_node.cpp`(注意:实际路径在功能包的`src`目录下)。我们编辑这个文件: ```bash gedit my_cpp_pkg/src/my_node.cpp ``` 然后替换为以下内容(一个简单的定时器节点,每秒输出一次“Hello ROS2”): ```cpp #include "rclcpp/rclcpp.hpp" class MyNode : public rclcpp::Node { public: MyNode() : Node("my_node") { // 创建一个定时器,周期为1秒,并绑定回调函数 timer_ = this->create_wall_timer( std::chrono::seconds(1), std::bind(&MyNode::timer_callback, this)); } private: void timer_callback() { RCLCPP_INFO(this->get_logger(), "Hello ROS2!"); } rclcpp::TimerBase::SharedPtr timer_; }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::spin(std::make_shared<MyNode>()); rclcpp::shutdown(); return 0; } ``` ### 4. 检查配置文件 由于我们使用了`ros2 pkg create`命令并指定了依赖和节点名,所以`package.xml`和`CMakeLists.txt`已经基本配置好了。但我们可以检查一下: - `package.xml`:应包含以下依赖(如果没有,请手动添加): ```xml <depend>rclcpp</depend> ``` - `CMakeLists.txt`:应包含以下内容(如果没有,请手动添加): ```cmake find_package(rclcpp REQUIRED) add_executable(my_node src/my_node.cpp) ament_target_dependencies(my_node rclcpp) install(TARGETS my_node DESTINATION lib/${PROJECT_NAME}) ``` ### 5. 编译工作空间 回到工作空间根目录,使用colcon进行编译: ```bash cd ~/ros2_ws colcon build --symlink-install --packages-select my_cpp_pkg ``` 这里`--symlink-install`允许在开发过程中通过符号链接快速更新代码而无需重新编译。 ### 6. 运行节点 首先,加载当前工作空间的环境设置: ```bash source install/setup.bash ``` 然后运行节点: ```bash ros2 run my_cpp_pkg my_node ``` 此时,终端应每秒输出一次:`[INFO] [my_node]: Hello ROS2!` ### 文件结构 最终的工作空间结构如下: ``` ros2_ws/ ├── build/ ├── install/ ├── log/ └── src/ └── my_cpp_pkg/ ├── CMakeLists.txt ├── include/ ├── package.xml └── src/ └── my_node.cpp ``` ### 注意事项 - 每次打开新终端时,需要重新运行`source install/setup.bash`,或者将其添加到`~/.bashrc`中。 - 如果修改了代码,需要重新编译(使用`colcon build`)。 §§相关问题§§ 1. 如何在ROS2功能包中添加自定义消息接口? 2. ROS2的`ament_cmake`和`ament_python`有何区别? 3. 如何为C++节点添加参数解析功能? 4. ROS2中如何实现节点间的跨包通信? > 以上步骤基于ROS2 Humble版本,其他版本可能略有差异,建议参考对应版本的官方文档[^1]。 </think>以下是在Ubuntu系统下创建ROS2工作空间和C++功能包的完整步骤(基于ROS2 Humble版本): ### 1. 创建ROS2工作空间 ```bash # 创建工作空间目录结构 mkdir -p ~/ros2_ws/src cd ~/ros2_ws ``` ### 2. 创建C++功能包 ```bash cd src ros2 pkg create my_cpp_pkg \ --build-type ament_cmake \ --dependencies rclcpp \ --node-name my_node ``` * `--dependencies rclcpp`:自动添加ROS2 C++客户端库依赖到`package.xml` * `--node-name my_node`:自动生成节点模板文件 ### 3. 编写C++节点代码 编辑`~/ros2_ws/src/my_cpp_pkg/src/my_node.cpp`: ```cpp #include "rclcpp/rclcpp.hpp" class MyNode : public rclcpp::Node { public: MyNode() : Node("my_ros2_node") { // 创建定时器(每秒触发一次) timer_ = this->create_wall_timer( std::chrono::seconds(1), std::bind(&MyNode::timer_callback, this) ); RCLCPP_INFO(this->get_logger(), "节点已启动!"); } private: void timer_callback() { RCLCPP_INFO(this->get_logger(), "Hello ROS2 (时间: %f)", this->now().seconds()); } rclcpp::TimerBase::SharedPtr timer_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node = std::make_shared<MyNode>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; } ``` ### 4. 配置包文件 确认`package.xml`包含: ```xml <depend>rclcpp</depend> ``` 确认`CMakeLists.txt`包含: ```cmake find_package(rclcpp REQUIRED) add_executable(my_node src/my_node.cpp) target_link_libraries(my_node ${rclcpp_LIBRARIES}) ament_target_dependencies(my_node rclcpp) install(TARGETS my_node DESTINATION lib/${PROJECT_NAME}) ``` ### 5. 编译工作空间 ```bash cd ~/ros2_ws colcon build --symlink-install ``` * `--symlink-install`:创建符号链接,加速开发迭代[^2] ### 6. 运行节点 ```bash # 加载环境变量 source install/setup.bash # 运行节点 ros2 run my_cpp_pkg my_node ``` 输出示例: ``` [INFO] [my_ros2_node]: 节点已启动! [INFO] [my_ros2_node]: Hello ROS2 (时间: 123456.789) [INFO] [my_ros2_node]: Hello ROS2 (时间: 123457.789) ``` ### 文件结构 ``` ros2_ws/ ├── build/ ├── install/ ├── log/ └── src/ └── my_cpp_pkg/ ├── CMakeLists.txt ├── include/ ├── package.xml └── src/ └── my_node.cpp ``` ### 常用命令 | 命令 | 功能 | |------|------| | `ros2 pkg list` | 列出所有包 | | `ros2 node info /my_ros2_node` | 查看节点信息 | | `colcon build --packages-select my_cpp_pkg` | 仅编译指定包 | ### 注意事项 1. 每次打开新终端需重新`source install/setup.bash` 2. 推荐使用`--symlink-install`参数加速开发[^2] 3. 确保系统已正确安装ROS2 Humble基础环境[^1] 4. 使用`ros2 doctor`检查环境配置是否完整
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值