Skip to content

GNSS 驱动

源码路径: modules/drivers/gnss/

概述

GNSS 驱动模块负责从 GNSS 接收机读取原始卫星导航数据,并将解析后的定位信息发布到 CyberRT 通信总线。该模块作为 CyberRT Component 运行,支持多种 GNSS 接收机协议(Novatel、uBlox、Huace、Asensing、BroadGNSS)及多种连接方式(串口、TCP、UDP、NTRIP、CAN)。同时支持 RTK 差分修正数据的收发,可对接 NTRIP 服务获取实时差分改正数,实现厘米级定位精度。

核心类

GnssDriverComponent

继承自 apollo::cyber::Component<>,是 GNSS 驱动的 CyberRT 入口组件。负责加载配置文件并启动 RawStream 实例。

cpp
class GnssDriverComponent : public Component<> {
 public:
  GnssDriverComponent();
  bool Init() override;

 private:
  std::unique_ptr<RawStream> raw_stream_ = nullptr;
  apollo::common::monitor::MonitorLogBuffer monitor_logger_buffer_;
};

CYBER_REGISTER_COMPONENT(GnssDriverComponent)
成员说明
raw_stream_GNSS 原始数据流管理器,封装了所有流连接和数据解析逻辑
monitor_logger_buffer_监控日志缓冲器,类别为 MonitorMessageItem::GNSS

RawStream

GNSS 数据流核心管理类,负责建立与 GNSS 接收机的连接、接收原始数据、发送 RTK 修正数据,并协调多个解析器完成数据解析与发布。

cpp
class RawStream {
 public:
  RawStream(const config::Config& config,
            const std::shared_ptr<apollo::cyber::Node>& node);
  ~RawStream();
  bool Init();
  void Start();

 private:
  void DataSpin();
  void RtkSpin();
  bool Connect();
  bool Disconnect();
  bool Login();
  bool Logout();
  // ...
};
成员说明
data_stream_ / command_stream_数据流和命令流连接
in_rtk_stream_ / out_rtk_stream_RTK 差分数据的输入/输出流
data_parser_ptr_GNSS 原始数据解析器
rtcm_parser_ptr_RTCM 差分修正数据解析器
data_thread_ptr_ / rtk_thread_ptr_数据接收和 RTK 处理的工作线程
raw_writer_ / rtcm_writer_原始数据和 RTCM 数据的 CyberRT Writer
stream_writer_流状态信息的 CyberRT Writer

核心函数

GnssDriverComponent::Init()

组件初始化入口。从配置文件加载 config::Config,创建 RawStream 并调用其 Init()Start() 方法。

cpp
bool GnssDriverComponent::Init() {
  config::Config gnss_config;
  if (!apollo::cyber::common::GetProtoFromFile(config_file_path_,
                                               &gnss_config)) {
    monitor_logger_buffer_.ERROR("Unable to load gnss conf file: " +
                                 config_file_path_);
    return false;
  }
  raw_stream_.reset(new RawStream(gnss_config, node_));
  if (!raw_stream_->Init()) {
    monitor_logger_buffer_.ERROR("Init gnss stream failed");
    return false;
  }
  raw_stream_->Start();
  return true;
}

RawStream::Init()

初始化所有通信流(数据流、命令流、RTK 流),创建 DataParserRtcmParser 实例,建立 CyberRT Writer/Reader 通道。

RawStream::Start()

启动数据接收线程 DataSpin 和 RTK 处理线程 RtkSpin,开始持续读取和处理 GNSS 数据。

RawStream::DataSpin() / RtkSpin()

分别在独立线程中运行:DataSpin 持续从数据流读取原始字节并交给 DataParser 解析发布;RtkSpin 从 NTRIP 或其他来源接收 RTK 差分修正数据并转发给接收机。

RawStream::Connect() / Login()

建立与 GNSS 接收机的物理连接(串口/TCP/UDP),并发送登录指令序列完成接收机初始化配置。

配置

GNSS 驱动通过 protobuf 配置文件(config::Config)进行参数设定,主要配置项如下:

字段类型说明
dataStream必填,数据读取端口,指定接收机连接方式和数据格式
commandStream命令发送端口,不配置时使用 data 端口
rtk_fromStreamRTK 差分数据来源,通常为 NTRIP 服务
rtk_toStreamRTK 差分数据发送端口,不配置时使用 data 端口
login_commandsrepeated bytes登录命令序列
logout_commandsrepeated bytes登出命令序列
rtk_solution_typeRtkSolutionTypeRTK 解算方式:接收机解算 或 软件解算
imu_typeImuTypeIMU 类型(如 STIM300、ISA100、ADIS16488 等)
proj4_textstring坐标投影参数(Proj4 格式)
tfTFTF 坐标变换配置
use_gnss_timebool是否使用 GNSS 时间戳,默认 true
gpsbin_folderstringGPS 原始二进制数据存储目录

Stream 支持 Serial(串口)、TcpUdpNtripCAN 五种连接类型,并通过 format 字段指定数据格式(NMEA、Novatel Binary、uBlox Binary 等)。

调用关系

text
CyberRT 框架
  └── GnssDriverComponent::Init()
        ├── GetProtoFromFile() — 加载 GNSS 配置
        ├── RawStream::Init() — 初始化流连接与解析器
        │     ├── Connect() — 建立数据/命令/RTK 流连接
        │     ├── Login() — 发送登录指令
        │     ├── DataParser 创建 — 原始数据解析器
        │     └── RtcmParser 创建 — RTCM 差分数据解析器
        └── RawStream::Start() — 启动数据处理
              ├── DataSpin 线程 — 持续读取数据并解析发布
              └── RtkSpin 线程 — 接收并转发 RTK 差分数据

贡献者

页面历史