PX4 在 ModalAI VOXL 2 上的异构部署:双核构建、安装与调试完全指南
嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载ModalAI VOXL 2 是一块搭载 Qualcomm QRB5165 处理器的飞行计算平台既可以作为飞行控制板的伴机companion computer使用也可以直接承载 PX4 自动飞行栈。本文基于 PX4-Autopilot 仓库中的 boards/modalai/voxl2/README.md 及其板级源码完整梳理 PX4 在 VOXL 2 上一板双核的异构架构、双工具链构建环境、ADB 安装部署、运行验证与 DSP 侧调试方法帮助读者从零掌握 VOXL 2 原生运行 PX4 的完整链路。平台概述QRB5165 上的双处理器架构VOXL 2 使用的 QRB5165 SoC 是一个异构计算平台PX4 直接运行其上时并非单一二进制而是被切分为两部分Sensor Low Power IslandSLPIDSP即 sdspHexagon 架构承载 PX4 中飞行安全关键的部分包括 IMU、气压计、磁力计、GPS、ESC 与电源管理驱动以及状态估计EKF2模块。DSP 充当整个系统的实时部分保证传感器采样与控制回路的确定性时序。Application Processorapps procARM64 / aarch64运行非飞行关键应用如 Mavlink 通信、日志记录logger、参数管理等。它运行在 LinuxPOSIX环境之上。两个处理器之间通过 Qualcomm 专有的共享内存接口通信PX4 侧对应的实现即muorbMicro-ORB over shared memory机制——应用处理器与 DSP 各自维护一份 uORB 消息总线的镜像通过共享内存同步主题数据。值得强调的是这两个处理器上运行的是从同一个板级目录构建出的两套独立固件对应两个独立的构建配置default.px4board —— POSIX 应用处理器ARM64配置slpi.px4board —— QURT DSPHexagon配置。板级配置解读两个 px4board 的分工从 default.px4board 可以看到应用处理器侧的核心配置CONFIG_PLATFORM_POSIXy CONFIG_BOARD_LINUX_TARGETy CONFIG_BOARD_TOOLCHAINaarch64-linux-gnu CONFIG_BOARD_ROOT_PATH/data/px4 CONFIG_MODULES_MAVLINKy CONFIG_MODULES_LOGGERy CONFIG_MODULES_MUORB_APPSy CONFIG_MODULES_UXRCE_DDS_CLIENTy CONFIG_PARAM_PRIMARYy关键点CONFIG_BOARD_ROOT_PATH/data/px4说明应用处理器上 PX4 的工作根目录被固定在/data/px4与 install-voxl.sh 中创建/data/px4/param、/data/px4/etc/extras目录的行为一致CONFIG_MODULES_MUORB_APPSy使能共享内存 uORB 的应用侧CONFIG_PARAM_PRIMARYy表明参数存储主实例位于应用处理器侧DSP 侧则通过CONFIG_PARAM_REMOTEy见 slpi.px4board以远程方式访问。而 slpi.px4board 则展示了 DSP 侧的取舍CONFIG_PLATFORM_QURTy CONFIG_BOARD_TOOLCHAINqurt # Disable modules from default.px4board that are apps-only CONFIG_BOARD_LINUX_TARGETn CONFIG_MODULES_MAVLINKn CONFIG_MODULES_LOGGERn CONFIG_MODULES_MUORB_APPSn CONFIG_MODULES_EKF2y CONFIG_MODULES_MUORB_SLPIy CONFIG_PARAM_REMOTEy可以看到 DSP 侧显式关闭了 Mavlink、Logger、OSD 等应用处理器专属模块同时开启了完整的传感器驱动链BMI270、ICM42688P、DPS310、ICP101XX、MS5611、BMP280/BMP388、IST8308/IST8310、QMC5883L、IIS2MDC、VL53L0X/VL53L1X、MS4525DO、INAv 功率监控等以及 EKF2、导航、多旋翼/固定翼控制等飞行核心模块。这种应用处理器负责通信与外设、DSP 负责飞控的分工正是整个板级设计的主线。构建环境双工具链与 ModalAI Docker 镜像要构建这一平台环境中必须同时具备两套交叉编译工具链Qualcomm HexagonDSP工具链用于编译运行在 SLPI DSP 上的 QURT 固件libpx4.soLinaro ARM64 工具链用于编译应用处理器上的 POSIX 二进制px4。其中 ARM64 工具链以及近乎完整的构建环境由 ModalAI 提供的基础 Docker 镜像rb5-flight-px4-build-docker打包但由于 ModalAI 不被允许再分发 Qualcomm Hexagon DSP SDKHexagon SDK 必须由最终用户自行安装并注入该镜像。镜像的完整搭建说明由 ModalAI 在 rb5-flight 构建 Docker 工程中提供对应工程名为rb5-flight-px4-build-docker含rb5-flight-px4-build-docker工程README 原链接指向 gitlab.com 的 voxl-public/rb5-flight/rb5-flight-px4-build-docker。进入构建容器的方式封装在仓库脚本 boards/modalai/voxl2/scripts/run-docker.sh 中docker run -it --rm -v pwd:/usr/local/workspace rb5-flight-px4-build-docker该命令将 PX4 仓库根目录挂载到容器内/usr/local/workspace并进入交互式 shell——后续所有构建操作都在容器内完成宿主只需具备 Docker 与仓库代码。构建流程一次 make 产出双固件在 PX4 仓库顶层执行一条命令即可同时构建 DSP 与应用处理器两套固件make modalai_voxl2Makefile 会把 SLPIDSP构建作为 defaultapps构建的前置依赖串联起来因此最终产物同时包含两侧固件。完整的容器内操作序列如下px4$ boards/modalai/voxl2/scripts/run-docker.sh root9373fa1401b8:/usr/local/workspace# boards/modalai/voxl2/scripts/clean.sh root9373fa1401b8:/usr/local/workspace# boards/modalai/voxl2/scripts/build-apps.sh root9373fa1401b8:/usr/local/workspace# exit其中 clean.sh 会直接删除整个build目录以获得干净构建build-apps.sh即封装了上述make modalai_voxl2的完整构建。如果只需要单独重编 DSP 固件例如只修改了 DSP 侧驱动可以只执行make modalai_voxl2_slpi构建产物与 install-voxl.sh 中引用的路径对应分别为产物路径说明DSP 固件build/modalai_voxl2_slpi/platforms/qurt/libpx4.so加载到 SLPI 的共享库应用处理器二进制build/modalai_voxl2_default/bin/px4Linux 侧 PX4 主程序启动辅助脚本build/modalai_voxl2_default/bin/px4-alias.sh模块别名脚本组件元数据build/modalai_voxl2_default/{actuators,component_general,parameters}.json.xz、build/modalai_voxl2_default/events/all_events.json.xz供地面站解析的压缩 JSON板级源码结构该板目录下还维护了一批 VOXL 2 专属源码从 boards/modalai/voxl2/src 可以清晰看到双核的实现痕迹QURTDSP侧驱动dsp_hitl硬件在环、dsp_sbus、spektrum_rc、ghst_rc、mavlink_rc_in、rc_controller、elrs_ledapps 侧驱动apps_sbus桥接模块连接两侧 uORB 总线sensor_imu_raw_bridge、sensor_baro_bridge、vehicle_air_data_bridge、vehicle_local_position_bridge、sih_vio_bridge参数固化模块voxl_save_cal_paramsModalAI 私有库src/lib/mpa内含 libmodal-json、libmodal-pipe。这些桥接模块是理解 VOXL 2 双核通信的关键——例如sensor_imu_raw_bridge将 DSP 侧通过 muorb 发布的原始 IMU 主题转发到应用侧供 VIO视觉惯性里程计等非实时应用消费。SLPI 动态导入检查机制DSP 侧固件libpx4.so是一个运行在 QURT 上的动态加载共享库允许保留部分未定义的动态符号由目标运行时的系统镜像在加载时提供。为保证链接结果的正确性构建流程在链接后会执行一次符号检查每个强动态导入strong dynamic import都会被逐一与ModalAI SSC 系统镜像及链接进libpx4.so的 C 运行时共享对象导出的符号做比对SSC 系统镜像导出的符号记录在 slpi_system_image_exports.txt 中。该文件必须从最终的 SSC ELF 重新生成——当受支持的 ModalAI 系统镜像版本变化时需要重新导出符号表并更新此文件凡是以px4_开头的导入一律被拒绝PX4 自有的 API 必须在libpx4.so内部完成解析如果链接后仍残留未定义的px4_符号说明 QURT 平台实现存在缺失比如某个 DSP 侧驱动没有实现对应接口。从 slpi_system_image_exports.txt 的头部注释可以看到其生成来源# Generated from SSC_SLPI_USER_8250.slpi.prodQ.elf built at modalai-slpi # commit 6f9636271d0f09c359aa1c4abbc0767b38c4439e.该导出表涵盖HAP_*Hexagon Application Processor 运行时 API、DAL_*Device Access Layer、SNS_CLIENT_SVC_*Sensors 客户端服务以及大量 libc/libm/C 运行时符号malloc、_Znwj、_ZTVN10__cxxabiv1*等是 DSP 侧与 ModalAI SSC 系统镜像之间 ABI 契约的具体化。安装到 VOXL 2基于 ADB 的一键部署两套固件构建完成后通过 ADBAndroid Debug Bridge即可安装到 VOXL 2 板卡。仓库提供了完整安装脚本 boards/modalai/voxl2/scripts/install-voxl.shpx4$ boards/modalai/voxl2/scripts/install-voxl.sh脚本的核心动作包括推送 DSP 固件adb push build/modalai_voxl2_slpi/platforms/qurt/libpx4.so /usr/lib/rfsa/adsp——libpx4.so被装载到 DSP 的 FastRPC 文件系统目录由系统侧负责加载推送应用处理器固件adb push build/modalai_voxl2_default/bin/px4 /usr/bin推送辅助脚本px4-alias.sh以及voxl-px4、voxl-px4-start、voxl-px4-hitl、voxl-px4-hitl-start、voxl-px4-sih-start等启动脚本并逐个chmod ax创建模块符号链接在/usr/bin下通过ln -f -s px4 px4-module为几乎每一个 PX4 模块建立别名px4-commander、px4-mavlink、px4-ekf2、px4-muorb、px4-param、px4-qshell、px4-reboot等上百个这样既兼容模块化启动方式也让px4单二进制可以按 argv[0] 分发到不同模块入口初始化数据目录创建/data/px4/param与/data/px4/etc/extras推送元数据将actuators.json.xz、component_general.json.xz、parameters.json.xz、all_events.json.xz推送到/data/px4/etc/extras供 QGroundControl 等地面站解析参数、执行器与事件定义。如果只是日常迭代 DSP 或主二进制可以使用精简版脚本 install-voxl-bins.sh——它只推送libpx4.so与px4两个核心文件后执行sync。此外仓库还提供了 systemd 服务定义 debian/voxl-px4.service可将 PX4 注册为开机自启服务[Unit] DescriptionPX4 Autopilot for VOXL2 Aftersscrpcd.service Requiressscrpcd.service [Service] ExecStartPre/bin/sleep 2 ExecStart/usr/bin/voxl-px4 ExecStopPost/usr/bin/voxl-reset-slpi -t 10000 Restarton-failure [Install] WantedBymulti-user.target其中Requiressscrpcd.service确保 SLPI 侧服务sscrpcd先于 PX4 启动ExecStopPost通过voxl-reset-slpi在停止时复位 DSPRestarton-failure使 PX4 崩溃后自动重启。运行 PX4从 ADB shell 到 pxh 提示符安装完成后通过 ADB 打开 VOXL 2 上的终端使用启动脚本运行 PX4rootm0054:/# voxl-px4启动时的典型输出如下Found DSP signature file / INFO [px4] mlockall() enabled. PX4s virtual address space is locked into RAM. INFO [px4] assuming working directory is rootfs, no symlinks needed. ______ __ __ ___ | ___ \ \ \ / / / | | |_/ / \ V / / /| | | __/ / \ / /_| | | | / /^\ \ \___ | \_| \/ \/ |_/ px4 starting. INFO [px4] Calling startup script: /bin/sh /etc/modalai/voxl-px4.config 0 INFO [muorb] muorb protobuf initalize method succeeded INFO [px4] Startup script returned successfully pxh对这段输出做几点解读Found DSP signature file应用侧检测到 DSP 固件签名文件确认libpx4.so已就位mlockall() enabledPX4 将自身虚拟地址空间锁定在 RAM 中mlockall避免页面换出导致的时序抖动——这是飞行实时性的基础保障/etc/modalai/voxl-px4.config由 ModalAI 板级包提供的 PX4 启动配置脚本负责拉起各模块与上面的模块别名机制配合INFO [muorb] muorb protobuf initalize method succeeded关键日志表明共享内存 uORBmuorb通道初始化成功DSP 与应用处理器之间的消息总线已打通最终进入pxh交互式 shell即可执行commander takeoff、param show、listener vehicle_attitude等 PX4 命令行。注意事项与调试技巧关机与重启在 VOXL 2 上无法用 PX4 的shutdown命令干净地关闭 PX4——需要给板卡断电重启以恢复全部功能。自 ModalAI SDK 1.3.0 起才支持在 VOXL 2 上干净地关闭 PX4对应上面 systemd 服务中的voxl-reset-slpi复位逻辑。始终使用最新 SDK 版本板级支持始终跟随 ModalAI SDK 演进README 明确建议总是使用最新的 SDK 版本进行构建与部署以确保与最新系统镜像、SSC 导出符号表见上文slpi_system_image_exports.txt的再生成要求保持兼容。查看 DSP 侧调试信息mini-dm绝大多数 DSP 日志会转发到应用处理器侧但部分底层消息不会。要查看 DSP 侧专属调试输出可以使用 Hexagon SDK 中自带的mini-dm工具modalaimodalai-XPS-15-9570:/local/mnt/workspace/Qualcomm/Hexagon_SDK/4.1.0.4/tools/debug/mini-dm/Ubuntu18$ sudo ./mini-dm连接成功后的典型日志Running mini-dm version: 3.2 Completed processing command line --- Connecting to the only usbport connected mini-dm is waiting for a DMSS connection... DMSS is connected. Running mini-dm... ------------Mini-dm is ready to log------------- [08500/02] 06:21.030 0069:01: SDSP: Creating new instance. 0355 sns_flight_controller_sensor. [08500/02] 06:21.030 0069:01: SDSP: Creating data streams 0292 sns_flight_controller_sensor_ [08500/02] 06:21.030 0069:01: SDSP: Configuring devices 0305 sns_flight_controller_sensor_ [08500/02] 06:21.030 0069:01: SDSP: Flight controller sensor instance initialized 0344 sns_flight_controller_sensor_ [08500/01] 06:21.092 0069:01: SDSP: Hello, world! 0000 test [08500/02] 06:21.092 006a:01: SDSP: CPU Utilization: 0.04, wait percentage 99.94 0162 sns_flight_controller_sensor. [08500/02] 06:21.092 006a:01: SDSP: Got interrupt registered event 0082 sns_flight_controller_sensor_可以看到SDSP:前缀的传感器服务日志以及 DSP 的 CPU 利用率信息CPU Utilization: 0.04, wait percentage 99.94可用于评估 DSP 侧的实时负载余量。这对排查传感器初始化失败、DSP 侧驱动异常等问题非常有效。小结PX4 on VOXL 2 的核心设计可以概括为一套代码仓库、两条构建链、两个处理器镜像、一条共享内存消息总线。default.px4board与slpi.px4board从同一板级目录分别产出 ARM64 应用与 QURT DSP 固件muorb 桥接两侧 uORB 总线ADB 脚本完成一键部署voxl-px4完成启动mini-dm 兜底 DSP 侧调试。无论是把 VOXL 2 作为纯伴机使用还是在其上原生运行 PX4本文覆盖的构建、安装、运行与调试链路都是后续开发与排障的基线。进一步深入可继续阅读板级配置 default.px4board、slpi.px4board 以及 src 目录 中的桥接模块与 QURT 驱动实现。赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐ArduPilot 在 ModalAI VOXL-2 上的部署systemd 服务、QURT 构建与安装全指南ArduPilot 在 ModalAI VOXL 2 上的部署systemd 服务、QURT 构建与安装全指南 导读 本文基于 ArduPilot 仓库中 l嵌入式无人机自动驾驶机器人固件Zephyr 在 NXP MIMXRT1160-EVK 上的双核开发指南架构、构建、烧录与调试Zephyr 在 NXP MIMXRT1160 EVK 上的双核开发指南架构、构建、烧录与调试 本篇技术指南以 Zephyr RTOS 中 mimxrt116操作系统嵌入式RTOS物联网在 PocketBeagle 2 Industrial 上运行 ZephyrA53 / M4F / MSPM0L1105 三核心部署与调试全指南在 PocketBeagle 2 Industrial 上运行 ZephyrA53 / M4F / MSPM0L1105 三核心部署与调试全指南 Pocket操作系统嵌入式RTOS物联网创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考