CUAV V6X-V2 PX4 开发、C-RID 处理与 Jetson 部署教学

CUAV V6X-V2 PX4 开发、C-RID 处理与 Jetson 部署教学

更新时间:2026-06-16

目标:从雷迅/CUAV 官方手册调研开始,建立一套可执行的 V6X-V2 + PX4 + C-RID + Jetson 开发路线,最终沉淀成 Jetson 可一键部署、可健康检查、可开机自启动的成熟脚本体系。

0. 最终路线一句话

不要一上来就把 C-RID、PX4、Jetson、自动任务、舵机、仿真全部混在一起调。正确顺序是:

text 复制代码
先确认 V6X-V2 硬件和 PX4 固件版本
再刷 PX4 v1.17+ 并完成基础传感器/电机/遥控配置
再打通 Jetson <-> V6X 的 MAVLink 通信
再接入 Offboard/MAVROS/ROS 控制
最后单独处理 C-RID:先工程通信,再合规固件/防篡改

核心原则:

text 复制代码
飞控安全优先
Jetson 只做上位计算和任务控制
C-RID 是合规模块,不是导航模块
PX4 默认固件能不能满足 C-RID 合规,要单独验证,不能口头假设

1. 调研阶段:先把手册读清楚

1.1 必读资料

必须先看这些官方资料:

  1. CUAV Pixhawk V6X v2 控制器页面

    • 关注硬件规格、接口、V6X 与 V6X-V2 区别。
    • 关键结论:V6X-V2 是 V6X 的升级迭代,共用兼容载板,但固件互不兼容。
  2. CUAV Pixhawk V6X/V6X-V2 PX4 用户手册

    • 关注 PX4 版本要求、刷写方式、串口映射、编译目标。
    • 关键结论:V6X-V2 兼容 PX4 v1.17.0 及以上。
    • 关键编译目标:make cuav_fmu-v6x_default
  3. CUAV V6X 接线快速手册

    • 关注 POWER、TELEM、CAN、ETH、M1-M8、A1-A8。
    • 关键结论:TELEM1/2/3 接 MAVLink 外设;CAN1/CAN2 接 DroneCAN/UAVCAN 外设;V6X 不给舵机主动供电。
  4. CUAV C-RID 产品手册

    • 关注 C-RID 是 Remote ID 广播模块,不是导航模块。
    • 支持 DroneCAN/UART(MAVLink)。
    • 推荐 LGC 地面站配置。
    • 合规模式下涉及特定 Remote ID 固件、防篡改存储和限制普通固件更新。
  5. PX4 Remote ID 文档

    • 关注 PX4 对 Open Drone ID 硬件的通用接入方式。
    • 支持串口或 CAN。
    • 串口常用 TELEM2。
    • CAN 需要启用 DroneCAN。
  6. MAVLink Open Drone ID 文档

    • 理解 Remote ID 通过 MAVLink 传输 ID、位置、高度、操作员信息等。
    • 理解广播层是 Wi-Fi/Bluetooth,飞控/Jetson 给模块的是 MAVLink/OpenDroneID 数据。

1.2 调研后必须形成的表格

第一天不要急着写代码,先整理这个表:

项目 当前判断 后续动作
飞控型号 CUAV Pixhawk V6X-V2 不用老 V6X 固件
PX4 版本 v1.17.0+ 低版本不作为主线
PX4 编译目标 cuav_fmu-v6x_default 不用 px4_fmu-v6x_default
Jetson 通信 MAVLink 串口或以太网 第一版建议串口 TELEM2/TELEM1
C-RID 接口 CAN 或 UART(MAVLink) 优先按 C-RID 手册走 CAN,失败再测 UART
C-RID 地面站 LGC 推荐,QGC 可辅助 合规配置优先 LGC
舵机供电 飞控不供电 外接 BEC,共地
合规状态 不能仅靠模块判断合规 后续走独立合规清单

2. V6X-V2 硬件重点

2.1 V6X-V2 和老 V6X 不能混刷

必须记住:

text 复制代码
V6X-V2 和老 V6X 固件互不兼容

PX4 编译目标:

bash 复制代码
make cuav_fmu-v6x_default

不要用老 V6X 目标:

bash 复制代码
make px4_fmu-v6x_default

这类错误最危险:可能能编译,但板子目标不对,后面传感器、I/O、参数都可能出奇怪问题。

2.2 V6X-V2 关键接口

按开发用途分类:

接口 用途
POWER C1/C2 CAN PMU 电源模块
POWER 1/2 SMBus/I2C 电源模块
GPS&SAFETY GPS、RTK、安全开关、蜂鸣器
GPS2 第二 GPS/RTK
TELEM1/2/3 MAVLink 数传、Jetson、Remote ID 串口外设
CAN1/CAN2 DroneCAN/UAVCAN 外设,如 CAN GPS、C-RID
ETH 以太网,可接任务计算机或高带宽载荷
M1-M8 IO PWM 输出,常接电调/舵机
A1-A8 FMU PWM/GPIO,支持部分高级输出
USB 刷固件、QGC/LGC 连接、调试
TF CARD 飞控日志

2.3 PX4 串口映射

CUAV PX4 手册给出的 V6X/V6X-V2 串口映射:

PX4 设备 板载接口
/dev/ttyS0 GPS
/dev/ttyS1 TELEM3
/dev/ttyS2 Debug Console
/dev/ttyS3 UART4 & I2C
/dev/ttyS4 TELEM2
/dev/ttyS5 PX4IO/RC
/dev/ttyS6 TELEM1
/dev/ttyS7 GPS2

建议分配:

text 复制代码
TELEM1:数传电台或备用 QGC
TELEM2:Jetson MAVLink 主链路
TELEM3:C-RID UART 备用或调试外设
CAN1/CAN2:C-RID DroneCAN 或 CAN GPS
ETH:后续 Jetson 高速链路,不作为第一阶段必选

如果 C-RID 走 CAN,Jetson 就优先用 TELEM2。

如果 C-RID 走 UART,Jetson 就用 TELEM1 或以太网/MAVLink Router。

2.4 舵机和 AUX 电源

V6X 不给舵机主动供电。

正确理解:

text 复制代码
AUX/M 排针上的 + 脚是电源轨接口
不是飞控内部给舵机输出大电流 5V

SG90 或投放舵机接法:

text 复制代码
BEC 5V  -> AUX/M 的 +
BEC GND -> AUX/M 的 -
舵机红线 -> +
舵机棕/黑 -> -
舵机黄/橙 -> Signal
飞控 GND 与 BEC GND 共地

PX4 Actuator 配置建议:

text 复制代码
电机:MAIN1-MAIN4 = Motor1-Motor4
舵机:AUX1/AUX2 = RC AUX1/RC AUX2 或 Peripheral via Actuator Set
舵机 PWM Rate = 50Hz
Disarmed = 1500
Min = 1200
Max = 1800
Center = 1500
Failsafe = 1500

3. PX4 固件开发路线

3.1 第一阶段:只刷官方/厂商推荐固件

目标:

text 复制代码
先让 V6X-V2 稳定跑 PX4,不改源码,不碰 C-RID 合规锁

动作:

  1. QGC 或 LGC 识别飞控。
  2. 刷 V6X-V2 对应 PX4 v1.17+ 固件。
  3. 完成机架选择。
  4. 校准加速度计、陀螺仪、磁罗盘、遥控器、电调。
  5. 只做手动/定点基础飞行验证。

此阶段不接 C-RID 的原因:

text 复制代码
先排除飞控基础问题
否则后面无法区分是 PX4 没配好,还是 C-RID 阻止解锁

3.2 第二阶段:建立 PX4 源码工程

Ubuntu/Jetson 开发依赖大致如下:

bash 复制代码
sudo apt update
sudo apt install -y git python3-pip python3-venv python3-empy python3-numpy python3-yaml \
  ninja-build exiftool astyle ccache cmake build-essential genromfs

拉源码:

bash 复制代码
mkdir -p ~/px4_dev
cd ~/px4_dev
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
git checkout v1.17.0
git submodule update --init --recursive

构建 V6X-V2:

bash 复制代码
make cuav_fmu-v6x_default

构建产物一般在:

text 复制代码
build/cuav_fmu-v6x_default/cuav_fmu-v6x_default.px4

本地刷写方式:

text 复制代码
QGC -> Firmware -> Advanced settings -> Custom firmware file -> 选择 .px4 文件

3.3 第三阶段:建立 PX4 参数基线

每次改参数前先导出:

text 复制代码
QGC -> Parameters -> Tools -> Save to file

建议保存这些版本:

text 复制代码
params_00_factory_after_flash.params
params_01_airframe_calibrated.params
params_02_mavlink_jetson_enabled.params
params_03_crid_engineering_test.params
params_04_crid_compliance_candidate.params

不要靠记忆改参数。PX4 开发最怕"昨天能解锁,今天不知道谁改坏了"。

4. Jetson 与 V6X-V2 通信路线

第一版优先用:

text 复制代码
Jetson UART/USB-TTL <-> V6X TELEM2

接线:

text 复制代码
Jetson TX -> TELEM2 RX
Jetson RX <- TELEM2 TX
Jetson GND <-> TELEM2 GND

注意:

text 复制代码
TX/RX 交叉
必须共地
电平必须匹配
不要把 Jetson 5V 随便灌进飞控信号口

PX4 参数方向:

text 复制代码
MAV_1_CONFIG = TELEM 2
MAV_1_MODE   = Onboard 或 Normal
MAV_1_RATE   = 0 或按带宽设置
SER_TEL2_BAUD = 与 Jetson 串口一致

具体参数名会随 PX4 版本略变,以 QGC 参数界面实际显示为准。

当 Jetson 既要接 QGC,又要接 ROS/MAVROS/MAVSDK,又要记录日志时,不要多个程序抢同一个串口。

推荐结构:

text 复制代码
V6X TELEM2 -> Jetson /dev/ttyTHS1
Jetson mavlink-routerd
  -> UDP 14550 给 QGC
  -> UDP 14540 给 MAVROS/MAVSDK
  -> 日志文件

这样串口只被 mavlink-routerd 占用,其他程序走 UDP。

4.3 第三版:以太网

V6X-V2 有 100M Ethernet PHY。以太网适合后期成熟系统:

text 复制代码
低延迟
高带宽
抗串口占用冲突
适合 Jetson 长期部署

但第一阶段不建议直接上以太网,因为排错复杂度高。先用 TELEM 串口把 MAVLink 链路打通。

5. C-RID 的正确理解

5.1 C-RID 是什么

C-RID 是 Remote ID 广播模块。

它做的事:

text 复制代码
广播无人机 ID
广播地面站/操作者信息
广播飞行数据
通过 Wi-Fi 或 Bluetooth 对外广播
通过 DroneCAN 或 UART(MAVLink) 接收飞控/地面站数据

它不做的事:

text 复制代码
不导航
不避障
不增强 GPS
不替代 RTK
不替代 PX4 飞控
不自动让系统合法商业化

5.2 C-RID 有两种模式

必须区分:

text 复制代码
工程通信模式
合规产品模式

工程通信模式:

text 复制代码
目标是让 PX4、C-RID、地面站之间能互相传 Remote ID 数据
可用于研发验证
不等于合规认证

合规产品模式:

text 复制代码
目标是满足 Remote ID 防篡改、唯一 ID、指定区域规则、不能绕过等要求
可能需要 CUAV/LGC 专用流程、特定固件、非易失/不可擦写 ID 存储
可能不能继续用普通 QGC 刷标准固件

5.3 为什么会出现"C-RID 不支持 PX4 默认固件"的感觉

原因不是一句"支持/不支持"能说清。

PX4 官方 Remote ID 文档说的是:

text 复制代码
PX4 可以和支持 Open Drone ID MAVLink 协议的 Remote ID 硬件配合
串口或 CAN 都可以接

CUAV C-RID 手册强调的是:

text 复制代码
C-RID 面向系统集成商/制造商
合规使用需要控制器运行带 Remote ID 功能的固件
需要写入不可篡改/不可擦除区域
配置不完整时可能不允许解锁
标准地面站普通刷固件流程可能不能继续使用

所以实际判断是:

text 复制代码
默认 PX4 固件可能能做 OpenDroneID 工程通信
但默认 PX4 固件不一定满足 CUAV C-RID 的合规防篡改产品流程

解决方案不是硬猜,而是分层测试。

6. C-RID 接入方案

6.1 方案 A:DroneCAN 接 C-RID

适用:

text 复制代码
按 CUAV C-RID 手册走
希望后续靠近合规产品流程
V6X CAN1/CAN2 有空

接线:

text 复制代码
C-RID CAN_H -> V6X CAN_H
C-RID CAN_L -> V6X CAN_L
C-RID 5V    -> V6X/CAN 5V 供电或独立稳定 5V
C-RID GND   -> V6X GND
安装天线

PX4 参数方向:

text 复制代码
UAVCAN_ENABLE = 非 0
保存并重启

检查:

  1. C-RID LED 是否正常。
  2. QGC/LGC 是否看到 DroneCAN 节点。
  3. PX4 是否有 DroneCAN 相关日志。
  4. LGC 是否能进入 C-RID 配置界面。
  5. 解锁前是否报 Remote ID mandatory data missing。

如果 CAN 不工作:

text 复制代码
先查 CAN 线序
再查终端电阻
再查供电 5V
再查 UAVCAN_ENABLE
再查是不是默认 PX4 固件没有 CUAV C-RID 所需完整支持

适用:

text 复制代码
DroneCAN 识别失败
C-RID 明确支持 UART(MAVLink)
想先做工程通信验证

推荐接口:

text 复制代码
C-RID -> TELEM3
Jetson -> TELEM2

PX4 参数方向参考 Remote ID 串口配置:

text 复制代码
MAV_X_CONFIG = 对应 TELEM 口
MAV_X_MODE   = Normal
MAV_X_FORWARD = Enabled
SER_TELx_BAUD = C-RID 要求的波特率

注意:

text 复制代码
波特率以 C-RID 手册或 LGC 实测为准
不同 Remote ID 模块可能不同

6.3 方案 C:Jetson 中转 OpenDroneID

这是工程兜底方案,不是首选合规方案。

结构:

text 复制代码
V6X -> MAVLink -> Jetson
Jetson 读取位置/状态/ID
Jetson 生成 MAVLink OpenDroneID 消息
Jetson -> UART -> C-RID

优点:

text 复制代码
不强依赖 PX4 默认固件对某个 C-RID 的完整支持
Jetson 可控性强
方便记录和调试

缺点:

text 复制代码
可能不满足防篡改要求
可能不能作为商业合规最终方案
Jetson 崩溃会影响 Remote ID 数据流

只建议用于研发验证,不建议直接作为商业合规交付。

6.4 方案 D:CUAV/LGC 合规固件流程

如果目标是商业化合规,最终要走这条:

text 复制代码
联系 CUAV/雷迅确认 V6X-V2 + C-RID + PX4 的推荐固件和 LGC 流程
确认 Remote ID 写入和防篡改机制
确认不能被普通 QGC 标准固件覆盖
确认无地面站数据/无 Remote ID 数据时的解锁逻辑
确认法规区域:中国/欧盟/美国对应配置
确认生产序列号、UAS ID、操作者 ID 写入流程

不要自己随便改 PX4 就宣称合规。

7. C-RID 故障处理决策树

7.1 C-RID 接上后飞控不能解锁

按顺序查:

text 复制代码
1. QGC/LGC 解锁提示是什么
2. 是否提示 Remote ID 数据缺失
3. LGC 是否写入了操作区域、UAS ID、操作者/地面站信息
4. C-RID LED 是否显示配置成功
5. C-RID 是否被 PX4 识别为 CAN/UART 外设
6. PX4 固件是否是普通默认固件
7. 是否需要 CUAV 提供 Remote ID 功能固件

处理:

text 复制代码
如果只是研发飞行:先拔掉 C-RID,恢复普通 PX4,完成飞控基础测试
如果要验证 C-RID:单独开 C-RID 分支,不要和飞控基础调参混在一起
如果要合规:走 LGC/CUAV 指定固件和写入流程

7.2 C-RID 在 CAN 上没有反应

检查:

text 复制代码
供电 4.7-5.2V
CAN_H/CAN_L 是否反
GND 是否共地
天线是否安装
PX4 UAVCAN_ENABLE 是否开启
是否重启飞控
CAN 总线是否已有冲突设备

7.3 QGC 看不到 Remote ID

判断:

text 复制代码
QGC 能看 PX4 不等于 QGC 能完整配置 C-RID
C-RID 手册推荐 LGC,优先用 LGC 做 Remote ID 信息配置

处理:

text 复制代码
QGC 用于 PX4 飞控调参
LGC 用于 CUAV/C-RID 相关配置
两者不要同时抢同一个连接口

7.4 PX4 默认固件能飞,但接 C-RID 后流程不通

结论:

text 复制代码
这不是 Jetson 问题
也不是 C-RID 硬件一定坏
大概率是默认 PX4 工程通信能力和 CUAV C-RID 合规流程之间不匹配

解决:

text 复制代码
短期:C-RID 拆出来单独验证,不影响 PX4 飞控主线
中期:用 LGC + CUAV 推荐固件验证 C-RID
长期:建立合规固件分支和普通研发固件分支

8. Jetson 部署架构

8.1 最终 Jetson 目录结构

建议目录:

text 复制代码
~/uav_stack/
  config/
    vehicle.env
    px4.params
    crid.env
    mavlink-router.conf
  scripts/
    00_collect_manual_notes.sh
    01_prepare_jetson_base.sh
    02_install_mavlink_router.sh
    03_install_ros_mavros.sh
    04_config_px4_params.py
    05_check_px4_link.py
    06_check_crid_status.py
    07_install_systemd_services.sh
    08_flight_readiness_check.sh
  services/
    mavlink-router.service
    uav-healthcheck.service
    uav-control.service
  logs/
  README.md

8.2 vehicle.env

bash 复制代码
# vehicle.env
VEHICLE_NAME=v6xv2_px4_jetson
FCU_SERIAL=/dev/ttyTHS1
FCU_BAUD=921600
QGC_UDP_IP=192.168.1.100
QGC_UDP_PORT=14550
LOCAL_MAVLINK_UDP=14540
ROS_DISTRO=noetic
USE_MAVROS=1
USE_CRID=0
CRID_MODE=disabled

说明:

text 复制代码
USE_CRID=0 是默认值
主飞控链路稳定后再改 USE_CRID=1

8.3 crid.env

bash 复制代码
# crid.env
CRID_LINK=can
CRID_CAN_PORT=CAN1
CRID_UART_PORT=
CRID_REGION=CN
CRID_REQUIRE_LGC=1
CRID_COMPLIANCE_MODE=0

说明:

text 复制代码
CRID_COMPLIANCE_MODE=0 代表工程测试
真正合规前必须改成独立流程,不能只改这个变量

9. Jetson 成熟脚本开发

9.1 01_prepare_jetson_base.sh

用途:安装基础工具、创建目录、检查系统。

bash 复制代码
#!/usr/bin/env bash
set -euo pipefail

ROOT="$HOME/uav_stack"
mkdir -p "$ROOT"/{config,scripts,services,logs}

sudo apt update
sudo apt install -y \
  git curl wget jq net-tools iproute2 can-utils \
  python3 python3-pip python3-venv python3-serial \
  build-essential cmake pkg-config htop tmux chrony

python3 -m pip install --user --upgrade pip
python3 -m pip install --user pymavlink MAVProxy

echo "[OK] base tools installed"
echo "[NEXT] edit $ROOT/config/vehicle.env"

用途:安装 MAVLink Router,避免多个程序抢串口。

bash 复制代码
#!/usr/bin/env bash
set -euo pipefail

sudo apt update
sudo apt install -y git meson ninja-build pkg-config gcc g++ systemd

cd /tmp
rm -rf mavlink-router
git clone https://github.com/mavlink-router/mavlink-router.git
cd mavlink-router
git submodule update --init --recursive
meson setup build .
ninja -C build
sudo ninja -C build install

echo "[OK] mavlink-router installed"
ini 复制代码
[General]
ReportStats=false
MavlinkDialect=common

[UartEndpoint fcu]
Device=/dev/ttyTHS1
Baud=921600

[UdpEndpoint qgc]
Mode=Normal
Address=192.168.1.100
Port=14550

[UdpEndpoint local]
Mode=Normal
Address=127.0.0.1
Port=14540
ini 复制代码
[Unit]
Description=MAVLink Router for V6X-V2 PX4
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mavlink-routerd -c /home/user/uav_stack/config/mavlink-router.conf
Restart=always
RestartSec=2
User=user

[Install]
WantedBy=multi-user.target

部署脚本里要自动替换 user

bash 复制代码
sed -i "s#/home/user#$HOME#g" mavlink-router.service
sed -i "s#User=user#User=$USER#g" mavlink-router.service

9.5 05_check_px4_link.py

用途:Jetson 上确认 PX4 心跳和基础状态。

python 复制代码
#!/usr/bin/env python3
import time
from pymavlink import mavutil

conn = mavutil.mavlink_connection("udp:127.0.0.1:14540")
print("[INFO] waiting heartbeat...")
hb = conn.wait_heartbeat(timeout=10)
if hb is None:
    raise SystemExit("[FAIL] no PX4 heartbeat")

print(f"[OK] heartbeat system={conn.target_system} component={conn.target_component}")

deadline = time.time() + 5
seen = set()
while time.time() < deadline:
    msg = conn.recv_match(blocking=True, timeout=1)
    if not msg:
        continue
    seen.add(msg.get_type())

print("[INFO] messages:", ", ".join(sorted(seen)))
need = {"HEARTBEAT", "SYS_STATUS"}
missing = need - seen
if missing:
    raise SystemExit(f"[WARN] missing basic messages: {missing}")

print("[OK] PX4 MAVLink link looks alive")

9.6 04_config_px4_params.py

用途:用脚本设置 Jetson MAVLink 口参数。第一版只给出框架,不自动乱改所有参数。

python 复制代码
#!/usr/bin/env python3
from pymavlink import mavutil
import time

PARAMS = {
    # 按实际 PX4 参数界面确认后再放开。
    # "MAV_1_CONFIG": value_for_telem2,
    # "MAV_1_MODE": value_for_onboard_or_normal,
    # "MAV_1_RATE": 0,
    # "SER_TEL2_BAUD": value_for_921600,
}

conn = mavutil.mavlink_connection("udp:127.0.0.1:14540")
conn.wait_heartbeat(timeout=10)

if not PARAMS:
    print("[SAFE] no params written. Fill PARAMS after QGC confirms enum values.")
    raise SystemExit(0)

for name, value in PARAMS.items():
    print(f"[SET] {name}={value}")
    conn.mav.param_set_send(
        conn.target_system,
        conn.target_component,
        name.encode("utf-8"),
        float(value),
        mavutil.mavlink.MAV_PARAM_TYPE_REAL32,
    )
    time.sleep(0.2)

print("[DONE] reboot PX4 after parameter changes")

为什么不直接写死枚举值:

text 复制代码
PX4 参数枚举值随版本可能变化
V6X-V2 需要 v1.17+
脚本第一版应先读参/备份,再写参

成熟版可以做:

text 复制代码
读取所有参数
保存备份
检查目标 PX4 版本
检查板子 ID
再按版本映射写入

9.7 06_check_crid_status.py

用途:工程层确认 Remote ID 相关 MAVLink 消息是否出现。

python 复制代码
#!/usr/bin/env python3
import time
from pymavlink import mavutil

REMOTE_ID_MSGS = {
    "OPEN_DRONE_ID_ARM_STATUS",
    "OPEN_DRONE_ID_BASIC_ID",
    "OPEN_DRONE_ID_LOCATION",
    "OPEN_DRONE_ID_SYSTEM",
    "OPEN_DRONE_ID_OPERATOR_ID",
    "OPEN_DRONE_ID_MESSAGE_PACK",
}

conn = mavutil.mavlink_connection("udp:127.0.0.1:14540")
conn.wait_heartbeat(timeout=10)

print("[INFO] listening Remote ID MAVLink messages for 20s...")
deadline = time.time() + 20
seen = set()

while time.time() < deadline:
    msg = conn.recv_match(blocking=True, timeout=1)
    if not msg:
        continue
    t = msg.get_type()
    if t in REMOTE_ID_MSGS:
        seen.add(t)
        print("[RID]", t, msg)

if not seen:
    print("[WARN] no OpenDroneID MAVLink messages seen")
    print("[HINT] check C-RID connection, PX4 Remote ID support, LGC/QGC config")
else:
    print("[OK] seen:", ", ".join(sorted(seen)))

注意:

text 复制代码
看到消息 != 法规合规
没看到消息 != 模块一定坏
它只说明工程通信状态

9.8 08_flight_readiness_check.sh

用途:起飞前统一检查。

bash 复制代码
#!/usr/bin/env bash
set -euo pipefail

source "$HOME/uav_stack/config/vehicle.env"

echo "[1/7] serial device"
test -e "$FCU_SERIAL" && echo "OK: $FCU_SERIAL" || { echo "FAIL: no $FCU_SERIAL"; exit 1; }

echo "[2/7] mavlink-router service"
systemctl is-active --quiet mavlink-router && echo "OK" || { echo "FAIL: mavlink-router inactive"; exit 1; }

echo "[3/7] PX4 heartbeat"
python3 "$HOME/uav_stack/scripts/05_check_px4_link.py"

echo "[4/7] CPU load"
uptime

echo "[5/7] disk"
df -h "$HOME"

echo "[6/7] time sync"
timedatectl | grep -E "System clock synchronized|NTP service" || true

echo "[7/7] C-RID"
if [ "${USE_CRID:-0}" = "1" ]; then
  python3 "$HOME/uav_stack/scripts/06_check_crid_status.py" || true
else
  echo "SKIP: USE_CRID=0"
fi

echo "[DONE] readiness check complete"

9.9 07_install_systemd_services.sh

bash 复制代码
#!/usr/bin/env bash
set -euo pipefail

ROOT="$HOME/uav_stack"

sudo cp "$ROOT/services/mavlink-router.service" /etc/systemd/system/
sudo sed -i "s#/home/user#$HOME#g" /etc/systemd/system/mavlink-router.service
sudo sed -i "s#User=user#User=$USER#g" /etc/systemd/system/mavlink-router.service

sudo systemctl daemon-reload
sudo systemctl enable mavlink-router
sudo systemctl restart mavlink-router
sudo systemctl status mavlink-router --no-pager

10. Jetson 部署顺序

10.1 第一次部署

bash 复制代码
mkdir -p ~/uav_stack/scripts ~/uav_stack/config ~/uav_stack/services ~/uav_stack/logs
cd ~/uav_stack
bash scripts/01_prepare_jetson_base.sh
bash scripts/02_install_mavlink_router.sh
nano config/vehicle.env
nano config/mavlink-router.conf
bash scripts/07_install_systemd_services.sh
bash scripts/08_flight_readiness_check.sh

10.2 每次上电检查

bash 复制代码
systemctl status mavlink-router --no-pager
python3 ~/uav_stack/scripts/05_check_px4_link.py
bash ~/uav_stack/scripts/08_flight_readiness_check.sh

10.3 QGC 连接方式

QGC 在电脑上:

text 复制代码
QGC UDP 14550
Jetson mavlink-router 转发到电脑 IP:14550

不要让 QGC 和 Jetson 控制程序同时直连飞控串口。

11. PX4 Offboard 开发路线

11.1 第一版控制方式

如果 Jetson 使用 ROS1/EGO/MAVROS 主线:

text 复制代码
PX4 <-> MAVLink Router <-> MAVROS <-> ROS1 控制节点/EGO 桥接节点

常用话题:

text 复制代码
/mavros/state
/mavros/local_position/pose
/mavros/setpoint_position/local
/mavros/set_mode
/mavros/cmd/arming

第一版不要直接真机 Offboard 飞:

text 复制代码
先 SITL
再拆桨台架
再低高度限速
最后自动任务

11.2 第二版控制方式

如果后续完全走 PX4 v1.17 + ROS2:

text 复制代码
PX4 uXRCE-DDS <-> Micro XRCE Agent <-> ROS2 控制节点

这条路线适合纯 PX4/ROS2 项目,但如果当前 EGO 主线是 ROS1,第一版不要强行切 ROS2。工程上先跑通比追新接口重要。

12. C-RID 合规路线

合规不是一个参数,也不是装上 C-RID 就结束。

必须建立独立清单:

text 复制代码
无人机实名登记
产品唯一识别码/UAS ID
操作者 ID
Remote ID 广播区域配置
飞控防篡改固件
固件更新限制
地面站配置流程
飞行日志留存
空域/场地审批
保险/运营主体
操控资质

C-RID 在系统里的位置:

text 复制代码
它是合规广播链路的一环
不是全部合规

建议分支管理:

text 复制代码
branch/dev-px4-normal     普通研发固件,可快速刷写
branch/dev-crid-test      C-RID 工程通信测试
branch/release-rid-locked 合规候选固件,禁止随意刷写

13. 从零到成熟的里程碑

M1:硬件确认

完成标准:

text 复制代码
确认飞控是 V6X-V2
确认电源模块接 POWER C1/C2 或正确 POWER 口
确认 TELEM/CAN/GPS/ETH 接口分配
确认舵机外接 BEC

M2:PX4 基础稳定

完成标准:

text 复制代码
刷 PX4 v1.17+
QGC/LGC 正常识别
传感器校准完成
电机方向正确
遥控器可接管
手动/定点飞行正常
导出参数基线

完成标准:

text 复制代码
Jetson 能收到 PX4 heartbeat
QGC 能通过 Jetson 转发连接
mavlink-router 开机自启动
健康检查脚本通过
不会多个程序抢串口

M4:Offboard 工程验证

完成标准:

text 复制代码
SITL 能起飞/定点
台架能切模式但不上桨
真机低高度限速能进入/退出 Offboard
遥控器可随时接管
failsafe 参数明确

M5:C-RID 工程通信

完成标准:

text 复制代码
C-RID 供电和 LED 正常
CAN 或 UART 识别正常
LGC 能写入 Remote ID 信息
PX4/MAVLink 侧能看到相关状态或不再报 mandatory data
不影响普通飞行主线

M6:C-RID 合规候选

完成标准:

text 复制代码
CUAV/LGC 推荐固件流程确认
唯一 ID 写入流程确认
防篡改/不可擦写机制确认
普通 QGC 固件更新限制确认
法规区域配置确认
实测广播能被检测设备识别
形成交付检查表

M7:Jetson 成熟部署

完成标准:

text 复制代码
一键安装脚本
参数备份脚本
健康检查脚本
systemd 自启动
日志轮转
异常重启
版本清单
离线部署包
恢复出厂脚本

14. 禁止事项

不要这样做:

  1. 不确认 V6X/V6X-V2 就刷固件。
  2. 不备份参数就批量改 PX4 参数。
  3. 把 C-RID 接上后不能解锁,就开始乱改 Jetson。
  4. QGC、MAVROS、MAVSDK 同时抢一个串口。
  5. 用 V6X 的 5V 丝印判断舵机供电已经存在。
  6. 把 PX4 仿真截图任务和真机 C-RID 合规混为一谈。
  7. 宣称"装了 C-RID 就商业合规"。
  8. 在飞控基础飞行不稳时接入 Offboard 自动任务。

15. 最终交付物

成熟项目最后应交付:

text 复制代码
1. 官方资料调研表
2. 硬件接线图
3. PX4 固件版本和编译目标记录
4. PX4 参数基线文件
5. Jetson 一键安装脚本
6. MAVLink Router 配置
7. MAVLink 健康检查脚本
8. C-RID 工程测试记录
9. C-RID 合规候选流程
10. 起飞前检查清单
11. 异常恢复流程
12. 完整版本清单

16. 资料依据

根据你的需求,我已将相关技术文档的链接整理如下:

CUAV Pixhawk V6X v2 控制器说明

V6X-V2 是 V6X 升级迭代版本,固件互不兼容。

CUAV PX4 固件指南

V6X-V2 兼容 PX4 v1.17.0 及以上,构建目标为 cuav_fmu-v6x_default

CUAV V6X 接线快速指南

TELEM、CAN、ETH、M1-M8、A1-A8 用途;V6X 不给舵机主动供电。

关键信息:A1~A8 用于连接相机快门/热靴、舵机等;舵机供电需外接 BEC(因 V6X 不给舵机供电)。

CUAV C-RID 手册

C-RID 支持 DroneCAN/UART(MAVLink),用于 Remote ID 广播;推荐 LGC;合规流程涉及专用 Remote ID 固件和防篡改要求。

PX4 Remote ID 文档

Remote ID 设备可通过串口或 CAN 接入;TELEM2 是常见串口选择;CAN 需要启用 DroneCAN。

关键信息:PX4 从 v1.14 开始支持 Remote ID;CAN 连接需要 PX4 v1.15+ 版本。C-RID 通过 CAN 连接时,需设置 DID_CANDRIVER=1 等参数。

OpenDroneID 消息用于在飞控、地面站和 Remote ID 发射模块之间传输 ID、位置、高度、操作员等数据。

关键消息:OPEN_DRONE_ID_BASIC_ID(ID信息)、OPEN_DRONE_ID_LOCATION(位置/高度/速度/方向)、OPEN_DRONE_ID_SYSTEM(操作员位置/多机信息)等。


补充说明

  1. 关于 C-RID 串口连接 :CUAV 官方文档指出,通过 UART 连接 C-RID 需要自主编译固件或寻求 CUAV 技术支持,普通用户推荐使用 CAN 连接。

  2. 关于 LGC 地面站 :文档推荐使用 LGC (CUAV Local Ground Control) 配置 C-RID 的 Remote ID 信息,而非 QGC。