1. 环境准备与依赖管理
在Ubuntu 20.04上通过源码编译Gazebo前,需要彻底清理系统残留的二进制文件。我遇到过不少开发者因为旧版本冲突导致编译失败的情况,建议先执行以下命令彻底清除:
sudo apt-get purge '.*gazebo.*' '.*sdformat.*' '.*ignition-.*' sudo rm -rf /usr/local/share/gazebo-*依赖项安装是源码编译的基础环节。实测发现,使用OSRF官方源比Ubuntu默认源更可靠。这里有个小技巧:先添加源再更新,能避免常见的404错误:
sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" > /etc/apt/sources.list.d/gazebo-stable.list' wget https://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - sudo apt update完整依赖列表可以通过自动化脚本获取。我习惯将依赖分为基础编译工具、图形库和物理引擎三部分安装:
# 基础编译工具链 sudo apt install build-essential cmake pkg-config git # 图形相关依赖 sudo apt install libogre-1.9-dev libfreeimage-dev libprotoc-dev protobuf-compiler # 物理引擎支持 sudo apt install libbullet-dev libsimbody-dev2. DART物理引擎深度配置
DART作为Gazebo的可选物理引擎,在仿真精度上有独特优势。但官方PPA源有时会出现版本冲突,我的经验是直接从源码编译更稳定。先卸载可能存在的旧版本:
sudo apt-get remove --purge libdart*编译DART需要特别注意Boost库版本。在Ubuntu 20.04上,建议使用以下参数配置:
git clone https://github.com/dartsim/dart.git cd dart && mkdir build && cd build cmake -DDART_ENABLE_SIMD=ON -DCMAKE_BUILD_TYPE=Release .. make -j$(nproc) sudo make install遇到过最头疼的问题是Eigen3版本冲突。解决方法是指定系统Eigen路径:
cmake -DEIGEN3_INCLUDE_DIR=/usr/include/eigen3 ...安装完成后建议验证DART是否被正确识别:
pkg-config --modversion dart3. OSRF核心组件编译指南
SDFormat和Ignition库是Gazebo的核心依赖。这里有个坑点:不同Gazebo版本需要匹配特定的SDFormat版本。对于Gazebo11,推荐使用SDFormat9:
sudo apt install libsdformat9-dev libsdformat9如果遇到Protobuf版本冲突,可以尝试从源码编译指定版本。我整理了个可靠的三步安装法:
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.12.4/protobuf-cpp-3.12.4.tar.gz tar xzf protobuf-cpp-3.12.4.tar.gz cd protobuf-3.12.4 && ./configure && make -j4 sudo make installIgnition-transport的编译需要特别注意Python绑定。建议在cmake时显式关闭Python支持以避免冲突:
cmake -DUSE_PYTHON=OFF ...4. Gazebo源码编译实战
获取源码推荐使用深度克隆方式,这样可以保留所有git子模块:
git clone --depth 1 --branch gazebo11 https://github.com/osrf/gazebo编译参数配置直接影响最终性能。这是我的常用优化配置:
mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="-march=native" \ -DENABLE_TESTS_COMPILATION=OFF \ ..遇到缺失依赖时,cmake会明确提示缺少的包名。例如出现"Could NOT find TinyXML"错误时:
sudo apt install libtinyxml2-dev编译过程可能持续30分钟以上,建议使用多线程加速:
make -j$(($(nproc)+1))安装后务必检查安装路径,通常位于/usr/local下。可以用这个命令验证:
ls /usr/local/lib | grep gazebo5. ROS1集成关键步骤
与ROS1集成需要特别注意环境变量污染问题。推荐的做法是在.bashrc中添加隔离配置:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc echo "export GAZEBO_RESOURCE_PATH=/usr/local/share/gazebo-11" >> ~/.bashrc验证集成是否成功的最佳方式是启动包含ROS插件的仿真:
roslaunch gazebo_ros empty_world.launch常见的一个错误是"Could not find rosgraph_msgs",解决方法:
sudo apt install ros-noetic-rosgraph-msgs对于需要修改源码的场景,比如调整GUI界面,建议采用增量编译:
cd ~/gazebo/build make -j4 && sudo make install6. 性能优化与调试技巧
启用硬件加速可以显著提升渲染性能。首先确认显卡驱动已安装:
glxinfo | grep "OpenGL renderer"在Gazebo启动配置中添加这些参数能提升实时性:
gazebo --verbose -o bullet内存不足时,可以调整交换分区大小。这是我常用的快速创建交换文件方法:
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile遇到奇怪的物理仿真异常时,可以尝试切换物理引擎:
<physics type="ode|bullet|dart|simbody">7. 自定义模型与插件开发
创建新模型时,建议采用标准SDF结构。典型目录布局如下:
my_robot/ ├── model.config ├── model.sdf └── meshes/ └── robot.stl编译自定义插件需要链接Gazebo库。示例CMakeLists.txt配置:
find_package(gazebo REQUIRED) include_directories(${GAZEBO_INCLUDE_DIRS}) add_library(my_plugin SHARED plugin.cpp) target_link_libraries(my_plugin ${GAZEBO_LIBRARIES})加载插件时最常见的错误是符号未定义,解决方法:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH8. 高级调试与问题排查
使用gdb调试Gazebo需要先启用调试符号。在启动时添加:
gdb --args gazebo --verbose日志级别控制可以帮助定位问题:
GAZEBO_LOG_LEVEL=DEBUG gazebo网络问题导致的模型加载失败,可以手动下载模型库:
git clone https://github.com/osrf/gazebo_models ~/.gazebo/models当出现奇怪的段错误时,可以检查系统日志:
dmesg | grep gazebo最后提醒一点:Gazebo源码编译会占用大量磁盘空间,建议保持至少15GB可用空间。编译过程中如果遇到内存不足,可以临时降低编译并行度:
make -j2