本文件按现象组织排查步骤,覆盖 Ubuntu 20.04 + ROS 2 Foxy、Ubuntu 22.04 + ROS 2 Humble、Ubuntu 24.04 + ROS 2 Jazzy 三套常见环境。验证环境使用 Ubuntu 24.04.4 + ROS 2 Jazzy,项目包路径为 /home/robot-a/Desktop/drone_training_github_release。
先检查 extension 路径是不是加错了。应该添加 Pegasus 的 extensions 目录,不是 pegasus.simulator 子目录。
常见路径:
/home/robot-a/Documents/PegasusSimulator/extensions再检查 Pegasus 是否安装到 Isaac Sim 使用的 Python 环境:
xxxxxxxxxxexport ISAACSIM_PYTHON=/home/robot-a/miniconda3/envs/env_isaacsim/bin/python$ISAACSIM_PYTHON -m pip show pegasus.simulator如果没有输出,重新安装:
xxxxxxxxxxcd /home/robot-a/Documents/PegasusSimulator/home/robot-a/miniconda3/envs/env_isaacsim/bin/python -m pip install -e extensions/pegasus.simulator安装 Pegasus 插件时应使用当前 Isaac Sim 环境里的 Python,不应使用系统 Python。
先看 Pegasus UI 里的 PX4 路径。路径要指向 PX4-Autopilot 根目录,例如:
xxxxxxxxxx/home/robot-a/PX4-Autopilot然后在终端检查 PX4 是否能单独编译:
xxxxxxxxxxcd /home/robot-a/PX4-Autopilotmake px4_sitl_default如果这里失败,应先处理 PX4 依赖或源码版本,再检查 Pegasus 配置。
按这个顺序查:
xxxxxxxxxx1. Isaac Sim timeline 是否正在播放2. Pegasus 是否选择了 PX4 backend3. PX4 SITL 进程是否启动4. QGC 是否已经打开5. MAVLink 端口是否被其他程序占用可以用下面命令看 PX4 进程:
xxxxxxxxxxps aux | grep px4 | grep -v grep如果 PX4 没启动,回到 Pegasus UI 检查 PX4 路径和 backend 配置。
QGC 的提示通常比终端更直接。常见原因:
不应跳过这些检查。应先确认官方 Iris 可以 arm,再替换为自定义无人机。
/fmu/* 话题先 source ROS 2 和 px4_msgs 工作空间。按系统选择对应版本。
Ubuntu 20.04 + Foxy:
xxxxxxxxxxsource /opt/ros/foxy/setup.bashsource /home/robot-a/ros2_ws/install/setup.bashUbuntu 22.04 + Humble:
xxxxxxxxxxsource /opt/ros/humble/setup.bashsource /home/robot-a/ros2_ws/install/setup.bashUbuntu 24.04 + Jazzy:
xxxxxxxxxxsource /opt/ros/jazzy/setup.bashsource /home/robot-a/ros2_ws/install/setup.bash再查话题:
xxxxxxxxxxros2 topic list --no-daemon | grep /fmu如果没有输出,检查 Micro XRCE-DDS Agent:
xxxxxxxxxxsource /home/robot-a/px4_agent_ws/install/setup.bashMicroXRCEAgent udp4 -p 8888如果 MicroXRCEAgent 仍不在 PATH,直接使用绝对路径:
xxxxxxxxxx/home/robot-a/px4_agent_ws/install/microxrcedds_agent/bin/MicroXRCEAgent udp4 -p 8888还要确认 PX4 侧 uXRCE-DDS Client 正在运行。没有 Agent,ROS 2 通常收不到 PX4 的 /fmu/out/* 数据,也发不进 /fmu/in/* 控制话题。
/fmu/*,但 /fmu/out/vehicle_local_position 没数据不同 PX4 / px4_msgs 版本的话题名可能不同。先查:
xxxxxxxxxxros2 topic list --no-daemon | grep vehicle_local_position可能出现:
xxxxxxxxxx/fmu/out/vehicle_local_position/fmu/out/vehicle_local_position_v1分别试:
xxxxxxxxxxros2 topic echo /fmu/out/vehicle_local_position --onceros2 topic echo /fmu/out/vehicle_local_position_v1 --once如果两个都没有数据,通常是 PX4 没有有效 local position,或者 XRCE-DDS 链路还没通。
run_control_menu.sh 报 Python 或 ROS 2 错误先退出 conda:
xxxxxxxxxxconda deactivate再运行:
xxxxxxxxxxcd /home/robot-a/Desktop/drone_training_github_release./run_control_menu.sh脚本默认使用 /usr/bin/python3。按系统选择对应 ROS 2 setup:
xxxxxxxxxx/opt/ros/foxy/setup.bash/opt/ros/humble/setup.bash/opt/ros/jazzy/setup.bash/home/robot-a/ros2_ws/install/setup.bashJazzy 对应系统 Python 3.12。应避免使用 conda Python 3.13 编译 Jazzy 的 px4_msgs。如果报 libpython3.13.so.1.0 或 UnsupportedTypeSupport,通常是 source 到了 Python 版本不匹配的工作空间。
如果 px4_msgs 不在 /home/robot-a/ros2_ws,可以手动指定:
xxxxxxxxxxexport PX4_ROS_WS=/path/to/ros2_ws./run_control_menu.shPX4 不是收到一次目标点就进入 Offboard。它要求外部控制器持续发布 setpoint。
检查三件事:
xxxxxxxxxxros2 topic hz /fmu/in/offboard_control_moderos2 topic hz /fmu/in/trajectory_setpointros2 topic echo /fmu/out/vehicle_status --once如果话题频率断断续续,或者先切模式再发 setpoint,PX4 可能拒绝 Offboard。正确顺序是:
xxxxxxxxxx1. 等待 local position 有效2. 先持续发布 OffboardControlMode 和 TrajectorySetpoint3. 再发送切 Offboard 命令4. 再发送 arm 命令move 1 0 0 后无人机不动move 不是起飞命令。它只是在当前目标点基础上修改目标位置。
先执行:
xxxxxxxxxxstatustakeoff 1.0statusmove 1 0 0如果无人机已经通过 QGC 起飞,先用:
xxxxxxxxxxoffboardmove 1 0 0还要确认 PX4 当前已经进入 OFFBOARD,并且 local position 有数据。
move 命令使用世界坐标 / ENU 相对位移:
xxxxxxxxxxmove x = 世界坐标 x 正方向move y = 世界坐标 y 正方向move z = 向上脚本内部会转换为 PX4 local / NED:
xxxxxxxxxxpx4_dx = world_dypx4_dy = world_dxpx4_dz = -world_dz所以在 move 命令里,上升是 z 增大。发送给 PX4 时会自动转成 NED 里的 z 减小。
例子:
xxxxxxxxxxtakeoff 1.0 # 目标 z = current_z - 1.0move 0 0 0.2 # 上升约 0.2mmove 0 0 -0.2 # 下降约 0.2m如果自定义代码直接发布 /fmu/in/trajectory_setpoint,仍然要使用 PX4 local / NED。把 ENU 的 z=+1 直接发给 PX4,飞机通常会往下走。
px4_msgs 版本不匹配典型现象:
/fmu/out/vehicle_status 变成 /fmu/out/vehicle_status_v3。/fmu/out/vehicle_local_position 变成 /fmu/out/vehicle_local_position_v1。验证环境已有 px4_msgs:
Ubuntu 20.04 + Foxy:
xxxxxxxxxxsource /opt/ros/foxy/setup.bashsource /home/robot-a/ros2_ws/install/setup.bashros2 interface show px4_msgs/msg/TrajectorySetpointUbuntu 22.04 + Humble:
xxxxxxxxxxsource /opt/ros/humble/setup.bashsource /home/robot-a/ros2_ws/install/setup.bashros2 interface show px4_msgs/msg/TrajectorySetpointUbuntu 24.04 + Jazzy:
xxxxxxxxxxsource /opt/ros/jazzy/setup.bashsource /home/robot-a/ros2_ws/install/setup.bashros2 interface show px4_msgs/msg/TrajectorySetpoint如需重新编译验证版:
xmkdir -p /home/robot-a/px4_install_demo/ros2_ws/srccd /home/robot-a/px4_install_demo/ros2_ws/srcgit clone https://github.com/PX4/px4_msgs.gitcd /home/robot-a/px4_install_demo/ros2_wssource /opt/ros/jazzy/setup.bash/usr/bin/python3 -m colcon build --symlink-install --packages-select px4_msgssource install/setup.bash如果更换 PX4 版本,px4_msgs 也要一起换到匹配版本。Foxy/Humble/Jazzy 的重新编译流程相同,只需要把 source /opt/ros/jazzy/setup.bash 替换为对应版本的 setup。
通用下载方式以 QGroundControl 官方下载页为准:
xxxxxxxxxxhttps://docs.qgroundcontrol.com/master/en/qgc-user-guide/getting_started/download_and_install.htmlUbuntu 20.04 / Ubuntu 22.04 上 AppImage 可能需要 libfuse2:
xxxxxxxxxxsudo apt updatesudo apt install -y libfuse2Ubuntu 24.04 上优先安装兼容包:
xxxxxxxxxxsudo apt updatesudo apt install -y libfuse2t64然后重新授权并启动下载好的 AppImage:
xxxxxxxxxxcd ~/Downloadschmod +x QGroundControl*.AppImage./QGroundControl*.AppImage如果仍然打不开,再检查 AppImage 是否有执行权限。
run_import_asset.sh 默认使用验证环境的 Isaac Sim 路径。如果需要手动指定:
xxxxxxxxxxexport ISAACSIM_BIN=/home/robot-a/miniconda3/envs/env_isaacsim/bin/isaacsimexport PEGASUS_EXTENSION=/home/robot-a/Documents/PegasusSimulator/extensions/pegasus.simulatorcd /home/robot-a/Desktop/drone_training_github_release./run_import_asset.shISAACSIM_BIN 应该指向 Isaac Sim 启动程序,不是 Python,也不是安装目录。
这通常不是 ROS 2 控制代码的问题。应先用官方 Iris 验证 Pegasus、PX4、QGC 链路。如果 Iris 能飞,但自定义无人机不能飞,重点检查 USD 和 Pegasus 绑定:
/World/quadrotor 是否存在。/World/quadrotor/body 是否是刚体。能显示只说明 USD 加载成功。能飞还需要 Pegasus 找到可控制的机体和旋翼结构。
出现问题时,不应直接修改代码。可按以下顺序排查:
xxxxxxxxxx1. Isaac Sim 能否启动2. Pegasus 插件是否启用3. 官方 Iris 能否通过 QGC 起飞4. 是否能看到 /fmu/out/* 话题5. 是否能读取 local position6. 控制菜单能否 status7. takeoff 1.0 是否进入 Offboard 并起飞8. move 是否改变目标点9. 再换自定义无人机资产前一步未通过时,不应跳到下一步。按顺序检查可以更快判断问题所在层级。