ROS2入门不迷路从零搭建环境到跑通最小Demo逻辑代码全解析标签#ROS2 #机器人操作系统 #Humble #入门教程 #C前言刚接触ROS2的新手最怕的就是环境装半天装不好、代码跑不通不知道哪错了。本文从零开始用国内一键脚本装环境通过话题通信和服务通信两个最小Demo把ROS2最核心的通信逻辑讲清楚。代码注释适中适合想快速上手跑通的新手。废话不多说直接开干。一、环境搭建1.1 一键安装推荐国内用户用鱼香ROS的一键脚本省心省力wgethttp://fishros.com/install-Ofishros.fishros运行后选择安装ROS2 Humble Desktop装完再跑一次脚本配置 rosdep。1.2 验证安装ros2 doctor输出All checks passed就完事环境没问题。二、验证环境跑通内置DemoROS2自带了示例节点先跑一下确认环境没问题。打开两个终端分别执行# 终端1发布消息ros2 run demo_nodes_cpp talker# 终端2接收消息ros2 run demo_nodes_cpp listener终端2能持续收到终端1发的消息说明通信链路通了环境OK。三、话题通信自己写最小Demo3.1 核心逻辑串一下话题通信就是发布/订阅模式类似广播电台发布端创建节点 → 创建发布者指定话题名→ 循环发消息订阅端创建节点 → 创建订阅者指定同一个话题名→ 收到消息触发回调两边话题名对得上就能通3.2 建包mkdir-p~/ros2_ws/srccd~/ros2_ws/src ros2 pkg create demo --build-type ament_cmake--dependenciesrclcpp std_msgs3.3 发布端talker.cpp在src/demo/src/下新建talker.cpp#includerclcpp/rclcpp.hpp#includestd_msgs/msg/string.hppusingnamespacestd::chrono_literals;intmain(intargc,char**argv){rclcpp::init(argc,argv);// 初始化ROS2autonoderclcpp::Node::make_shared(talker);// 创建节点// 创建发布者话题名chatter队列长度10autopubnode-create_publisherstd_msgs::msg::String(chatter,10);std_msgs::msg::String msg;msg.datahello;rclcpp::Raterate(1s);// 每秒发一次while(rclcpp::ok()){pub-publish(msg);// 发消息RCLCPP_INFO(node-get_logger(),发了: %s,msg.data.c_str());rate.sleep();}rclcpp::shutdown();return0;}3.4 订阅端listener.cpp在src/demo/src/下新建listener.cpp#includerclcpp/rclcpp.hpp#includestd_msgs/msg/string.hppintmain(intargc,char**argv){rclcpp::init(argc,argv);autonoderclcpp::Node::make_shared(listener);// 订阅chatter话题收到消息执行回调autosubnode-create_subscriptionstd_msgs::msg::String(chatter,10,[](conststd_msgs::msg::String::SharedPtr msg){RCLCPP_INFO(rclcpp::get_logger(listener),收到: %s,msg-data.c_str());});rclcpp::spin(node);// 阻塞等待消息rclcpp::shutdown();return0;}3.5 修改CMakeLists.txt在src/demo/CMakeLists.txt末尾添加add_executable(talker src/talker.cpp) ament_target_dependencies(talker rclcpp std_msgs) add_executable(listener src/listener.cpp) ament_target_dependencies(listener rclcpp std_msgs) install(TARGETS talker listener DESTINATION lib/${PROJECT_NAME} ) ament_package()3.6 编译运行cd~/ros2_ws colcon build --packages-select demosourceinstall/setup.bash打开两个终端# 终端1ros2 run demo talker# 终端2ros2 run demo listener终端2持续打印收到: hello通了。四、服务通信请求/响应模式4.1 核心逻辑串一下服务通信是一问一答模式类似打电话服务端创建节点 → 创建服务指定服务名回调函数→ 阻塞等待请求客户端创建节点 → 创建客户端指定同一个服务名→ 构造请求 → 发送并等待结果两边服务名对得上客户端才能拿到返回值4.2 建包cd~/ros2_ws/src ros2 pkg create svc_demo --build-type ament_cmake--dependenciesrclcpp example_interfaces4.3 服务端server.cpp在src/svc_demo/src/下新建server.cpp#includerclcpp/rclcpp.hpp#includeexample_interfaces/srv/add_two_ints.hpp// 回调函数收到请求时执行计算abvoidhandle(conststd::shared_ptrexample_interfaces::srv::AddTwoInts::Requestreq,std::shared_ptrexample_interfaces::srv::AddTwoInts::Responseresp){resp-sumreq-areq-b;RCLCPP_INFO(rclcpp::get_logger(server),%ld %ld %ld,req-a,req-b,resp-sum);}intmain(intargc,char**argv){rclcpp::init(argc,argv);autonoderclcpp::Node::make_shared(server);// 创建服务服务名add_two_intsautosrvnode-create_serviceexample_interfaces::srv::AddTwoInts(add_two_ints,handle);RCLCPP_INFO(rclcpp::get_logger(server),服务已启动);rclcpp::spin(node);// 阻塞等待请求rclcpp::shutdown();return0;}4.4 客户端client.cpp在src/svc_demo/src/下新建client.cpp#includerclcpp/rclcpp.hpp#includeexample_interfaces/srv/add_two_ints.hppintmain(intargc,char**argv){rclcpp::init(argc,argv);autonoderclcpp::Node::make_shared(client);// 创建客户端连接add_two_ints服务autoclientnode-create_clientexample_interfaces::srv::AddTwoInts(add_two_ints);// 构造请求autoreqstd::make_sharedexample_interfaces::srv::AddTwoInts::Request();req-a3;req-b7;// 等服务端启动while(!client-wait_for_service(std::chrono::seconds(1))){RCLCPP_INFO(rclcpp::get_logger(client),等服务端...);}// 发请求并等待结果autoresultclient-async_send_request(req);if(rclcpp::spin_until_future_complete(node,result)rclcpp::FutureReturnCode::SUCCESS){RCLCPP_INFO(rclcpp::get_logger(client),结果: %ld,result.get()-sum);}rclcpp::shutdown();return0;}4.5 修改CMakeLists.txt在src/svc_demo/CMakeLists.txt末尾添加add_executable(server src/server.cpp) ament_target_dependencies(server rclcpp example_interfaces) add_executable(client src/client.cpp) ament_target_dependencies(client rclcpp example_interfaces) install(TARGETS server client DESTINATION lib/${PROJECT_NAME} ) ament_package()4.6 编译运行cd~/ros2_ws colcon build --packages-select svc_demosourceinstall/setup.bash先跑服务端再跑客户端# 终端1ros2 run svc_demo server# 终端2ros2 run svc_demo client服务端打印3 7 10客户端打印结果: 10通了。五、总结类型模式逻辑适用场景话题发布/订阅发布端一直发订阅端一直收传感器数据、状态广播服务请求/响应客户端问服务端答一问一答计算、查询、开关控制两套通信搞明白ROS2就算入门了。常见问题colcon build 报错确认执行了source install/setup.bashros2 run 找不到节点确认编译成功包名和节点名正确客户端等服务超时确认服务名一致服务端先启动