在Ubuntu 20.04上首次运行make px4_sitl gazebo-classic时,我最先遇到的拦路虎是CMake版本过低。系统预装的3.16版本无法满足PX4 v1.14的最低要求(需要≥3.19),但直接卸载旧版本可能引发"核爆"——所有依赖旧版CMake编译的软件都会崩溃。这里分享我的无损升级方案:
bash复制# 下载预编译的CMake 3.22(当前稳定版)
wget https://github.com/Kitware/CMake/releases/download/v3.22.0/cmake-3.22.0-linux-x86_64.tar.gz
tar -xzvf cmake-3.22.0-linux-x86_64.tar.gz -C /opt
关键技巧在于创建优先级更高的软链接,而不是粗暴替换系统默认路径:
bash复制sudo update-alternatives --install /usr/bin/cmake cmake /opt/cmake-3.22.0-linux-x86_64/bin/cmake 100 --force
验证时别只用cmake --version,还要检查动态库路径:
bash复制ldd $(which cmake) | grep not
我曾遇到GLIBC版本不兼容的情况,这时需要回退到CMake 3.20。如果看到libssl.so.1.1 not found错误,说明需要安装libssl1.1:
bash复制sudo apt install libssl1.1
接下来遇到的google/protobuf/port_def.inc报错看似是头文件缺失,实则可能是依赖地狱的入口。通过apt list --installed | grep protobuf查到的3.6.1版本虽然符合要求,但Gazebo可能偷偷加载了其他版本。
我用ldconfig -p | grep protobuf发现系统存在两个版本的动态库:
code复制libprotobuf.so.22 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libprotobuf.so.22
libprotobuf.so.17 (libc6,x86-64) => /usr/local/lib/libprotobuf.so.17
解决方案是清理冲突版本并重建软链接:
bash复制sudo rm /usr/local/lib/libprotobuf*
sudo ldconfig
对于从源码安装的protobuf,建议用checkinstall打包而非直接make install,这样后续可以干净卸载:
bash复制cd protobuf-3.6.1
./configure
make -j$(nproc)
sudo checkinstall
当反复编译失败时,我意识到master分支可能不适合Ubuntu 20.04。通过git tag -l查看所有标签后,发现v1.14.0是最后一个明确支持该系统的稳定版。切换版本时需要彻底清理:
bash复制git checkout v1.14.0
make submodulesclean # 比git submodule update更彻底
make distclean # 清除所有构建产物
这里有个隐藏坑点:.gitmodules文件可能在版本切换后被修改,需要手动恢复:
bash复制git checkout -- .gitmodules
git submodule sync
那个看似简单的libEGL.so not found报错,实际暴露了Qt库的依赖链问题。检查/usr/lib/x86_64-linux-gnu/发现存在libEGL.so.1但缺少符号链接。创建软链接时要注意版本匹配:
bash复制sudo ln -s /usr/lib/x86_64-linux-gnu/libEGL.so.1 /usr/lib/x86_64-linux-gnu/libEGL.so
同样需要处理其依赖伙伴:
bash复制sudo ln -s /usr/lib/x86_64-linux-gnu/libGL.so.1 /usr/lib/x86_64-linux-gnu/libGL.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 /usr/lib/x86_64-linux-gnu/libGLdispatch.so
如果仍然报错,可能需要安装mesa库:
bash复制sudo apt install libegl1-mesa-dev libgles2-mesa-dev
当遇到Failed to connect to github.com port 443时,我发现了PX4编译过程中最顽固的问题——子模块下载。通过修改Tools/setup/gazebo.cmake文件,将github.com替换为镜像源:
cmake复制# 在文件开头添加
set(GITHUB_MIRROR "https://ghproxy.com/https://github.com")
对于已经失败的下载,需要手动清理缓存:
bash复制rm -rf build/px4_sitl_default/src/modules/uxrce_dds_client
还可以通过git config全局设置超时和重试:
bash复制git config --global http.postBuffer 524288000
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999
最后那个令人绝望的6FPS问题,其实可以通过环境变量调优:
bash复制export SVGA_VGPU10=0 # 禁用VMware的虚拟GPU
export LIBGL_ALWAYS_SOFTWARE=1 # 强制使用软件渲染
vblank_mode=0 ./build/px4_sitl_default/bin/px4
在~/.gazebo/gui.ini中调整渲染设置:
ini复制[geometry]
width=1280
height=720
[render_engine]
type=ogre2
如果使用虚拟机,务必在VirtualBox中启用3D加速,并分配至少128MB显存。物理机用户建议安装专有驱动:
bash复制sudo ubuntu-drivers autoinstall