在机器人仿真开发领域,Gazebo作为一款开源的物理仿真引擎,被广泛应用于算法验证和系统测试。但实际工作中我们经常遇到这样的困境:不同项目依赖的Gazebo版本存在差异,而官方源通常只提供单一版本。更棘手的是,在Windows系统下通过WSL2进行开发时,默认的apt安装方式会污染系统环境,导致版本冲突难以管理。
我在参与某机械臂控制项目时就踩过这个坑——项目A需要Gazebo9配合ROS Melodic,而项目B必须使用Gazebo11运行新开发的插件。来回卸载重装不仅耗时,还曾导致依赖关系彻底混乱。这促使我研究出基于WSL2的独立编译方案,实现多个Gazebo版本在同一开发环境下的隔离共存。
首先需要确保WSL2环境配置正确。建议使用Ubuntu 20.04 LTS作为发行版,这是目前ROS和Gazebo生态支持最完善的版本。在PowerShell中执行:
bash复制wsl --set-version Ubuntu-20.04 2
接着修改WSL配置文件%USERPROFILE%\.wslconfig,分配足够资源:
ini复制[wsl2]
memory=8GB
processors=4
swap=4GB
注意:Gazebo编译过程非常消耗内存,建议至少分配6GB内存,否则可能在编译gazebo_ros_pkgs时因OOM失败
为后续编译顺利,需要一次性安装所有基础依赖:
bash复制sudo apt update && sudo apt install -y \
build-essential \
cmake \
git \
libboost-all-dev \
libeigen3-dev \
libogre-1.9-dev \
libbullet-dev \
libsimbody-dev \
libdart6-dev \
libignition-math4-dev \
libsdformat6-dev \
libavcodec-dev \
libavformat-dev \
libswscale-dev
特别提醒:Ogre图形引擎的版本必须与Gazebo要求严格匹配。例如Gazebo9需要ogre-1.9,而Gazebo11则需要ogre-1.11。这里我们先安装1.9版本,其他版本后续通过源码编译。
以Gazebo9为例,我们需要从osrf官方仓库获取特定tag的代码:
bash复制mkdir -p ~/gazebo_ws/src && cd ~/gazebo_ws/src
git clone https://github.com/osrf/gazebo -b gazebo9
关键技巧:使用-b参数指定分支或tag,不同版本对应关系如下:
创建独立构建目录避免污染源码:
bash复制cd ~/gazebo_ws
mkdir build && cd build
配置CMake时需特别注意安装路径隔离:
bash复制cmake ../src/gazebo \
-DCMAKE_INSTALL_PREFIX=/opt/gazebo-9 \
-DENABLE_TESTS_COMPILATION=OFF \
-DCMAKE_BUILD_TYPE=Release
参数解析:
CMAKE_INSTALL_PREFIX:将版本号直接包含在路径中实现隔离ENABLE_TESTS_COMPILATION:关闭测试节省编译时间CMAKE_BUILD_TYPE:Release模式提升运行时性能利用WSL2的多核优势进行并行编译:
bash复制make -j$(nproc)
sudo make install
安装完成后需要配置环境变量:
bash复制echo 'export GAZEBO_ROOT=/opt/gazebo-9' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/opt/gazebo-9/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export PATH=/opt/gazebo-9/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
为每个版本创建独立的启动脚本是个优雅的方案。例如创建/opt/gazebo-9/bin/gazebo9:
bash复制#!/bin/bash
export GAZEBO_ROOT=/opt/gazebo-9
export LD_LIBRARY_PATH=/opt/gazebo-9/lib:$LD_LIBRARY_PATH
/opt/gazebo-9/bin/gazebo "$@"
然后通过update-alternatives建立版本管理:
bash复制sudo update-alternatives --install /usr/bin/gazebo gazebo /opt/gazebo-9/bin/gazebo9 100
如果需要与ROS联用,必须在对应workspace中指定Gazebo路径。修改catkin工程的CMakeLists.txt:
cmake复制set(GAZEBO_INCLUDE_DIRS "/opt/gazebo-9/include")
set(GAZEBO_LIBRARY_DIRS "/opt/gazebo-9/lib")
或者在启动ROS节点前设置环境变量:
bash复制export GAZEBO_RESOURCE_PATH=/opt/gazebo-9/share/gazebo-9
export GAZEBO_MODEL_PATH=/opt/gazebo-9/share/gazebo-9/models
WSL2中Gazebo的GUI需要X Server支持。推荐使用VcXsrv:
bash复制export DISPLAY=$(awk '/nameserver / {print $2}' /etc/resolv.conf):0
如果遇到Bullet或ODE引擎崩溃,可以尝试:
bash复制export GAZEBO_PHYSICS_ENGINE=libdart
WSL2的磁盘IO性能较差,建议:
bash复制mkdir -p ~/.gazebo/models
wget -P ~/.gazebo/models http://models.gazebosim.org/model.tar.gz
在WSL2配置中增加swap空间:
ini复制[wsl2]
swap=8GB
使用ccache缓存编译结果:
bash复制sudo apt install ccache
echo 'export PATH="/usr/lib/ccache:$PATH"' >> ~/.bashrc
在VcXsrv配置中:
实测在i7-11800H + RTX3060平台上,Gazebo9运行机械臂仿真场景可达60FPS,与原生Linux性能差距小于15%。