保姆级教程:在Ubuntu 20.04上从源码编译PX4固件,并用Gazebo跑通你的第一个仿真
从零构建PX4无人机仿真环境:Ubuntu 20.04实战指南
当第一次接触PX4无人机仿真时,很多开发者会被官网庞杂的文档和复杂的依赖关系吓退。本文将带你从纯净的Ubuntu 20.04系统开始,一步步完成PX4固件编译、Gazebo仿真环境搭建,最终实现无人机在仿真环境中的起飞控制。整个过程无需任何先验知识,每个步骤都经过实测验证,特别针对国内网络环境优化了下载配置。
1. 系统准备与依赖安装
在开始PX4编译之前,我们需要确保系统具备所有必要的工具链和依赖库。Ubuntu 20.04虽然已经包含了许多基础组件,但仍需补充一些专用于无人机开发的软件包。
首先更新系统软件源并升级现有软件:
sudo apt update && sudo apt upgrade -y接下来安装PX4开发的核心依赖组。这里我们使用PX4官方提供的便捷安装脚本,但针对国内网络环境做了优化:
sudo apt install git zip qtcreator cmake build-essential ninja-build -y sudo apt install python3-pip python3-dev python3-wheel -y特别需要注意的依赖项包括:
- Gazebo 11:PX4当前稳定版本兼容的仿真环境
- FastRTPS:用于ROS2与PX4的通信
- Eigen3:数学运算库
安装这些关键依赖的命令如下:
sudo apt install gazebo11 libgazebo11-dev -y sudo apt install ros-noetic-desktop-full -y # 包含ROS和Gazebo提示:如果之前安装过ROS或其他仿真工具,建议先清理可能存在的冲突包,使用
sudo apt autoremove进行清理。
验证Gazebo安装是否成功:
gazebo --version正常应输出Gazebo 11.x.x版本信息。如果遇到黑屏或无响应问题,可能是显卡驱动需要额外配置:
sudo apt install mesa-utils libgl1-mesa-dri libgl1-mesa-dev -y2. PX4固件源码获取与编译
完成系统准备后,我们就可以获取PX4固件源码并进行首次编译了。PX4项目使用Git进行版本控制,代码托管在GitHub上。
2.1 克隆PX4固件仓库
推荐使用国内镜像源加速克隆过程:
git clone https://gitee.com/mirrors/PX4-Firmware.git ~/PX4_Firmware cd ~/PX4_Firmware git submodule update --init --recursive如果子模块更新速度慢,可以尝试以下方法加速:
git config --global url."https://hub.fastgit.org".insteadOf https://github.com2.2 编译SITL仿真目标
PX4支持多种硬件目标,对于仿真我们使用px4_sitl_default配置:
make px4_sitl_default gazebo首次编译会下载大量工具链和依赖,可能需要较长时间。常见问题及解决方案:
- 下载失败:修改
Tools/setup/ubuntu.sh中的下载URL为国内镜像 - 内存不足:添加交换空间
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile - 权限问题:在命令前添加
sudo或正确配置用户组
成功编译后,终端会显示类似以下信息:
[px4] Startup script returned successfully此时Gazebo应该自动启动,显示带有无人机的空场景。
3. Gazebo仿真环境配置
PX4与Gazebo的集成已经相当成熟,但仍需一些配置才能获得最佳仿真体验。
3.1 世界环境选择
PX4支持多种Gazebo世界环境,默认使用空世界。要切换环境,可在启动时指定:
export PX4_SITL_WORLD=warehouse make px4_sitl_default gazebo可用世界包括:
| 世界名称 | 描述 | 适用场景 |
|---|---|---|
| empty | 空世界 | 基础测试 |
| baylands | 海湾地形 | 视觉导航 |
| warehouse | 室内仓库 | 避障测试 |
| windy | 大风环境 | 抗风测试 |
3.2 无人机模型选择
PX4支持多种无人机模型,默认使用四旋翼iris。切换模型方式:
export PX4_SITL_AIRCRAFT=standard_vtol make px4_sitl_default gazebo常用模型对比如下:
- iris:标准四旋翼,最常用
- standard_vtol:垂直起降固定翼
- tailsitter:尾座式无人机
- rover:地面车辆
4. MAVROS与Offboard控制实战
当仿真环境正常运行后,我们可以通过MAVROS实现更高级的Offboard控制。这种模式下,飞控执行来自外部计算机的指令。
4.1 MAVROS安装与连接
首先确保已安装ROS Noetic,然后安装MAVROS包:
sudo apt install ros-noetic-mavros ros-noetic-mavros-extras -y运行以下命令启动PX4仿真并连接MAVROS:
roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"验证连接状态:
rostopic echo /mavros/state应看到connected: True的输出。
4.2 Offboard控制示例
创建一个简单的ROS包来实现无人机起飞控制:
cd ~/catkin_ws/src catkin_create_pkg offboard_control roscpp mavros geometry_msgs在src目录下创建offboard_control.cpp文件,内容如下:
#include <ros/ros.h> #include <geometry_msgs/PoseStamped.h> #include <mavros_msgs/CommandBool.h> #include <mavros_msgs/SetMode.h> #include <mavros_msgs/State.h> mavros_msgs::State current_state; void state_cb(const mavros_msgs::State::ConstPtr& msg){ current_state = *msg; } int main(int argc, char **argv){ ros::init(argc, argv, "offboard_control"); ros::NodeHandle nh; ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State> ("mavros/state", 10, state_cb); ros::Publisher local_pos_pub = nh.advertise<geometry_msgs/PoseStamped> ("mavros/setpoint_position/local", 10); ros::ServiceClient arming_client = nh.serviceClient<mavros_msgs::CommandBool> ("mavros/cmd/arming"); ros::ServiceClient set_mode_client = nh.serviceClient<mavros_msgs::SetMode> ("mavros/set_mode"); ros::Rate rate(20.0); while(ros::ok() && !current_state.connected){ ros::spinOnce(); rate.sleep(); } geometry_msgs::PoseStamped pose; pose.pose.position.z = 2.0; for(int i = 100; ros::ok() && i > 0; --i){ local_pos_pub.publish(pose); ros::spinOnce(); rate.sleep(); } mavros_msgs::SetMode offb_set_mode; offb_set_mode.request.custom_mode = "OFFBOARD"; mavros_msgs::CommandBool arm_cmd; arm_cmd.request.value = true; ros::Time last_request = ros::Time::now(); while(ros::ok()){ if( current_state.mode != "OFFBOARD" && (ros::Time::now() - last_request > ros::Duration(5.0))){ if( set_mode_client.call(offb_set_mode) && offb_set_mode.response.mode_sent){ ROS_INFO("Offboard enabled"); } last_request = ros::Time::now(); } else { if( !current_state.armed && (ros::Time::now() - last_request > ros::Duration(5.0))){ if( arming_client.call(arm_cmd) && arm_cmd.response.success){ ROS_INFO("Vehicle armed"); } last_request = ros::Time::now(); } } local_pos_pub.publish(pose); ros::spinOnce(); rate.sleep(); } return 0; }编译并运行该节点:
cd ~/catkin_ws && catkin_make rosrun offboard_control offboard_control无人机应自动起飞到2米高度并保持悬停。
