Arduino 读取GPS 数据发送解析并发布ROS topic(一)

概述

通过Arduino收集GPS数据,连接至电脑端,在电脑端通过python对数据进行整理,并通过发布 TOPIC,本部分主要记录如何通过Arduino读取GPS数据。

接线方式

在这里插入图片描述

  1. GPS 的 UCC GND 分别接到 arduino板子上的 5v 和 GND
  2. GPS 的 TXD 引脚接 arduino 的RX1引脚 (只需要接受从芯片上发回的数据)
  3. Arduino 连接至串口
    #解析代码

方法一

将gps 发布的数据不加处理,全部发送到串口

void setup() {
  // put your setup code here, to run once:
     // put your setup code here, to run once:
  Serial1.begin(38400);
  Serial.begin(38400);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial1.available()) {
    //Serial.print((char)Serial1.read());
    Serial.print((char)Serial1.read()); // read each character
  }
}

结果如下:
在这里插入图片描述
串口受到的数据如下

$GNGLL,0000.0000,N,00000.0000,E,085931.000,V,N*59
$GNGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*2E
$GNRMC,085931.000,V,0000.0000,N,00000.0000,E,000.0,000.0,151118,,,N*63
$GNVTG,000.0,T,,M,000.0,N,000.0,K,N*1C
$GNZDA,085931.000,15,11,2018,00,00*41
$GNGGA,085932.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*76
$GNGLL,0000.0000,N,00000.0000,E,085932.000,V,N*5A
$GNGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*2E

其中“ $GNGGA 所在的行就是GPS 的信息,格式如下:
$GNGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)
(1) UTC 时间,格式为 hhmmss.ss;
(2) 纬度,格式为 ddmm.mmmmm(度分格式);
(3) 纬度半球,N 或 S(北纬或南纬);
(4) 经度,格式为 dddmm.mmmmm(度分格式);
(5) 经度半球,E 或 W(东经或西经);
(6) GPS 状态,0=未定位,1=非差分定位,2=差分定位;
(7) 正在使用的用于定位的卫星数量(00~12)
(8) HDOP 水平精确度因子(0.5~99.9)
(9) 海拔高度(-9999.9 到 9999.9 米)
(10) 大地水准面高度(-9999.9 到 9999.9 米)
(11) 差分时间(从最近一次接收到差分信号开始的秒数,非差分定位,此项为空)
(12) 差分参考基站标号(0000 到 1023,首位 0 也将传送,非差分定位,此项为空)

##方法二 提取信息再发布(采用)

char msg_line[600];
char read;
int i = 0;

void setup() {
  // put your setup code here, to run once:
  Serial1.begin(38400);
  Serial.begin(38400);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial1.available()) {
    //Serial.print((char)Serial1.read());
    msg_line[i++] = (char)Serial1.read(); // read each character into the list
    //Serial.print(msg_line[i]);

    if(i >= 580) {
      int ii = 0;
      while(ii<i){
      if(ii+20 < 600 && msg_line[ii] == 'G' && msg_line[ii+1] == 'A'){  //对GA那一行进行提取
        int t = ii;
        while(t<ii+73){
          Serial.print(msg_line[t]);
          t++;}//print info 
       }
       ii++;
       }
      memset(msg_line, 0, 600);
      i = 0;} //clear info
    //Serial.print((char)Serial1.read());
  }
}

接下来将介绍将串口的数据解析后发布 ros topic
Arduino 读取GPS 数据发送解析并发布ROS topic(二) https://blog.csdn.net/Fourier_Legend/article/details/84107998

猜你喜欢

转载自blog.csdn.net/Fourier_Legend/article/details/84107494
今日推荐