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

用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_cmake或ament_python,C++选前者):
ros2 pkg create --build-type ament_cmake my_robot_node --dependencies rclcpp std_msgs
这会自动生成CMakeLists.txt、package.xml和基础目录结构,rclcpp是C++客户端库,std_msgs提供常用消息类型(如String、Int32)。
立即学习“C++免费学习笔记(深入)”;
2. 编写一个最简C++节点
在src/下新建talker.cpp(发布者示例):
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
<p>int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("talker");
auto publisher = node->create_publisher<std_msgs::msg::String>("chatter", 10);</p><p>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);</p><p>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_executable和ament_target_dependencies中添加对应项:
add_executable(talker src/talker.cpp)
ament_target_dependencies(talker "rclcpp" "std_msgs")
<p>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<msgtype>("topic_name", callback, qos)</msgtype>,callback形参为const MsgType::SharedPtr& -
服务端:用
create_service<srvtype>("service_name", callback)</srvtype>,callback接收Request::SharedPtr和Response::SharedPtr -
参数:调用
declare_parameter("param_name", default_value)声明,再用get_parameter("param_name").as_string()读取
这些接口都在rclcpp::Node派生类或共享指针上调用,风格统一,上手后可组合使用。
ROS2的C++节点本质就是一个带生命周期管理的事件驱动程序,掌握节点创建、通信对象构造、回调注册和主循环这四步,就能覆盖绝大多数机器人控制逻辑。不需要深入中间件细节,也能高效开发。











