保姆级教程:在Ubuntu 20.04上从源码编译PX4固件,并用Gazebo跑通你的第一个仿真

保姆级教程:在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 11PX4当前稳定版本兼容的仿真环境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_WORLDwarehouse make px4_sitl_default gazebo可用世界包括世界名称描述适用场景empty空世界基础测试baylands海湾地形视觉导航warehouse室内仓库避障测试windy大风环境抗风测试3.2 无人机模型选择PX4支持多种无人机模型默认使用四旋翼iris。切换模型方式export PX4_SITL_AIRCRAFTstandard_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仿真并连接MAVROSroslaunch mavros px4.launch fcu_url:udp://:14540127.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.subscribemavros_msgs::State (mavros/state, 10, state_cb); ros::Publisher local_pos_pub nh.advertisegeometry_msgs/PoseStamped (mavros/setpoint_position/local, 10); ros::ServiceClient arming_client nh.serviceClientmavros_msgs::CommandBool (mavros/cmd/arming); ros::ServiceClient set_mode_client nh.serviceClientmavros_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米高度并保持悬停。