用C++开发ROS2节点的关键是掌握四步流程:创建工作空间与包、编写节点代码(含init/spin/shutdown)、配置CMakeLists.txt并编译、扩展订阅/服务/参数功能;核心依赖rclcpp库,基于Node类构建事件驱动程序。

c++如何开发ROS2节点 c++机器人操作系统入门【教程】  第1张

用C++开发ROS2节点其实不难,关键是理清工作流程和关键组件。ROS2的C++ API设计清晰,基于rclcpp库,所有节点都围绕Node类展开,配合发布器(Publisher)、订阅器(Subscriber)、服务(Service)等核心对象即可快速构建功能。

1. 创建ROS2工作空间和包

ROS2不依赖catkin,改用colcon构建系统。先新建工作空间并初始化:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
source install/setup.bash

再用ros2 pkg create命令创建C++包(需指定--build-type ament_cmakeament_python,C++选前者):

ros2 pkg create --build-type ament_cmake my_robot_node --dependencies rclcpp std_msgs

这会自动生成CMakeLists.txtpackage.xml和基础目录结构,rclcpp是C++客户端库,std_msgs提供常用消息类型(如StringInt32)。

立即学习“C++免费学习笔记(深入)”;

2. 编写一个最简C++节点

src/下新建talker.cpp(发布者示例):

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

int main(int argc, char * argv[]) { rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("talker"); auto publisher = node->create_publisher("chatter", 10);

auto timer_callback = [&publisher]() { auto msg = std_msgs::msg::String(); msg.data = "Hello ROS2 from C++"; publisher->publish(msg); }; auto timer = node->create_wall_timer(std::chrono::seconds(1), timer_callback);

rclcpp::spin(node); rclcpp::shutdown(); return 0; }

关键点:

  • rclcpp::init()必须在最前,rclcpp::shutdown()收尾
  • 节点名("talker")用于ROS2图中标识该节点
  • create_publisher指定话题名、消息类型和队列长度(10)
  • create_wall_timer实现周期性回调,单位是std::chrono类型
  • rclcpp::spin()启动事件循环,处理回调、接收消息等

3. 配置CMakeLists.txt并编译

打开包内的CMakeLists.txt,在add_executableament_target_dependencies中添加对应项:

add_executable(talker src/talker.cpp)
ament_target_dependencies(talker "rclcpp" "std_msgs")

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

保存后回到工作空间根目录运行:

colcon build --packages-select my_robot_node
source install/setup.bash
ros2 run my_robot_node talker

另开终端执行ros2 topic echo /chatter就能看到发布的字符串。

4. 常见扩展:订阅、服务与参数

实际机器人节点往往不止发布数据,还需响应外部请求或读取配置:

  • 订阅器:用create_subscription("topic_name", callback, qos),callback形参为const MsgType::SharedPtr&
  • 服务端:用create_service("service_name", callback),callback接收Request::SharedPtrResponse::SharedPtr
  • 参数:调用declare_parameter("param_name", default_value)声明,再用get_parameter("param_name").as_string()读取

这些接口都在rclcpp::Node派生类或共享指针上调用,风格统一,上手后可组合使用。

ROS2的C++节点本质就是一个带生命周期管理的事件驱动程序,掌握节点创建、通信对象构造、回调注册和主循环这四步,就能覆盖绝大多数机器人控制逻辑。不需要深入中间件细节,也能高效开发。