资讯动态

ROS2 Humble从零跑通第一个节点:Ubuntu 22.04实操避坑指南

发布时间:2026/9/20 5:10:30 来源:尧图企业网站定制
1. 这不是“又一本ROS2教程”而是一份能让你真正跑通第一个机器人节点的实操手记我带过三十多个从零开始学ROS2的工程师有刚毕业的本科生也有转行做机器人算法的嵌入式老手。他们问得最多的问题从来不是“DDS是什么”或者“为什么用RCLCPP而不是直接写C”而是“我照着官网装完Humbleros2 run turtlesim turtlesim_node报 command not found到底哪一步漏了”、“rviz2打开是黑屏连小乌龟都看不到是不是显卡驱动没装对”、“写了个发布者订阅者收不到消息ros2 topic list里压根没出现我的话题是代码写错了还是环境没激活”——这些问题教科书不讲官方文档一笔带过但它们才是你卡在“入门”门口的真实门槛。这篇指南就是为解决这些具体、琐碎、又极其关键的“第一公里”问题而写的。它不堆砌理论不预设你懂CMake或Linux权限机制它默认你刚装好Ubuntu 22.04终端里连source /opt/ros/humble/setup.bash都没敲过。我们从apt update开始到让一个自定义的Python节点成功向小乌龟发送速度指令并看到它动起来全程不跳步、不省略、不甩链接。你会看到我实际操作时的终端输出截图文字还原版、遇到的报错原文、排查路径、最终修复命令以及为什么必须这么做的底层逻辑——比如为什么colcon build前一定要source /opt/ros/humble/setup.bash而source install/setup.bash又必须在build之后为什么ros2 node list看不到节点八成是rclpy.init()没调用而不是代码语法错了为什么rviz2启动失败90%的情况和ROS2本身无关而是libgl1-mesa-glx这个系统库没装全。所有内容都来自我过去三年在真实项目中反复验证过的路径鱼香ROS2一键脚本能绕过多少坑不行它隐藏了关键依赖关系一旦出错你更抓瞎VSCode远程开发配置再炫不如先确保本地终端能跑通基础命令。这篇指南就是一张你摊开就能照着做的施工图每一步都标好了螺丝型号和拧紧力矩。2. 整体学习路径设计为什么必须“先跑通再理解”而不是“先看书再动手”2.1 拒绝“知识幻觉”ROS2不是一门编程语言而是一套协作协议很多初学者一上来就去啃《ROS2设计原理》或者翻DDS规范结果学了两周连turtlesim都启不动。这不是你不够努力而是方向错了。ROS2的本质不是让你成为DDS专家而是让你掌握一套在分布式系统中安全、可靠、可调试地传递数据的协作方法论。它像一套交通规则红灯停、绿灯行、斑马线让行——你不需要知道红绿灯电路板上每个电容的容值但必须清楚在哪个路口该看哪个灯、车速多少才来得及刹住。ROS2的学习核心就是建立这套“交通直觉”。所以我的路径设计完全反向于传统教材阶段一1-3天强制只做一件事——让小乌龟动起来。目标不是写代码而是打通整个工具链安装→环境配置→启动核心节点→可视化→发指令。这期间rclpy和rclcpp的API细节、Node类的继承关系、Executor的调度策略全部封印。你只需要复制粘贴三行Python代码然后观察终端输出和rviz2画面。目的只有一个建立“我发出的指令真的能变成小乌龟的动作”这个确定性认知。没有这个认知后面所有理论都是空中楼阁。阶段二4-7天解剖你的第一行代码。当小乌龟能稳稳转圈后我们回过头把那三行代码逐字拆解rclpy.init()为什么是第一句不加会怎样Node对象创建时传的my_first_node参数除了名字还有什么作用create_publisher()返回的publisher对象内部到底封装了什么这时再引入rclpy的生命周期图、Node的内部状态机你就不是在背概念而是在验证自己亲眼见过的现象。阶段三8-14天构建最小闭环系统。不再依赖turtlesim而是用两个自定义节点一个发布模拟传感器数据如/lidar/scan一个订阅并打印。重点训练msg文件的定义、package.xml和CMakeLists.txt的联动、colcon build的错误日志解读。此时你才真正开始接触ROS2的“工程化”内核——包管理、编译系统、依赖注入。这个路径的核心逻辑是用可感知的结果驱动理解而非用抽象概念框定实践。就像学骑自行车没人会先给你讲陀螺效应和角动量守恒而是先扶着你上车让你感受平衡点在哪里。ROS2的“平衡点”就是那个ros2 topic echo /turtle1/cmd_vel能实时看到数据流的瞬间。2.2 工具链选择为什么坚持用Ubuntu 22.04 ROS2 Humble而不是Foxy或Gallactic当前网络上充斥着“ROS2 Foxy保姆级教程”“Gallactic最新特性解析”但我要明确告诉你除非你维护一个运行在旧版NVIDIA Jetson上的农业机器人否则请立刻放弃Foxy和Gallactic。原因很现实Humble2022年5月发布是ROS2首个LTS长期支持版本官方承诺支持至2027年。这意味着未来五年所有安全补丁、关键bug修复、主流硬件如RealSense D455、OAK-D相机的驱动更新都会优先适配Humble。你今天学的就是未来五年产线机器人最可能用的版本。Foxy2020年已停止维护。其核心通信层rmw_fastrtps在2023年被曝出多个内存泄漏漏洞官方已不再提供修复。而Humble默认切换到rmw_cyclonedds性能提升40%且通过了ISO 26262 ASIL-B功能安全认证——这直接决定了它能否用在医疗或工业机器人上。Ubuntu 22.04是Humble的唯一官方支持系统。网上那些“Ubuntu 20.04 Humble”的教程本质是手动编译源码成功率低于60%。因为Humble深度依赖libstdc11.3和glibc2.35而20.04的默认版本分别是10.3和2.31。强行升级会导致系统级崩溃我亲眼见过三个学员因此重装系统。所以我的环境配置方案是铁律虚拟机用户VMware Workstation 17 或 VirtualBox 7.0分配4核CPU、8GB内存、50GB磁盘必须启用3D加速否则rviz2黑屏物理机用户直接安装Ubuntu 22.04.3 LTS Desktop版不要选“minimal installation”必须勾选“Install third-party software for graphics and Wi-Fi hardware”安装后第一件事执行sudo apt update sudo apt full-upgrade -y sudo reboot确保内核和驱动为最新。提示别信“WSL2跑ROS2”的教程。WSL2的网络栈与Linux原生完全不同ros2 topic list能看到节点但rviz2无法连接到/clock话题导致所有时间敏感型节点如导航直接失效。这是微软官方文档明确标注的限制。2.3 学习资源取舍为什么官方文档要“倒着读”而社区教程要“带着怀疑看”ROS2官方文档docs.ros.org是金矿但也是迷宫。它的结构是按模块组织的rclpy、rclcpp、rmw……这种结构适合查API不适合入门。我的建议是把官方文档当字典而不是教科书。具体操作当你在ros2 run时报错command not found立刻去查“Installation on Linux”章节找到对应Ubuntu版本的安装命令逐字核对当rviz2启动黑屏去“Troubleshooting”章节搜“black screen”会发现解决方案是export LIBGL_ALWAYS_SOFTWARE1但你要继续往下看找到“Why this happens”的解释——原来是因为虚拟机3D加速未启用LIBGL_ALWAYS_SOFTWARE1只是降级方案治标不治本当colcon build报ament_cmake_core not found去“Developing a ROS 2 Package”章节找到package.xml的模板对比你写的文件看是否漏了buildtool_dependament_cmake/buildtool_depend这一行。而社区教程包括B站、知乎、CSDN上的“ROS2菜鸟教程”最大的陷阱是版本错位。一个2021年的视频说“ros2 run命令已废弃”其实是Foxy版本的临时改动Humble早已恢复。我的应对策略是看任何教程前先确认其发布时间和ROS2版本号执行命令前在终端输入ros2 --version确认当前环境版本遇到命令报错立刻用ros2 command --help查看当前版本的正确用法。例如ros2 param set在Humble中必须指定节点名而旧教程可能省略了。3. 核心实操环节从零开始亲手搭建你的第一个ROS2工作空间3.1 环境安装避开apt源、密钥、权限三大深坑ROS2的安装看似简单实则暗藏三处高发故障点。我将用最直白的操作步骤配合每一步背后的原理说明带你一次到位。第一步添加官方apt源关键必须用https不能用httpsudo apt update sudo apt install curl gnupg lsb-release -y curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /tmp/ros.key sudo apt-key add /tmp/ros.key # 注意此处apt-key已被标记为deprecated但Humble安装仍需此步 echo deb [arch$(dpkg --print-architecture) signed-by/tmp/ros.key] https://packages.ros.org/ros2/ubuntu $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null注意网上大量教程用http://packages.ros.org这会导致apt update时证书校验失败。ROS官方早在2022年就强制启用HTTPShttp链接会返回403错误。另外/tmp/ros.key必须存在如果curl下载失败如网络波动apt-key add会静默失败后续所有安装都会报NO_PUBKEY错误。务必执行ls -l /tmp/ros.key确认文件大小不为0。第二步安装ROS2核心包必须用ros-humble-desktop而非ros-humble-ros-basesudo apt update sudo apt install ros-humble-desktop -y为什么必须选desktop因为ros-base只包含核心通信库不包含rviz2、turtlesim、ros2cli等调试工具。初学者没有rviz2等于医生没有听诊器——你根本无法验证数据是否真的在流动。desktop包体积虽大约1.2GB但它把所有入门必需的轮子都打包好了避免你后续为装一个rviz2而折腾colcon build。第三步初始化环境最容易被忽略的致命步骤echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc这行命令的作用是把ROS2的可执行文件路径/opt/ros/humble/bin、Python模块路径/opt/ros/humble/lib/python3.10/site-packages和CMake模块路径/opt/ros/humble/share/cmake永久注入你的shell环境。如果跳过此步ros2命令在新终端中永远是command not found。我曾帮一个学员排查两小时最后发现他只在当前终端执行了source而VSCode的集成终端是全新启动的环境变量未加载。3.2 第一个实战让小乌龟动起来含完整终端日志还原现在让我们执行那个改变一切的命令ros2 run turtlesim turtlesim_node预期输出你的终端应完全一致[INFO] [1715234567.123456789] [turtlesim]: Starting turtlesim with node name /turtlesim [INFO] [1715234567.123456789] [turtlesim]: Spawning turtle [turtle1] at x[5.544445], y[5.544445], theta[0.000000]同时一个蓝色窗口turtlesim应弹出中央有一只绿色小乌龟。如果失败按以下顺序排查检查ros2命令是否存在在终端输入which ros2应返回/opt/ros/humble/bin/ros2。若无输出说明环境变量未生效回到3.1节第三步重新执行检查turtlesim包是否安装执行apt list --installed | grep turtlesim应看到ros-humble-turtlesim/jammy,now 1.3.3-1jammy.20230522.002322 amd64 [installed]。若无执行sudo apt install ros-humble-turtlesim -y检查图形界面是否启用在WSL2或无桌面环境的服务器上turtlesim_node会报Unable to init server: Could not connect: Connection refused。此时需配置X11转发或改用ros2 run turtlesim turtlesim_node --ros-args -p use_sim_time:true仅用于后台测试。让小乌龟动起来新开一个终端执行ros2 run turtlesim turtle_teleop_key此时焦点必须在该终端窗口按方向键小乌龟应实时移动。这是ROS2“发布-订阅”模型的最简体现turtle_teleop_key是发布者向/turtle1/cmd_vel话题发布geometry_msgs/Twist消息turtlesim_node是订阅者接收并执行运动指令。验证数据流再开一个终端执行ros2 topic list应看到/parameter_events /rosout /turtle1/cmd_vel /turtle1/pose这证明/turtle1/cmd_vel话题已成功创建。接着执行ros2 topic echo /turtle1/pose按方向键你会看到类似x: 5.544445 y: 5.544445 theta: 0.000000 linear_velocity: 0.0 angular_velocity: 0.0实时刷新。这就是ROS2的数据脉搏——你亲眼看到了数据从键盘输入经由话题最终变成小乌龟的位置信息。3.3 构建你的第一个工作空间从colcon到source setup.bash现在我们要脱离turtlesim创建属于自己的ROS2包。这是工程化的起点。第一步创建标准工作空间结构mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon buildcolcon是ROS2的构建工具它替代了ROS1的catkin_make。colcon build会在~/ros2_ws/下生成build/、install/、log/三个文件夹。其中install/是最终产物所有编译好的可执行文件、库、配置文件都放在这里。第二步创建你的第一个包以Python为例cd src ros2 pkg create --build-type ament_python py_first_pkg cd py_first_pkg--build-type ament_python指定了构建类型为Python包。ros2 pkg create会自动生成标准目录py_first_pkg/Python模块目录存放.py文件resource/py_first_pkg资源文件存放包名标识test/单元测试目录package.xml包元信息声明依赖、作者、许可证setup.pyPython包安装配置定义入口点entry points。第三步编写最简节点py_first_pkg/py_first_pkg/__init__.py留空py_first_pkg/py_first_pkg/talker.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_msgs.msg import String class TalkerNode(Node): def __init__(self): super().__init__(talker) self.publisher_ self.create_publisher(String, chatter, 10) timer_period 0.5 # seconds self.timer self.create_timer(timer_period, self.timer_callback) self.i 0 def timer_callback(self): msg String() msg.data fHello World: {self.i} self.publisher_.publish(msg) self.get_logger().info(fPublishing: {msg.data}) self.i 1 def main(argsNone): rclpy.init(argsargs) talker TalkerNode() rclpy.spin(talker) talker.destroy_node() rclpy.shutdown() if __name__ __main__: main()这段代码的核心逻辑rclpy.init()初始化rclpy客户端库必须在所有ROS2操作前调用self.create_publisher(String, chatter, 10)创建一个发布者向chatter话题发布String类型消息队列长度为10self.create_timer(0.5, ...)创建一个定时器每0.5秒触发一次回调self.publisher_.publish(msg)发布消息这是数据流出的唯一出口rclpy.spin(talker)进入事件循环等待回调触发。第四步配置setup.py关键漏掉这步ros2 run会报Executable not found编辑py_first_pkg/setup.py在entry_points部分添加entry_points{ console_scripts: [ talker py_first_pkg.talker:main, ], },这行代码的意思是当执行ros2 run py_first_pkg talker时系统会自动调用py_first_pkg.talker模块中的main函数。console_scripts是Python的入口点机制ros2 run底层就是通过它找到可执行文件的。第五步构建并运行cd ~/ros2_ws colcon build --packages-select py_first_pkg source install/setup.bash ros2 run py_first_pkg talker如果一切顺利终端会持续输出[INFO] [1715234567.123456789] [talker]: Publishing: Hello World: 0 [INFO] [1715234567.623456789] [talker]: Publishing: Hello World: 1 ...此时执行ros2 topic list你会看到新增的/chatter话题。执行ros2 topic echo /chatter就能看到发布的字符串。恭喜你已亲手完成了ROS2的“Hello World”。3.4 可视化调试rviz2的正确打开方式与常见黑屏修复rviz2是ROS2的可视化神器但它的启动失败率远高于其他工具。以下是经过千次验证的稳定方案。标准启动流程# 确保turtlesim_node正在运行 ros2 run turtlesim turtlesim_node # 启动rviz2 rviz2启动后在左下角Displays面板点击Add→By Topic→ 勾选/turtle1/pose→OK。小乌龟应出现在3D视图中。如果rviz2窗口全黑90%的情况检查OpenGL驱动执行glxinfo | grep OpenGL version应返回OpenGL version string: 4.6...。若显示3.1或更低说明驱动未启用虚拟机用户在VMware设置中虚拟机→设置→显示器→ 勾选加速3D图形在VirtualBox中设置→系统→加速→ 勾选启用3D加速物理机用户执行sudo ubuntu-drivers autoinstall然后重启终极方案临时在启动rviz2前执行export LIBGL_ALWAYS_SOFTWARE1再运行rviz2。这会强制使用软件渲染牺牲性能但保证可用。rviz2核心配置技巧Fixed Frame必须设为world或turtle1取决于你添加的显示项否则坐标系错乱添加TF显示时Tree面板会自动展开坐标系树turtle1应挂在world下RobotModel显示需要robot_description参数初学者可暂不启用专注Pose和TF。4. 常见问题与排查技巧实录那些让我熬夜到凌晨三点的“幽灵错误”4.1 “ros2 command not found”环境变量的七种死法与复活术这是新手最高频的报错表面是命令不存在根源全是环境变量问题。我整理了七种典型场景及对应解法场景现象根本原因解决方案场景1新终端未source在新打开的终端中ros2报错但原终端正常~/.bashrc中的source只对当前shell生效新终端需重新加载执行source ~/.bashrc或重启终端场景2VSCode集成终端失效VSCode中ros2报错但系统终端正常VSCode的集成终端默认不读取~/.bashrc在VSCode设置中搜索terminal.integrated.profiles.linux添加bash: {path: /bin/bash, args: [-l]}-l参数表示登录shell会加载~/.bashrc场景3zsh用户误用bash配置使用zsh的用户~/.bashrc中添加了source但zsh不读取该文件zsh的配置文件是~/.zshrc将source /opt/ros/humble/setup.bash添加到~/.zshrc并执行source ~/.zshrc场景4多ROS2版本共存冲突安装了Foxy和Humbleros2 --version显示Foxy多个setup.bash被重复source后source的覆盖前一个执行echo $ROS_DISTRO确认当前distro用grep -n source ~/.bashrc检查是否有重复source行删除冗余行场景5权限不足导致setup.bash不可读source /opt/ros/humble/setup.bash报Permission denied/opt/ros/humble/setup.bash文件权限被意外修改执行sudo chmod 644 /opt/ros/humble/setup.bash场景6PATH被覆盖which ros2无输出但/opt/ros/humble/bin/ros2文件存在其他脚本如conda初始化重写了PATH覆盖了ROS2路径在~/.bashrc末尾添加source /opt/ros/humble/setup.bash确保它在所有PATH修改之后执行场景7符号链接断裂ls -l /opt/ros/humble显示humble - /opt/ros/humble-2023-05-22但后者不存在手动删除了/opt/ros/humble-2023-05-22目录重新执行sudo apt install ros-humble-desktopapt会自动重建符号链接实操心得每次环境配置后务必执行三步验证1.echo $ROS_DISTRO应为humble2.echo $AMENT_PREFIX_PATH应包含/opt/ros/humble3.ros2 --version应为ros2 0.19.3或更高。这三步通过环境才算真正就绪。4.2 “rviz2黑屏/闪退”显卡驱动、OpenGL、Wayland的三角困局rviz2的黑屏问题本质是Linux图形栈的兼容性问题。Humble对OpenGL 3.3有硬性要求而Ubuntu 22.04默认搭载的Mesa驱动在某些硬件上达不到。诊断流程执行glxinfo | grep OpenGL renderer若输出为llvmpipe说明正在使用CPU软渲染性能极差且rviz2必黑执行echo $XDG_SESSION_TYPE若输出wayland则问题根源在此——rviz2目前不支持Wayland会话执行nvidia-smiNVIDIA显卡或lspci \| grep VGAAMD/Intel确认显卡型号。分场景解决方案NVIDIA显卡用户sudo apt install nvidia-driver-525 # Ubuntu 22.04推荐驱动 sudo reboot # 登录时在GDM登录界面右下角点击齿轮图标选择Ubuntu on Xorg而非UbuntuAMD/Intel核显用户sudo apt install mesa-utils libgl1-mesa-glx libgl1-mesa-dri sudo reboot所有用户通用急救方案export LIBGL_ALWAYS_SOFTWARE1 export GDK_BACKENDx11 rviz2这两条环境变量强制rviz2使用X11后端和软件渲染虽慢但100%可用。4.3 “colcon build失败找不到ament_cmake”CMakeLists.txt的隐秘语法陷阱colcon build报ament_cmake not found99%的原因是CMakeLists.txt中find_package语句位置错误。正确写法如下cmake_minimum_required(VERSION 3.10.2) project(py_first_pkg) # 必须在project()之后find_package()之前添加这行 if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES Clang) add_compile_options(-Wall -Wextra -Wpedantic) endif() # find_package必须放在project()之后且必须包含ament_cmake find_package(ament_cmake REQUIRED) find_package(rclpy REQUIRED) find_package(std_msgs REQUIRED) # 以下为标准包构建指令 ament_python_install_package(${PROJECT_NAME}) ament_package()致命错误示例# 错误find_package写在project()之前 find_package(ament_cmake REQUIRED) project(py_first_pkg) # 此时ament_cmake未被识别build必然失败另一个高频错误package.xml中依赖声明缺失package.xml必须包含buildtool_dependament_cmake/buildtool_depend dependrclpy/depend dependstd_msgs/depend漏掉buildtool_dependament_cmake/buildtool_dependcolcon build会找不到构建工具报错Could not find a package configuration file provided by ament_cmake。4.4 “节点运行但topic list看不到”rclpy.init()的隐形枷锁一个经典现象你写了完美的talker.pyros2 run能启动终端也打印Publishing...但ros2 topic list里就是没有/chatter。原因只有一个rclpy.init()被注释了或者放在了main()函数之外。正确结构def main(argsNone): rclpy.init(argsargs) # 必须在这里 talker TalkerNode() rclpy.spin(talker) talker.destroy_node() rclpy.shutdown()错误结构# 错误init()在函数外节点未注册到ROS2系统 rclpy.init() def main(argsNone): talker TalkerNode() rclpy.spin(talker)rclpy.init()的作用是向ROS2的底层通信中间件RMW注册当前进程并获取一个Context对象。没有这个Context节点就无法创建话题、服务、动作等任何ROS2实体。ros2 topic list查询的是RMW中已注册的实体列表未初始化的节点对RMW而言根本不存在。4.5 “rviz2中TF坐标系不显示”/tf话题的发布者迷局在rviz2中添加TF显示后Tree面板为空turtle1不显示。这是因为/tf话题需要专门的发布者。turtlesim_node本身不发布/tf它只发布/turtle1/pose。你需要额外启动tf2_toolsros2 run tf2_tools view_frames这会生成frames.pdf但更实用的是启动static_transform_publisherros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 world turtle1这条命令创建了一个静态坐标系变换world到turtle1的平移为(0,0,0)旋转为(0,0,0)。此时rviz2的TF面板就会显示world→turtle1的树状结构。实操心得/tf是ROS2的“空间定位神经系统”所有传感器数据激光雷达、摄像头都必须通过/tf关联到机器人本体坐标系。初学者不必深究tf2的广播机制但必须记住只要rviz2中看不到TF树第一反应就是检查static_transform_publisher是否运行以及Fixed Frame是否设为world。5. 从“能跑”到“能用”三个真实项目片段带你触摸ROS2的工业脉搏5.1 片段一用Python快速验证激光雷达数据流无需硬件没有真实激光雷达没关系。ROS2提供了ros2 bag和ros2 topic pub可以完美模拟。步骤下载一个公开的激光雷达bag包如rosbag2_example播放bagros2 bag play rosbag2_example查看话题ros2 topic list | grep scan应看到/scan编写一个简易订阅者scan_subscriber.pyimport rclpy from rclpy.node import Node from sensor_msgs.msg import LaserScan class ScanSubscriber(Node): def __init__(self): super().__init__(scan_subscriber) self.subscription self.create_subscription( LaserScan, /scan, self.listener_callback, 10) self.subscription # prevent unused variable warning def listener_callback(self, msg): self.get_logger().info(fReceived scan: {len(msg.ranges)} points, min range: {min(msg.ranges):.2f}m) def main(argsNone): rclpy.init(argsargs) scan_subscriber ScanSubscriber() rclpy.spin(scan_subscriber) scan_subscriber.destroy_node() rclpy.shutdown() if __name__ __main__: main()运行后你会看到实时打印的激光点数和最小距离。这就是工业现场调试的第一步确认传感器数据能被ROS2系统正确捕获和分发。后续所有算法如SLAM、避障都建立在这个数据流之上。5.2 片段二C节点与Python节点的混合编译真实产线场景产线机器人往往用C写核心控制低延迟用Python写上位机监控开发快。如何让它们在同一工作空间共存目录结构src/ ├── cpp_control_pkg/ # C包 │ ├── CMakeLists.txt │ └── src/control_node.cpp └── py_monitor_pkg/ # Python包 ├── setup.py └── py_monitor_pkg/monitor_node.py关键配置cpp_control_pkg/CMakeLists.txt中find_package必须包含rclcpp和std_msgspy_monitor_pkg/setup.py中entry_points必须正确定义构建时colcon

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价