GPS 定位信息获取(北斗星通 GPS)

GPS 定位信息获取(1)

首先回顾北斗星通 GPS 数据获取(1)~(5)

  • gps_pub.cpp 将接收到的串口数据转化为GPS的经纬度信息
  • gps_path.cpp 将经纬度信息转化为全局坐标系下的XY值,以第一个GPS经纬度为原点

目前已确定可以接收差分数据,但是 GPGGA 指令只能获取经纬度信息,无法获取航向信息

GPRMC 指令

查阅指令手册发现 GPRMC 指令可以位置、速度、航向等期望的信息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Heading 模式指令

要获取航向角信息需要满足一定的条件,即需要开启 Heading 模式

在这里插入图片描述

💡 本指令用于设置支持单板卡(模块)双天线定向的接收机(UB482、UM482、UM442)

车载接收机的型号是 NC502 系列,内置板卡 UB482,支持 Heading 模式

在这里插入图片描述

接收机及蘑菇头安装

按照《NPOS220S接收机操作使用说明书》中的说明,接收机和双天线的安装需要满足如下要求

在这里插入图片描述
在这里插入图片描述
但是由于接收机型号不同,本接收机机身并未标有 X/Y/Z 轴指向,可能需要根据实际的数据判断


GPS 定位信息获取(2)

下午把车开出去跑了一下,没有开下坡,直接从台阶那边搬下去,没有开很远,所幸没坏

用 cutecom 获取数据,原始数据如下

[16:52:13:433] $command,gprmc 1,response: OK*24␍␊
[16:52:14:643] $GPRMC,085115.00,A,3150.93331124,N,11717.59467080,E,0.014,5.3,101123,5.6,W,D*21␍␊
[16:52:15:643] $GPRMC,085116.00,A,3150.93332581,N,11717.59468186,E,0.041,59.4,101123,5.6,W,D*1C␍␊
[16:52:16:641] $GPRMC,085117.00,A,3150.93333013,N,11717.59468264,E,0.066,81.7,101123,5.6,W,D*1E␍␊
[16:52:17:642] $GPRMC,085118.00,A,3150.93333688,N,11717.59468779,E,0.071,77.2,101123,5.6,W,D*16␍␊
[16:52:18:645] $GPRMC,085119.00,A,3150.93333483,N,11717.59468236,E,0.038,89.2,101123,5.6,W,D*1C␍␊
[16:52:19:646] $GPRMC,085120.00,A,3150.93334090,N,11717.59465670,E,0.061,337.7,101123,5.6,W,D*23␍␊
[16:52:20:646] $GPRMC,085121.00,A,3150.93331782,N,11717.59463967,E,0.082,331.4,101123,5.6,W,D*24␍␊
[16:52:21:646] $GPRMC,085122.00,A,3150.93330466,N,11717.59461499,E,0.089,238.0,101123,5.6,W,D*26␍␊

为了更接近串口通信获取到的数据,进行一些简单的处理

sed 's/^\[.*\] //' input.txt > output.txt
sed 's/..$//' input.txt > output.txt
  • s/^\[.*\] //:替换每一行开头的**[16:52:14:643]为空白。这里使用正则表达式 ^\[.*\] 匹配每一行开头的[16:52:14:643]**,然后用空白替换
  • 使用正则表达式 ..$ 匹配每一行末尾的最后两个字符,然后将其替换为空白

处理后如下

$command,gprmc 1,response: OK*24
$GPRMC,085115.00,A,3150.93331124,N,11717.59467080,E,0.014,5.3,101123,5.6,W,D*21
$GPRMC,085116.00,A,3150.93332581,N,11717.59468186,E,0.041,59.4,101123,5.6,W,D*1C
$GPRMC,085117.00,A,3150.93333013,N,11717.59468264,E,0.066,81.7,101123,5.6,W,D*1E
$GPRMC,085118.00,A,3150.93333688,N,11717.59468779,E,0.071,77.2,101123,5.6,W,D*16
$GPRMC,085119.00,A,3150.93333483,N,11717.59468236,E,0.038,89.2,101123,5.6,W,D*1C
$GPRMC,085120.00,A,3150.93334090,N,11717.59465670,E,0.061,337.7,101123,5.6,W,D*23
$GPRMC,085121.00,A,3150.93331782,N,11717.59463967,E,0.082,331.4,101123,5.6,W,D*24

注意进行 3 组实验

  1. 原地顺时针转向 — clockwise.txt
  2. 原地逆时针转向 — anticlockwise.txt
  3. 任意轨迹运动 — path.txt

GPRMC 指令的纬度、经度、航向角信息分别对应 4、6、9 字段

在这里插入图片描述
在这里插入图片描述

参考陆辉东编写的 gps_sensor 功能包编写解析代码如下

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <boost/algorithm/string.hpp>
#include <vector>
#include <cstdlib>
#include <sstream>
#include <fstream>
#include <math.h>
using namespace std;

static double EARTH_RADIUS = 6371.393;//6378.137;//地球半径

struct my_pose
{
    double latitude;
    double longitude;
};

// 角度制转弧度制
double rad(double d)
{
    return d * 3.1415926 / 180.0;
}

int main(int argc, char **argv)
{
    const string filePath = "/home/redwall/catkin_ws/src/gps_sensor/log/2023-11-10/clockwise.txt";

    ifstream log_file(filePath);
    if (!log_file.is_open())
    {
        cerr << "Failed to open the file!" << endl;
        return -1;
    }

    bool is_init_pose = false;
    my_pose init_pose;

    string one_line;
    vector<string> raw_strs;

    while (getline(log_file, one_line))
    {
        // split one line data by ","
        boost::split(raw_strs, one_line, boost::is_any_of(","));
        cout << "raw data:" << raw_strs[3] << "\t" << raw_strs[5] << "\t" << raw_strs[8] << endl;

        double latitude, longitude, heading_angle;
        vector<string> data_strs;
        boost::split(data_strs, raw_strs[3], boost::is_any_of("."));
        latitude = atoi(data_strs[0].c_str()) / 100 + (atoi(data_strs[0].c_str()) % 100 + atoi(data_strs[1].c_str()) / 100000000.0) / 60.0;
        
        boost::split(data_strs, raw_strs[5], boost::is_any_of("."));
        longitude = atoi(data_strs[0].c_str()) / 100 + (atoi(data_strs[0].c_str()) % 100 + atoi(data_strs[1].c_str()) / 100000000.0) / 60.0;
        
        heading_angle = stod(raw_strs[8]);
        cout << "latitude: " << latitude << "\tlongitude: " << longitude << "\theading_angle: " << heading_angle << endl;

        if (!is_init_pose)
        {
            init_pose.latitude = latitude;
            init_pose.longitude = longitude;
            is_init_pose = true;
        }
        else
        {
            // 计算相对位置
            double radLat1, radLat2, radLong1, radLong2, delta_lat, delta_long;
            radLat1 = rad(init_pose.latitude);
            radLong1 = rad(init_pose.longitude);
            radLat2 = rad(latitude);
            radLong2 = rad(longitude);
            // 计算x
            delta_lat = radLat2 - radLat1;
            delta_long = 0;
            double x = 2 * asin(sqrt(pow(sin(delta_lat / 2), 2) + cos(radLat1) * cos(radLat2) * pow(sin(delta_long / 2), 2)));
            x = x * EARTH_RADIUS * 1000;

            // 计算y
            delta_lat = 0;
            delta_long = radLong1 - radLong2;
            double y = 2 * asin(sqrt(pow(sin(delta_lat / 2), 2) + cos(radLat2) * cos(radLat2) * pow(sin(delta_long / 2), 2)));
            y = y * EARTH_RADIUS * 1000;

            cout << "x: " << x << "\ty: " << y << endl;
            cout << "---------" << endl;
        }
    }

    return 0;
}

输出如下,与原始数据中的对应字段相符

raw data:3150.93331124	11717.59467080	5.3
latitude: 31.8489	longitude: 117.293	heading_angle: 5.3
raw data:3150.93332581	11717.59468186	59.4
latitude: 31.8489	longitude: 117.293	heading_angle: 59.4
x: 0.0270035	y: 0.017412
---------
raw data:3150.93333013	11717.59468264	81.7
latitude: 31.8489	longitude: 117.293	heading_angle: 81.7
x: 0.03501	y: 0.01864
---------
raw data:3150.93333688	11717.59468779	77.2
latitude: 31.8489	longitude: 117.293	heading_angle: 77.2
x: 0.0475202	y: 0.0267478
---------
raw data:3150.93333483	11717.59468236	89.2
latitude: 31.8489	longitude: 117.293	heading_angle: 89.2
x: 0.0437208	y: 0.0181992
---------
raw data:3150.93334090	11717.59465670	337.7
latitude: 31.8489	longitude: 117.293	heading_angle: 337.7
x: 0.0549707	y: 0.022198
---------
raw data:3150.93331782	11717.59463967	331.4
latitude: 31.8489	longitude: 117.293	heading_angle: 331.4
x: 0.0121951	y: 0.0490088
---------
raw data:3150.93330466	11717.59461499	238.0
latitude: 31.8489	longitude: 117.293	heading_angle: 238
x: 0.0121951	y: 0.0878631
---------
raw data:3150.93333556	11717.59459573	269.0
latitude: 31.8489	longitude: 117.293	heading_angle: 269
x: 0.0450738	y: 0.118185
---------
raw data:3150.93335679	11717.59456484	265.9
latitude: 31.8489	longitude: 117.293	heading_angle: 265.9
x: 0.0844207	y: 0.166816
---------
raw data:3150.93336170	11717.59454041	282.2
latitude: 31.8489	longitude: 117.293	heading_angle: 282.2
x: 0.0935207	y: 0.205276
---------
raw data:3150.93338996	11717.59451834	294.5
latitude: 31.8489	longitude: 117.293	heading_angle: 294.5
x: 0.145897	y: 0.240022
---------
raw data:3150.93342933	11717.59450323	334.3
latitude: 31.8489	longitude: 117.293	heading_angle: 334.3
x: 0.218864	y: 0.26381
---------
raw data:3150.93345386	11717.59449815	338.9
latitude: 31.8489	longitude: 117.293	heading_angle: 338.9
x: 0.264327	y: 0.271807
---------
raw data:3150.93348823	11717.59450537	10.2
latitude: 31.8489	longitude: 117.293	heading_angle: 10.2
x: 0.328027	y: 0.260441
---------
raw data:3150.93353467	11717.59451156	6.5
latitude: 31.8489	longitude: 117.293	heading_angle: 6.5
x: 0.414097	y: 0.250696
---------
raw data:3150.93358054	11717.59453627	24.7
latitude: 31.8489	longitude: 117.293	heading_angle: 24.7
x: 0.499111	y: 0.211794
---------
raw data:3150.93360846	11717.59458635	56.9
latitude: 31.8489	longitude: 117.293	heading_angle: 56.9
x: 0.550857	y: 0.132952
---------
raw data:3150.93366693	11717.59460345	14.0
latitude: 31.8489	longitude: 117.293	heading_angle: 14
x: 0.659223	y: 0.106031
---------
raw data:3150.93370425	11717.59465149	47.7
latitude: 31.8489	longitude: 117.293	heading_angle: 47.7
x: 0.72839	y: 0.0304002
---------
raw data:3150.93372192	11717.59471207	63.2
latitude: 31.8489	longitude: 117.293	heading_angle: 63.2
x: 0.761139	y: 0.0649724
---------
raw data:3150.93370758	11717.59477295	87.8
latitude: 31.8489	longitude: 117.293	heading_angle: 87.8
x: 0.734562	y: 0.160817
---------
raw data:3150.93369450	11717.59483801	93.8
latitude: 31.8489	longitude: 117.293	heading_angle: 93.8
x: 0.71032	y: 0.263243
---------
raw data:3150.93367488	11717.59488022	116.6
latitude: 31.8489	longitude: 117.293	heading_angle: 116.6
x: 0.673957	y: 0.329695
---------
raw data:3150.93365466	11717.59492160	118.6
latitude: 31.8489	longitude: 117.293	heading_angle: 118.6
x: 0.636482	y: 0.394841
---------
raw data:3150.93361987	11717.59494557	122.0
latitude: 31.8489	longitude: 117.293	heading_angle: 122
x: 0.572003	y: 0.432577
---------
raw data:3150.93356921	11717.59496880	130.5
latitude: 31.8489	longitude: 117.293	heading_angle: 130.5
x: 0.478112	y: 0.469149
---------
raw data:3150.93353325	11717.59498063	148.4
latitude: 31.8489	longitude: 117.293	heading_angle: 148.4
x: 0.411465	y: 0.487773
---------
raw data:3150.93347774	11717.59498615	164.2
latitude: 31.8489	longitude: 117.293	heading_angle: 164.2
x: 0.308585	y: 0.496464
---------
raw data:3150.93341225	11717.59497409	183.9
latitude: 31.8489	longitude: 117.293	heading_angle: 183.9
x: 0.187208	y: 0.477477
---------
raw data:3150.93335876	11717.59495099	200.5
latitude: 31.8489	longitude: 117.293	heading_angle: 200.5
x: 0.0880718	y: 0.44111
---------
raw data:3150.93331556	11717.59490935	227.1
latitude: 31.8489	longitude: 117.293	heading_angle: 227.1
x: 0.00800653	y: 0.375555
---------
raw data:3150.93328314	11717.59486159	233.1
latitude: 31.8489	longitude: 117.293	heading_angle: 233.1
x: 0.0520795	y: 0.300366
---------
raw data:3150.93326676	11717.59479839	239.3
latitude: 31.8489	longitude: 117.293	heading_angle: 239.3
x: 0.0824376	y: 0.200868
---------
raw data:3150.93325654	11717.59472604	255.8
latitude: 31.8489	longitude: 117.293	heading_angle: 255.8
x: 0.101379	y: 0.0869658
---------
raw data:3150.93325328	11717.59474098	253.8
latitude: 31.8489	longitude: 117.293	heading_angle: 253.8
x: 0.107421	y: 0.110486
---------
raw data:3150.93324540	11717.59474752	255.1
latitude: 31.8489	longitude: 117.293	heading_angle: 255.1
x: 0.122025	y: 0.120782
---------
raw data:3150.93324398	11717.59474844	280.4
latitude: 31.8489	longitude: 117.293	heading_angle: 280.4
x: 0.124657	y: 0.122231
---------
raw data:3150.93324677	11717.59474572	270.3
latitude: 31.8489	longitude: 117.293	heading_angle: 270.3
x: 0.119486	y: 0.117948
---------

需要在 MATLAB 中进一步分析结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/189250.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快递批量查询高手软件,让你轻松掌握多家快递物流信息,提升工作效率

随着电子商务的繁荣和智能化物流的普及&#xff0c;快递行业在全球范围内迅速发展。在这个快节奏的时代&#xff0c;为了提高工作效率并更好地管理物流信息&#xff0c;一款强大的工具——快递批量查询高手软件应运而生。这款软件可以让你轻松掌握多家快递公司的物流信息&#…

C++ 实现位图

引出 面试题&#xff1a;给出 40 亿个不重复的无符号整数&#xff0c;没有排过序。给定一个无符号整数&#xff0c;如何快速判断这个数是否在这 40 亿个无符号整数中。[ 腾讯面试题 ] 想法一&#xff1a;将 40 亿个数据存放到 set 里面&#xff0c;然后再查找指定的无符号整数。…

PyCharm 安装插件Vue

一、打开PyCharm工具 File -> Settings -> Plugins 二、在项目中添加Vue.js的依赖项。 npm install vue 三、页面应用

Innux(特殊位与权限)

特殊位与权限 目录&#xff1a; 1. SUID 2. SGID 3. SBIT 4. 文件系统属性chattr权限 5. 管理员权限sudo 1. SUID 1.1 什么是SUID SUID只对二进制可执行文件才有效&#xff08;文件必须具备x权限&#xff09; 执行者对该程序有 x 权限 当前程序拥有SUID时&#xff0…

MySQL性能优化,SQL调优,SQL调优的手段

文章目录 对MySQL性能的优化的理解硬件和操作系统层面的优化架构设计层面的优化MySQL程序配置优化SQL优化 SQL调优有哪几种方式1.EXPLAIN2.SQL语句中IN包含的值不应过多3.SELECT语句务必指明字段名称4.当只需要一条数据的时候&#xff0c;使用limit 15.如果排序字段没有用到索引…

android系统新特性——用户界面以及系统界面改进

用户界面改进 Android用户界面改进最明显的就是MD了。MD是Google于2014年推出的设计语言&#xff0c;它是一套完整的设计系统&#xff0c;包含了动画、样式、布局、组件等一系列与设计有关的元素。通过对这些行为的描述&#xff0c;让开发者设计出更符合目标的软件&#xff0c…

Percepio Tracealyzer 4.8.1 视觉跟踪诊断解决方案

Percepio Tracealyzer 4.8.1 视觉跟踪诊断解决方案&#xff0c; 是使嵌入式软件开发人员能够深入了解其运行时系统。这样可以更轻松地调试系统级问题、查找软件设计缺陷以及测量软件时序和资源使用情况。确保您的代码可靠、高效且响应迅速。 视觉运行时洞察 在运行时将 X 射线视…

计算器的模拟实现

计算器的模拟实现 一、实验题目&#xff1a;计算器二&#xff1a;实验目的&#xff1a;三&#xff1a;实验内容与实现1&#xff1a;【实验内容】2&#xff1a;【实验实现】1.计算器界面的实现&#xff0c;如下图所示&#xff1a;2&#xff1a;各项功能的实现&#xff0c;如下图…

Linux常用命令——bg命令

在线Linux命令查询工具 bg 用于将作业放到后台运行 补充说明 bg命令用于将作业放到后台运行&#xff0c;使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号&amp;的效果是相同的&#xff0c;都是将其放到系统后台执行。 在Linux系统中执行某些操作时候&…

基于YOLOv5的视频计数 — 汽车计数实现

在视频中计数对象可能看起来有挑战性&#xff0c;但借助Python和OpenCV的强大功能&#xff0c;变得令人意外地易于实现。在本文中&#xff0c;我们将探讨如何使用YOLO&#xff08;You Only Look Once&#xff09;目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单…

HCIA题目解析(1)

1、【多选题】关于动态 MAC 地址表说法正确的是&#xff1f; A、通过报文中的源MAC地址学习获得的动态MAC表项会老化 B、通过查看指定动态MAC地址表项的个数&#xff0c;可以获取接口下通信的用户数 C、在设备重启后&#xff0c;之前的动态表项会丢失 D、在设备重启后&…

车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体)

车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都…

C#,《小白学程序》第十九课:随机数(Random)第六,随机生成任意长度的大数(BigInteger)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// 除法运算为 Truffer…

【腾讯云云上实验室】向量数据库相亲社交应用实践

快速入口 &#x1f449;向量数据库_大模型知识库_向量数据存储_向量数据检索- 腾讯云 (tencent.com) 文章目录 前言1. 向量数据库概念及原理1.1 向量数据库概念1.2 向量数据库核心原理1.3 向量数据库优缺点1.4 向量数据库与传统数据库的区别 2. 腾讯云向量数据库的基本特性及优…

[数据结构]-红黑树

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、红黑树的…

可观测性建设实践之 - 日志分析的权衡取舍

指标、日志、链路是服务可观测性的三大支柱&#xff0c;在服务稳定性保障中&#xff0c;通常指标侧重于发现故障和问题&#xff0c;日志和链路分析侧重于定位和分析问题&#xff0c;其中日志实际上是串联这三大维度的一个良好桥梁。 但日志分析往往面临成本和效果之间的权衡问…

css加载会造成阻塞吗??

前言 前几天面试问到了这个问题&#xff0c;当时这个答得不敢确定哈哈&#xff0c;虽然一面还是过了 现在再分析下这个&#xff0c;总结下&#xff0c;等下次遇到就能自信得回答&#xff0c;666 准备工作 为了完成本次测试&#xff0c;先来科普一下&#xff0c;如何利用chr…

【UnLua】在 Lua 中定义 UE 反射类型

【UnLua】在 Lua 中定义 UE 反射类型 UEnum C UENUM(BlueprintType) enum class ETest : uint8 {Walking,Running,Sprinting,ALS_MAX UMETA(DisplayName"ALS MAX") };Test.generated.h #include "UObject/ObjectMacros.h" #include "UObject/Scri…

人工智能-注意力机制之Transformer

Transformer 比较了卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#xff09;和自注意力&#xff08;self-attention&#xff09;。值得注意的是&#xff0c;自注意力同时具有并行计算和最短的最大路径长度这两个优势。因此&#xff0c;使用自注意力…

红队攻防实战系列一之metasploit

百目无她&#xff0c;百书质华&#xff0c;君当醒悟&#xff0c;建我中华 本文首发于先知社区&#xff0c;原创作者即是本人 前言 在红队攻防中&#xff0c;我们主要在外网进行信息收集&#xff0c;通过cms或者其他漏洞拿到shell&#xff0c;之后通过免杀木马将windows或lin…