1. 从零开始为什么要在Windows上折腾ROS 2和Rviz2如果你是一个机器人开发者或者对机器人操作系统ROS感兴趣那么“ROS 2”和“Rviz2”这两个词对你来说一定不陌生。ROS 2是ROS的下一代版本解决了ROS 1在实时性、跨平台和安全性等方面的诸多痛点正逐渐成为工业界和学术界的新标准。而Rviz2作为ROS 2的可视化工具是开发者观察机器人世界、调试传感器数据、验证算法效果的“眼睛”。但一提到ROS 2很多人的第一反应是“在Ubuntu上安装”。确实ROS 2官方对Linux尤其是Ubuntu的支持最为完善。然而现实情况是Windows仍然是全球桌面操作系统的绝对主流。很多开发者尤其是学生、工业领域的工程师他们的主力开发环境可能就是Windows。为了一个机器人项目专门安装双系统或者使用虚拟机不仅麻烦还会带来性能损耗和开发体验的割裂。所以在Windows上原生运行ROS 2和Rviz2就成了一件非常有价值的事情。它能让你在自己最熟悉的操作系统上无缝地进行机器人算法的开发、仿真和调试。想象一下你可以在Windows上编写代码、运行仿真然后通过Rviz2实时看到机器人的运动轨迹、激光雷达点云或者摄像头图像这无疑能极大地提升开发效率和学习体验。然而这条路并非一帆风顺。ROS 2在Windows上的生态相比Linux要年轻一些安装和配置过程中会遇到各种“坑”。网络上的教程要么过于简略要么版本过时导致很多初学者在第一步就卡住最终无奈放弃。本文的目的就是为你提供一份详尽、可靠、基于最新实践的Windows平台ROS 2与Rviz2入门指南。我会带你一步步走通整个流程并重点分享那些官方文档不会写的、只有踩过坑才知道的细节和技巧。2. 环境准备选择合适的ROS 2发行版与安装方式在Windows上安装ROS 2第一步也是最重要的一步就是选择正确的“发行版”和安装方法。这一步选错了后面可能会遇到无数兼容性问题。2.1 ROS 2发行版的选择为什么推荐Humble HawksbillROS 2和Linux一样有长期支持版LTS和普通版。对于Windows平台我强烈建议你选择ROS 2 Humble Hawksbill。原因如下长期支持与稳定性Humble是LTS版本官方支持到2027年5月。这意味着在它的生命周期内你会获得稳定的功能更新和安全补丁非常适合学习和长期项目开发。对Windows的最佳支持从Humble开始ROS 2对Windows的原生支持通过Chocolatey包管理器达到了一个非常成熟和稳定的阶段。之前的Foxy版本虽然也是LTS但其Windows支持在后期暴露出更多问题。而更新的Jazzy版本作为非LTS版其稳定性和社区支持度尚不及Humble。广泛的生态兼容性大多数流行的ROS 2功能包如Navigation2、MoveIt 2都对Humble版本有良好的支持。这意味着你学会后能更容易地将知识应用到实际项目中。所以请记住我们的目标在Windows 10或Windows 11上安装ROS 2 Humble。2.2 安装路径规划避开系统权限的“雷区”在Windows上安装软件安装路径是个大学问。默认的C:\Program Files或C:\Program Files (x86)路径需要管理员权限而ROS 2在运行过程中会产生大量临时文件和日志如果路径权限不足会导致各种莫名其妙的失败。我的经验是为ROS 2单独创建一个专属目录并且这个目录的路径中不要包含空格和中文。我推荐的做法是在C盘根目录或你的用户目录下创建一个新文件夹例如C:\dev\ros2_humbleC:\Users\你的用户名\ros2这样做的好处是权限充足你的用户账户对这个目录拥有完全控制权避免了后续colcon build或运行节点时的权限错误。路径简单没有空格在命令行中操作时不需要加引号减少输入错误。易于管理所有ROS 2相关的东西都放在这里卸载或迁移时一目了然。注意请务必遵守这个建议。我曾见过无数因为安装在带空格的默认路径下导致ament构建系统找不到文件或者Python模块导入失败的案例。2.3 核心依赖安装Chocolatey、Python与Visual StudioROS 2 Humble for Windows官方推荐使用Chocolatey进行安装。Chocolatey是Windows上的包管理器类似于Ubuntu的apt它能帮你自动处理复杂的依赖关系。第一步安装Chocolatey以管理员身份打开PowerShell执行以下命令Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(https://community.chocolatey.org/install.ps1))执行完成后关闭并重新打开一个管理员权限的PowerShell窗口输入choco如果显示帮助信息说明安装成功。第二步安装Python 3.10ROS 2 Humble依赖Python 3.8到3.10。我们安装3.10以确保最佳兼容性。choco install python310 -y安装完成后需要将Python添加到系统环境变量。通常Chocolatey会帮你做好但最好验证一下。在PowerShell中输入python --version应显示Python 3.10.x。如果没有你需要手动将C:\Python310和C:\Python310\Scripts添加到系统的PATH环境变量中。第三步安装Visual Studio 2019 Build Tools这是最关键、最容易出错的一步。ROS 2的许多底层C库需要MSVC编译器来构建。我们不需要安装完整的Visual Studio IDE只需要安装构建工具。choco install visualstudio2019buildtools -y此外还必须安装Windows 10 SDK和MSVC v142构建工具。choco install windows-sdk-10.1 -y安装完成后你需要在“开始”菜单中找到“Developer Command Prompt for VS 2019”或“x64 Native Tools Command Prompt for VS 2019”。后续所有ROS 2相关的命令行操作都必须从这个命令提示符启动因为它会自动设置好所有编译所需的环境变量如CLLIB等。这是Windows上开发C项目的标准做法也是ROS 2能成功编译和运行的前提。3. 安装ROS 2 Humble使用Chocolatey一键搞定环境准备就绪后安装ROS 2本身反而变得简单了。3.1 执行安装命令在我们刚才打开的“x64 Native Tools Command Prompt for VS 2019”中执行以下Chocolatey命令choco upgrade ros-humble-desktop -y --install-arguments/InstallationPath:C:\dev\ros2_humble ADDLOCALDesktop让我们拆解一下这个命令ros-humble-desktop这是Chocolatey上ROS 2 Humble桌面完整版的包名。“桌面版”包含了ROS 2核心、Rviz2、Gazebo仿真器、教程示例等几乎所有常用工具。--install-arguments这是关键参数它指定了安装选项。/InstallationPath:C:\dev\ros2_humble这告诉安装程序将ROS 2安装到我们事先规划好的C:\dev\ros2_humble目录。请确保你有权限在这个路径创建文件夹。ADDLOCALDesktop这个参数确保安装桌面版的所有组件。执行这个命令后Chocolatey会自动下载ROS 2及其所有依赖包括OpenCV、Qt5、Eigen等这个过程根据网速可能需要30分钟到1小时。期间请保持网络通畅并耐心等待。3.2 验证安装与配置环境变量安装完成后Chocolatey通常会自动将ROS 2的启动脚本路径添加到系统的PATH环境变量。但为了确保万无一失我们手动验证并配置一下。ROS 2的核心是一个批处理文件用于设置所有必要的环境变量。这个文件位于你的安装目录下例如C:\dev\ros2_humble\local_setup.bat。每次你要使用ROS 2时都需要先“激活”这个环境。最方便的方法是创建一个快捷方式在桌面上右键 - 新建 - 快捷方式。输入对象位置cmd.exe /k C:\dev\ros2_humble\local_setup.bat命名这个快捷方式为“ROS 2 Humble Terminal”。以后你只需要双击这个快捷方式就会打开一个已经设置好ROS 2环境的命令提示符窗口。在这个新打开的ROS 2终端里让我们进行最关键的两步验证验证1ROS 2核心功能ros2 run demo_nodes_cpp talker打开另一个ROS 2终端运行ros2 run demo_nodes_py listener如果第一个终端在持续打印“Hello World”消息第二个终端在同步接收并打印这些消息那么恭喜你ROS 2的核心通信机制——节点Node和话题Topic——工作正常验证2Rviz2可视化工具rviz2如果Rviz2的图形界面能够成功启动显示一个灰色的3D视图窗口那么Rviz2的安装也成功了。你可以先关掉它我们后面会详细使用。4. 初识Rviz2界面解析与基础数据可视化Rviz2启动后你可能会觉得界面有些复杂。别担心我们一步步来拆解。Rviz2的核心是“显示类型”和“坐标系”。4.1 Rviz2主界面功能区详解Rviz2的界面主要分为以下几个区域3D视图区中间最大的区域用于渲染所有可视化数据如网格、点云、模型、路径等。你可以用鼠标左键旋转视角中键平移右键缩放。显示面板左侧面板。这是Rviz2的“控制中心”。所有要显示的内容称为“Display”都在这里添加、删除和配置。例如你要显示一个机器人的模型就需要在这里添加一个“RobotModel”显示。视图设置右侧面板。可以保存和加载不同的视角方便你在调试时快速切换观察角度。时间面板底部面板。显示当前的ROS时间、系统时间以及帧率等信息。菜单栏与工具栏顶部。提供文件操作、工具如测量、设置初始位姿等功能。4.2 第一个可视化显示一个静态的网格地板让我们完成第一个简单的可视化来理解Rviz2的工作流程。在ROS 2终端中运行rviz2。在左侧“显示面板”的底部点击“Add”按钮。在弹出的添加显示窗口中你会看到一个很长的列表。找到并选择“Grid”然后点击“OK”。此时左侧面板的“Displays”树下会出现一个“Grid”条目。点击它前面的小箭头展开你可以看到它的配置项。在3D视图区你应该立刻看到了一个由线条组成的网格。这就是“Grid”显示的效果它常用于作为地面参考。通过这个操作你完成了Rviz2最核心的操作添加一个显示Display并订阅某种类型的数据对于Grid它不需要外部数据是内部生成的。4.3 理解“Fixed Frame”可视化数据的锚点在“显示面板”的顶部有一个非常重要的输入框“Fixed Frame”。它默认通常是map或odom。这个“固定帧”是Rviz2中所有可视化数据的参考坐标系。你可以把它想象成整个3D世界的“原点”。所有其他数据如机器人的位置、传感器的读数都需要通过一个变换关系转换到这个“固定帧”下才能被正确绘制在3D视图的对应位置上。这个变换关系就是由ROS 2的TF2库来管理和提供的。如果“Fixed Frame”设置错误或者TF变换树不完整你就会在Rviz2底部看到黄色的警告信息例如“No transform from [frame_a] to [frame_b]”。这是使用Rviz2时最常见的问题之一。为了演示这一点我们可以尝试发布一个简单的TF变换。首先安装TF2工具choco upgrade ros-humble-turtle-tf2-py -y然后运行一个发布TF变换的示例ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py再次打开Rviz2添加一个“TF”显示。在“Fixed Frame”中输入world你就能在3D视图中看到两个乌龟坐标系之间的动态变换关系了。这直观地展示了TF如何描述不同部件间的相对位置。5. 实战演练创建自定义ROS 2节点并在Rviz2中可视化只看示例不够过瘾我们来动手创建一个自己的ROS 2工作空间编写一个简单的节点发布一些数据并在Rviz2中看到它。5.1 创建ROS 2工作空间与功能包工作空间是存放你所有ROS 2代码的地方。我们创建一个名为my_ws的工作空间。# 在ROS 2终端中切换到你想存放代码的目录例如用户目录 cd C:\Users\你的用户名 mkdir -p my_ws/src cd my_ws现在我们在src目录下创建一个Python功能包。ROS 2功能包可以包含节点、库、配置文件等。# 创建功能包依赖rclpyROS 2 Python客户端库和geometry_msgs我们将用它来发布消息 ros2 pkg create my_first_rviz2_pkg --build-type ament_python --dependencies rclpy geometry_msgs cd src/my_first_rviz2_pkg/my_first_rviz2_pkg你会看到自动生成的文件结构。我们需要创建两个Python文件一个发布者节点一个启动文件。5.2 编写一个发布“点”数据的节点创建一个名为simple_marker_publisher.py的文件内容如下#!/usr/bin/env python3 import rclpy from rclpy.node import Node from geometry_msgs.msg import PointStamped import time class SimpleMarkerPublisher(Node): def __init__(self): super().__init__(simple_marker_publisher) # 创建一个发布者发布到话题 /my_point 消息类型是 PointStamped self.publisher_ self.create_publisher(PointStamped, /my_point, 10) # 创建一个定时器每0.5秒发布一次消息 timer_period 0.5 # seconds self.timer self.create_timer(timer_period, self.timer_callback) self.get_logger().info(Simple Marker Publisher 节点已启动正在发布点数据...) def timer_callback(self): msg PointStamped() # 设置消息头时间戳和坐标系ID msg.header.stamp self.get_clock().now().to_msg() msg.header.frame_id map # 这个点位于map坐标系下 # 设置点的三维坐标 (x, y, z) msg.point.x 1.0 msg.point.y 0.5 msg.point.z 0.0 # 发布消息 self.publisher_.publish(msg) self.get_logger().debug(f发布点: ({msg.point.x}, {msg.point.y}, {msg.point.z})) def main(argsNone): rclpy.init(argsargs) node SimpleMarkerPublisher() try: rclpy.spin(node) except KeyboardInterrupt: pass finally: node.destroy_node() rclpy.shutdown() if __name__ __main__: main()这个节点每隔0.5秒会发布一个PointStamped消息到/my_point话题。这个消息包含了一个在map坐标系下位置为(1.0, 0.5, 0.0)的点。别忘了给这个文件添加可执行权限在Windows上这一步通常在setup.py中配置但为了简单我们直接运行# 在 my_first_rviz2_pkg 目录下 # 编辑 setup.py在 console_scripts 括号内添加一行 # simple_marker_pub my_first_rviz2_pkg.simple_marker_publisher:main,然后在工作空间根目录(my_ws)编译功能包colcon build --packages-select my_first_rviz2_pkg编译成功后需要“激活”这个工作空间的环境# 在my_ws目录下 call install\local_setup.bat5.3 在Rviz2中可视化自定义点数据现在让我们在Rviz2中看到这个点。在一个ROS 2终端中运行你的节点ros2 run my_first_rviz2_pkg simple_marker_pub你应该能看到日志输出说明节点正在运行。在另一个终端启动Rviz2rviz2在Rviz2中首先确保“Fixed Frame”设置为map与我们节点中发布的坐标系一致。点击“Add”这次我们添加一个“Marker”显示。Marker是Rviz2中最灵活的可视化类型之一可以表示箭头、立方体、球体、文本、线条等多种形状。添加“Marker”后在左侧面板中找到它并展开。你需要配置两个关键地方Marker Topic将其设置为/my_point这是我们节点发布的话题。Namespace可以留空或填一个名字用于区分不同的Marker集合。仅仅订阅话题还不够我们需要告诉Rviz2如何绘制这个点。默认的Marker显示可能不会自动处理PointStamped消息。为了简单起见我们可以使用另一个更专门的显示类型。先删除刚才添加的“Marker”显示。点击“Add”这次选择“PointCloud2”。虽然我们的数据是单个点但PointStamped消息可以很容易地被转换成PointCloud2格式一个只包含一个点的点云。不过这需要我们在节点中发布PointCloud2消息或者使用一个转换节点。作为更简单的入门我们换一种方式。让我们修改节点发布Rviz2能直接识别的“Marker”消息。这需要visualization_msgs包。首先修改功能包的依赖和代码。修改setup.py和package.xml 在package.xml的depend标签内添加visualization_msgs。 在setup.py的install_requires列表中添加visualization_msgs。创建新的节点文件marker_publisher.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from visualization_msgs.msg import Marker from geometry_msgs.msg import Point import time class MarkerPublisher(Node): def __init__(self): super().__init__(marker_publisher) self.publisher_ self.create_publisher(Marker, /visualization_marker, 10) timer_period 1.0 self.timer self.create_timer(timer_period, self.timer_callback) self.counter 0 self.get_logger().info(Marker Publisher 节点已启动...) def timer_callback(self): marker Marker() marker.header.frame_id map marker.header.stamp self.get_clock().now().to_msg() marker.ns my_namespace marker.id self.counter marker.type Marker.SPHERE # 类型为球体 marker.action Marker.ADD marker.pose.position.x 1.0 marker.pose.position.y 0.5 (self.counter * 0.1) # 每次Y坐标增加0.1让球体移动 marker.pose.position.z 0.0 marker.pose.orientation.w 1.0 # 无旋转 marker.scale.x 0.2 # 球体直径 marker.scale.y 0.2 marker.scale.z 0.2 marker.color.a 1.0 # 不透明度 marker.color.r 0.0 marker.color.g 1.0 # 绿色 marker.color.b 0.0 self.publisher_.publish(marker) self.get_logger().info(f发布Marker ID: {self.counter}) self.counter 1 def main(argsNone): rclpy.init(argsargs) node MarkerPublisher() try: rclpy.spin(node) except KeyboardInterrupt: pass finally: node.destroy_node() rclpy.shutdown() if __name__ __main__: main()同样在setup.py中注册这个节点然后重新编译工作空间(colcon build)并激活环境。运行新节点ros2 run my_first_rviz2_pkg marker_publisher在Rviz2中点击“Add”再次选择“Marker”显示。将其“Marker Topic”设置为/visualization_marker。现在你应该能在Rviz2的3D视图中在map坐标系下(1.0, 0.5, 0.0)附近看到一个绿色的球体并且每秒钟它会向Y轴正方向移动0.1米。通过这个完整的流程你不仅学会了安装还亲手创建了一个能与Rviz2交互的ROS 2节点实现了数据的生成、发布与可视化。这才是真正的“入门”。6. 避坑指南与效能提升Windows平台特有问题的解决在Windows上使用ROS 2和Rviz2你会遇到一些在Linux上不常见的问题。这里我总结几个最典型的“坑”及其解决方案。6.1 路径与权限问题构建失败与导入错误问题现象在执行colcon build时出现“Permission denied”、“无法创建目录”或“找不到文件”等错误。或者在运行Python节点时出现“ModuleNotFoundError: No module named ‘xxx’”。根因分析构建失败通常是因为工作空间或安装目录路径包含空格或中文或者当前用户对该目录没有写权限。colcon在构建过程中需要创建build、install、log等目录。导入错误在Windows上Python模块的搜索路径处理与Linux略有不同。如果你在非激活的终端运行节点或者工作空间的环境没有正确“source”在Windows上是call install\local_setup.batPython就找不到你自定义的功能包。解决方案严格遵守路径规范工作空间、功能包、安装目录的路径绝对不要包含空格和中文。使用简单的英文路径如C:\dev\ros2_ws。始终在正确环境中操作任何与ROS 2相关的命令ros2,colcon,rviz2都必须在已经激活了ROS 2或对应工作空间环境的终端中执行。养成双击“ROS 2 Humble Terminal”快捷方式开始工作的习惯。以管理员身份一般情况下不要以管理员身份运行你的开发终端除非你非常确定需要修改系统级文件。在用户目录下操作可以避免很多权限问题。如果确实需要确保所有相关终端都以管理员身份运行。6.2 Rviz2启动黑屏、闪退或渲染异常问题现象Rviz2能启动但3D视图区域是黑的或者整个窗口闪烁后关闭或者模型显示破碎。根因分析这几乎总是与图形驱动或OpenGL有关。Rviz2重度依赖Qt和OpenGL进行3D渲染。Windows上不同显卡尤其是集成显卡和某些NVIDIA/AMD笔记本显卡的驱动对OpenGL的支持程度不同。解决方案更新显卡驱动前往你的显卡制造商NVIDIA、AMD、Intel官网下载并安装最新的官方驱动程序。笔记本用户请务必注意有时需要安装笔记本厂商提供的特定版本驱动。设置图形性能偏好仅限Windows 10/11打开Windows“设置” - “系统” - “显示” - “图形设置”。在“图形性能首选项”下点击“浏览”找到rviz2.exe。它通常位于C:\dev\ros2_humble\bin或你的安装目录下的bin文件夹。添加后点击该条目选择“选项”。尝试选择“高性能”通常指向你的独立显卡然后保存。重新启动Rviz2。这个设置强制系统使用指定的GPU来运行Rviz2对于双显卡笔记本尤其有效。检查环境变量有时旧的OpenGL相关环境变量会导致冲突。可以尝试在启动Rviz2前在终端中设置QT_OPENGLangle或QT_OPENGLsoftware后者使用软件渲染慢但兼容性最好来测试。set QT_OPENGLsoftware rviz2如果软件模式能运行那就确定是硬件OpenGL驱动的问题。6.3 网络与发现多机通信与本地回环问题问题现象在一台机器上运行的talker另一台机器上的listener收不到消息或者甚至在同一台机器上多个终端间的节点无法发现彼此。根因分析ROS 2使用DDS作为底层通信中间件。DDS依赖于组播Multicast进行节点发现。在某些Windows网络配置特别是企业网络或使用了某些防火墙/杀毒软件下组播可能被禁用或过滤。解决方案设置ROS_DOMAIN_ID这是最简单有效的隔离方法。在同一物理网络下如果你想隔离不同的ROS 2系统或者解决发现冲突可以为它们设置不同的ROS_DOMAIN_ID0-101之间。只有在相同ROS_DOMAIN_ID下的节点才能互相发现。set ROS_DOMAIN_ID42 ros2 run demo_nodes_cpp talker在另一个终端也需要设置相同的ID才能通信。检查防火墙确保Windows Defender防火墙或第三方防火墙允许ROS 2和DDS相关进程如ros2.exe,rviz2.exe进行网络通信。在首次运行时通常Windows会弹出询问框请选择“允许”。禁用低质量网络适配器在“控制面板”-“网络和共享中心”-“更改适配器设置”中禁用那些不用的网络连接如VMware虚拟网卡、某些虚拟专用网络适配器等有时它们会干扰DDS的发现机制。使用循环回环地址在%ROS_HOME%\config\ros2_system.env如果不存在则创建中可以设置ROS_LOCALHOST_ONLY1来强制仅使用本地回环通信这能彻底避免网络问题但仅限于单机。6.4 性能优化让Rviz2在Windows上更流畅Rviz2在显示高密度点云或复杂模型时可能比较吃资源。在Windows上你可以通过以下设置提升体验调整Rviz2渲染设置在Rviz2中点击菜单栏的“File” - “Preferences”。在“Preferences”窗口中Display可以尝试降低“Default Background Color”的亮度如设为深灰色减少视觉疲劳。3D View如果卡顿可以尝试取消勾选“Use anti-aliasing”抗锯齿。Status勾选“Hide on startup”可以启动时隐藏底部状态栏获得更大视图区域。管理显示项在左侧显示面板中及时关闭不需要的显示项。每个显示如点云、激光扫描、网格都会消耗GPU资源。不需要调试时可以取消勾选使其失效而不是删除。使用--help和-s参数rviz2 -s可以在启动时加载一个保存的配置文件.rviz文件快速恢复到你的工作布局避免每次手动添加显示。你可以通过rviz2 --help查看所有命令行参数。7. 下一步探索更丰富的Rviz2功能与ROS 2生态成功运行第一个自定义可视化只是起点。Rviz2的强大远不止于此。基于你现在搭建好的Windows环境你可以继续探索加载机器人模型URDF使用“RobotModel”显示加载你的机器人的URDF文件在Rviz2中查看它的3D模型并观察各个关节的运动。可视化传感器数据激光雷达使用“LaserScan”显示订阅/scan话题可以看到二维激光雷达的扫描线。摄像头使用“Image”或“Camera”显示订阅/image_raw话题可以实时显示摄像头画面。点云使用“PointCloud2”显示订阅/points话题可以渲染三维点云数据。路径与导航调试使用“Path”显示来查看机器人的全局规划路径和局部规划路径。使用“PoseArray”显示粒子滤波器的位姿估计。交互工具使用Rviz2顶部的工具栏你可以发布目标点“2D Pose Estimate”、发送导航目标“2D Nav Goal”甚至通过“Publish Point”工具点击3D视图来获取坐标。要学习这些最好的方法是动手实践。你可以从ROS 2的官方教程开始尝试运行turtlesim、teleop_twist_keyboard等示例并在Rviz2中添加相应的显示来观察数据流。在Windows上建立起流畅的ROS 2和Rviz2开发环境意味着你打通了机器人算法开发中“思考”与“看见”的桥梁。从此你可以在熟悉的操作系统上高效地进行算法验证、仿真调试甚至连接真实的机器人硬件。这个过程虽然初期配置繁琐但一旦跑通其带来的便利性和一致性回报是巨大的。希望这份详尽的指南能帮你扫清障碍顺利踏上ROS 2的实战之旅。如果在实践中遇到新的问题记住多查阅官方文档、社区论坛如ROS Answers并且善用ros2 --help和rviz2 --help来探索工具本身提供的选项。