# CUAV 7-Nano GPS2 配置与检查 ## 1. 当前设备和固件配置 - 飞控:CUAV 7-Nano V2 - PX4:`v1.17.0` - 固件目标:`cuav_7-nano_minimal_vtol` - 当前 GPS 物理连接口:`GPS2` - GPS协议:UBX(从当前 `gps status` 输出判断) 当前固件中的串口映射为: | 物理接口 | PX4设备节点 | |---|---| | GPS1 | `/dev/ttyS0` | | GPS2 | `/dev/ttyS6` | | TELEM1 | `/dev/ttyS5` | | TELEM2 | `/dev/ttyS3` | | TELEM3 | `/dev/ttyS1` | 该映射来自: ```text boards/cuav/7-nano/minimal_vtol.px4board ``` 其中定义: ```text CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS6" ``` --- ## 2. 当前检测结果 在 NuttShell 中执行: ```sh gps status ``` 得到: ```text INFO [gps] Main GPS INFO [gps] protocol: UBX INFO [gps] status: NOT OK, port: /dev/ttyS0, baudrate: 0 INFO [gps] sat info: disabled INFO [gps] rate reading: 0 B/s ``` 这段输出表示: 1. GPS驱动已经启动。 2. 驱动正在把 `/dev/ttyS0` 当作 Main GPS 端口。 3. `/dev/ttyS0` 对应物理 `GPS1` 接口。 4. 当前 GPS 实际插在物理 `GPS2` 接口,即 `/dev/ttyS6`。 5. 驱动当前读取了错误的物理串口。 6. `rate reading: 0 B/s` 表示该串口没有收到任何 GPS 字节。 7. `status: NOT OK` 不是单纯的“室内没有卫星定位”,而是当前端口连串口数据都没有收到。 因此,当前首要问题是 GPS 端口配置与实际接线不一致。 --- ## 3. GPS串口配置参数 当前固件中,GPS串口配置值含义为: | 参数值 | 端口 | |---:|---| | `0` | Disabled,禁用 | | `101` | TELEM1 | | `102` | TELEM2 | | `103` | TELEM3 | | `201` | GPS1 | | `202` | GPS2 | 相关参数: - `GPS_1_CONFIG`:配置 Main GPS 所使用的串口。 - `GPS_2_CONFIG`:配置 Secondary GPS 所使用的串口。 这里的 `GPS_1_CONFIG` 和 `GPS_2_CONFIG` 表示“主 GPS 实例”和“次 GPS 实例”,并不强制要求主 GPS 一定插在物理 GPS1 口。 例如:只有一个 GPS,且它插在物理 GPS2 口时,可以让 Main GPS 使用 GPS2: ```text GPS_1_CONFIG=202 GPS_2_CONFIG=0 ``` --- ## 4. 当前推荐配置 当前只有一个 GPS,并且插在 GPS2 物理接口,因此推荐将它配置成 Main GPS。 先查看现有参数: ```sh param show GPS_1_CONFIG param show GPS_2_CONFIG ``` 然后设置: ```sh param set GPS_1_CONFIG 202 param set GPS_2_CONFIG 0 param save reboot ``` 设置结果表示: ```text Main GPS → GPS2物理口 → /dev/ttyS6 Secondary GPS → 禁用 ``` `GPS_1_CONFIG` 和 `GPS_2_CONFIG` 都属于需要重启后生效的串口配置参数。 不要同时把两个 GPS 实例配置到同一个物理串口,否则会产生串口占用冲突。 --- ## 5. 重启后的验证步骤 ### 5.1 检查 GPS 驱动状态 ```sh gps status ``` 首先确认端口已经变成: ```text port: /dev/ttyS6 ``` 如果串口和模块正常,应看到: ```text status: OK rate reading: 非0 B/s ``` 波特率也应被自动检测为一个实际值,而不是长期保持 `0`。 ### 5.2 检查原始 GPS 数据 ```sh listener sensor_gps -n 5 ``` 重点字段: | 字段 | 含义 | 正常表现 | |---|---|---| | `timestamp` | 数据时间戳 | 每次输出持续增加 | | `fix_type` | 定位类型 | 室外最终至少达到 `3` | | `satellites_used` | 使用的卫星数量 | 室外逐渐增加并趋于稳定 | | `latitude_deg` | 纬度 | 定位后为有效值 | | `longitude_deg` | 经度 | 定位后为有效值 | | `altitude_msl_m` | 海拔高度 | 定位后为有效值 | | `eph` | 水平精度估计 | 定位后逐渐降低并稳定 | | `epv` | 垂直精度估计 | 定位后逐渐降低并稳定 | | `vel_m_s` | 地面速度 | 静止时接近0 | 常见 `fix_type`: | 数值 | 含义 | |---:|---| | `0` | 没有有效 GPS | | `1` | 没有定位 | | `2` | 2D定位 | | `3` | 3D定位 | | `4` | DGPS | | `5` | RTK Float | | `6` | RTK Fixed | GPS在室内可能已经有非零串口数据,但长时间无法达到 `3D Fix`。这表示通信已经建立、卫星信号不足,和 `rate reading: 0 B/s` 是不同问题。 ### 5.3 检查 EKF2 是否融合 GPS ```sh ekf2 status ``` 然后查看融合标志: ```sh listener estimator_status_flags -n 1 ``` 重点关注类似字段: ```text cs_gnss_pos: True cs_gnss_vel: True ``` 只有 `sensor_gps` 有数据,不代表 EKF 一定已经采用它。EKF还会检查定位类型、精度、数据质量和稳定时间。 ### 5.4 检查最终位置输出 ```sh listener vehicle_global_position -n 3 listener vehicle_local_position -n 3 ``` 判断链路如下: ```text GPS串口收到字节 │ ▼ gps驱动解析UBX数据 │ ▼ sensor_gps持续发布 │ ▼ EKF2检查质量并融合 │ ▼ vehicle_global_position / vehicle_local_position ``` --- ## 6. 推荐的一次性检查命令 重启飞控后,按顺序执行: ```sh param show GPS_1_CONFIG param show GPS_2_CONFIG gps status listener sensor_gps -n 5 ekf2 status listener estimator_status_flags -n 1 listener vehicle_global_position -n 3 listener vehicle_local_position -n 3 ``` 预期参数应为: ```text GPS_1_CONFIG = 202 GPS_2_CONFIG = 0 ``` --- ## 7. 如果改为 GPS2 后仍然没有数据 如果重启后已经看到: ```text port: /dev/ttyS6 ``` 但仍然是: ```text status: NOT OK rate reading: 0 B/s ``` 说明参数端口已经正确,问题转向硬件、线序或设备类型。按以下顺序检查。 ### 7.1 检查供电 - GPS模块指示灯是否亮。 - GPS2接口是否有正确供电电压。 - GPS模块需要的电压是否与飞控接口兼容。 - 插头是否完全插入、方向是否正确。 ### 7.2 检查 UART 线序 UART连接需要交叉: ```text GPS TX → 飞控 RX GPS RX → 飞控 TX GPS GND → 飞控 GND GPS VCC → 正确电源 ``` 不同厂家即使使用相同外形插头,针脚顺序也不一定一致。不能仅凭插头能插入就认定线序兼容,必须核对 CUAV 7-Nano 与 GPS 模块各自的针脚定义。 ### 7.3 确认 GPS 接口类型 确认模块输出的是哪一种接口: - UART UBX - UART NMEA - DroneCAN/UAVCAN 如果模块是 DroneCAN GPS,就不应插在普通 UART GPS2 口并由 `gps` 串口驱动读取。DroneCAN设备应连接 CAN 接口,并检查: ```sh uavcan status ``` ### 7.4 检查串口占用 确认 GPS2 没有同时配置给: - MAVLink - 遥控接收机 - DShot遥测 - 其他串口驱动 - Secondary GPS的另一个实例 一个物理串口通常只能由一个驱动占用。 ### 7.5 检查协议和波特率 通常保持 GPS协议自动检测即可。当前输出已经显示协议为 UBX,但如果始终没有任何接收字节,首先仍应检查供电、线序和端口,而不是反复修改协议参数。 --- ## 8. 如果将来安装两个 GPS 如果将来同时在 GPS1 和 GPS2 各安装一个串口 GPS,可以配置: ```sh param set GPS_1_CONFIG 201 param set GPS_2_CONFIG 202 param save reboot ``` 对应关系: ```text Main GPS → GPS1 → /dev/ttyS0 Secondary GPS → GPS2 → /dev/ttyS6 ``` 两个 GPS 发布时,`sensor_gps` 会存在多个实例。可以使用: ```sh listener sensor_gps -i 0 -n 3 listener sensor_gps -i 1 -n 3 ``` 具体 `listener` 参数以当前固件中的 `listener help` 输出为准。 --- ## 9. 当前结论 当前状态不是“GPS有数据但没有卫星定位”,而是: ```text GPS插在GPS2物理口 │ ▼ PX4仍在读取GPS1对应的/dev/ttyS0 │ ▼ 读取速率为0 B/s │ ▼ GPS状态NOT OK ``` 当前应先应用: ```sh param set GPS_1_CONFIG 202 param set GPS_2_CONFIG 0 param save reboot ``` 重启后,以 `gps status` 是否显示 `/dev/ttyS6` 和非零 `rate reading` 作为第一步验证。通信正常后,再到室外等待 `fix_type >= 3`,最后确认 EKF2 已经融合 GNSS 位置和速度。