GPS机制分析(1)

1. android gps实现方案

整个流程图如下,

img

android 系统中高通定位方案架构图如下,

img

​ GPS Application(各种GPS定位的apk)都通过android系统的LocationManager对GPS进行打开/关闭/启动等操作。然后等待数据的上报。所以架构中有2个流程,由上往下的控制流,由下往上的数据流。

  1. GPS Application和LocationManagerService所在进程通过Binder机制进行跨进程调用。

  2. GpsLocationProvider和com_android_server_location_GpsLocationProvide以及com_android_server_location_GpsLocationProvide和gps.so库相互之间都是通过数据结构进行回调。其实, com_android_server_location_GpsLocationProvide只是Framework和HAL之间的一个桥梁。

  3. HAL的gps.so库和Modem通过高通的QMI机制进行数据传输,并且数据的格式是NMEA类型。

2. gps数据结构

​ \hardware\libhardware\include\hardware\gps.h,定义了GPS底层相关的结构体和接口;GpsLocation 包含经纬度海拔,速度,定位的精度等卫星信息;

typedef struct {
    size_t          size;
    uint16_t        flags;
    double          latitude;
    double          longitude;
    double          altitude;
    float           speed;
    float           bearing;
    float           accuracy;
    GpsUtcTime    timestamp;
} GpsLocation;

GpsStatus:GPS的状态;

typedef struct {
    size_t          size;
    GpsStatusValue status;
} GpsStatus;

status有未知、正在定位、停止定位、启动未定义、未启动五种状态,

typedef uint16_t GpsStatusValue;
#define GPS_STATUS_NONE             0
#define GPS_STATUS_SESSION_BEGIN    1
#define GPS_STATUS_SESSION_END      2
#define GPS_STATUS_ENGINE_ON        3
#define GPS_STATUS_ENGINE_OFF       4

GpsSvInfo 包含卫星ID、信噪比等信息,定义如下,

typedef struct {
    size_t          size;
    int     prn;
    float   snr;
    float   elevation;
    float   azimuth;
} GpsSvInfo;

GpsSvStatus 包含可视卫星数、星历时间、年历时间等信息;

typedef struct {
    size_t          size;
    int         num_svs;
    GpsSvInfo   sv_list[GPS_MAX_SVS];
    uint32_t    ephemeris_mask;
    uint32_t    almanac_mask;
    uint32_t    used_in_fix_mask;
} GpsSvStatus;

GpsCallbacks对应JNI的回调方法,

typedef struct {
    size_t      size;
    gps_location_callback location_cb;
    gps_status_callback status_cb;
    gps_sv_status_callback sv_status_cb;
    gps_nmea_callback nmea_cb;
    gps_set_capabilities set_capabilities_cb;
    gps_acquire_wakelock acquire_wakelock_cb;
    gps_release_wakelock release_wakelock_cb;
    gps_create_thread create_thread_cb;
    gps_request_utc_time request_utc_time_cb;
} GpsCallbacks;

GpsInterface:JNI层通过此接口与HAL进行交互;

typedef struct {
    size_t          size;
    int   (*init)( GpsCallbacks* callbacks );
    int   (*start)( void );
    int   (*stop)( void );
    void  (*cleanup)( void );
    int   (*inject_time)(GpsUtcTime time, int64_t timeReference,
                         int uncertainty);
    int  (*inject_location)(double latitude, double longitude, float accuracy);
    void  (*delete_aiding_data)(GpsAidingData flags);
    int   (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence,
            uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time);
    const void* (*get_extension)(const char* name);
} GpsInterface;

gps_device_t:GPS设备结构体,继承自hw_device_t,硬件适配接口,向上层提供了get_gps_interface接口;

struct gps_device_t {
    struct hw_device_t common;
    const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev);
};

小结:

  1. 介绍了android系统中gps的结构;

  2. 分析了gps中基本的数据结构以及含义。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STL是C++标准模板库的缩写,它提供了一系列的模板类和函数,用于实现各种容器、算法和迭代器等,提供了丰富的功能和标准化的接口。 而GPS则是一种卫星导航系统,通过接收卫星发射的信号,可以确定地面点的位置坐标。 结合这两个概念,假设我们希望使用C++ STL来编写一个GPS代码,来实现一些基本的功能,比如获取当前位置、计算两点之间的距离等。 首先,我们可以使用STL提供的容器来存储经纬度信息,比如可以使用vector来存储。每个点的经纬度可以用一个结构体表示: ```cpp struct Position { double latitude; // 纬度 double longitude; // 经度 }; std::vector<Position> positions; ``` 然后,可以使用STL提供的算法来实现一些功能,比如计算两点之间的距离。可以使用Haversine公式来计算两个经纬度坐标对应的球面距离: ```cpp double haversineDistance(const Position& pos1, const Position& pos2) { double lat1 = pos1.latitude * M_PI / 180.0; double lon1 = pos1.longitude * M_PI / 180.0; double lat2 = pos2.latitude * M_PI / 180.0; double lon2 = pos2.longitude * M_PI / 180.0; double dlon = lon2 - lon1; double dlat = lat2 - lat1; double a = sin(dlat / 2) * sin(dlat / 2) + cos(lat1) * cos(lat2) * sin(dlon / 2) * sin(dlon / 2); double c = 2 * atan2(sqrt(a), sqrt(1 - a)); double distance = 6371 * c; // 地球半径为6371km return distance; } ``` 当然,以上只是一个简单的示例,实际应用中还需要考虑很多其他因素,比如坐标系转换、误差校正等。但通过使用STL,我们可以更方便地管理和操作数据,提高代码的可读性和可维护性。 ### 回答2: C++ STL是一种包含各种容器和算法的标准库,用于简化和加速C++程序的开发。GPS(全球定位系统)是一种利用卫星信号进行定位和导航的技术。要使用STL来编写GPS代码,可以使用STL容器和算法来管理和处理GPS数据。 首先,可以使用STL容器中的vector来存储GPS数据。vector是一种动态数组,可以根据需要自动调整大小。在这个vector中,可以存储GPS的位置信息,如经度、纬度和海拔高度等。 然后,可以使用STL算法来对GPS数据进行处理和分析。例如,可以使用STL中的sort算法对GPS数据进行排序,以便按照位置从近到远的顺序进行处理。还可以使用STL中的find算法来查找特定的GPS数据,如查找特定经度和纬度的位置。 此外,还可以使用STL中的迭代器(iterator)来遍历GPS数据。迭代器提供了一种方便和统一的方式来访问和操作容器中的元素。通过使用迭代器,可以遍历整个GPS数据集,并对每个位置进行必要的处理。 最后,可以使用STL中的其他算法和数据结构来进一步扩展GPS代码的功能。例如,可以使用STL中的map来实现位置和地址之间的映射关系,以便根据特定地址查询对应的GPS坐标。 总之,使用C++ STL可以方便地管理和处理GPS数据,提供了强大的容器和算法支持。这个库可以大大简化GPS代码的开发过程,并提高程序的效率和可维护性。 ### 回答3: STL(Standard Template Library)是C++的一个重要特性,其中包括了许多常用的数据结构和算法。GPS(General Positioning System)是一种全球定位系统,用于确定物体在地球上的位置。 在C++中,可以使用STL来编写处理GPS数据的代码。首先,可以使用STL提供的容器类(如vector、list等)来保存GPS数据,例如经度和纬度等信息。 接下来,可以使用STL提供的算法来对GPS数据进行处理。例如,可以使用算法库中的sort函数来将GPS数据按照经度或纬度进行排序,以便进一步分析和处理。 此外,STL还提供了一些用于处理字符串的函数,可以用于解析GPS数据中的其他信息,例如时间戳、海拔高度等。 除了容器和算法,STL还提供了迭代器(iterator)的概念,可以用于遍历容器中的元素。在处理GPS数据时,可以使用迭代器来逐个访问数据,并进行相关计算或输出。 最后,可以利用STL的异常处理机制,对可能出现的异常情况进行捕获和处理。例如,在解析GPS数据时,如果数据格式不符合预期,可以使用try-catch块来捕获异常并进行相应的错误处理。 综上所述,使用STL编写GPS代码可以利用STL提供的容器、算法、迭代器和异常处理等特性,方便地对GPS数据进行处理和分析,从而实现全球定位系统的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值