
专栏VMware Ubuntu22.04 ROS2 Humble 从入门实战教程承接第五章【工作空间与功能包】环境VMware 虚拟机 Ubuntu22.04 ROS2 Humble文章目录本章概述ROS2 节点是什么ROS2 节点常用命令行实操案例官方 Talker / Listener 节点演示动手编写第一个 C 节点节点核心 API 解析 常见编码坑节点命名与命名空间VMware 环境踩坑汇总课后练习本章小结1. 本章概述上一章我们搭建好了 ROS2 的大本营工作空间并学会创建最小代码组织单元功能包。 在功能包内部真正干活、独立运行的最小执行单元就是节点 (Node)。我们做一个形象类比工作空间整个生物体功能包器官视觉器官、运动控制器官节点机器人的工作细胞每个节点只负责单一任务解耦设计。例如图像采集节点负责读取摄像头画面目标检测节点识别画面中的障碍物运动控制节点下发底盘速度指令单个节点崩溃不会影响其他节点节点之间通过 ROS2 的通信机制传递数据互不直接调用函数这就是 ROS2 模块化设计思想。2. ROS2 节点是什么ROS2 节点本质是独立的可执行程序进程。 机器人软件系统由多个节点共同组成每个节点只完成一件事情。✅ 节点设计优势模块化功能拆分清晰便于单独调试高容错某一个节点异常退出其余节点继续运行分布式节点可以运行在同一台电脑也可以分布在机器人主板和上位机跨设备通信核心节点之间不直接交互依靠话题、服务、动作等通信方式传递信息。3. ROS2 节点常用命令行实操前置终端加载 ROS2 环境# 加载ROS2系统环境 source /opt/ros/humble/setup.bash # 如果需要使用自己工作空间编译的程序 source ~/ros2_ws/install/setup.bash3.1 查看当前所有正在运行的节点ros2 node list输出的节点名称以/开头例如/talker。3.2 查看节点详细信息ros2 node info /节点名称 # 示例 ros2 node info /talker可以查看该节点发布的话题、订阅的话题、提供的服务、调用的服务等。3.3 启动节点ros2 run语法ros2 run 功能包名 可执行文件名称ros2 run demo_nodes_cpp talker3.4 节点重映射运行时修改节点名称同一时刻不能存在同名节点启动时可以通过参数修改节点名避免冲突ros2 run demo_nodes_cpp talker --ros-args -r __node:talker_robot14. 案例官方 Talker / Listener 节点演示ROS2 自带示例包talker发布者持续发送字符串消息listener订阅者接收消息。终端 1启动 talker 节点ros2 run demo_nodes_cpp talker终端 2启动 listener 节点ros2 run demo_nodes_cpp listener终端 3查看节点列表ros2 node list可以看到/talker和/listener两个节点。 执行ros2 node info /talker查看该节点对外发布的话题信息。现象talker 不断打印消息listener 终端收到对应的字符串。两个独立节点完成通信。5. 动手编写第一个 C 节点环境路径~/ros2_ws/src先创建功能包第五章已学cd ~/ros2_ws/src ros2 pkg create --build-type ament_cmake my_node_pkg --dependencies rclcpp cd my_node_pkg mkdir src5.1 新建代码文件 src/hello_node.cpp#include rclcpp/rclcpp.hpp // 创建节点类继承 rclcpp::Node class HelloNode : public rclcpp::Node { public: // 构造函数节点名称 hello_node HelloNode() : Node(hello_node) { // ROS日志打印 RCLCPP_INFO(this-get_logger(), Hello ROS2! 我是机器人的工作细胞); } }; int main(int argc, char * argv[]) { // 初始化ROS2上下文 rclcpp::init(argc, argv); // 创建节点实例 auto node std::make_sharedHelloNode(); // 启动节点事件循环 rclcpp::spin(node); // 关闭ROS2 rclcpp::shutdown(); return 0; }5.2 修改 CMakeLists.txt在文件中添加编译和安装配置add_executable(hello_node src/hello_node.cpp) ament_target_dependencies(hello_node rclcpp) install(TARGETS hello_node DESTINATION lib/${PROJECT_NAME} )5.3 修改 package.xml确认依赖已经添加创建包时已经自动添加buildtool_dependament_cmake/buildtool_depend dependrclcpp/depend5.4 编译 运行节点cd ~/ros2_ws # 只编译当前功能包 colcon build --packages-select my_node_pkg # 刷新环境 source install/setup.bash # 运行节点 ros2 run my_node_pkg hello_node✅ 终端输出[INFO] [xxx]: Hello ROS2! 我是机器人的工作细胞6. 节点核心 API 解析 编码坑rclcpp::init(argc, argv); // 初始化ROS2环境必须最先执行 auto node std::make_sharedHelloNode(); // 实例化节点对象 rclcpp::spin(node); // 开启事件循环监听回调节点核心 rclcpp::shutdown(); // 关闭ROS2释放资源⚠️ 新手头号坑忘记写 rclcpp::spin (node)如果没有 spin程序运行瞬间直接退出看不到日志输出。spin 会阻塞程序等待回调事件。7. 节点命名与命名空间节点名称仅支持小写字母、数字、下划线_不能带中文、空格同一系统中不允许同名节点后启动节点会报错命名空间 namespace用于多机器人分组/robot1/talker命名空间robot1节点名talker/robot2/talker命名空间robot2节点名talker多机器人场景下使用命名空间可以复用同一套代码不会出现节点重名冲突。8. VMware Ubuntu22.04 环境踩坑汇总ros2 run 找不到可执行文件原因编译后没有执行source install/setup.bash解决每次新开终端进入工作空间后刷新环境变量节点启动报错节点名称冲突排查ros2 node list查看正在运行节点关闭占用同名节点的终端git clone 拉取古月居示例仓库报错 RPC failed curl GnuTLS# 方案1增大git缓存 git config --global http.postBuffer 524288000 # 方案2浅克隆不下载完整历史记录推荐虚拟机 git clone --depth1 https://gitee.com/guyuehome/ros2_21_tutorials.git虚拟机多机通信失败虚拟机网卡切换为桥接模式多台设备 ROS_DOMAIN_ID 保持一致。9. 课后练习启动 talker /listener 示例使用ros2 node list和ros2 node info观察节点信息。修改上面 C 代码更换节点名称重新编译运行。尝试启动两个 talker 节点使用节点重映射参数解决同名冲突。10. 本章小结节点 Node 是 ROS2 机器人软件中最小执行单元是机器人的工作细胞。工作空间项目大本营功能包代码器官节点工作细胞节点采用模块化设计每个节点只负责单一任务节点之间通过话题、服务等通信方式交换数据。