【Apollo源码分析】系列的第五部分【localization】

Apollo的定位模块(localization)是其核心组件之一,主要依赖RTK-GPS技术实现厘米级精度定位。输入包括GPS和IMU信号,输出为LocalizationEstimate定位信息。RTK-GPS基于基准站和流动站的载波相位差分,通过数据链实时传递信息。文章还介绍了localization模块的主要文件,如main.cc、localization.h等,并探讨了RTKLocalization和CameraLocalization的实现。未来改进方向包括多传感器融合和降低成本。
摘要由CSDN通过智能技术生成

【Apollo源码分析】系列的第五部分【localization】

localization 是车辆 定位模块,是自动驾驶的核心模块之一。 
目前Apollo的定位模块大概有1000行代码。

localization的输入:

  • GPS全球信号
  • IMU惯性测量单元信号

localization的输出:

  • 由localization/proto/localization.proto文件描述的LocalizationEstimate定位信息

目前Apollo 1.0采用的是 RTK-GPS定位法。

RTK-GPS定位法:

  • RTK(Real - time kinematic)载波相位差分技术,是实时处理两个测量站载波相位观测量的差分方法,将基准站采集的载波相位发给用户接收机,进行求差解算坐标。这是一种新的常用的GPS测量方法,以前的静态、快速静态、动态测量都需要事后进行解算才能获得厘米级的精度,而RTK是能够在野外实时得到厘米级定位精度的测量方法,它采用了载波相位动态实时差分方法,是GPS应用的重大里程碑,它的出现为工程放样、地形测图,各种控制测量带来了新曙光,极大地提高了外业作业效率。
  • 高精度的GPS测量必须采用载波相位观测值,RTK定位技术就是基于载波相位观测值的实时动态定位技术,它能够实时地提供测站点在指定坐标系中的三维定位结果,并达到厘米级精度。在RTK作业模式下,基准站通过数据链将其观测值和测站坐标信息一起传送给流动站。流动站不仅通过数据链接收来自基准站的数据,还要采集GPS观测数据,并在系统内组成差分观测值进行实时处理,同时给出厘米级定位结果,历时不足一秒钟。流动站可处于静止状态,也可处于运动状态;可在固定点上先进行初始化后再进入动态作业,也可在动态条件下直接开机,并在动态环境下完成整周模糊度的搜索求解。在整周未知数解固定后,即可进行每个历元的实时处理,只要能保持四颗以上卫星相位观测值的跟踪和必要的几何图形,则流动站可随时给出厘米级定位结果。

GPS-RTK 至少有一个基准站接收机,一个流动站接收机。

基准站的接收机有两个任务:

  • 1)接收卫星信号
  • 2)把自己的观测量通过发送给流动站

流动站有三个任务:

  • 1)接收卫星信号
  • 2)接收基准站所发送的基准站观测量
  • 3)对卫星信号与基准站观测量进行对比处理,从而对自己的观测量进行修正

关于RTK-GPS可以参阅: 
[1]https://en.wikipedia.org/wiki/Real_Time_Kinematic 
[2]https://baike.baidu.com/item/RTK 
[3]https://www.zhihu.com/question/24471733/answer/28676022 
[4]http://www.sbsm.gov.cn/article/zszygx/chzs/chkp/ddcl/200912/20091200059052.shtml


localization/main.cc

照例先看看 localization文件夹下面最重要的文件main.cc 写了什么:

 
 
 
  1. #include "modules/common/apollo_app.h"
  2. #include "modules/localization/localization.h"
  3. APOLLO_MAIN(::apollo::localization::Localization)

结合common/apollo_app.h文件,上述代码一看便知是用于注册localization模块,并运行本模块。而本文件没有重写ApolloApp类就不能实例化,那么只能是localization.h文件重写了ApolloApp类。

localization/localization.h

 
 
 
  1. class Localization : public apollo::common::ApolloApp
  2. 果然,Localization类继承了ApolloApp类,并重写了父类的纯虚函数接口。

重写的接口有:

 
 
 
  1. std::string Name() const override;
  2. 模块名称
 
 
 
  1. apollo::common::Status Init() override;
  2. 初始化步骤
 
 
 
  1. apollo::common::Status Start() override;
  2. 模块执行内容
 
 
 
  1. void Stop() override;
  2. 模块清理内容

以上全都是public访问权限。

本模块独有的 private函数有:

 
 
 
  1. void RegisterLocalizationMethods();
  2. 工厂函数。注册RTK定位实例和CAMERA定位实例。

再看看localization.cc.cc文件源码:

 
 
 
  1. std::string Localization::Name() const {
  2. return FLAGS_localization_module_name;//模块名称
  3. }
  4. void Localization::RegisterLocalizationMethods() {
  5. localization_factory_.Register(//工厂函数。注册RTK定位方法的实例。
  6. LocalizationConfig::RTK,
  7. []() -> LocalizationBase* { return new RTKLocalization(); });
  8. localization_factory_.Register(
  9. LocalizationConfig::CAMERA,//工厂函数。注册CAMERA定位方法实例。
  10. []() -> LocalizationBase* { return new CameraLocalization(); });
  11. }
  12. Status Localization::Init() { //初始化操作,包括获取配置文件信息+注册定位方法实例
  13. RegisterLocalizationMethods();
  14. if (!apollo::common::util::GetProtoFromFile(FLAGS_localization_config_file,
  15. &config_)) {
  16. AERROR << "failed to load localization config file "
  17. << FLAGS_localization_config_file;
  18. return Status(ErrorCode::LOCALIZATION_ERROR,
  19. "failed to load localization config file: " +
  20. FLAGS_localization_config_file);
  21. }
  22. return Status::OK();
  23. }
  24. Status Localizati
  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Apollo Routing 是 Apollo Client 的一个功能模块,用于处理客户端的路由和导航。它提供了一组 API 和工具,使得在 GraphQL 客户端进行页面导航和路由管理变得更简单。 Apollo Routing 的源码主要包括以下几个部分: 1. `Router` 类:这是 Apollo Routing 的核心类,负责管理路由状态和导航。它使用浏览器的 `history` API 来监听 URL 变化,并根据变化更新路由状态。`Router` 类还提供了一组方法,用于注册和处理路由变化的回调函数。 2. `Route` 组件:这是一个 React 组件,用于声明式地定义路由与组件的映射关系。每个 `Route` 组件都包含一个 `path` 属性和一个 `component` 属性,用于指定 URL 匹配规则和对应的组件。 3. `Link` 组件:这是一个 React 组件,用于生成带有正确 URL 的链接。它会通过 `Router` 类提供的 API 来更新 URL,并触发路由变化。 4. `Switch` 组件:这是一个 React 组件,用于在多个 `Route` 组件之间选择匹配的路由。它会遍历所有子组件,并渲染第一个匹配成功的 `Route` 组件。 5. `useRouter` Hook:这是一个自定义的 React Hook,用于在函数组件获取 `Router` 实例。它会利用 React 的上下文(context)机制,从根组件向下传递 `Router` 实例。 以上是 Apollo Routing 的主要源码组成部分。通过分析这些源码,我们可以更深入地了解 Apollo Routing 的实现原理和使用方式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值