保姆级教程:用ROS Melodic + PX4 v1.13在Ubuntu 20.04上实现无人机定点悬停(附完整代码)

张开发
2026/4/16 18:17:45 15 分钟阅读

分享文章

保姆级教程:用ROS Melodic + PX4 v1.13在Ubuntu 20.04上实现无人机定点悬停(附完整代码)
从零构建无人机悬停控制系统ROS Melodic与PX4 v1.13实战指南在无人机自主飞行领域定点悬停是最基础也最关键的技能之一。想象一下当你需要无人机稳定停留在空中某个位置进行航拍、监测或物资投递时精准的位置控制能力就显得尤为重要。本文将带你从零开始在Ubuntu 20.04系统上搭建完整的ROS Melodic和PX4 v1.13开发环境最终实现Gazebo仿真中的2米高度精准悬停。不同于简单的代码复制粘贴我们会深入解析每个步骤背后的原理让你真正掌握无人机offboard模式的控制精髓。1. 环境准备与基础配置1.1 系统要求与依赖安装在开始之前请确保你的计算机满足以下最低配置要求操作系统Ubuntu 20.04 LTS推荐纯净安装内存至少8GBGazebo仿真需要较多资源存储空间至少50GB可用空间PX4固件和ROS占用较大首先安装必要的依赖项打开终端执行以下命令sudo apt-get update sudo apt-get install -y python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential1.2 ROS Melodic安装与配置虽然Ubuntu 20.04官方支持ROS Noetic但为了与PX4 v1.13保持最佳兼容性我们选择ROS Melodic。通过以下步骤安装sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt-get update sudo apt-get install ros-melodic-desktop-full安装完成后初始化rosdep并设置环境变量sudo rosdep init rosdep update echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc提示如果在Ubuntu 20.04上安装ROS Melodic遇到依赖问题可以尝试手动修复缺失的依赖项特别是python-*相关的包。2. PX4开发环境搭建2.1 安装PX4工具链PX4自动驾驶仪软件需要特定的工具链支持。执行以下命令安装必要组件sudo apt-get install -y git zip qtcreator cmake \ ninja-build exiftool python-argparse python-empy python-toml python-numpy \ python-dev python-pip python-wheel python-setuptools接下来克隆PX4固件仓库并初始化子模块git clone https://github.com/PX4/Firmware.git --recursive cd Firmware git checkout v1.13.0 make px4_sitl_default gazebo2.2 Gazebo仿真环境配置PX4与Gazebo的集成需要额外的模型和插件支持。安装Gazebo 9与ROS Melodic兼容的版本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-get update sudo apt-get install gazebo9 libgazebo9-dev配置Gazebo模型路径echo export GAZEBO_MODEL_PATH${GAZEBO_MODEL_PATH}:~/Firmware/Tools/sitl_gazebo/models ~/.bashrc echo export GAZEBO_PLUGIN_PATH${GAZEBO_PLUGIN_PATH}:~/Firmware/build/px4_sitl_default/build_gazebo ~/.bashrc source ~/.bashrc3. MAVROS安装与通信配置3.1 安装MAVROS包MAVROS是ROS与PX4飞控通信的桥梁通过以下命令安装sudo apt-get install ros-melodic-mavros ros-melodic-mavros-extras wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh sudo bash ./install_geographiclib_datasets.sh3.2 测试PX4与ROS通信首先启动PX4仿真cd ~/Firmware make px4_sitl_default gazebo在新的终端中启动MAVROS节点roslaunch mavros px4.launch fcu_url:udp://:14540127.0.0.1:14557验证通信是否正常rostopic echo /mavros/state你应该能看到类似以下的输出表示连接成功header: seq: 1234 stamp: secs: 1620000000 nsecs: 0 frame_id: connected: True armed: False guided: False manual_input: True mode: STABILIZED system_status: 34. Offboard控制节点开发与悬停实现4.1 创建ROS工作空间与功能包首先创建一个新的ROS工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make source devel/setup.bash然后创建offboard控制功能包cd ~/catkin_ws/src catkin_create_pkg offboard_node roscpp rospy std_msgs geometry_msgs mavros_msgs4.2 编写Offboard控制节点在~/catkin_ws/src/offboard_node/src目录下创建offboard_node.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, offb_node); 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); // 设置发布频率为20Hz ros::Rate rate(20.0); // 等待连接建立 while(ros::ok() !current_state.connected){ ros::spinOnce(); rate.sleep(); } // 初始化目标位置2米高度 geometry_msgs::PoseStamped pose; pose.pose.position.x 0; pose.pose.position.y 0; pose.pose.position.z 2; // 发送初始位置信息100次 for(int i 100; ros::ok() i 0; --i){ local_pos_pub.publish(pose); ros::spinOnce(); rate.sleep(); } // 设置Offboard模式请求 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()){ // 尝试切换到Offboard模式 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; }4.3 编译与运行控制节点修改CMakeLists.txt文件添加以下内容add_executable(offboard_node src/offboard_node.cpp) target_link_libraries(offboard_node ${catkin_LIBRARIES})然后编译工作空间cd ~/catkin_ws catkin_make运行节点的完整流程启动PX4仿真终端1cd ~/Firmware make px4_sitl_default gazebo启动MAVROS终端2roslaunch mavros px4.launch fcu_url:udp://:14540127.0.0.1:14557运行offboard节点终端3rosrun offboard_node offboard_node5. 关键参数调优与常见问题解决5.1 重要参数解析在offboard控制中以下几个参数对系统性能有重要影响参数推荐值作用说明发布频率20Hz控制指令更新频率影响响应速度重试间隔5秒模式切换和解锁请求的重试间隔初始位置发送次数100次确保飞控收到足够的位置信息目标高度2米悬停高度可根据需求调整5.2 常见错误与解决方案PX4无法连接到Gazebo检查Gazebo模型路径是否正确设置确保没有其他Gazebo实例在运行尝试重新编译PX4固件MAVROS连接超时确认PX4仿真已成功启动检查fcu_url参数是否正确确保防火墙没有阻止UDP通信无法切换到Offboard模式确保已发送足够数量的位置信息至少10-15条检查遥控器是否在手动模式仿真中可忽略确认没有其他安全限制阻止模式切换无人机悬停不稳定调整PID参数位于PX4参数列表中确保Gazebo物理引擎运行正常检查控制指令的发布频率是否稳定5.3 性能优化技巧提高仿真流畅度在Gazebo启动时添加-l参数使用轻量级渲染make px4_sitl_default gazebo_iris_opt_flow记录ROS话题数据使用rosbag记录飞行数据用于分析rosbag record -O flight_data.bag /mavros/local_position/pose可视化工具使用RViz监控无人机状态rosrun rviz rviz添加/mavros/local_position/pose话题显示在实际项目中我发现最关键的环节是确保PX4与ROS之间的通信稳定。曾经因为网络配置问题浪费了大量时间排查后来通过编写简单的连接状态监控节点大大提高了调试效率。另一个经验是在正式飞行前务必在Gazebo中进行充分测试特别是针对各种边界条件和异常情况的处理。

更多文章