1. 环境准备与工具链搭建
1.1 操作系统与基础依赖
推荐使用Ubuntu 18.04 LTS作为开发环境,这是目前PX4和ROS Melodic最稳定的支持版本。实测在Ubuntu 20.04上会遇到Gazebo版本兼容性问题,而Ubuntu 22.04则需要手动降级多个关键组件。安装完成后首先执行:
sudo apt update && sudo apt upgrade -y sudo apt install -y git cmake python3-pip python3-dev特别提醒:如果系统已安装Anaconda,建议在.bashrc中注释conda初始化代码,避免后续Python环境冲突。我就曾因为conda环境导致PX4编译时找不到empy模块,折腾了整整一天。
1.2 ROS Melodic完整安装
ROS作为无人机仿真的"神经系统",需要完整安装桌面版:
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 update sudo apt install ros-melodic-desktop-full安装完成后务必执行环境变量配置:
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc验证安装是否成功:打开新终端输入roscore,应该能看到ROS master启动日志。我习惯用rosdep update提前更新依赖数据库,避免后续编译时卡在依赖解析环节。
2. PX4固件与仿真环境配置
2.1 PX4源码编译
推荐使用阿木实验室的Prometheus_PX4分支,这个版本针对国内开发者做了优化:
git clone https://gitee.com/amovlab/prometheus_px4.git cd prometheus_px4 git submodule update --init --recursive编译前有个关键步骤:安装Python依赖时务必使用--user参数避免污染系统环境:
sudo -H python3 -m pip install --user toml empy jinja2 packaging首次编译建议使用jMAVSim轻量级模拟器验证基础功能:
make px4_sitl jmavsim如果看到终端显示无人机模型和地面站连接提示,说明基础环境已就绪。我在第一次编译时遇到bloaty组件下载失败,手动解决方案如下:
git clone --recursive https://github.com/google/bloaty.git /tmp/bloaty cd /tmp/bloaty && cmake -GNinja . && ninja bloaty sudo cp bloaty /usr/local/bin/2.2 Gazebo仿真环境集成
Gazebo是物理仿真核心,需要单独安装ROS插件:
sudo apt install ros-melodic-gazebo-ros-pkgs ros-melodic-gazebo-ros-controlPX4与Gazebo的版本匹配是关键。实测Gazebo 9与PX4 v1.11兼容性最好。如果遇到模型加载失败,检查~/.gazebo/models目录是否存在,缺失时可手动复制:
cp -r prometheus_px4/Tools/sitl_gazebo/models ~/.gazebo/编译Gazebo仿真目标时推荐使用多线程加速:
make px4_sitl gazebo_p450 -j$(nproc)常见报错处理:当出现[Err] [REST.cc:205] Error in REST request时,这是Gazebo尝试在线下载模型导致的,解决方案:
mkdir -p ~/.gazebo/models wget -P ~/.gazebo/models/ http://models.gazebosim.org/model.tar.gz3. ROS与PX4通信桥梁
3.1 MAVROS安装与配置
MAVROS是ROS与PX4通信的核心节点:
sudo apt 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.sh验证MAVROS连接:
roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"在另一个终端使用rostopic echo /mavros/state查看连接状态,connected应为True。如果遇到权限问题,记得将用户加入dialout组:
sudo usermod -a -G dialout $USER3.2 自定义消息与节点开发
Prometheus项目提供了丰富的消息类型,建议将其工作空间与PX4环境集成:
git clone https://gitee.com/amovlab/Prometheus.git cd Prometheus ./compile_all.sh编译完成后在.bashrc中添加:
echo "source $(pwd)/devel/setup.bash" >> ~/.bashrc创建一个简单的控制节点示例demo_control.cpp:
#include <ros/ros.h> #include <mavros_msgs/PositionTarget.h> int main(int argc, char **argv) { ros::init(argc, argv, "demo_control"); ros::NodeHandle nh; ros::Publisher pos_pub = nh.advertise<mavros_msgs::PositionTarget>( "/mavros/setpoint_raw/local", 10); mavros_msgs::PositionTarget pos; pos.position.x = 5; pos.position.y = 5; pos.position.z = 5; pos.coordinate_frame = mavros_msgs::PositionTarget::FRAME_LOCAL_NED; ros::Rate rate(20); while(ros::ok()) { pos_pub.publish(pos); rate.sleep(); } return 0; }在CMakeLists.txt中添加:
add_executable(demo_control src/demo_control.cpp) target_link_libraries(demo_control ${catkin_LIBRARIES})4. 多模拟器协同调试技巧
4.1 Gazebo与RViz联合可视化
安装RViz可视化工具:
sudo apt install ros-melodic-rviz ros-melodic-rviz-imu-plugin创建启动文件prometheus_gazebo.launch:
<launch> <!-- PX4 SITL --> <include file="$(find prometheus_gazebo)/launch/sitl.launch"> <arg name="world" value="$(find prometheus_gazebo)/worlds/empty.world"/> </include> <!-- MAVROS --> <include file="$(find mavros)/launch/px4.launch"> <arg name="fcu_url" value="udp://:14540@127.0.0.1:14557"/> </include> <!-- RViz --> <node pkg="rviz" type="rviz" name="rviz" args="-d $(find prometheus_gazebo)/config/rviz_config.rviz"/> </launch>4.2 传感器数据融合实战
以激光雷达SLAM为例,需要安装RTAB-Map:
sudo apt install ros-melodic-rtabmap-ros修改PX4启动配置加载激光传感器:
export PX4_SIM_MODEL=p450_lidar make px4_sitl gazebo_p450在ROS端启动SLAM节点:
roslaunch rtabmap_ros rtabmap.launch \ rgb_topic:=/camera/rgb/image_raw \ depth_topic:=/camera/depth/image \ camera_info_topic:=/camera/rgb/camera_info \ frame_id:=base_link4.3 硬件在环测试
连接真实飞控进行HITL测试:
- 使用USB连接Pixhawk飞控
- 启动QGroundControl地面站
- 在终端运行:
make px4_sitl none -j8在QGC中配置"HITL Config"参数:
SYS_HITL= 1HIL_ACT_FUNC= 1 (PWM输出)
实测中我发现USB延迟会影响控制效果,改用数传电台后稳定性显著提升。如果遇到舵机无响应,检查PWM_OUT参数是否与硬件匹配。