模块三:PX4 Offboard 与 ROS 2 代码控制

学习目标:

前置条件:

01 PX4 local / NED 坐标系

坐标系是无人机控制中常见的错误来源。飞机方向相反、高度不对,通常与坐标映射错误或 frame 不匹配有关。

常见坐标系:

坐标系是否固定含义
world / map固定场景或规划使用的世界坐标
PX4 local固定PX4 本地位置控制使用的局部坐标,通常以 home/local origin 为原点
body随无人机移动无人机机身坐标,随姿态变化
sensor frame随传感器移动例如相机或其它传感器自己的坐标系

PX4 local 通常按 NED 理解:

控制时记住三点:

02 ENU / NED 与 FLU / FRD 转换

ENU:

NED:

ENU 和 NED 都是右手系,只是轴定义不同。不能把 NED 简单理解成左手系。

PX4 常用机体系是 FRD:

ROS 常见机体系是 FLU:

PX4 body 和 ROS body 的 y、z 方向不同。写桥接代码时别混用。

03 PX4 输入输出话题说明

ROS 2 控制 PX4 最常用的输入话题:

话题作用注意
/fmu/in/offboard_control_mode告诉 PX4 外部控制器控制位置/速度/姿态等必须持续发布
/fmu/in/trajectory_setpoint发送 PX4 local 下的位置/速度/加速度/yaw setpoint坐标必须是 PX4 local/NED
/fmu/in/vehicle_commandarm、disarm、切模式、land 等命令通常需要重复或按时序发送

常用输出话题:

话题作用
/fmu/out/vehicle_local_positionPX4 local 位置估计
/fmu/out/vehicle_local_position_v1部分 PX4 / px4_msgs 版本里的 local position 话题
/fmu/out/vehicle_status飞行模式、解锁状态
/fmu/out/vehicle_status_v3部分 PX4 / px4_msgs 版本里的 vehicle status 话题

04 Offboard 控制最小流程

ROS 2 控制 PX4 的基本流程如下:

PX4 Offboard 控制链路

05 控制菜单使用

配套代码包默认放在桌面:

里面主要有这些文件:

文件作用
run_import_asset.sh用 Isaac Sim 执行导入脚本,加载比赛无人机资产,并启动 Pegasus PX4 backend
isaac/import_sunray150_with_px4.pyIsaac Sim --exec 脚本,调用 Pegasus Multirotor 加载无人机
run_control_menu.sh启动 ROS 2/PX4 命令行控制菜单
control/px4_offboard_menu.py发布 /fmu/in/* Offboard 控制话题,订阅 /fmu/out/* 状态话题

使用前先确认 PX4 话题可见:

/fmu/out/vehicle_local_position/fmu/out/vehicle_local_position_v1 只要有一个有数据,就说明 ROS 2 已经能读到 PX4 local position。

第一步,启动 Isaac Sim 并导入无人机:

如果只是检查 USD 资产能不能加载,不想启动 PX4,可以用:

常用参数:

第二步,打开新终端启动控制菜单:

进入菜单后,按下面顺序测试:

想快速验证控制链路,可以输入:

demo 会自动执行:起飞 1m,等待进入 Offboard,然后把 PX4 local x 目标增加 1m。

菜单命令说明:

命令作用
status显示 PX4 local position、当前目标点、解锁状态和飞行模式
takeoff 1.0以当前位置为基准,上升约 1m,并切入 Offboard、发送 arm
offboard如果无人机已经通过 QGC 起飞,先保持当前位置并切入 Offboard
move 1 0 0在当前目标点基础上,PX4 local x 增加 1m
goto 0 0 -1.2直接设置 PX4 local/NED 目标点
hover把当前位置设为目标点并保持
land发送 PX4 land 命令

注意:move 不是起飞命令。它只在 PX4 已经处于 OFFBOARD 模式后改变目标点。如果 PX4 仍在 AUTO_LOITERPOSCTLMANUAL 等模式,脚本会提示先运行 takeoffoffboard

控制菜单使用 PX4 local/NED 坐标:

所以上升是 z 变小。比如:

如果脚本启动时报 Python 版本问题,通常是因为在 conda (base) 环境中运行了 ROS 2。run_control_menu.sh 默认使用 /usr/bin/python3,不应改成 conda 的 python3

06 Python 控制代码讲解

下面只保留核心结构。实际代码还要处理 QoS、时间戳、状态检查和错误分支。

07 自动起飞、移动、悬停、降落

如果目标已经在 PX4 local/NED 坐标里:

不能把“前进”直接等同于 PX4 local x 增大。前进通常指 body forward,它和世界系/PX4 local 的关系取决于当前 yaw。

控制菜单示例:

08 Offboard 常见问题排查

Offboard 不起飞一般先查这些:

飞行方向反了,优先检查:

ROS 2 控制检查清单: