1. PX4 ROS2 开发环境搭建与验证

PX4 ROS2 开发环境搭建与验证 学习卡片

任务目标

在 Ubuntu 22.04 上完成三件事:安装 ROS2 Humble、安装 PX4 工具链并启动 SITL、配置 Micro XRCE-DDS 桥接,最后运行一个最小 ROS2 节点订阅 PX4 发布的 /fmu/out/vehicle_status 话题,确认通信链路打通。

环境与依赖

  • Ubuntu 22.04(ROS2 Humble 官方支持版本)
  • ROS2 Humble Desktop:ros-humble-desktop
  • PX4 源码(v1.14 及以上)与 px4_msgs、px4_ros_com
  • Micro XRCE-DDS Agent(MicroXRCEAgent)

安装步骤

# 1. ROS2 Humble
sudo apt update && sudo apt install -y ros-humble-desktop python3-colcon-common-extensions
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc

# 2. PX4 工具链 + 源码
git clone https://github.com/PX4/PX4-Autopilot.git --recursive ~/PX4-Autopilot
bash ~/PX4-Autopilot/Tools/setup/ubuntu.sh

# 3. Micro XRCE-DDS Agent
git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git ~/Micro-XRCE-DDS-Agent
cd ~/Micro-XRCE-DDS-Agent && mkdir build && cd build
cmake .. && make -j$(nproc) && sudo make install
sudo ldconfig /usr/local/lib/

# 4. px4_msgs 与 px4_ros_com
mkdir -p ~/ws_px4/src && cd ~/ws_px4/src
git clone https://github.com/PX4/px4_msgs.git
git clone https://github.com/PX4/px4_ros_com.git
cd ~/ws_px4 && source /opt/ros/humble/setup.bash && colcon build

启动顺序与数据链路

PX4 SITL (px4_sitl gz_x500) MicroXRCEAgent udp4 -p 8888 ROS2 节点 vehicle_status_listener 终端输出 armed / mode uORB DDS/XRCE topic

最小验证节点

在 ~/ws_px4/src/px4_ros_com/src/examples/offboard 同级新建 status_listener.cpp,订阅 PX4 的 vehicle_status 并打印解锁状态与飞行模式。

// status_listener.cpp
#include <rclcpp/rclcpp.hpp>
#include <px4_msgs/msg/vehicle_status.hpp>

using px4_msgs::msg::VehicleStatus;

class StatusListener : public rclcpp::Node {
public:
  StatusListener() : Node("status_listener") {
    auto qos = rclcpp::QoS(rclcpp::KeepLast(10)).best_effort().durability_volatile();
    sub_ = create_subscription<VehicleStatus>(
      "/fmu/out/vehicle_status", qos,
      [this](const VehicleStatus::SharedPtr msg) {
        RCLCPP_INFO(get_logger(), "armed=%d nav_state=%d",
                    msg->arming_state, msg->nav_state);
      });
  }
private:
  rclcpp::Subscription<VehicleStatus>::SharedPtr sub_;
};

int main(int argc, char** argv) {
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<StatusListener>());
  rclcpp::shutdown();
  return 0;
}

在 px4_ros_com/CMakeLists.txt 末尾追加:

add_executable(status_listener src/examples/offboard/status_listener.cpp)
ament_target_dependencies(status_listener rclcpp px4_msgs)
install(TARGETS status_listener DESTINATION lib/${PROJECT_NAME})

运行与验证

# 终端 A:启动 Agent
MicroXRCEAgent udp4 -p 8888

# 终端 B:启动 PX4 SITL
cd ~/PX4-Autopilot
make px4_sitl gz_x500

# 终端 C:编译并运行监听节点
cd ~/ws_px4
source /opt/ros/humble/setup.bash
colcon build --packages-select px4_ros_com
source install/setup.bash
ros2 run px4_ros_com status_listener

通过条件:终端 C 持续打印形如 armed=1 nav_state=2 的日志,且 ros2 topic list 能看到 /fmu/out/vehicle_status。若长时间无输出,检查 Agent 是否在 8888 端口监听、PX4 启动日志中是否出现 XRCE-DDS client connected。