Windows 11通过WSL 2搭建ROS 2开发环境完整指南
1. 为什么在Windows 11上搞Linux和ROS?一个开发者的真实场景
如果你是一个机器人、自动驾驶或者嵌入式领域的开发者,或者正在学习相关技术,那么“ROS”这个词对你来说肯定不陌生。ROS,机器人操作系统,是当前机器人研发领域事实上的标准软件框架。但一个很现实的问题是,它的“原生家园”是Linux,特别是Ubuntu。这就让大量使用Windows作为主力工作系统的开发者感到头疼:难道为了跑个ROS,非得装个双系统,或者整天开着虚拟机吗?
几年前,答案可能真是这样。但到了2023年,情况已经完全不同。Windows Subsystem for Linux 2,也就是WSL 2,已经成熟到足以承担严肃的开发工作。它不再是那个“玩具”,而是一个在Windows内核上原生运行的、完整的Linux兼容层。这意味着,你可以在Windows 11上,以一个近乎原生(我实测性能损耗在5%以内)的速度,运行一个完整的Ubuntu系统,并且完美地安装和运行ROS。
我选择在2023年重新梳理这个流程,是因为WSL和ROS的生态都在快速迭代。网上很多老教程(比如2020年甚至更早的)已经过时,会带你踩进各种坑里,比如图形界面支持、USB设备访问、网络配置等问题。这篇内容,就是基于我最近在全新Windows 11机器上,从零开始配置Ubuntu 22.04 LTS和ROS 2 Humble Hawksbill(当前最新的LTS版本)的完整实录。我会把每一步的原理、为什么这么做、以及我踩过的坑和解决方案,都毫无保留地分享出来。目标很简单:让你用最短的时间,在Windows上搭建一个稳定、高效、可投入实际开发的ROS 2环境。
2. 战前准备:理解WSL 2与你的系统环境
在动手之前,我们必须搞清楚几个核心概念,这能帮你理解后续每一步操作的意义,甚至在出问题时自己找到解决方案。
2.1 WSL 1 vs WSL 2:为什么我们坚定选择WSL 2?
WSL 1和WSL 2是两代完全不同的技术架构。
- WSL 1:它是一个“翻译层”。当你在WSL 1中运行Linux命令时,WSL会实时将这些系统调用“翻译”成Windows能理解的形式。它的优点是启动快,并且和Windows文件系统的互操作性极好(因为文件就在NTFS上)。但缺点也很明显:兼容性有缺口(不是所有Linux内核特性都支持),尤其是I/O性能,特别是大量小文件读写时,会慢得让你怀疑人生。这对于需要编译大量代码(比如ROS)的场景是致命的。
- WSL 2:它本质上是一个轻量级的、基于Hyper-V的完整Linux虚拟机。它拥有一个完整的、微软优化过的Linux内核。这意味着它拥有100%的系统调用兼容性,并且提供了接近原生的性能,特别是文件I/O和网络性能。与传统虚拟机(如VMware, VirtualBox)相比,它的资源占用更小,启动速度更快(几乎是秒级),并且与Windows的集成度更高(比如可以直接从Windows终端访问)。
对于ROS开发,WSL 2是唯一正确的选择。ROS的构建系统(如colcon)和很多底层通信机制(如DDS)都对系统性能和内核特性有较高要求,WSL 2才能提供稳定可靠的体验。
2.2 检查你的Windows 11版本与虚拟化支持
WSL 2依赖于Windows的虚拟化功能。在开始前,请确保:
- 系统版本:Windows 11版本 21H2 或更高。你可以在“设置”->“系统”->“关于”中查看。低于此版本可能无法获得最佳支持。
- 虚拟化已开启:这通常在BIOS/UEFI设置中。对于大多数现代电脑,默认是开启的。你可以通过任务管理器来验证:按
Ctrl+Shift+Esc打开任务管理器,切换到“性能”标签页,查看CPU部分,如果“虚拟化”显示为“已启用”,则说明没问题。
如果未启用,你需要重启电脑进入BIOS/UEFI设置(开机时按F2、Del、F10等键,因主板而异),找到类似“Intel Virtualization Technology (VT-x)”或“AMD-V”的选项,将其设置为“Enabled”。
2.3 为什么是Ubuntu 22.04 LTS和ROS 2 Humble?
- Ubuntu 22.04 LTS (Jammy Jellyfish):LTS代表长期支持,官方提供5年的维护更新。对于开发环境,稳定性远高于追求最新版本。22.04是当前最新的LTS版本,拥有最新的工具链和库,社区支持也最好。ROS 2 Humble官方就是为Ubuntu 22.04构建的,这是“官配”,能最大程度避免依赖库冲突。
- ROS 2 Humble Hawksbill:ROS 1已经停止开发,ROS 2是现在和未来的方向。Humble是ROS 2的第三个LTS版本(前两个是Foxy和Galactic),于2022年5月发布,支持到2027年5月。它比早期的LTS版本更稳定,功能更完善,是目前开始新ROS 2项目最推荐的选择。
明确了这些,我们的路径就非常清晰了:在满足条件的Windows 11上,安装WSL 2,然后安装Ubuntu 22.04 LTS发行版,最后在这个Linux子系统中安装ROS 2 Humble。
3. 步步为营:安装与配置WSL 2及Ubuntu 22.04
网上有很多“一键安装”的命令,但我强烈建议你理解每一步,因为出问题时你知道从哪里查起。
3.1 安装WSL 2功能与Linux内核更新包
最可靠的方式是通过Windows终端(管理员身份)使用命令行。
- 以管理员身份打开PowerShell或Windows终端。在开始菜单搜索“PowerShell”,右键选择“以管理员身份运行”。
- 启用WSL功能:输入以下命令并回车。这个命令会启用“适用于Linux的Windows子系统”这个可选功能。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart - 启用虚拟机平台功能:输入以下命令并回车。这是WSL 2的依赖。
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart - 重启电脑。这是必须的,否则更改不会生效。
- 设置WSL 2为默认版本:重启后,再次以管理员身份打开PowerShell,输入:
如果系统提示你需要更新WSL 2 Linux内核,它会提供一个链接(通常是 https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi ),下载并安装那个MSI包即可。安装后,再次执行上面的命令。wsl --set-default-version 2
注意:如果你之前安装过WSL 1的发行版,可以通过
wsl -l -v查看所有发行版及其版本。如果想将某个发行版从WSL 1升级到WSL 2,可以使用wsl --set-version <发行版名称> 2。
3.2 安装Ubuntu 22.04 LTS发行版
现在,我们可以安装Linux发行版了。有两种主流方法:
- 方法一:通过Microsoft Store(推荐给新手):打开Microsoft Store,搜索“Ubuntu 22.04 LTS”,选择那个由“Canonical Group Limited”发布的版本,点击“获取”安装。这是最省事的方法。
- 方法二:通过命令行(更可控):在PowerShell(无需管理员)中直接输入:
这个命令会自动完成发行版的下载和安装。wsl --install -d Ubuntu-22.04
安装完成后,你可以在开始菜单找到“Ubuntu 22.04 LTS”并启动它。第一次启动会需要几分钟进行初始化,并提示你创建Linux系统的用户名和密码。这个用户名和密码与你的Windows账户无关,是独立的,请务必记住!在Linux中输入密码时,光标不会移动,这是正常现象,输完回车即可。
3.3 至关重要的初始配置与优化
系统装好了,但直接用它来开发ROS还很粗糙。我们需要进行一些优化配置。
更新软件源和升级系统:在Ubuntu终端中,依次执行:
sudo apt update sudo apt upgrade -y这能确保你获得最新的安全补丁和软件包。
配置Windows Terminal作为默认终端(强烈推荐):Windows Terminal比传统的命令行窗口好用到不知道哪里去,支持多标签、分屏、丰富的主题和配置。从Microsoft Store安装“Windows Terminal”。安装后,打开设置,在“启动”->“默认配置文件”中选择“Ubuntu 22.04”。这样以后打开终端就直接进入WSL环境了。
文件系统互访:这是WSL的一大优势。
- 在WSL中访问Windows文件:你的Windows的C盘、D盘等,会自动挂载到WSL的
/mnt/c,/mnt/d目录下。你可以直接cd /mnt/c/Users/YourName来访问你的Windows用户目录。但是,强烈不建议在/mnt目录下进行Linux项目的编译或开发,因为跨文件系统性能损失巨大。你的Linux项目文件应该放在WSL自己的文件系统里(如/home/your_username)。 - 在Windows中访问WSL文件:在文件资源管理器的地址栏输入
\\wsl$\回车,你就能看到安装的WSL发行版,点进去就能像访问普通网络驱动器一样访问Linux文件。这非常方便你在Windows下用VS Code等编辑器编辑Linux下的代码。
- 在WSL中访问Windows文件:你的Windows的C盘、D盘等,会自动挂载到WSL的
安装基础开发工具:在安装ROS之前,先装一些必备工具。
sudo apt install -y build-essential cmake git curl wget python3-pip python3-venv
4. 核心任务:在WSL 2中安装ROS 2 Humble
终于来到重头戏。ROS 2的安装已经非常规范化,但其中一些细节决定了成败。
4.1 设置软件源与密钥
ROS官方提供了APT仓库,我们需要将其添加到Ubuntu的软件源列表中。
- 确保支持
universe仓库:Ubuntu的universe仓库包含了许多社区维护的软件,ROS的一些依赖在其中。sudo apt install software-properties-common sudo add-apt-repository universe - 添加ROS 2 GPG密钥:GPG密钥用于验证下载的软件包是否来自官方,未被篡改。
如果上面的sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpgcurl命令因为网络问题失败(这是常见坑),可以多试几次,或者尝试用wget。也可以手动下载这个文件,然后复制到指定位置。 - 添加ROS 2仓库到源列表:
这个命令看起来很复杂,但它只是动态地根据你的系统架构(echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/nullarch)和Ubuntu版本代号($(source /etc/os-release && echo $UBUNTU_CODENAME),对于22.04就是jammy)来生成正确的源地址。
4.2 安装ROS 2桌面版
再次更新软件源列表,然后安装。
sudo apt update sudo apt install ros-humble-desktop -yros-humble-desktop:这是“桌面完整版”,包含了ROS核心、基础工具、GUI工具(如RQt、RViz2)以及一大批常用的功能包。对于学习和大多数开发,这个版本是最合适的。如果你只需要最核心的部分,可以安装ros-humble-ros-base。
安装过程会持续一段时间,并下载几百MB的软件包,请保持网络通畅。
4.3 配置环境变量——最容易出错的一步
安装完成后,ROS的命令(如ros2)并不会立即可用,因为它的可执行文件和库的路径没有被添加到系统的环境变量中。ROS提供了一个脚本来设置这些环境变量。
每次打开新的终端窗口,你都需要“激活”ROS环境:
source /opt/ros/humble/setup.bash执行这条命令后,你再输入ros2就应该能看到命令帮助了。
但是,我们不可能每次开终端都手动执行这条命令。所以需要将其添加到shell的启动脚本中。
- 如果你使用bash(默认):编辑家目录下的
.bashrc文件。
然后让更改生效:echo "source /opt/ros/humble/setup.bash" >> ~/.bashrcsource ~/.bashrc - 如果你使用zsh:命令类似,但文件是
.zshrc。
踩坑实录:有时候,即使添加到了
.bashrc,在新终端里ros2命令依然找不到。这可能是因为你的shell没有正确读取.bashrc。一个排查方法是打开新终端后,先执行echo $ROS_DISTRO,如果没输出,说明环境没生效。可以手动source ~/.bashrc试试。另一个常见原因是,你在某个脚本或过程中以非交互式、非登录式shell运行,这种shell可能不会读取.bashrc。对于复杂的脚本,最好显式地source /opt/ros/humble/setup.bash。
4.4 安装额外的依赖和工具
为了让开发体验更完整,我们还需要安装一些工具。
- colcon构建工具:ROS 2推荐使用colcon来构建工作空间。
sudo apt install python3-colcon-common-extensions -y - ROS编译依赖:安装一些常用的编译依赖。
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential -y - 初始化rosdep:
rosdep是一个工具,用于安装ROS包的系统依赖。这是编译很多第三方ROS包时必须的步骤。sudo rosdep init rosdep update注意:
sudo rosdep init只需要在系统初始化时执行一次。而rosdep update是更新本地的依赖数据库,建议定期执行,或者在安装新包遇到依赖问题时执行。sudo rosdep init命令可能会因为网络问题失败,提示“Website may be down”。这是因为它在尝试从raw.githubusercontent.com下载文件。如果遇到这个问题,可以尝试配置网络代理,或者寻找其他替代方案(如手动下载文件并放置到相应位置),这是ROS安装中最经典的网络坑之一。
5. 验证安装与初体验:让ROS 2在WSL里动起来
理论说再多,不如跑个demo实在。我们来运行ROS 2经典的“小海龟”示例,这能验证核心通信机制是否正常。
5.1 启动一个“话题”发布者
打开第一个终端(确保环境已激活),运行以下命令启动一个节点,它会向/turtle1/cmd_vel话题发布指令,让海龟做圆周运动:
ros2 run turtlesim turtlesim_node你会看到一个蓝色的窗口弹出,里面有一只小海龟。注意:这个GUI窗口能弹出来,本身就证明了WSL 2的图形界面支持是正常的。WSL 2通过内置的机制将Linux的GUI应用转发到Windows桌面显示,无需额外配置复杂的X Server(这是老教程里常见的坑)。
5.2 启动一个“话题”订阅者与控制节点
打开第二个终端(同样需要先source /opt/ros/humble/setup.bash或已配置自动加载),运行:
ros2 run turtlesim turtle_teleop_key这个节点启动后,第二个终端会提示你用方向键控制海龟。把焦点放在这个终端上,按上下左右键,看看第一个窗口里的海龟是否随之移动。
5.3 查看系统状态
打开第三个终端,我们可以用ROS 2的工具来查看当前系统的状态:
# 查看所有正在运行的节点 ros2 node list # 应该能看到 /teleop_turtle 和 /turtlesim # 查看所有活跃的话题 ros2 topic list # 应该能看到 /turtle1/cmd_vel, /turtle1/pose, /turtlesim/parameter_events 等 # 实时监听 /turtle1/cmd_vel 话题上流动的数据 ros2 topic echo /turtle1/cmd_vel然后在第二个终端里按方向键,你会在第三个终端里看到不断刷新的几何数据(linear和angular向量),这就是ROS节点间通过话题进行通信的真实数据。
如果以上所有步骤都成功了,那么恭喜你,一个功能完整的ROS 2 Humble环境已经在你的Windows 11上通过WSL 2搭建完毕!这个环境已经具备了进行实际项目开发的基础能力。
6. 进阶配置与避坑指南:让开发环境更顺手
基础环境跑通了,但要投入日常开发,我们还需要解决一些“痒点”和“痛点”。
6.1 图形性能与3D加速(RViz2/Gazebo)
对于机器人开发,RViz2(可视化工具)和Gazebo(仿真环境)是重中之重。它们需要较好的OpenGL支持。
- WSL 2的图形支持:WSL 2默认支持OpenGL的软件渲染(LLVMPipe),但对于复杂的3D图形,性能很差。解决方案是安装Windows平台的GPU驱动。
- 根据你的显卡型号(NVIDIA / AMD / Intel),去官网下载并安装适用于WSL的GPU驱动。例如,对于NVIDIA,你需要下载并安装 NVIDIA CUDA on WSL 的驱动 。
- 在WSL 2的Ubuntu中,安装对应的GPU库。对于NVIDIA:
sudo apt install nvidia-cuda-toolkit
wsl --shutdown,然后重新打开Ubuntu终端)。运行glxinfo -B可以查看当前的OpenGL渲染器,如果显示是你的独立显卡型号(如“NVIDIA GeForce...”),而不是“LLVMPipe”,那就说明硬件加速生效了。这时再运行RViz2,流畅度会有质的提升。
6.2 USB设备访问(连接真实机器人/传感器)
默认情况下,WSL 2无法直接访问连接到Windows的USB设备。这对于需要连接激光雷达、IMU、控制器等硬件的机器人开发是个大问题。
- 解决方案:使用
usbipd。这是一个开源工具,可以将Windows上的USB设备“挂载”到WSL 2中。- 在Windows端安装
usbipd:以管理员身份打开PowerShell,运行:winget install --interactive --exact dorssel.usbipd-win - 在WSL 2(Ubuntu)端安装客户端工具:
sudo apt install linux-tools-generic hwdata sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20 - 使用流程:
- 在Windows PowerShell(管理员)中,列出USB设备:
usbipd wsl list - 找到你的设备总线ID,然后将其绑定到WSL:
usbipd wsl attach --busid <总线ID> - 在WSL终端中,现在应该能用
lsusb命令看到该设备了。 这个过程相对复杂,且每次重新连接设备可能需要重新操作。但对于必须使用真实硬件的场景,这是目前最可行的方案。
- 在Windows PowerShell(管理员)中,列出USB设备:
- 在Windows端安装
6.3 网络配置与ROS 2多机通信
WSL 2的网络模式是NAT,它有一个虚拟的网络接口,与Windows主机共享IP。这意味着:
- 从Windows访问WSL:很简单,WSL的IP地址通常是
172.x.x.x网段,你可以在WSL里用ip addr show查看eth0的地址。 - 从WSL访问Windows:可以通过特殊的DNS名称
host.docker.internal或固定IP172.25.240.1(这个可能变,最好用前面的DNS名)来访问Windows主机上运行的服务。 - ROS 2多机通信:如果你想让你在WSL里的ROS节点,与同一局域网内另一台物理机(比如真正的机器人)上的ROS节点通信,就需要配置ROS 2的发现协议。你需要设置
ROS_DOMAIN_ID环境变量,并确保所有机器在同一个域内,且防火墙允许相关端口(通常是UDP 7400-7600范围)的通信。在WSL中,还需要确保Windows防火墙没有阻止这些端口。
6.4 性能调优与文件位置
- 不要跨文件系统工作:再次强调,你的ROS工作空间(
~/ros2_ws)一定要创建在WSL的文件系统内(如/home/yourname/),而不是/mnt/c/下。跨NTFS和WSL的ext4文件系统进行大量小文件编译,速度可能相差10倍以上。 - 调整WSL 2资源限制:默认WSL 2会尽可能使用所有可用内存和CPU。你可以在用户目录(
C:\Users\<YourName>\)下创建.wslconfig文件来限制资源,这对于在配置不高的机器上防止WSL占用过多资源很有用。
修改后,需要在PowerShell中执行[wsl2] memory=4GB # 限制最大内存为4GB processors=4 # 限制使用4个CPU核心 localhostForwarding=truewsl --shutdown关闭WSL,再重新启动生效。
7. 集成开发环境(IDE)配置:VS Code + WSL 2
命令行固然强大,但一个好的IDE能极大提升开发效率。Visual Studio Code + WSL远程扩展是绝配。
- 安装VS Code:从官网下载安装。
- 安装“Remote - WSL”扩展:在VS Code的扩展商店搜索并安装。
- 连接WSL:点击VS Code左下角的绿色远程连接图标,选择“New WSL Window”,然后选择你安装的Ubuntu发行版。VS Code会在WSL环境中启动一个服务器,并将界面连接到它。此时,你打开的文件夹、运行的终端,都完全在WSL环境内。
- 安装ROS扩展:在连接到WSL的VS Code中,安装“ROS”扩展(由Microsoft发布)。这个扩展提供了ROS工作空间识别、
package.xml和CMakeLists.txt的智能感知、ROS节点启动配置等强大功能。 - 打开ROS工作空间:在WSL终端里创建你的ROS工作空间(
mkdir -p ~/ros2_ws/src),然后用VS Code打开~/ros2_ws文件夹。VS Code会自动识别为ROS工作空间,侧边栏会出现ROS视图,你可以方便地浏览包、启动节点、查看话题和服务。
这套组合让你可以在Windows下享受VS Code流畅的图形界面和丰富的插件生态,同时在WSL内获得原生的Linux编译和运行环境,真正做到两全其美。
走到这里,你已经拥有了一个强大、现代且高效的ROS 2开发环境。它不再是“将就用用”的替代品,而是一个可以胜任从学习、算法仿真到部分实物调试的全流程平台。我自己的多个机器人项目都在这个环境下进行前期开发和测试,稳定性和效率都经受住了考验。当然,遇到复杂硬件在环或极致性能要求的场景,最终还是需要部署到真实的Linux硬件上,但WSL 2无疑为Windows平台的机器人开发者打开了一扇全新的大门。