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 必读资料
必须先看这些官方资料:
-
CUAV Pixhawk V6X v2 控制器页面
- 关注硬件规格、接口、V6X 与 V6X-V2 区别。
- 关键结论:V6X-V2 是 V6X 的升级迭代,共用兼容载板,但固件互不兼容。
-
CUAV Pixhawk V6X/V6X-V2 PX4 用户手册
- 关注 PX4 版本要求、刷写方式、串口映射、编译目标。
- 关键结论:V6X-V2 兼容 PX4 v1.17.0 及以上。
- 关键编译目标:
make cuav_fmu-v6x_default。
-
CUAV V6X 接线快速手册
- 关注 POWER、TELEM、CAN、ETH、M1-M8、A1-A8。
- 关键结论:TELEM1/2/3 接 MAVLink 外设;CAN1/CAN2 接 DroneCAN/UAVCAN 外设;V6X 不给舵机主动供电。
-
CUAV C-RID 产品手册
- 关注 C-RID 是 Remote ID 广播模块,不是导航模块。
- 支持 DroneCAN/UART(MAVLink)。
- 推荐 LGC 地面站配置。
- 合规模式下涉及特定 Remote ID 固件、防篡改存储和限制普通固件更新。
-
PX4 Remote ID 文档
- 关注 PX4 对 Open Drone ID 硬件的通用接入方式。
- 支持串口或 CAN。
- 串口常用 TELEM2。
- CAN 需要启用 DroneCAN。
-
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 合规锁
动作:
- QGC 或 LGC 识别飞控。
- 刷 V6X-V2 对应 PX4 v1.17+ 固件。
- 完成机架选择。
- 校准加速度计、陀螺仪、磁罗盘、遥控器、电调。
- 只做手动/定点基础飞行验证。
此阶段不接 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 通信路线
4.1 第一版推荐:MAVLink 串口
第一版优先用:
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 参数界面实际显示为准。
4.2 第二版:MAVLink Router
当 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
保存并重启
检查:
- C-RID LED 是否正常。
- QGC/LGC 是否看到 DroneCAN 节点。
- PX4 是否有 DroneCAN 相关日志。
- LGC 是否能进入 C-RID 配置界面。
- 解锁前是否报 Remote ID mandatory data missing。
如果 CAN 不工作:
text
先查 CAN 线序
再查终端电阻
再查供电 5V
再查 UAVCAN_ENABLE
再查是不是默认 PX4 固件没有 CUAV C-RID 所需完整支持
6.2 方案 B:UART/MAVLink 接 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"
9.2 02_install_mavlink_router.sh
用途:安装 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"
9.3 mavlink-router.conf
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
9.4 mavlink-router.service
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 正常识别
传感器校准完成
电机方向正确
遥控器可接管
手动/定点飞行正常
导出参数基线
M3:Jetson MAVLink 稳定
完成标准:
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. 禁止事项
不要这样做:
- 不确认 V6X/V6X-V2 就刷固件。
- 不备份参数就批量改 PX4 参数。
- 把 C-RID 接上后不能解锁,就开始乱改 Jetson。
- QGC、MAVROS、MAVSDK 同时抢一个串口。
- 用 V6X 的
5V丝印判断舵机供电已经存在。 - 把 PX4 仿真截图任务和真机 C-RID 合规混为一谈。
- 宣称"装了 C-RID 就商业合规"。
- 在飞控基础飞行不稳时接入 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 官方中文文档 :Pixhawk V6X v2智能控制器
- CUAV 官方英文文档 :Pixhawk V6X v2 Controller
CUAV PX4 固件指南
V6X-V2 兼容 PX4 v1.17.0 及以上,构建目标为
cuav_fmu-v6x_default。
- CUAV 官方中文文档 :PX4固件使用指南
- CUAV 官方英文文档 :PX4 Firmware Guide
CUAV V6X 接线快速指南
TELEM、CAN、ETH、M1-M8、A1-A8 用途;V6X 不给舵机主动供电。
- PX4 用户指南(中文) :CUAV Pixhawk V6X Wiring Quick Start
关键信息:
A1~A8用于连接相机快门/热靴、舵机等;舵机供电需外接 BEC(因 V6X 不给舵机供电)。
CUAV C-RID 手册
C-RID 支持 DroneCAN/UART(MAVLink),用于 Remote ID 广播;推荐 LGC;合规流程涉及专用 Remote ID 固件和防篡改要求。
- CUAV 官方中文文档 :C-RID远程ID广播模块
- CUAV 官方英文文档 :C-RID module
PX4 Remote ID 文档
Remote ID 设备可通过串口或 CAN 接入;TELEM2 是常见串口选择;CAN 需要启用 DroneCAN。
- PX4 用户指南(中文) :Remote ID (Open Drone ID)
关键信息:PX4 从 v1.14 开始支持 Remote ID;CAN 连接需要 PX4 v1.15+ 版本。C-RID 通过 CAN 连接时,需设置
DID_CANDRIVER=1等参数。
MAVLink Open Drone ID 文档
OpenDroneID 消息用于在飞控、地面站和 Remote ID 发射模块之间传输 ID、位置、高度、操作员等数据。
- MAVLink 中文文档 :Open Drone ID
关键消息:
OPEN_DRONE_ID_BASIC_ID(ID信息)、OPEN_DRONE_ID_LOCATION(位置/高度/速度/方向)、OPEN_DRONE_ID_SYSTEM(操作员位置/多机信息)等。
补充说明
-
关于 C-RID 串口连接 :CUAV 官方文档指出,通过 UART 连接 C-RID 需要自主编译固件或寻求 CUAV 技术支持,普通用户推荐使用 CAN 连接。
-
关于 LGC 地面站 :文档推荐使用 LGC (CUAV Local Ground Control) 配置 C-RID 的 Remote ID 信息,而非 QGC。