本教程适用于在编译 PX4 SITL 时遇到 Protobuf 版本冲突、CMake 找不到正确的 Protobuf 头文件或库、MAVROS 运行错误 等问题。我们将彻底清理旧的 Protobuf 版本,重新安装 ROS Noetic 和 PX4,确保系统使用正确的 Protobuf 版本。
由于手动安装的 Protobuf 可能与系统版本冲突,我们需要完全清除所有 Protobuf 相关的库、头文件和编译缓存。
首先,使用 apt-get purge
命令移除所有 Protobuf 相关的软件包:
sudo apt-get purge libprotobuf* protobuf*
如果曾经手动编译安装过 Protobuf,它的头文件可能仍然残留在 /usr/local/include/
目录下。删除 Protobuf 相关的头文件:
sudo rm -rf /usr/local/include/google/protobuf/
⚠️ 注意:请确保没有其他软件依赖手动安装的 Protobuf,否则可能导致部分程序无法运行。
由于 ROS 依赖 Protobuf,我们需要重新安装完整的 ROS Noetic 桌面版,以确保所有库文件正确。
sudo apt-get install ros-noetic-desktop-full --reinstall
⚠️ 这个命令可能需要一定时间,因为 ROS Noetic 是一个较大的安装包。
安装完成后,执行以下命令加载 ROS 环境变量:
source /opt/ros/noetic/setup.bash
如果你使用 zsh
作为默认 Shell,则需要运行:
source /opt/ros/noetic/setup.zsh
由于之前的编译可能已经缓存了错误的 Protobuf 版本,我们需要彻底删除 PX4 的 build
目录和 Gazebo 编译缓存。
cd ~/PX4-Autopilot
rm -rf build
rm -rf Tools/sitl_gazebo/build
rm -rf Tools/sitl_gazebo/CMakeCache.txt
清理完成后,我们可以完整更新 PX4 代码仓库,然后重新编译 PX4 SITL。
cd ~/PX4-Autopilot
git submodule update --init --recursive
make clean
make px4_sitl gazebo
这将从头开始重新构建 PX4 和 Gazebo 插件,确保所有依赖库都是正确的。
如果编译成功,现在可以尝试运行 PX4 SITL 了。
roslaunch px4 mavros_posix_sitl.launch
如果 ROS 找不到 mavros
,可以执行以下命令安装:
sudo apt install ros-noetic-mavros ros-noetic-mavros-extras ros-noetic-geographic-msgs
然后,再次尝试运行:
roslaunch px4 mavros_posix_sitl.launch
如果仍然遇到 protobuf
相关的错误,可以执行以下命令检查 Protobuf 版本是否正确:
which protoc
protoc --version
ldconfig -p | grep protobuf
✅ 正确的输出应该是:
which protoc
→ /usr/bin/protoc
protoc --version
→ libprotoc 3.x
(如 3.6.1
)ldconfig -p | grep protobuf
→ 只显示 /lib/x86_64-linux-gnu/libprotobuf.so.17
,而不应该有 /usr/local/lib/
相关的 Protobuf 版本。如果 ldconfig -p | grep protobuf
仍然显示 /usr/local/lib/libprotobuf.so
,则需要运行:
sudo rm -rf /usr/local/lib/libprotobuf*
sudo ldconfig
然后再次编译 PX4:
cd ~/PX4-Autopilot
make clean
make px4_sitl gazebo
本教程提供了一套完整的步骤,帮助你彻底清除 Protobuf 冲突,并重新安装 PX4 SITL。如果你按照教程操作,PX4 和 Gazebo 应该可以正常运行。
最终流程总结:
apt-get purge
和 rm -rf
删除 Protobuf 头文件)。apt-get install ros-noetic-desktop-full --reinstall
)。build
目录)。git submodule update --init --recursive
)。make clean && make px4_sitl gazebo
)。roslaunch px4 mavros_posix_sitl.launch
)。如果你在某一步遇到问题,欢迎留言,我会继续帮你排查!