编辑 | blame | 历史 | 原始文档

GPS GPRMI和GPIMU数据解析实现说明

概述

本次实现为STM32H7割草机项目添加了GPRMI(GPS/INS组合定位)和GPIMU(IMU传感器)数据包的解析功能。

修改文件

1. GPS.h - 添加数据结构和函数声明

  • ST_GPRMI: 存储GPRMI数据的结构体(23个字段)
  • UTC时间、周数、周内时间
  • 纬度、经度、高程及其标准差
  • 三轴速度及标准差
  • 姿态角(俯仰、侧倾、翻滚)及标准差
  • 基线距离、卫星数、定位质量
  • ST_GPIMU: 存储GPIMU数据的结构体(9个字段)

  • UTC时间
  • 三轴加速度(g)
  • 三轴角速度(°/s)
  • 传感器温度
  • 异或校验和
  • 新增函数:

  • GPS_GetGPRMI(): 获取最新GPRMI数据
  • GPS_GetGPIMU(): 获取最新GPIMU数据

2. GPS.c - 实现解析逻辑

添加的静态变量

static ST_GPRMI l_stGPRMI;  // 存储最新GPRMI数据
static ST_GPIMU l_stGPIMU;  // 存储最新GPIMU数据

修改的结构体

ST_GPSRecv - 增加了Header4和Header5以识别GPRMI和GPIMU
           - 接收缓冲区从128增加到256字节

新增解析函数

  • GPS_ParseGPRMI(): 解析23个字段的GPRMI数据
  • 使用HIDO_UtilParseFormat()按格式解析
  • 进行数据校验(GPS_DataCheck)
  • 转换字符串为相应数值类型
  • 设置有效标志
  • GPS_ParseGPIMU(): 解析9个字段的GPIMU数据

  • 解析8个数据字段 + 1个校验字段
  • 计算并验证异或校验和(可选)
  • 设置有效标志

修改的函数

  • GPS_RecvFsm(): 状态机识别新增的$GPRMI和$GPIMU头
  • GPS_Init(): 初始化Header4和Header5

数据格式

GPRMI格式

$GPRMI,<1>,<2>,<3>,<4>,<5>,...,<23>*<校验><CR><LF>

关键字段:
- 定位质量指示:0=无效, 1=单点, 2=差分, 4=固定, 5=浮点
- 三轴速度:东向、北向、天顶方向
- 姿态角:俯仰、侧倾、翻滚

GPIMU格式

$GPIMU,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>*<CR><LF>

关键字段:
- 三轴加速度(g)
- 三轴角速度(°/s)
- 传感器温度(℃)

使用方法

1. 在应用层获取GPRMI数据

ST_GPRMI stGPRMI;
if (GPS_GetGPRMI(&stGPRMI) == HIDO_OK) {
    // 使用stGPRMI数据
    double lat = stGPRMI.m_dLatitude;
    double lon = stGPRMI.m_dLongitude;
    float alt = stGPRMI.m_fAltitude;
    uint8_t quality = stGPRMI.m_u8PositionQuality;
}

2. 在应用层获取GPIMU数据

ST_GPIMU stGPIMU;
if (GPS_GetGPIMU(&stGPIMU) == HIDO_OK) {
    // 使用stGPIMU数据
    float accelX = stGPIMU.m_fAccelX;
    float gyroZ = stGPIMU.m_fGyroZ;
    float temp = stGPIMU.m_fTemperature;
}

3. 定期轮询示例

void app_task(void *pvParameters)
{
    GPS_Init();
    // ...其他初始化
    
    while (1)
    {
        GPS_Poll();  // 自动接收并解析数据
        
        // 定期读取解析结果
        ST_GPRMI gprmi;
        if (GPS_GetGPRMI(&gprmi) == HIDO_OK) {
            // 处理定位数据
        }
        
        // ...其他处理
    }
}

工作流程

  1. 数据接收: GPS模块通过UART2发送数据
  2. 状态机识别: GPS_RecvFsm()识别$GPRMI或$GPIMU头
  3. 数据缓存: 接收完整句子(直到\r\n)
  4. 格式解析: 调用对应解析函数
  5. 数据校验: 验证校验和(GPRMI使用*号校验,GPIMU使用异或)
  6. 存储更新: 更新静态变量l_stGPRMIl_stGPIMU
  7. 应用读取: 通过GPS_GetGPRMI()GPS_GetGPIMU()获取最新数据

注意事项

  1. 线程安全: 解析函数在GPS_Poll()中调用,通常在单一任务中,无需加锁
  2. 数据有效性: 使用m_bValid标志判断数据是否有效
  3. 缓冲区大小: 已将接收缓冲区扩大到256字节以容纳GPRMI的长数据包
  4. 校验和: GPIMU的异或校验目前已实现但未强制验证,可根据需要启用
  5. 时间格式:
  • GPRMI: UTC时间存储为hhmmss.ss * 100(整数)
  • GPIMU: UTC时间存储为hhmmss.sss * 1000(毫秒)

测试建议

  1. 使用串口工具发送测试数据验证解析正确性
  2. 检查定位质量字段确保RTK固定解(值为4)
  3. 监测IMU数据频率和温度漂移
  4. 验证姿态角数据与实际倾斜一致

文件清单

  • GPS.h - 数据结构和函数声明
  • GPS.c - 解析实现
  • GPS_Usage_Example.c - 使用示例和详细注释

版本信息

  • 创建日期: 2025年11月11日
  • 作者: www.hido-studio.com
  • 基于项目: Lawnmower_STM32H7